chiark / gitweb /
@@@ BROKEN wip
[mLib] / test / t / tvec-test.c
index b4ef9a45005063cfa303cb500e69e47d15a35511..78f730f34534eb588d7e76e704180f1a3b36be3d 100644 (file)
@@ -70,7 +70,7 @@ static const struct tvec_floatinfo fenum_fltinfo =
 
 #define DEFENUM(tag, ty, slot)                                         \
   static const struct tvec_##slot##enuminfo slot##enum_info =          \
-    { { slot##enum_NAME, TVMISC_##tag }, slot##enum_assocs slot##enum_ARGS };
+    { slot##enum_NAME, slot##enum_assocs slot##enum_ARGS };
 #define ienum_NAME "order"
 #define ienum_ARGS , &tvrange_i16
 #define uenum_NAME "fruit"
@@ -122,10 +122,10 @@ static const struct tvec_urange range_32 = { 0, 31 };
   _(float,     RFP,    float,                  p, 0)                   \
   _(fltish,    RFISH,  float,                  p, &fltish_info)        \
   _(char,      RCH,    char,                   p, 0)                   \
-  _(ienum,     RIE,    enum,                   p, &ienum_info)         \
-  _(uenum,     RUE,    enum,                   p, &uenum_info)         \
-  _(fenum,     RFE,    enum,                   p, &fenum_info)         \
-  _(penum,     RPE,    enum,                   p, &penum_info)         \
+  _(ienum,     RIE,    ienum,                  p, &ienum_info)         \
+  _(uenum,     RUE,    uenum,                  p, &uenum_info)         \
+  _(fenum,     RFE,    fenum,                  p, &fenum_info)         \
+  _(penum,     RPE,    penum,                  p, &penum_info)         \
   _(flags,     RF,     flags,                  p, &attr_info)          \
   _(string,    RSTR,   string,                 p, &range_32)           \
   _(bytes,     RBY,    bytes,                  p, &tvrange_byte)       \
@@ -199,30 +199,25 @@ static void test_serialization
   if (BLEFT(&b._b))
     { out[RRC].v.i = -3; goto end; }
 
-  if (in[RSAB].f&TVRF_LIVE) {
-    for (rd = tv->test->regs; rd->name; rd++)
-      if (STRCMP(in[RSAB].v.str.p, ==, rd->name)) {
-       rv = &out[rd->i].v;
-       if (rd->ty == &tvty_int ||
-           (rd->ty == &tvty_enum &&
-            ((const struct tvec_enuminfo *)rd->arg.p)->mv == TVMISC_INT))
-         rv->i ^= 1;
-       else if (rd->ty == &tvty_uint || rd->ty == &tvty_flags ||
-                (rd->ty == &tvty_enum &&
-                 ((const struct tvec_enuminfo *)rd->arg.p)->mv ==
-                   TVMISC_INT))
-         rv->u ^= 1;
-       else if (rd->ty == &tvty_enum &&
-                ((const struct tvec_enuminfo *)rd->arg.p)->mv == TVMISC_PTR)
-         rv->p = rv->p
-           ? 0
-           : (/*unconst*/ void *)
-               ((const struct tvec_penuminfo *)rd->arg.p)->av[0].p;
-       else if (rd->ty == &tvty_string)
-         { if (rv->str.sz) rv->str.p[0] ^= 1; }
-       else if (rd->ty == &tvty_bytes)
-         { if (rv->bytes.sz) rv->bytes.p[0] ^= 1; }
-      }
+  if ((in[RSAB].f&TVRF_LIVE) && in[RSAB].v.i >= 0) {
+    rd = &tv->test->regs[in[RSAB].v.i]; rv = &out[in[RSAB].v.i].v;
+    if (rd->ty == &tvty_int || rd->ty == &tvty_ienum)
+      rv->i ^= 1;
+    else if (rd->ty == &tvty_uint ||
+            rd->ty == &tvty_flags || rd->ty == &tvty_uenum)
+      rv->u ^= 1;
+    else if (rd->ty == &tvty_float || rd->ty == &tvty_fenum) {
+      if (rv->f == rv->f) rv->f = -rv->f;
+      else rv->f = 1.0;
+    } else if (rd->ty == &tvty_penum)
+      rv->p = rv->p
+       ? 0
+       : (/*unconst*/ void *)
+       ((const struct tvec_penuminfo *)rd->arg.p)->av[0].p;
+    else if (rd->ty == &tvty_string)
+      { if (rv->str.sz) rv->str.p[0] ^= 1; }
+    else if (rd->ty == &tvty_bytes)
+      { if (rv->bytes.sz) rv->bytes.p[0] ^= 1; }
   }
 
   out[RRC].v.i = 0;
@@ -230,6 +225,15 @@ end:
   dbuf_destroy(&b);
 }
 
+static const struct tvec_iassoc type_assocs[] = {
+  { "none",            -1 },
+#define DEFASSOC(name, i, ty, argslot, argval) { #name, i },
+  TYPEREGS(DEFASSOC)
+#undef DEFASSOC
+  { 0,                 0 }
+};
+static const struct tvec_ienuminfo type_enum = { "regty", type_assocs, 0 };
+
 static DSGINIT(const) struct tvec_regdef test_regs[] = {
 #define DEFREG(name, i, ty, argslot, argval)                           \
   { #name,     i,      &tvty_##ty,     TVRF_OPT,                       \
@@ -238,7 +242,7 @@ static DSGINIT(const) struct tvec_regdef test_regs[] = {
 #undef DEFREG
   { "rc",      RRC,    &tvty_int,      TVRF_OPT,       { &tvrange_int } },
   { "serialized", RSER,        &tvty_bytes,    TVRF_OPT },
-  { "sabotage",        RSAB,   &tvty_string,   TVRF_OPT,       { &tvrange_byte } },
+  { "sabotage",        RSAB,   &tvty_ienum,    TVRF_OPT,       { &type_enum } },
 
   { 0 }
 };
@@ -298,10 +302,10 @@ static int single_set(struct tvec_state *tv, const char *name,
   struct singlectx *s = ctx;
   union tvec_regval rv;
   static const struct tvec_regdef rd =
-    { "@show", -1, &tvty_enum, 0, { &tvenum_bool } };
+    { "@show", -1, &tvty_ienum, 0, { &tvenum_bool } };
 
   if (STRCMP(name, ==, "@show")) {
-    if (tvty_enum.parse(&rv, &rd, tv)) return (-1);
+    if (tvty_ienum.parse(&rv, &rd, tv)) return (-1);
     if (s) {
       if (rv.i) s->f |= SF_SHOW;
       else s->f &= ~SF_SHOW;