@@@ man wip
[mLib] / test / t / tvec-test.c
index aaa4465..04759cd 100644 (file)
@@ -177,22 +177,26 @@ static void common_setup(struct tvec_state *tv,
   tctx->f = 0;
 }
 
-static int common_set(struct tvec_state *tv, const char *name, void *ctx)
+static int common_setvar(struct tvec_state *tv, const char *var,
+                        const union tvec_regval *rv, void *ctx)
 {
   struct test_context *tctx = ctx;
-  union tvec_regval rv;
-  static const struct tvec_regdef rd =
-    { "@show", -1, &tvty_ienum, 0, { &tvenum_bool } };
-
-  if (STRCMP(name, ==, "@show")) {
-    if (tvty_ienum.parse(&rv, &rd, tv)) return (-1);
-    if (tctx) {
-      if (rv.i) tctx->f |= SF_SHOW;
-      else tctx->f &= ~SF_SHOW;
-    }
-    return (1);
-  } else
-    return (0);
+
+  if (STRCMP(var, ==, "@show")) {
+    if (rv->i) tctx->f |= SF_SHOW;
+  } else assert(!"unknown var");
+  return (0);
+}
+
+static const struct tvec_vardef show_var =
+  { sizeof(struct tvec_reg), common_setvar,
+    { "@show", &tvty_ienum, -1, 0, { &tvenum_bool } } };
+
+static const struct tvec_vardef *common_findvar
+  (struct tvec_state *tv, const char *var, void **ctx_out, void *ctx)
+{
+  if (STRCMP(var, ==, "@show")) { *ctx_out = ctx; return (&show_var); }
+  return (0);
 }
 
 static void common_run(struct tvec_state *tv, tvec_testfn *fn, void *ctx)
@@ -210,7 +214,7 @@ static void common_after(struct tvec_state *tv, void *ctx)
 
 static const struct tvec_env common_testenv = {
   sizeof(struct test_context),
-  common_setup, common_set,
+  common_setup, common_findvar,
   0, common_run, common_after,
   0
 };
@@ -235,6 +239,10 @@ static void test_copy_bytes
   memcpy(out->v.bytes.p, in->v.bytes.p, in->v.bytes.sz);
 }
 
+static void test_copy_buffer
+  (const struct tvec_reg *in, struct tvec_reg *out, void *ctx)
+  { tvec_initbuffer(&out->v, &in->v, in->v.buf.sz); }
+
 #define test_copy_int test_copy_simple
 #define test_copy_uint test_copy_simple
 #define test_copy_ienum test_copy_simple
@@ -245,11 +253,10 @@ static void test_copy_bytes
 #define test_copy_flags test_copy_simple
 #define test_copy_float test_copy_simple
 #define test_copy_fltish test_copy_simple
-#define test_copy_buffer test_copy_bytes
 
 #define COPYREG(name, i, ty, argslot, argval)                          \
        static DSGINIT(const) struct tvec_regdef name##_copyregs[] = {  \
-         { #name, RVOUT, &tvty_##ty, 0, DSGINIT({ .argslot = argval }) }, \
+         { #name, &tvty_##ty, RVOUT, 0, DSGINIT({ .argslot = argval }) }, \
          { 0 }                                                         \
        };
 TYPEREGS(COPYREG)
@@ -307,16 +314,21 @@ static void test_single_deserialize
 
 #define SERREG(name, i, ty, argslot, argval)                           \
        static DSGINIT(const) struct tvec_regdef name##_serregs[] = {   \
-         { #name, RV,  &tvty_##ty, 0, DSGINIT({ .argslot = argval }) }, \
-         { "buf", RSEROUT, &tvty_bytes },                              \
-         { "rc", RRC,  &tvty_int,      TVRF_OPT,       { &tvrange_int } }, \
+         { #name,      &tvty_##ty,     RV,     0,                      \
+                                     DSGINIT({ .argslot = argval }) }, \
+         { "buf",      &tvty_bytes,    RSEROUT, 0 },                   \
+         { "rc",       &tvty_int,      RRC,    TVRF_OPT,               \
+                                                   { &tvrange_int } }, \
          TVEC_ENDREGS                                                  \
        };                                                              \
        static DSGINIT(const) struct tvec_regdef name##_deserregs[] = { \
-         { "buf", RSER, &tvty_bytes },                                 \
-         { #name, RVOUT, &tvty_##ty, 0, DSGINIT({ .argslot = argval }) }, \
-         { "left", RLEFT, &tvty_uint,  TVRF_OPT,      { &tvrange_size } }, \
-         { "rc", RRC,  &tvty_int,      TVRF_OPT,       { &tvrange_int } }, \
+         { "buf",      &tvty_bytes,    RSER,   0 },                    \
+         { #name,      &tvty_##ty,     RVOUT,  0,                      \
+                                     DSGINIT({ .argslot = argval }) }, \
+         { "left",     &tvty_uint,     RLEFT,  TVRF_OPT,               \
+                                                  { &tvrange_size } }, \
+         { "rc",       &tvty_int,      RRC,    TVRF_OPT,               \
+                                                   { &tvrange_int } }, \
          TVEC_ENDREGS                                                  \
        };
 TYPEREGS(SERREG)
@@ -344,12 +356,12 @@ static void before_single_deserialize(struct tvec_state *tv, void *ctx)
 
 static const struct tvec_env single_serialize_testenv = {
   sizeof(struct test_context),
-  common_setup, common_set,
+  common_setup, common_findvar,
   before_single_serialize, common_run, common_after,
   0
 }, single_deserialize_testenv = {
   sizeof(struct test_context),
-  common_setup, common_set,
+  common_setup, common_findvar,
   before_single_deserialize, common_run, common_after,
   0
 };
@@ -416,14 +428,14 @@ static const struct tvec_ienuminfo reg_enum = { "reg", reg_assocs, 0 };
 
 static DSGINIT(const) struct tvec_regdef multi_serialize_regs[] = {
 #define DEFREG(name, i, ty, argslot, argval)                           \
-  { #name,     i,      &tvty_##ty,     TVRF_OPT,                       \
-                                           DSGINIT({ .argslot = argval }) },
+  { #name,     &tvty_##ty,     i,      TVRF_OPT,                       \
+                                     DSGINIT({ .argslot = argval }) },
   TYPEREGS(DEFREG)
 #undef DEFREG
 
-  { "rc",      RRC,    &tvty_int,      TVRF_OPT,       { &tvrange_int } },
-  { "serialized", RSEROUT, &tvty_bytes,        TVRF_OPT },
-  { "sabotage",        RSAB,   &tvty_ienum,    TVRF_OPT,       { &reg_enum } },
+  { "rc",      &tvty_int,      RRC,    TVRF_OPT,       { &tvrange_int } },
+  { "serialized", &tvty_bytes, RSEROUT, TVRF_OPT },
+  { "sabotage",        &tvty_ienum,    RSAB,   TVRF_OPT,       { &reg_enum } },
 
   TVEC_ENDREGS
 };
@@ -438,7 +450,7 @@ static void before_multi_serialize(struct tvec_state *tv, void *ctx)
 
 static const struct tvec_env multi_serialize_testenv = {
   sizeof(struct test_context),
-  common_setup, common_set,
+  common_setup, common_findvar,
   before_multi_serialize, common_run, common_after,
   0
 };
@@ -456,9 +468,9 @@ static const struct tvec_remotefork crash_testenv =
   { TVEC_REMOTEFORK(0, 0) };
 
 static const struct tvec_regdef crash_regs[] = {
-  { "crash",   RSAB,   &tvty_ienum,    0,              { &tvenum_bool } },
-  { "x",       RV,     &tvty_uint,     0,              { &tvrange_uint } },
-  { "z",       RVOUT,  &tvty_uint,     0,              { &tvrange_uint } },
+  { "crash",   &tvty_ienum,    RSAB,   0,              { &tvenum_bool } },
+  { "x",       &tvty_uint,     RV,     0,              { &tvrange_uint } },
+  { "z",       &tvty_uint,     RVOUT,  0,              { &tvrange_uint } },
   TVEC_ENDREGS
 };
 
@@ -489,8 +501,8 @@ static const struct tvec_remotefork sleep_testenv =
   { TVEC_REMOTEFORK(&sleep_subenv._env, 0) };
 
 static const struct tvec_regdef sleep_regs[] = {
-  { "time",    RV,     &tvty_float,    0,              { &tvflt_nonneg } },
-  { "z",       RVOUT,  &tvty_float,    0,              { &tvflt_nonneg } },
+  { "time",    &tvty_duration, RV,     0,              { &tvflt_nonneg } },
+  { "z",       &tvty_float,    RVOUT,  0,              { &tvflt_nonneg } },
   TVEC_ENDREGS
 };