]> pd.if.org Git - zpackage/commitdiff
add options for vercmp output and tests
authorNathan Wagner <nw@hydaspes.if.org>
Sat, 10 Nov 2018 19:35:48 +0000 (19:35 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Sat, 10 Nov 2018 23:02:45 +0000 (23:02 +0000)
t/vercmp.t
zpm-vercmp.c

index 2799a539349ca6dff30b642a157904bdab1013b5..a877c08e2824d3c8fb3dab79381c66454f4741ed 100755 (executable)
@@ -13,7 +13,34 @@ vtest() {
        okstreq "$res" 0 "$1 == $1"
 }
 
-plan 45
+least() {
+       want=$1
+       shift
+       l=$(zpm vercmp -L "$@")
+       okstreq "$l" "$want" "least $*"
+}
+
+greatest() {
+       want=$1
+       shift
+       g=$(zpm vercmp -G "$@")
+       okstreq "$g" "$want" "greatest $*"
+}
+
+plan 53
+
+least 1.0a 1.0a 1.0b
+least 1.0a 1.0b 1.0a
+greatest z a b z
+greatest z a z b
+least abc abc
+greatest abc abc
+zpm vercmp -gq 'gnupg-1.0-1' "gnupg-2.0-1"
+exitwith 1 vercmp -g not gt
+
+zpm vercmp -gq 'gnupg-2.0-1' "gnupg-1.0-1"
+exitwith 0 vercmp -g is gt
 
 # alpha
 vtest 1.0a 1.0b
index bfa54125d822c45a9f4ead9e0671d2b516d6fcd5..b0e5117b8e703384f89f65dee630ca7dea8e2566 100644 (file)
+#define _POSIX_C_SOURCE 2 
+
 #include <stdlib.h>
 #include <stdio.h>
 
+#include <unistd.h>
+
 #include "zpm.h"
 
+/*
+ * -g greater than
+ * -l less than
+ * -e equal
+ * -L least : print least
+ * -G greatest : print greatest
+ * -q quiet: no print
+ */
 int main(int ac, char *av[]) {
        int cmp;
+       char *a = 0, *b = 0;
+       int print = 1;
+       int argn, opt, pass, failed = 0;
+
+       /* 0x1 = less than, 0x2 = equal, 0x4 = greater */
+       unsigned testmask = 0;
+       unsigned testcases = 0;
+
+       char *greatest = 0;
+       char *least = 0;
 
        if (ac < 2) return 1;
 
-       cmp = zpm_vercmp(av[1], av[2]);
-       printf("%d\n", cmp);
-       if (cmp == -1) cmp = 2;
-       return cmp;
+       while ((opt = getopt(ac, av, "qgleLG")) != -1) {
+               switch (opt) {
+                       case 'q': print = 0; break;
+                       case 'l': testmask |= 0x1; break;
+                       case 'e': testmask |= 0x2; break;
+                       case 'g': testmask |= 0x4; break;
+                       case 'L': print = 2; break;
+                       case 'G': print = 3; break;
+                       default:
+                                 exit(EXIT_FAILURE);
+                                 break;
+               }
+       }
+       argn = optind;
+
+       if (ac > argn) {
+               a = av[argn++];
+               greatest = a;
+               least = a;
+       }
+
+       while (ac > argn) {
+               b = av[argn++];
+
+               cmp = zpm_vercmp(a, b) + 1;
+               testcases |= (1<<cmp);
+               
+               if (testmask) {
+                       pass = (testmask & (1 << cmp));
+                       if (!pass) {
+                               failed++;
+                       }
+               }
+
+               cmp = zpm_vercmp(greatest, b);
+               if (cmp > 0) {
+                       greatest = b;
+               }
+
+               cmp = zpm_vercmp(least, b);
+               if (cmp < 0) {
+                       least = b;
+               }
+       }
+
+       switch (testcases) {
+               case 0: /* no tests */
+                       cmp = 0; break;
+               case 1: /* only less than */
+                       cmp = 2; break;
+               case 2: /* only equal */
+                       cmp = 0; break;
+               case 4: /* only greater than */
+                       cmp = 1; break;
+               default: /* mixed */
+                       cmp = 3; break;
+       }
+
+       switch (print) {
+               case 1:
+                       printf("%d\n", cmp == 2 ? -1 : cmp);
+                       break;
+               case 2:
+                       if (greatest) printf("%s\n", greatest);
+                       break;
+               case 3:
+                       if (least) printf("%s\n", least);
+                       break;
+               default:
+                       break;
+       }
+       fflush(stdout);
+
+       if (testmask == 0) {
+               return cmp;
+       } else {
+               return failed ? 1 : 0;
+       }
 }