💾 Archived View for gmi.noulin.net › gitRepositories › netSerial › file › memcheckNetSerial.c.gmi captured on 2023-07-10 at 15:40:01. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-01-29)

-=-=-=-=-=-=-

netSerial

Log

Files

Refs

README

LICENSE

memcheckNetSerial.c (49592B)

     1 #include <stdlib.h>
     2 #include <stdio.h>
     3 #include <string.h>
     4 
     5 #define ck_assert_str_eq(a,b) a;b;
     6 #define ck_assert_str_ne(a,b) a;b;
     7 #define ck_assert_ptr_eq(a,b) a;b;
     8 #define ck_assert_ptr_ne(a,b) a;b;
     9 #define ck_assert_uint_eq(a,b) a;b;
    10 #define ck_assert_uint_ne(a,b) a;b;
    11 #define ck_assert_int_eq(a,b) a;b;
    12 #define ck_assert_int_ne(a,b) a;b;
    13 #define ck_assert(a) a;
    14 
    15 
    16 #include "libsheepyObject.h"
    17 #include "netSerial.h"
    18 
    19 int argc; char **argv;
    20 
    21 /* enable/disable logging */
    22 /* #undef pLog */
    23 /* #define pLog(...) */
    24 
    25 
    26 void topT(void) {
    27 
    28   // STEPS
    29   // init
    30   // init allocate
    31   // terminate
    32   // allocate
    33   // string
    34   // duplicate
    35 
    36   createNetSerial(n);
    37   createNetSerial(ds);
    38   char *s;
    39   smallBytest *B;
    40   createSmallDict(d);
    41   createSmallArray(a);
    42 
    43   // empty smallBytes
    44   initiateG(&B);
    45   pushBufferG(B, NULL, 1);
    46   // store garbage data in empty smallBytes
    47   B->B->data = 0;
    48   ck_assert_ptr_eq(getTopTypeG(&ds), NULL);
    49   deserialG(&ds, B);
    50   // nothing should deserialized
    51   ck_assert_ptr_eq(getTopTypeG(&ds), NULL);
    52   terminateG(B);
    53 
    54   // undefined
    55   undefinedt *oU = allocUndefined();
    56   setTopNFreeG(&n, (baset *)oU);
    57   B = serialG(&n);
    58   s = sToString((smallt *) B->B);
    59   ck_assert_str_eq(s, "[0x00]");
    60   free(s);
    61   deserialG(&ds, B);
    62   s = toStringG(&ds);
    63   ck_assert_str_eq(s, "null");
    64   free(s);
    65   terminateG(B);
    66   freeManyG(&n, &ds);
    67 
    68   // bool
    69   setTopG(&n, TRUE);
    70   B = serialG(&n);
    71   s = sToString((smallt *) B->B);
    72   ck_assert_str_eq(s, "[0x11]");
    73   free(s);
    74   deserialG(&ds, B);
    75   s = toStringG(&ds);
    76   ck_assert_str_eq(s, "true");
    77   free(s);
    78   terminateG(B);
    79   freeManyG(&n, &ds);
    80 
    81   // double
    82   setTopG(&n, 1.2);
    83   B = serialG(&n);
    84   logI("len %u", lenG(B));
    85   logSI("%s", toHexSepS(getValG(B), lenG(B), " "));
    86   s = sToString((smallt *) B->B);
    87   ck_assert_str_eq(s, "[0x03,0x33,0x33,0x33,0x33,0x33,0x33,0xf3,0x3f]");
    88   free(s);
    89   deserialG(&ds, B);
    90   s = toStringG(&ds);
    91   ck_assert_str_eq(s, "1.200000e+00");
    92   free(s);
    93   terminateG(B);
    94   freeManyG(&n, &ds);
    95 
    96   // TODO test with 0x8000000000000000 and 0x7FFFFFFFFFFFFFFF
    97   // 64 bit int test with bit 63 set
    98   setTopG(&n, -8030967404224553996);
    99   B = serialG(&n);
   100   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   101   s = sToString((smallt *) B->B);
   102   ck_assert_str_eq(s, "[0xf4,0x82,0xd2,0x8b,0xc7,0xb7,0xd2,0xbb,0xee,0x1b]");
   103   free(s);
   104   deserialG(&ds, B);
   105   s = toStringG(&ds);
   106   logVarG(s);
   107   ck_assert_str_eq(s, "-8030967404224553996");
   108   free(s);
   109   terminateG(B);
   110   freeManyG(&n, &ds);
   111 
   112   // 64 bit int test large positive value
   113   setTopG(&n, 12000000000UL);
   114   B = serialG(&n);
   115   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   116   s = sToString((smallt *) B->B);
   117   ck_assert_str_eq(s, "[0x84,0x80,0xbc,0xc1,0x96,0x0b]");
   118   free(s);
   119   deserialG(&ds, B);
   120   s = toStringG(&ds);
   121   logVarG(s);
   122   ck_assert_str_eq(s, "12000000000");
   123   free(s);
   124   terminateG(B);
   125   freeManyG(&n, &ds);
   126 
   127   // int
   128   setTopG(&n, 120);
   129   B = serialG(&n);
   130   logI("len %u", lenG(B));
   131   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   132   s = sToString((smallt *) B->B);
   133   ck_assert_str_eq(s, "[0x84,0x1e]");
   134   free(s);
   135   deserialG(&ds, B);
   136   s = toStringG(&ds);
   137   ck_assert_str_eq(s, "120");
   138   free(s);
   139   terminateG(B);
   140   freeManyG(&n, &ds);
   141 
   142   // string
   143   setTopG(&n, "string");
   144   B = serialG(&n);
   145   logI("len %u", lenG(B));
   146   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   147   s = sToString((smallt *) B->B);
   148   ck_assert_str_eq(s, "[0x05,0x73,0x74,0x72,0x69,0x6e,0x67,0x00]");
   149   free(s);
   150   deserialG(&ds, B);
   151   s = toStringG(&ds);
   152   ck_assert_str_eq(s, "string");
   153   free(s);
   154   terminateG(B);
   155   freeManyG(&n, &ds);
   156 
   157   // dict
   158   setG(&d, "k", 4);
   159   setTopG(&n, &d);
   160   B = serialG(&n);
   161   logI("len %u", lenG(B));
   162   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   163   s = sToString((smallt *) B->B);
   164   ck_assert_str_eq(s, "[0x4e,0x01,0x6b,0x00,0x08]");
   165   free(s);
   166   deserialG(&ds, B);
   167   s = toStringG(&ds);
   168   ck_assert_str_eq(s, "{\"k\":4}");
   169   free(s);
   170   terminateG(B);
   171   freeManyG(&n, &ds);
   172 
   173   // array
   174   pushG(&a, "k");
   175   pushG(&a, 4);
   176   setTopG(&n, &a);
   177   B = serialG(&n);
   178   logI("len %u", lenG(B));
   179   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   180   s = sToString((smallt *) B->B);
   181   ck_assert_str_eq(s, "[0x26,0x45,0x6b,0x00,0x08]");
   182   free(s);
   183   deserialG(&ds, B);
   184   s = toStringG(&ds);
   185   ck_assert_str_eq(s, "[\"k\",4]");
   186   free(s);
   187   terminateG(B);
   188   freeManyG(&n, &ds);
   189 
   190 }
   191 
   192 
   193 
   194 void uniformDictT(void) {
   195 
   196   // STEPS
   197   // init
   198   // init allocate
   199   // terminate
   200   // allocate
   201   // string
   202   // duplicate
   203 
   204   createNetSerial(n);
   205   createNetSerial(ds);
   206   char *s;
   207   smallBytest *B;
   208   createSmallDict(d);
   209   createSmallDict(dd);
   210   createSmallArray(a);
   211 
   212   // undefined
   213   undefinedt *oU = allocUndefined();
   214   setG(&d, "0", oU);
   215   setG(&d, "1", oU);
   216   setG(&d, "2", oU);
   217   setG(&d, "3", oU);
   218   setG(&d, "4", oU);
   219   setNFreeG(&d, "5", oU);
   220   setTopG(&n, &d);
   221   B = serialG(&n);
   222   logI("len %u", lenG(B));
   223   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   224   s = sToString((smallt *) B->B);
   225   ck_assert_str_eq(s, "[0x0e,0x06,0x30,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00]");
   226   free(s);
   227   deserialG(&ds, B);
   228   s = toStringG(&ds);
   229   ck_assert_str_eq(s, "{\"0\":null,\"1\":null,\"2\":null,\"3\":null,\"4\":null,\"5\":null}");
   230   free(s);
   231   terminateG(B);
   232   freeManyG(&n, &ds);
   233 
   234   // empty dict
   235   initiateG(&d);
   236   setTopG(&n, &d);
   237   B = serialG(&n);
   238   logI("len %u", lenG(B));
   239   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   240   s = sToString((smallt *) B->B);
   241   ck_assert_str_eq(s, "[0x0e,0x00]");
   242   free(s);
   243   deserialG(&ds, B);
   244   s = toStringG(&ds);
   245   ck_assert_str_eq(s, "{}");
   246   free(s);
   247   terminateG(B);
   248   freeManyG(&n, &ds);
   249 
   250   // bool
   251   initiateG(&d);
   252   setG(&d, "0", TRUE);
   253   setG(&d, "1", TRUE);
   254   setG(&d, "2", TRUE);
   255   setG(&d, "3", TRUE);
   256   setTopG(&n, &d);
   257   B = serialG(&n);
   258   logI("len %u", lenG(B));
   259   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   260   s = sToString((smallt *) B->B);
   261   ck_assert_str_eq(s, "[0x1e,0x04,0x30,0x00,0x0f,0x31,0x00,0x32,0x00,0x33,0x00]");
   262   free(s);
   263   deserialG(&ds, B);
   264   s = toStringG(&ds);
   265   ck_assert_str_eq(s, "{\"0\":true,\"1\":true,\"2\":true,\"3\":true}");
   266   free(s);
   267   terminateG(B);
   268   freeManyG(&n, &ds);
   269 
   270   // 9 bools
   271   initiateG(&d);
   272   setG(&d, "0", TRUE);
   273   setG(&d, "1", TRUE);
   274   setG(&d, "2", TRUE);
   275   setG(&d, "3", TRUE);
   276   setG(&d, "4", TRUE);
   277   setG(&d, "5", TRUE);
   278   setG(&d, "6", TRUE);
   279   setG(&d, "7", TRUE);
   280   setG(&d, "8", TRUE);
   281   setTopG(&n, &d);
   282   B = serialG(&n);
   283   logI("len %u", lenG(B));
   284   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   285   s = sToString((smallt *) B->B);
   286   ck_assert_str_eq(s, "[0x1e,0x09,0x30,0x00,0xff,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x01]");
   287   free(s);
   288   deserialG(&ds, B);
   289   s = toStringG(&ds);
   290   ck_assert_str_eq(s, "{\"0\":true,\"1\":true,\"2\":true,\"3\":true,\"4\":true,\"5\":true,\"6\":true,\"7\":true,\"8\":true}");
   291   free(s);
   292   terminateG(B);
   293   freeManyG(&n, &ds);
   294 
   295 
   296   // double
   297   initiateG(&d);
   298   setG(&d, "0", 1.1);
   299   setG(&d, "1", 2.2);
   300   setG(&d, "2", 3.3);
   301   setTopG(&n, &d);
   302   B = serialG(&n);
   303   logI("len %u", lenG(B));
   304   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   305   s = sToString((smallt *) B->B);
   306   ck_assert_str_eq(s, "[0x3e,0x03,0x30,0x00,0x9a,0x99,0x99,0x99,0x99,0x99,0xf1,0x3f,0x31,0x00,0x9a,0x99,0x99,0x99,0x99,0x99,0x01,0x40,0x32,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x0a,0x40]");
   307   free(s);
   308   deserialG(&ds, B);
   309   s = toStringG(&ds);
   310   ck_assert_str_eq(s, "{\"0\":1.100000e+00,\"1\":2.200000e+00,\"2\":3.300000e+00}");
   311   free(s);
   312   terminateG(B);
   313   freeManyG(&n, &ds);
   314 
   315   // int
   316   initiateG(&d);
   317   setG(&d, "0", 1);
   318   setG(&d, "1", 2);
   319   setTopG(&n, &d);
   320   B = serialG(&n);
   321   logI("len %u", lenG(B));
   322   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   323   s = sToString((smallt *) B->B);
   324   ck_assert_str_eq(s, "[0x4e,0x02,0x30,0x00,0x02,0x31,0x00,0x04]");
   325   free(s);
   326   deserialG(&ds, B);
   327   s = toStringG(&ds);
   328   ck_assert_str_eq(s, "{\"0\":1,\"1\":2}");
   329   free(s);
   330   terminateG(B);
   331   freeManyG(&n, &ds);
   332 
   333   // string
   334   initiateG(&d);
   335   setG(&d, "0", "a");
   336   setG(&d, "1", "A");
   337   setG(&d, "2", "z");
   338   setTopG(&n, &d);
   339   B = serialG(&n);
   340   logI("len %u", lenG(B));
   341   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   342   s = sToString((smallt *) B->B);
   343   ck_assert_str_eq(s, "[0x5e,0x03,0x30,0x00,0x61,0x00,0x31,0x00,0x41,0x00,0x32,0x00,0x7a,0x00]");
   344   free(s);
   345   deserialG(&ds, B);
   346   s = toStringG(&ds);
   347   ck_assert_str_eq(s, "{\"0\":\"a\",\"1\":\"A\",\"2\":\"z\"}");
   348   free(s);
   349   terminateG(B);
   350   freeManyG(&n, &ds);
   351 
   352   // dict
   353   initiateG(&d);
   354   setG(&dd, "9", "z");
   355   setG(&dd, "1", 1);
   356   setG(&d, "0", &dd);
   357   initiateG(&dd);
   358   setG(&dd, "Z", "-");
   359   setG(&dd, "A", 234);
   360   setG(&d, "1", &dd);
   361   setTopG(&n, &d);
   362   logVarG(&n);
   363   B = serialG(&n);
   364   logI("len %u", lenG(B));
   365   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   366   s = sToString((smallt *) B->B);
   367   ck_assert_str_eq(s, "[0x2e,0x02,0x30,0x00,0x02,0x39,0x00,0x45,0x7a,0x00,0x31,0x00,0x02,0x31,0x00,0x02,0x5a,0x00,0x45,0x2d,0x00,0x41,0x00,0xd4,0x03]");
   368   free(s);
   369   deserialG(&ds, B);
   370   s = toStringG(&ds);
   371   ck_assert_str_eq(s, "{\"0\":{\"9\":\"z\",\"1\":1},\"1\":{\"Z\":\"-\",\"A\":234}}");
   372   free(s);
   373   terminateG(B);
   374   freeManyG(&n, &ds);
   375 
   376   // uniform dict
   377   initiateG(&dd);
   378   initiateG(&d);
   379   setG(&dd, "9", 1);
   380   setG(&dd, "1", 2);
   381   setG(&d, "0", &dd);
   382   initiateG(&dd);
   383   setG(&dd, "Z", "-");
   384   setG(&dd, "A", "+");
   385   setG(&d, "1", &dd);
   386   setTopG(&n, &d);
   387   logVarG(&n);
   388   B = serialG(&n);
   389   logI("len %u", lenG(B));
   390   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   391   s = sToString((smallt *) B->B);
   392   ck_assert_str_eq(s, "[0xee,0x02,0x30,0x00,0x24,0x39,0x00,0x02,0x31,0x00,0x04,0x31,0x00,0x25,0x5a,0x00,0x2d,0x00,0x41,0x00,0x2b,0x00]");
   393   free(s);
   394   deserialG(&ds, B);
   395   s = toStringG(&ds);
   396   ck_assert_str_eq(s, "{\"0\":{\"9\":1,\"1\":2},\"1\":{\"Z\":\"-\",\"A\":\"+\"}}");
   397   free(s);
   398   terminateG(B);
   399   freeManyG(&n, &ds);
   400 
   401   // array
   402   initiateG(&d);
   403   pushG(&a, "k");
   404   pushG(&a, 4);
   405   setG(&d, "0", &a);
   406   setTopG(&n, &d);
   407   B = serialG(&n);
   408   logI("len %u", lenG(B));
   409   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   410   s = sToString((smallt *) B->B);
   411   ck_assert_str_eq(s, "[0x6e,0x01,0x30,0x00,0x02,0x45,0x6b,0x00,0x08]");
   412   free(s);
   413   deserialG(&ds, B);
   414   s = toStringG(&ds);
   415   ck_assert_str_eq(s, "{\"0\":[\"k\",4]}");
   416   free(s);
   417   terminateG(B);
   418   freeManyG(&n, &ds);
   419 
   420   // uniform array
   421   initiateG(&d);
   422   initiateG(&a);
   423   pushG(&a, 1);
   424   pushG(&a, 2);
   425   pushG(&a, 3);
   426   pushG(&a, 4);
   427   setG(&d, "0", &a);
   428   setTopG(&n, &d);
   429   B = serialG(&n);
   430   logI("len %u", lenG(B));
   431   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   432   s = sToString((smallt *) B->B);
   433   ck_assert_str_eq(s, "[0xfe,0x01,0x30,0x00,0x44,0x02,0x04,0x06,0x08]");
   434   free(s);
   435   deserialG(&ds, B);
   436   s = toStringG(&ds);
   437   ck_assert_str_eq(s, "{\"0\":[1,2,3,4]}");
   438   free(s);
   439   terminateG(B);
   440   freeManyG(&n, &ds);
   441 
   442   // smallBytes
   443   initiateG(&d);
   444   createSmallBytes(b);
   445   createSmallBytes(b1);
   446   pushG(&b, 1);
   447   pushG(&b, 2);
   448   pushG(&b, 3);
   449   pushG(&b, 4);
   450   pushG(&b1, 5);
   451   pushG(&b1, 6);
   452   pushG(&b1, 7);
   453   setG(&d, "0", &b);
   454   setG(&d, "1", &b1);
   455   setTopG(&n, &d);
   456   B = serialG(&n);
   457   logI("len %u", lenG(B));
   458   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   459   s = sToString((smallt *) B->B);
   460   ck_assert_str_eq(s, "[0x7e,0x02,0x30,0x00,0x04,0x01,0x02,0x03,0x04,0x31,0x00,0x03,0x05,0x06,0x07]");
   461   free(s);
   462   deserialG(&ds, B);
   463   s = toStringG(&ds);
   464   ck_assert_str_eq(s, "{"_"0"_":[0x01,0x02,0x03,0x04],"_"1"_":[0x05,0x06,0x07]}");
   465   free(s);
   466   terminateG(B);
   467   freeManyG(&n, &ds);
   468 
   469 }
   470 
   471 
   472 // uniformArray
   473 void uniformArrayT(void) {
   474 
   475   // STEPS
   476   // init
   477   // init allocate
   478   // terminate
   479   // allocate
   480   // string
   481   // duplicate
   482 
   483   createNetSerial(n);
   484   createNetSerial(ds);
   485   char *s;
   486   smallBytest *B;
   487   createSmallArray(A);
   488   createSmallDict(dd);
   489   createSmallArray(a);
   490 
   491   // undefined
   492   undefinedt *oU = allocUndefined();
   493   pushG(&A, oU);
   494   pushG(&A, oU);
   495   pushG(&A, oU);
   496   pushG(&A, oU);
   497   pushG(&A, oU);
   498   pushNFreeG(&A, oU);
   499   setTopG(&n, &A);
   500   B = serialG(&n);
   501   logI("len %u", lenG(B));
   502   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   503   s = sToString((smallt *) B->B);
   504   ck_assert_str_eq(s, "[0x0f,0x06]");
   505   free(s);
   506   deserialG(&ds, B);
   507   s = toStringG(&ds);
   508   ck_assert_str_eq(s, "[null,null,null,null,null,null]");
   509   free(s);
   510   terminateG(B);
   511   freeManyG(&n, &ds);
   512 
   513   // empty dict
   514   initiateG(&A);
   515   setTopG(&n, &A);
   516   B = serialG(&n);
   517   logI("len %u", lenG(B));
   518   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   519   s = sToString((smallt *) B->B);
   520   ck_assert_str_eq(s, "[0x0f,0x00]");
   521   free(s);
   522   deserialG(&ds, B);
   523   s = toStringG(&ds);
   524   ck_assert_str_eq(s, "[]");
   525   free(s);
   526   terminateG(B);
   527   freeManyG(&n, &ds);
   528 
   529   // bool
   530   initiateG(&A);
   531   pushG(&A, TRUE);
   532   pushG(&A, TRUE);
   533   pushG(&A, TRUE);
   534   pushG(&A, TRUE);
   535   setTopG(&n, &A);
   536   B = serialG(&n);
   537   logI("len %u", lenG(B));
   538   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   539   s = sToString((smallt *) B->B);
   540   ck_assert_str_eq(s, "[0x1f,0x04,0x0f]");
   541   free(s);
   542   deserialG(&ds, B);
   543   s = toStringG(&ds);
   544   ck_assert_str_eq(s, "[true,true,true,true]");
   545   free(s);
   546   terminateG(B);
   547   freeManyG(&n, &ds);
   548 
   549   // double
   550   initiateG(&A);
   551   pushG(&A, 1.1);
   552   pushG(&A, 2.2);
   553   pushG(&A, 3.3);
   554   setTopG(&n, &A);
   555   B = serialG(&n);
   556   logI("len %u", lenG(B));
   557   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   558   s = sToString((smallt *) B->B);
   559   ck_assert_str_eq(s, "[0x3f,0x03,0x9a,0x99,0x99,0x99,0x99,0x99,0xf1,0x3f,0x9a,0x99,0x99,0x99,0x99,0x99,0x01,0x40,0x66,0x66,0x66,0x66,0x66,0x66,0x0a,0x40]");
   560   free(s);
   561   deserialG(&ds, B);
   562   s = toStringG(&ds);
   563   ck_assert_str_eq(s, "[1.100000e+00,2.200000e+00,3.300000e+00]");
   564   free(s);
   565   terminateG(B);
   566   freeManyG(&n, &ds);
   567 
   568   // int
   569   initiateG(&A);
   570   pushG(&A, 1);
   571   pushG(&A, 2);
   572   setTopG(&n, &A);
   573   B = serialG(&n);
   574   logI("len %u", lenG(B));
   575   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   576   s = sToString((smallt *) B->B);
   577   ck_assert_str_eq(s, "[0x4f,0x02,0x02,0x04]");
   578   free(s);
   579   deserialG(&ds, B);
   580   s = toStringG(&ds);
   581   ck_assert_str_eq(s, "[1,2]");
   582   free(s);
   583   terminateG(B);
   584   freeManyG(&n, &ds);
   585 
   586   // string
   587   initiateG(&A);
   588   pushG(&A, "a");
   589   pushG(&A, "A");
   590   pushG(&A, "z");
   591   setTopG(&n, &A);
   592   B = serialG(&n);
   593   logI("len %u", lenG(B));
   594   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   595   s = sToString((smallt *) B->B);
   596   ck_assert_str_eq(s, "[0x5f,0x03,0x61,0x00,0x41,0x00,0x7a,0x00]");
   597   free(s);
   598   deserialG(&ds, B);
   599   s = toStringG(&ds);
   600   ck_assert_str_eq(s, "[\"a\",\"A\",\"z\"]");
   601   free(s);
   602   terminateG(B);
   603   freeManyG(&n, &ds);
   604 
   605   // dict
   606   initiateG(&A);
   607   setG(&dd, "9", "z");
   608   setG(&dd, "1", 1);
   609   pushG(&A, &dd);
   610   initiateG(&dd);
   611   setG(&dd, "Z", "-");
   612   setG(&dd, "A", 234);
   613   pushG(&A, &dd);
   614   setTopG(&n, &A);
   615   logVarG(&n);
   616   B = serialG(&n);
   617   logI("len %u", lenG(B));
   618   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   619   s = sToString((smallt *) B->B);
   620   ck_assert_str_eq(s, "[0x2f,0x02,0x02,0x39,0x00,0x45,0x7a,0x00,0x31,0x00,0x02,0x02,0x5a,0x00,0x45,0x2d,0x00,0x41,0x00,0xd4,0x03]");
   621   free(s);
   622   deserialG(&ds, B);
   623   s = toStringG(&ds);
   624   ck_assert_str_eq(s, "[{\"9\":\"z\",\"1\":1},{\"Z\":\"-\",\"A\":234}]");
   625   free(s);
   626   terminateG(B);
   627   freeManyG(&n, &ds);
   628 
   629   // uniform dict
   630   initiateG(&dd);
   631   initiateG(&A);
   632   setG(&dd, "9", 1);
   633   setG(&dd, "1", 2);
   634   pushG(&A, &dd);
   635   initiateG(&dd);
   636   setG(&dd, "Z", "-");
   637   setG(&dd, "A", "+");
   638   pushG(&A, &dd);
   639   setTopG(&n, &A);
   640   logVarG(&n);
   641   B = serialG(&n);
   642   logI("len %u", lenG(B));
   643   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   644   s = sToString((smallt *) B->B);
   645   ck_assert_str_eq(s, "[0xef,0x02,0x24,0x39,0x00,0x02,0x31,0x00,0x04,0x25,0x5a,0x00,0x2d,0x00,0x41,0x00,0x2b,0x00]");
   646   free(s);
   647   deserialG(&ds, B);
   648   s = toStringG(&ds);
   649   ck_assert_str_eq(s, "[{\"9\":1,\"1\":2},{\"Z\":\"-\",\"A\":\"+\"}]");
   650   free(s);
   651   terminateG(B);
   652   freeManyG(&n, &ds);
   653 
   654   // array
   655   initiateG(&A);
   656   pushG(&a, "k");
   657   pushG(&a, 4);
   658   pushG(&A, &a);
   659   setTopG(&n, &A);
   660   B = serialG(&n);
   661   logI("len %u", lenG(B));
   662   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   663   s = sToString((smallt *) B->B);
   664   ck_assert_str_eq(s, "[0x6f,0x01,0x02,0x45,0x6b,0x00,0x08]");
   665   free(s);
   666   deserialG(&ds, B);
   667   s = toStringG(&ds);
   668   ck_assert_str_eq(s, "[[\"k\",4]]");
   669   free(s);
   670   terminateG(B);
   671   freeManyG(&n, &ds);
   672 
   673   initiateG(&A);
   674   initiateG(&a);
   675   pushG(&a, 1);
   676   pushG(&a, 2);
   677   pushG(&a, 3);
   678   pushG(&a, 4);
   679   pushG(&A, &a);
   680   setTopG(&n, &A);
   681   B = serialG(&n);
   682   logI("len %u", lenG(B));
   683   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   684   s = sToString((smallt *) B->B);
   685   ck_assert_str_eq(s, "[0xff,0x01,0x44,0x02,0x04,0x06,0x08]");
   686   free(s);
   687   deserialG(&ds, B);
   688   s = toStringG(&ds);
   689   ck_assert_str_eq(s, "[[1,2,3,4]]");
   690   free(s);
   691   terminateG(B);
   692   freeManyG(&n, &ds);
   693 
   694   // many bools in uniform array
   695   parseG(&n, "[true,true,true,true,true,true,true,true,false,true]");
   696   logVarG(&n);
   697   B = serialG(&n);
   698   logI("len %u", lenG(B));
   699   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   700   s = sToString((smallt *) B->B);
   701   ck_assert_str_eq(s, "[0x1f,0x0a,0xff,0x02]");
   702   free(s);
   703   deserialG(&ds, B);
   704   s = toStringG(&ds);
   705   ck_assert_str_eq(s, "[true,true,true,true,true,true,true,true,false,true]");
   706   free(s);
   707   terminateG(B);
   708   freeManyG(&n, &ds);
   709 
   710   // smallBytes
   711   initiateG(&A);
   712   createSmallBytes(b);
   713   pushG(&b, 1);
   714   pushG(&b, 2);
   715   pushG(&b, 3);
   716   pushG(&b, 4);
   717   pushG(&b, 5);
   718   pushG(&b, 6);
   719   pushG(&A, &b);
   720   initiateG(&b);
   721   pushG(&b, 7);
   722   pushG(&b, 8);
   723   pushG(&b, 9);
   724   pushG(&b, 10);
   725   pushG(&b, 11);
   726   pushG(&b, 12);
   727   pushG(&A, &b);
   728   setTopG(&n, &A);
   729   logVarG(&n);
   730   B = serialG(&n);
   731   logI("len %u", lenG(B));
   732   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   733   s = sToString((smallt *) B->B);
   734   ck_assert_str_eq(s, "[0x7f,0x02,0x06,0x01,0x02,0x03,0x04,0x05,0x06,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c]");
   735   free(s);
   736   deserialG(&ds, B);
   737   s = toStringG(&ds);
   738   ck_assert_str_eq(s, "[[0x01,0x02,0x03,0x04,0x05,0x06],[0x07,0x08,0x09,0x0a,0x0b,0x0c]]");
   739   free(s);
   740   terminateG(B);
   741   freeManyG(&n, &ds);
   742 
   743 }
   744 
   745 
   746 // dict with values, dict, array, uniforms, packed test high/low nibbles
   747 void dictT(void) {
   748 
   749   // STEPS
   750   // init
   751   // init allocate
   752   // terminate
   753   // allocate
   754   // string
   755   // duplicate
   756 
   757   createNetSerial(n);
   758   createNetSerial(ds);
   759   char *s;
   760   smallBytest *B;
   761   createSmallDict(d);
   762   createSmallDict(dd);
   763   createSmallArray(a);
   764 
   765   // dict with a deleted element (empty with dict->count == 1)
   766   initiateG(&d);
   767   setG(&d, "0", NULL);
   768   delElemG(&d, "0");
   769   setTopG(&n, &d);
   770   logVarG(&n);
   771   B = serialG(&n);
   772   logI("len %u", lenG(B));
   773   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   774   s = sToString((smallt *) B->B);
   775   ck_assert_str_eq(s, "[0x0e,0x00]");
   776   free(s);
   777   deserialG(&ds, B);
   778   s = toStringG(&ds);
   779   ck_assert_str_eq(s, "{}");
   780   free(s);
   781   terminateG(B);
   782   freeManyG(&n, &ds);
   783 
   784   // null and uniform dict
   785   initiateG(&d);
   786   setG(&d, "0", NULL);
   787   initiateG(&dd);
   788   setG(&dd, "Z", "-");
   789   setG(&dd, "A", "+");
   790   setG(&d, "1", &dd);
   791   setTopG(&n, &d);
   792   logVarG(&n);
   793   B = serialG(&n);
   794   logI("len %u", lenG(B));
   795   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   796   s = sToString((smallt *) B->B);
   797   ck_assert_str_eq(s, "[0x22,0x30,0x00,0xe0,0x31,0x00,0x25,0x5a,0x00,0x2d,0x00,0x41,0x00,0x2b,0x00]");
   798   free(s);
   799   deserialG(&ds, B);
   800   s = toStringG(&ds);
   801   ck_assert_str_eq(s, "{\"0\":null,\"1\":{\"Z\":\"-\",\"A\":\"+\"}}");
   802   free(s);
   803   terminateG(B);
   804   freeManyG(&n, &ds);
   805 
   806   // null and dict
   807   initiateG(&d);
   808   setG(&d, "0", NULL);
   809   initiateG(&dd);
   810   setG(&dd, "Z", "-");
   811   setG(&dd, "A", 1);
   812   setG(&d, "1", &dd);
   813   setTopG(&n, &d);
   814   logVarG(&n);
   815   B = serialG(&n);
   816   logI("len %u", lenG(B));
   817   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   818   s = sToString((smallt *) B->B);
   819   ck_assert_str_eq(s, "[0x22,0x30,0x00,0x20,0x31,0x00,0x02,0x5a,0x00,0x45,0x2d,0x00,0x41,0x00,0x02]");
   820   free(s);
   821   deserialG(&ds, B);
   822   s = toStringG(&ds);
   823   ck_assert_str_eq(s, "{\"0\":null,\"1\":{\"Z\":\"-\",\"A\":1}}");
   824   free(s);
   825   terminateG(B);
   826   freeManyG(&n, &ds);
   827 
   828   // bool and uniform dict
   829   initiateG(&d);
   830   setG(&d, "0", TRUE);
   831   initiateG(&dd);
   832   setG(&dd, "Z", "-");
   833   setG(&dd, "A", "+");
   834   setG(&d, "1", &dd);
   835   setTopG(&n, &d);
   836   logVarG(&n);
   837   B = serialG(&n);
   838   logI("len %u", lenG(B));
   839   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   840   s = sToString((smallt *) B->B);
   841   ck_assert_str_eq(s, "[0x22,0x30,0x00,0x11,0x31,0x00,0x5e,0x02,0x5a,0x00,0x2d,0x00,0x41,0x00,0x2b,0x00]");
   842   free(s);
   843   deserialG(&ds, B);
   844   s = toStringG(&ds);
   845   ck_assert_str_eq(s, "{\"0\":true,\"1\":{\"Z\":\"-\",\"A\":\"+\"}}");
   846   free(s);
   847   terminateG(B);
   848   freeManyG(&n, &ds);
   849 
   850   // null element and uniform array
   851   initiateG(&d);
   852   setG(&d, "1", NULL);
   853   initiateG(&a);
   854   pushG(&a, 1);
   855   pushG(&a, 2);
   856   pushG(&a, 3);
   857   pushG(&a, 4);
   858   setG(&d, "0", &a);
   859   setTopG(&n, &d);
   860   logVarG(&n);
   861   B = serialG(&n);
   862   logI("len %u", lenG(B));
   863   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   864   s = sToString((smallt *) B->B);
   865   ck_assert_str_eq(s, "[0x22,0x31,0x00,0xf0,0x30,0x00,0x44,0x02,0x04,0x06,0x08]");
   866   free(s);
   867   deserialG(&ds, B);
   868   s = toStringG(&ds);
   869   ck_assert_str_eq(s, "{\"1\":null,\"0\":[1,2,3,4]}");
   870   free(s);
   871   terminateG(B);
   872   freeManyG(&n, &ds);
   873 
   874   // uniform array high nibble
   875   initiateG(&d);
   876   setG(&d, "1", TRUE);
   877   initiateG(&a);
   878   pushG(&a, 1);
   879   pushG(&a, 2);
   880   pushG(&a, 3);
   881   pushG(&a, 4);
   882   setG(&d, "0", &a);
   883   setTopG(&n, &d);
   884   logVarG(&n);
   885   B = serialG(&n);
   886   logI("len %u", lenG(B));
   887   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   888   s = sToString((smallt *) B->B);
   889   ck_assert_str_eq(s, "[0x22,0x31,0x00,0x11,0x30,0x00,0x4f,0x04,0x02,0x04,0x06,0x08]");
   890   free(s);
   891   deserialG(&ds, B);
   892   s = toStringG(&ds);
   893   ck_assert_str_eq(s, "{\"1\":true,\"0\":[1,2,3,4]}");
   894   free(s);
   895   terminateG(B);
   896   freeManyG(&n, &ds);
   897 
   898   // uniform array in high nibble
   899   initiateG(&d);
   900   setG(&d, "1", "1");
   901   initiateG(&a);
   902   pushG(&a, 1);
   903   pushG(&a, 2);
   904   pushG(&a, 3);
   905   pushG(&a, 4);
   906   setG(&d, "0", &a);
   907   setTopG(&n, &d);
   908   logVarG(&n);
   909   B = serialG(&n);
   910   logI("len %u", lenG(B));
   911   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   912   s = sToString((smallt *) B->B);
   913   ck_assert_str_eq(s, "[0x22,0x31,0x00,0xf5,0x31,0x00,0x30,0x00,0x44,0x02,0x04,0x06,0x08]");
   914   free(s);
   915   deserialG(&ds, B);
   916   s = toStringG(&ds);
   917   ck_assert_str_eq(s, "{\"1\":\"1\",\"0\":[1,2,3,4]}");
   918   free(s);
   919   terminateG(B);
   920   freeManyG(&n, &ds);
   921 
   922   // low and high nibble undefined
   923   parseG(&n, "{"_"0"_":null,"_"1"_":null, "_"2"_":1}");
   924   logVarG(&n);
   925   B = serialG(&n);
   926   logI("len %u", lenG(B));
   927   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   928   s = sToString((smallt *) B->B);
   929   ck_assert_str_eq(s, "[0x32,0x30,0x00,0x00,0x31,0x00,0x32,0x00,0x24]");
   930   free(s);
   931   deserialG(&ds, B);
   932   s = toStringG(&ds);
   933   ck_assert_str_eq(s, "{\"0\":null,\"1\":null,\"2\":1}");
   934   free(s);
   935   terminateG(B);
   936   freeManyG(&n, &ds);
   937 
   938   // low and high nibble bool
   939   parseG(&n, "{"_"z"_":null,"_"0"_":true,"_"1"_":true, "_"2"_":true, "_"3"_":true"_"4"_":true"_"5"_":true, "_"6"_":true, "_"7"_":true, "_"8"_":true, "_"9"_":true, "_"a"_":true, "_"b"_":true, "_"c"_":true, "_"d"_":true}");
   940   logVarG(&n);
   941   B = serialG(&n);
   942   logI("len %u", lenG(B));
   943   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   944   s = sToString((smallt *) B->B);
   945   ck_assert_str_eq(s, "[0xf2,0x01,0x7a,0x00,0x10,0x30,0x00,0xff,0x31,0x00,0x11,0x32,0x00,0x33,0x00,0x11,0x34,0x00,0x35,0x00,0x11,0x36,0x00,0x37,0x00,0x11,0x38,0x00,0x3f,0x39,0x00,0x11,0x61,0x00,0x62,0x00,0x11,0x63,0x00,0x64,0x00,0x01]");
   946   free(s);
   947   deserialG(&ds, B);
   948   s = toStringG(&ds);
   949   ck_assert_str_eq(s, "{\"z\":null,\"0\":true,\"1\":true,\"2\":true,\"3\":true,\"4\":true,\"5\":true,\"6\":true,\"7\":true,\"8\":true,\"9\":true,\"a\":true,\"b\":true,\"c\":true,\"d\":true}");
   950   free(s);
   951   terminateG(B);
   952   freeManyG(&n, &ds);
   953 
   954   // low and high nibble bool - deserialDict ctx->nibble == lowNbl and ctx->boolShift == 8
   955   parseG(&n, "{"_"z"_":null,"_"0"_":true,"_"1"_":true, "_"2"_":true, "_"3"_":true, "_"4"_":true, "_"5"_":true, "_"6"_":true, "_"7"_":true, \"Z\": null, "_"8"_":true, "_"9"_":true, "_"a"_":true, "_"b"_":true, "_"c"_":true, "_"d"_":true}");
   956   logVarG(&n);
   957   B = serialG(&n);
   958   logI("len %u", lenG(B));
   959   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   960   s = sToString((smallt *) B->B);
   961   ck_assert_str_eq(s, "[0x82,0x02,0x7a,0x00,0x10,0x30,0x00,0xff,0x31,0x00,0x11,0x32,0x00,0x33,0x00,0x11,0x34,0x00,0x35,0x00,0x11,0x36,0x00,0x37,0x00,0x01,0x5a,0x00,0x38,0x00,0xf1,0x39,0x00,0x11,0x61,0x00,0x62,0x00,0x11,0x63,0x00,0x03,0x64,0x00,0x01]");
   962   free(s);
   963   deserialG(&ds, B);
   964   s = toStringG(&ds);
   965   ck_assert_str_eq(s, "{\"z\":null,\"0\":true,\"1\":true,\"2\":true,\"3\":true,\"4\":true,\"5\":true,\"6\":true,\"7\":true,\"Z\":null,\"8\":true,\"9\":true,\"a\":true,\"b\":true,\"c\":true,\"d\":true}");
   966   free(s);
   967   terminateG(B);
   968   freeManyG(&n, &ds);
   969 
   970   // dict in dict
   971   parseG(&n, "{"_"0"_":{\"0\":true}, "_"2"_":{\"0\":false},\"z\":null}");
   972   logVarG(&n);
   973   B = serialG(&n);
   974   logI("len %u", lenG(B));
   975   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   976   s = sToString((smallt *) B->B);
   977   ck_assert_str_eq(s, "[0x32,0x30,0x00,0x1e,0x01,0x30,0x00,0x01,0x32,0x00,0x1e,0x01,0x30,0x00,0x7a,0x00,0x00]");
   978   free(s);
   979   deserialG(&ds, B);
   980   s = toStringG(&ds);
   981   ck_assert_str_eq(s, "{\"0\":{\"0\":true},\"2\":{\"0\":false},\"z\":null}");
   982   free(s);
   983   terminateG(B);
   984   freeManyG(&n, &ds);
   985 
   986 
   987   // low and high nibble double
   988   parseG(&n, "{"_"0"_":0.0, "_"2"_":2.0,\"z\":null}");
   989   logVarG(&n);
   990   B = serialG(&n);
   991   logI("len %u", lenG(B));
   992   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
   993   s = sToString((smallt *) B->B);
   994   ck_assert_str_eq(s, "[0x32,0x30,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x7a,0x00,0x00]");
   995   free(s);
   996   deserialG(&ds, B);
   997   s = toStringG(&ds);
   998   ck_assert_str_eq(s, "{\"0\":0.000000e+00,\"2\":2.000000e+00,\"z\":null}");
   999   free(s);
  1000   terminateG(B);
  1001   freeManyG(&n, &ds);
  1002 
  1003   // high nibble string
  1004   parseG(&n, "{"_"0"_":null, "_"2"_":\"2.0\",\"z\":null}");
  1005   logVarG(&n);
  1006   B = serialG(&n);
  1007   logI("len %u", lenG(B));
  1008   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1009   s = sToString((smallt *) B->B);
  1010   ck_assert_str_eq(s, "[0x32,0x30,0x00,0x50,0x32,0x00,0x32,0x2e,0x30,0x00,0x7a,0x00,0x00]");
  1011   free(s);
  1012   deserialG(&ds, B);
  1013   s = toStringG(&ds);
  1014   ck_assert_str_eq(s, "{\"0\":null,\"2\":\"2.0\",\"z\":null}");
  1015   free(s);
  1016   terminateG(B);
  1017   freeManyG(&n, &ds);
  1018 
  1019   // array in dict
  1020   parseG(&n, "{"_"0"_":null, "_"2"_":[1,2],\"z\":[true,3]}");
  1021   logVarG(&n);
  1022   B = serialG(&n);
  1023   logI("len %u", lenG(B));
  1024   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1025   s = sToString((smallt *) B->B);
  1026   ck_assert_str_eq(s, "[0x32,0x30,0x00,0xf0,0x32,0x00,0x24,0x02,0x04,0x7a,0x00,0x26,0x11,0x64]");
  1027   free(s);
  1028   deserialG(&ds, B);
  1029   s = toStringG(&ds);
  1030   ck_assert_str_eq(s, "{\"0\":null,\"2\":[1,2],\"z\":[true,3]}");
  1031   free(s);
  1032   terminateG(B);
  1033   freeManyG(&n, &ds);
  1034 
  1035 
  1036 
  1037   // packed dicts
  1038   parseG(&n, "{"_"0"_":{},"_"1"_":{}, "_"2"_":{}, "_"3"_":{}, "_"4"_":{}, "_"5"_": 1}");
  1039   logVarG(&n);
  1040   B = serialG(&n);
  1041   logI("len %u", lenG(B));
  1042   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1043   s = sToString((smallt *) B->B);
  1044   ck_assert_str_eq(s, "[0x62,0x30,0x00,0x58,0x00,0x31,0x00,0x00,0x32,0x00,0x00,0x33,0x00,0x00,0x34,0x00,0x00,0x35,0x00,0x24]");
  1045   free(s);
  1046   deserialG(&ds, B);
  1047   s = toStringG(&ds);
  1048   ck_assert_str_eq(s, "{\"0\":{},\"1\":{},\"2\":{},\"3\":{},\"4\":{},\"5\":1}");
  1049   free(s);
  1050   terminateG(B);
  1051   freeManyG(&n, &ds);
  1052 
  1053   parseG(&n, "{"_"0"_":{"_"0"_":null,"_"1"_":1},"_"1"_":{"_"0"_":"_"0"_","_"1"_":1}, "_"2"_":{"_"0"_":"_"0"_","_"1"_":1}, "_"3"_":{"_"0"_":"_"0"_","_"1"_":1}, "_"4"_":{"_"0"_":"_"0"_","_"1"_":1}, "_"5"_": 1}");
  1054   logVarG(&n);
  1055   B = serialG(&n);
  1056   logI("len %u", lenG(B));
  1057   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1058   s = sToString((smallt *) B->B);
  1059   ck_assert_str_eq(s, "[0x62,0x30,0x00,0x58,0x02,0x30,0x00,0x40,0x31,0x00,0x02,0x31,0x00,0x02,0x30,0x00,0x45,0x30,0x00,0x31,0x00,0x02,0x32,0x00,0x02,0x30,0x00,0x45,0x30,0x00,0x31,0x00,0x02,0x33,0x00,0x02,0x30,0x00,0x45,0x30,0x00,0x31,0x00,0x02,0x34,0x00,0x02,0x30,0x00,0x45,0x30,0x00,0x31,0x00,0x02,0x35,0x00,0x24]");
  1060   free(s);
  1061   deserialG(&ds, B);
  1062   s = toStringG(&ds);
  1063   ck_assert_str_eq(s, "{\"0\":{\"0\":null,\"1\":1},\"1\":{\"0\":\"0\",\"1\":1},\"2\":{\"0\":\"0\",\"1\":1},\"3\":{\"0\":\"0\",\"1\":1},\"4\":{\"0\":\"0\",\"1\":1},\"5\":1}");
  1064   free(s);
  1065   terminateG(B);
  1066   freeManyG(&n, &ds);
  1067 
  1068   // high nibble packed dicts
  1069   parseG(&n, "{\"a\": null,"_"0"_":{},"_"1"_":{}, "_"2"_":{}, "_"3"_":{}, "_"4"_":{}, "_"5"_": 1}");
  1070   logVarG(&n);
  1071   B = serialG(&n);
  1072   logI("len %u", lenG(B));
  1073   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1074   s = sToString((smallt *) B->B);
  1075   ck_assert_str_eq(s, "[0x72,0x61,0x00,0x80,0x30,0x00,0x05,0x00,0x31,0x00,0x00,0x32,0x00,0x00,0x33,0x00,0x00,0x34,0x00,0x00,0x35,0x00,0x24]");
  1076   free(s);
  1077   deserialG(&ds, B);
  1078   s = toStringG(&ds);
  1079   ck_assert_str_eq(s, "{\"a\":null,\"0\":{},\"1\":{},\"2\":{},\"3\":{},\"4\":{},\"5\":1}");
  1080   free(s);
  1081   terminateG(B);
  1082   freeManyG(&n, &ds);
  1083 
  1084 
  1085   // packed doubles
  1086   parseG(&n, "{"_"0"_":0.0,"_"1"_":1.0, "_"2"_":2.0, "_"3"_":3.0, "_"4"_":4.0, "_"5"_": null}");
  1087   logVarG(&n);
  1088   B = serialG(&n);
  1089   logI("len %u", lenG(B));
  1090   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1091   s = sToString((smallt *) B->B);
  1092   ck_assert_str_eq(s, "[0x62,0x30,0x00,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x35,0x00,0x00]");
  1093   free(s);
  1094   deserialG(&ds, B);
  1095   s = toStringG(&ds);
  1096   ck_assert_str_eq(s, "{\"0\":0.000000e+00,\"1\":1.000000e+00,\"2\":2.000000e+00,\"3\":3.000000e+00,\"4\":4.000000e+00,\"5\":null}");
  1097   free(s);
  1098   terminateG(B);
  1099   freeManyG(&n, &ds);
  1100 
  1101   // high nibble packed doubles
  1102   parseG(&n, "{\"a\": null, "_"0"_":0.0,"_"1"_":1.0, "_"2"_":2.0, "_"3"_":3.0, "_"4"_":4.0, "_"5"_": null}");
  1103   logVarG(&n);
  1104   B = serialG(&n);
  1105   logI("len %u", lenG(B));
  1106   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1107   s = sToString((smallt *) B->B);
  1108   ck_assert_str_eq(s, "[0x72,0x61,0x00,0x90,0x30,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x35,0x00,0x00]");
  1109   free(s);
  1110   deserialG(&ds, B);
  1111   s = toStringG(&ds);
  1112   ck_assert_str_eq(s, "{\"a\":null,\"0\":0.000000e+00,\"1\":1.000000e+00,\"2\":2.000000e+00,\"3\":3.000000e+00,\"4\":4.000000e+00,\"5\":null}");
  1113   free(s);
  1114   terminateG(B);
  1115   freeManyG(&n, &ds);
  1116 
  1117 
  1118   // packed ints
  1119   parseG(&n, "{\"1\":1,\"2\":2,\"3\":3,\"4\":4,\"Z\":\"l\"}");
  1120   logVarG(&n);
  1121   B = serialG(&n);
  1122   logI("len %u", lenG(B));
  1123   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1124   s = sToString((smallt *) B->B);
  1125   ck_assert_str_eq(s, "[0x52,0x31,0x00,0x4a,0x02,0x32,0x00,0x04,0x33,0x00,0x06,0x34,0x00,0x08,0x5a,0x00,0x05,0x6c,0x00]");
  1126   free(s);
  1127   deserialG(&ds, B);
  1128   s = toStringG(&ds);
  1129   ck_assert_str_eq(s, "{\"1\":1,\"2\":2,\"3\":3,\"4\":4,\"Z\":\"l\"}");
  1130   free(s);
  1131   terminateG(B);
  1132   freeManyG(&n, &ds);
  1133 
  1134   // high nibble packed ints
  1135   parseG(&n, "{\"0\":null,\"1\":1,\"2\":2,\"3\":3,\"4\":4,\"Z\":\"l\"}");
  1136   logVarG(&n);
  1137   B = serialG(&n);
  1138   logI("len %u", lenG(B));
  1139   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1140   s = sToString((smallt *) B->B);
  1141   ck_assert_str_eq(s, "[0x62,0x30,0x00,0xa0,0x31,0x00,0x04,0x02,0x32,0x00,0x04,0x33,0x00,0x06,0x34,0x00,0x08,0x5a,0x00,0x05,0x6c,0x00]");
  1142   free(s);
  1143   deserialG(&ds, B);
  1144   s = toStringG(&ds);
  1145   ck_assert_str_eq(s, "{\"0\":null,\"1\":1,\"2\":2,\"3\":3,\"4\":4,\"Z\":\"l\"}");
  1146   free(s);
  1147   terminateG(B);
  1148   freeManyG(&n, &ds);
  1149 
  1150 
  1151   // packed strings
  1152   parseG(&n, "{\"1\":\"1\",\"2\":\"2\",\"3\":\"3\",\"4\":\"4\",\"Z\":null}");
  1153   logVarG(&n);
  1154   B = serialG(&n);
  1155   logI("len %u", lenG(B));
  1156   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1157   s = sToString((smallt *) B->B);
  1158   ck_assert_str_eq(s, "[0x52,0x31,0x00,0x4b,0x31,0x00,0x32,0x00,0x32,0x00,0x33,0x00,0x33,0x00,0x34,0x00,0x34,0x00,0x5a,0x00,0x00]");
  1159   free(s);
  1160   deserialG(&ds, B);
  1161   s = toStringG(&ds);
  1162   ck_assert_str_eq(s, "{\"1\":\"1\",\"2\":\"2\",\"3\":\"3\",\"4\":\"4\",\"Z\":null}");
  1163   free(s);
  1164   terminateG(B);
  1165   freeManyG(&n, &ds);
  1166 
  1167   // high nibble packed strings
  1168   parseG(&n, "{\"0\":null,\"1\":\"1\",\"2\":\"2\",\"3\":\"3\",\"4\":\"4\",\"Z\":null}");
  1169   logVarG(&n);
  1170   B = serialG(&n);
  1171   logI("len %u", lenG(B));
  1172   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1173   s = sToString((smallt *) B->B);
  1174   ck_assert_str_eq(s, "[0x62,0x30,0x00,0xb0,0x31,0x00,0x04,0x31,0x00,0x32,0x00,0x32,0x00,0x33,0x00,0x33,0x00,0x34,0x00,0x34,0x00,0x5a,0x00,0x00]");
  1175   free(s);
  1176   deserialG(&ds, B);
  1177   s = toStringG(&ds);
  1178   ck_assert_str_eq(s, "{\"0\":null,\"1\":\"1\",\"2\":\"2\",\"3\":\"3\",\"4\":\"4\",\"Z\":null}");
  1179   free(s);
  1180   terminateG(B);
  1181   freeManyG(&n, &ds);
  1182 
  1183   // packed arrays
  1184   parseG(&n, "{\"1\":[],\"2\":[1],\"3\":[\"3r\"],\"4\":[true],\"Z\":null}");
  1185   logVarG(&n);
  1186   B = serialG(&n);
  1187   logI("len %u", lenG(B));
  1188   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1189   s = sToString((smallt *) B->B);
  1190   ck_assert_str_eq(s, "[0x52,0x31,0x00,0x4c,0x00,0x32,0x00,0x01,0x24,0x33,0x00,0x01,0x15,0x33,0x72,0x00,0x34,0x00,0x01,0x01,0x5a,0x00,0x00]");
  1191   free(s);
  1192   deserialG(&ds, B);
  1193   s = toStringG(&ds);
  1194   ck_assert_str_eq(s, "{\"1\":[],\"2\":[1],\"3\":[\"3r\"],\"4\":[true],\"Z\":null}");
  1195   free(s);
  1196   terminateG(B);
  1197   freeManyG(&n, &ds);
  1198 
  1199   // high nibble packed arrays
  1200   parseG(&n, "{\"0\":null,\"1\":[],\"2\":[1],\"3\":[\"3r\"],\"4\":[true],\"Z\":null}");
  1201   logVarG(&n);
  1202   B = serialG(&n);
  1203   logI("len %u", lenG(B));
  1204   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1205   s = sToString((smallt *) B->B);
  1206   ck_assert_str_eq(s, "[0x62,0x30,0x00,0xc0,0x31,0x00,0x04,0x00,0x32,0x00,0x01,0x24,0x33,0x00,0x01,0x15,0x33,0x72,0x00,0x34,0x00,0x01,0x01,0x5a,0x00,0x00]");
  1207   free(s);
  1208   deserialG(&ds, B);
  1209   s = toStringG(&ds);
  1210   ck_assert_str_eq(s, "{\"0\":null,\"1\":[],\"2\":[1],\"3\":[\"3r\"],\"4\":[true],\"Z\":null}");
  1211   free(s);
  1212   terminateG(B);
  1213   freeManyG(&n, &ds);
  1214 
  1215   // smallBytes
  1216   parseG(&n, "{"_"0"_":null,"_"z"_":[true,3]}");
  1217   createSmallBytes(b);
  1218   pushG(&b, 1);
  1219   pushG(&b, 2);
  1220   pushG(&b, 3);
  1221   pushG(&b, 4);
  1222   pushG(&b, 5);
  1223   pushG(&b, 6);
  1224   setG(&n, "bytes", &b);
  1225   logVarG(&n);
  1226   B = serialG(&n);
  1227   logI("len %u", lenG(B));
  1228   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1229   s = sToString((smallt *) B->B);
  1230   ck_assert_str_eq(s, "[0x32,0x30,0x00,0x60,0x7a,0x00,0x02,0x11,0x64,0x62,0x79,0x74,0x65,0x73,0x00,0x67,0x01,0x02,0x03,0x04,0x05,0x06]");
  1231   free(s);
  1232   deserialG(&ds, B);
  1233   s = toStringG(&ds);
  1234   ck_assert_str_eq(s, "{"_"0"_":null,"_"z"_":[true,3],"_"bytes"_":[0x01,0x02,0x03,0x04,0x05,0x06]}");
  1235   free(s);
  1236   terminateG(B);
  1237   freeManyG(&n, &ds);
  1238 
  1239   parseG(&n, "{"_"0"_":null,"_"z"_":[true,3],"_"1"_":null}");
  1240   initiateG(&b);
  1241   pushG(&b, 1);
  1242   pushG(&b, 2);
  1243   pushG(&b, 3);
  1244   pushG(&b, 4);
  1245   pushG(&b, 5);
  1246   pushG(&b, 6);
  1247   setG(&n, "bytes", &b);
  1248   logVarG(&n);
  1249   B = serialG(&n);
  1250   logI("len %u", lenG(B));
  1251   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1252   s = sToString((smallt *) B->B);
  1253   ck_assert_str_eq(s, "[0x42,0x30,0x00,0x60,0x7a,0x00,0x02,0x11,0x64,0x31,0x00,0x70,0x62,0x79,0x74,0x65,0x73,0x00,0x06,0x01,0x02,0x03,0x04,0x05,0x06]");
  1254   free(s);
  1255   deserialG(&ds, B);
  1256   s = toStringG(&ds);
  1257   ck_assert_str_eq(s, "{"_"0"_":null,"_"z"_":[true,3],"_"1"_":null,"_"bytes"_":[0x01,0x02,0x03,0x04,0x05,0x06]}");
  1258   free(s);
  1259   terminateG(B);
  1260   freeManyG(&n, &ds);
  1261 
  1262 }
  1263 
  1264 
  1265 // array with values, dict, array, uniforms, packed test high/low nibbles
  1266 void arrayT(void) {
  1267 
  1268   // STEPS
  1269   // init
  1270   // init allocate
  1271   // terminate
  1272   // allocate
  1273   // string
  1274   // duplicate
  1275 
  1276   createNetSerial(n);
  1277   createNetSerial(ds);
  1278   char *s;
  1279   smallBytest *B;
  1280   createSmallArray(A);
  1281   createSmallArray(a);
  1282 
  1283   // null and uniform array
  1284   initiateG(&A);
  1285   pushG(&A, NULL);
  1286   initiateG(&a);
  1287   pushG(&a, 1);
  1288   pushG(&a, 2);
  1289   pushG(&a, 3);
  1290   pushG(&a, 4);
  1291   pushG(&A, &a);
  1292   setTopG(&n, &A);
  1293   logVarG(&n);
  1294   B = serialG(&n);
  1295   logI("len %u", lenG(B));
  1296   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1297   s = sToString((smallt *) B->B);
  1298   ck_assert_str_eq(s, "[0x26,0xf0,0x44,0x02,0x04,0x06,0x08]");
  1299   free(s);
  1300   deserialG(&ds, B);
  1301   s = toStringG(&ds);
  1302   //ck_assert_str_eq(s, "[null,null]");
  1303   ck_assert_str_eq(s, "[null,[1,2,3,4]]");
  1304   free(s);
  1305   terminateG(B);
  1306   freeManyG(&n, &ds);
  1307 
  1308   // uniform array in high low
  1309   initiateG(&A);
  1310   pushG(&A, FALSE);
  1311   initiateG(&a);
  1312   pushG(&a, 1);
  1313   pushG(&a, 2);
  1314   pushG(&a, 3);
  1315   pushG(&a, 4);
  1316   pushG(&A, &a);
  1317   setTopG(&n, &A);
  1318   logVarG(&n);
  1319   B = serialG(&n);
  1320   logI("len %u", lenG(B));
  1321   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1322   s = sToString((smallt *) B->B);
  1323   ck_assert_str_eq(s, "[0x26,0x01,0x4f,0x04,0x02,0x04,0x06,0x08]");
  1324   free(s);
  1325   deserialG(&ds, B);
  1326   s = toStringG(&ds);
  1327   //ck_assert_str_eq(s, "[null,null]");
  1328   ck_assert_str_eq(s, "[false,[1,2,3,4]]");
  1329   free(s);
  1330   terminateG(B);
  1331   freeManyG(&n, &ds);
  1332 
  1333   // uniform array in high nibble
  1334   initiateG(&A);
  1335   pushG(&A, "1");
  1336   initiateG(&a);
  1337   pushG(&a, 1);
  1338   pushG(&a, 2);
  1339   pushG(&a, 3);
  1340   pushG(&a, 4);
  1341   pushG(&A, &a);
  1342   setTopG(&n, &A);
  1343   logVarG(&n);
  1344   B = serialG(&n);
  1345   logI("len %u", lenG(B));
  1346   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1347   s = sToString((smallt *) B->B);
  1348   ck_assert_str_eq(s, "[0x26,0xf5,0x31,0x00,0x44,0x02,0x04,0x06,0x08]");
  1349   free(s);
  1350   deserialG(&ds, B);
  1351   s = toStringG(&ds);
  1352   ck_assert_str_eq(s, "[\"1\",[1,2,3,4]]");
  1353   free(s);
  1354   terminateG(B);
  1355   freeManyG(&n, &ds);
  1356 
  1357   // high nibble array
  1358   parseG(&n, "[null, [1,null]]");
  1359   logVarG(&n);
  1360   B = serialG(&n);
  1361   logI("len %u", lenG(B));
  1362   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1363   s = sToString((smallt *) B->B);
  1364   ck_assert_str_eq(s, "[0x26,0x60,0x02,0x24,0x00]");
  1365   free(s);
  1366   deserialG(&ds, B);
  1367   s = toStringG(&ds);
  1368   ck_assert_str_eq(s, "[null,[1,null]]");
  1369   free(s);
  1370   terminateG(B);
  1371   freeManyG(&n, &ds);
  1372 
  1373   // low and high undefined
  1374   parseG(&n, "[null,null,1]");
  1375   logVarG(&n);
  1376   B = serialG(&n);
  1377   logI("len %u", lenG(B));
  1378   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1379   s = sToString((smallt *) B->B);
  1380   ck_assert_str_eq(s, "[0x36,0x00,0x24]");
  1381   free(s);
  1382   deserialG(&ds, B);
  1383   s = toStringG(&ds);
  1384   ck_assert_str_eq(s, "[null,null,1]");
  1385   free(s);
  1386   terminateG(B);
  1387   freeManyG(&n, &ds);
  1388 
  1389   // low and high nibble bool
  1390   parseG(&n, "[null,true,false,false,true,true,false,true,false,true,true,true,true,true]");
  1391   logVarG(&n);
  1392   B = serialG(&n);
  1393   logI("len %u", lenG(B));
  1394   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1395   s = sToString((smallt *) B->B);
  1396   ck_assert_str_eq(s, "[0xe6,0x01,0x10,0x59,0x11,0x11,0x11,0x11,0x1f,0x11,0x11]");
  1397   free(s);
  1398   deserialG(&ds, B);
  1399   s = toStringG(&ds);
  1400   ck_assert_str_eq(s, "[null,true,false,false,true,true,false,true,false,true,true,true,true,true]");
  1401   free(s);
  1402   terminateG(B);
  1403   freeManyG(&n, &ds);
  1404 
  1405   // low and high nibble bool - ctx->boolOffset != 0 ctx->nibble == lowNbl ctx->boolShift == 8
  1406   parseG(&n, "[true,false,false,true,null,true,false,true,false,true,true,true,true,true]");
  1407   logVarG(&n);
  1408   B = serialG(&n);
  1409   logI("len %u", lenG(B));
  1410   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1411   s = sToString((smallt *) B->B);
  1412   ck_assert_str_eq(s, "[0xe6,0x01,0x91,0x11,0x01,0x51,0x11,0x11,0x1f,0x11,0x11]");
  1413   free(s);
  1414   deserialG(&ds, B);
  1415   s = toStringG(&ds);
  1416   ck_assert_str_eq(s, "[true,false,false,true,null,true,false,true,false,true,true,true,true,true]");
  1417   free(s);
  1418   terminateG(B);
  1419   freeManyG(&n, &ds);
  1420 
  1421 
  1422   // dict in array
  1423   parseG(&n, "[{\"0\":null,\"1\":1},{\"2\":2},{\"3\":3},null]");
  1424   logVarG(&n);
  1425   B = serialG(&n);
  1426   logI("len %u", lenG(B));
  1427   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1428   s = sToString((smallt *) B->B);
  1429   ck_assert_str_eq(s, "[0x46,0x22,0x30,0x00,0x40,0x31,0x00,0x02,0x4e,0x01,0x32,0x00,0x04,0x4e,0x01,0x33,0x00,0x06,0x00]");
  1430   free(s);
  1431   deserialG(&ds, B);
  1432   s = toStringG(&ds);
  1433   ck_assert_str_eq(s, "[{\"0\":null,\"1\":1},{\"2\":2},{\"3\":3},null]");
  1434   free(s);
  1435   terminateG(B);
  1436   freeManyG(&n, &ds);
  1437 
  1438   // double in array
  1439   parseG(&n, "[1.0,2.0,null]");
  1440   logVarG(&n);
  1441   B = serialG(&n);
  1442   logI("len %u", lenG(B));
  1443   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1444   s = sToString((smallt *) B->B);
  1445   ck_assert_str_eq(s, "[0x36,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00]");
  1446   free(s);
  1447   deserialG(&ds, B);
  1448   s = toStringG(&ds);
  1449   ck_assert_str_eq(s, "[1.000000e+00,2.000000e+00,null]");
  1450   free(s);
  1451   terminateG(B);
  1452   freeManyG(&n, &ds);
  1453 
  1454   // int in array
  1455   parseG(&n, "[1,2,null]");
  1456   logVarG(&n);
  1457   B = serialG(&n);
  1458   logI("len %u", lenG(B));
  1459   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1460   s = sToString((smallt *) B->B);
  1461   ck_assert_str_eq(s, "[0x36,0x24,0x44,0x00]");
  1462   free(s);
  1463   deserialG(&ds, B);
  1464   s = toStringG(&ds);
  1465   ck_assert_str_eq(s, "[1,2,null]");
  1466   free(s);
  1467   terminateG(B);
  1468   freeManyG(&n, &ds);
  1469 
  1470   // string in array
  1471   parseG(&n, "[\"1\",\"2\",null]");
  1472   logVarG(&n);
  1473   B = serialG(&n);
  1474   logI("len %u", lenG(B));
  1475   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1476   s = sToString((smallt *) B->B);
  1477   ck_assert_str_eq(s, "[0x36,0x55,0x31,0x00,0x32,0x00,0x00]");
  1478   free(s);
  1479   deserialG(&ds, B);
  1480   s = toStringG(&ds);
  1481   ck_assert_str_eq(s, "[\"1\",\"2\",null]");
  1482   free(s);
  1483   terminateG(B);
  1484   freeManyG(&n, &ds);
  1485 
  1486   // array in array
  1487   parseG(&n, "[[],[1,2],null]");
  1488   logVarG(&n);
  1489   B = serialG(&n);
  1490   logI("len %u", lenG(B));
  1491   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1492   s = sToString((smallt *) B->B);
  1493   ck_assert_str_eq(s, "[0x36,0x0f,0x00,0x4f,0x02,0x02,0x04,0x00]");
  1494   free(s);
  1495   deserialG(&ds, B);
  1496   s = toStringG(&ds);
  1497   ck_assert_str_eq(s, "[[],[1,2],null]");
  1498   free(s);
  1499   terminateG(B);
  1500   freeManyG(&n, &ds);
  1501 
  1502 
  1503   // packed dicts
  1504   parseG(&n, "[{\"1\":1},{\"2\":2},{\"3\":3},{\"4\":4},null]");
  1505   logVarG(&n);
  1506   B = serialG(&n);
  1507   logI("len %u", lenG(B));
  1508   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1509   s = sToString((smallt *) B->B);
  1510   ck_assert_str_eq(s, "[0x56,0x48,0x01,0x31,0x00,0x24,0x01,0x32,0x00,0x44,0x01,0x33,0x00,0x64,0x01,0x34,0x00,0x84,0x01,0x00]");
  1511   free(s);
  1512   deserialG(&ds, B);
  1513   s = toStringG(&ds);
  1514   ck_assert_str_eq(s, "[{\"1\":1},{\"2\":2},{\"3\":3},{\"4\":4},null]");
  1515   free(s);
  1516   terminateG(B);
  1517   freeManyG(&n, &ds);
  1518 
  1519   // high nibble packed dicts
  1520   parseG(&n, "[null,{\"1\":1},{\"2\":2},{\"3\":3},{\"4\":4},null]");
  1521   logVarG(&n);
  1522   B = serialG(&n);
  1523   logI("len %u", lenG(B));
  1524   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1525   s = sToString((smallt *) B->B);
  1526   ck_assert_str_eq(s, "[0x66,0x80,0x04,0x01,0x31,0x00,0x24,0x01,0x32,0x00,0x44,0x01,0x33,0x00,0x64,0x01,0x34,0x00,0x84,0x01,0x00]");
  1527   free(s);
  1528   deserialG(&ds, B);
  1529   s = toStringG(&ds);
  1530   ck_assert_str_eq(s, "[null,{\"1\":1},{\"2\":2},{\"3\":3},{\"4\":4},null]");
  1531   free(s);
  1532   terminateG(B);
  1533   freeManyG(&n, &ds);
  1534 
  1535   // packed doubles
  1536   parseG(&n, "[1.0,2.0,3.0,4.0,null]");
  1537   logVarG(&n);
  1538   B = serialG(&n);
  1539   logI("len %u", lenG(B));
  1540   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1541   s = sToString((smallt *) B->B);
  1542   ck_assert_str_eq(s, "[0x56,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x00]");
  1543   free(s);
  1544   deserialG(&ds, B);
  1545   s = toStringG(&ds);
  1546   ck_assert_str_eq(s, "[1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00,null]");
  1547   free(s);
  1548   terminateG(B);
  1549   freeManyG(&n, &ds);
  1550 
  1551   // high nibble packed doubles
  1552   parseG(&n, "[null,1.0,2.0,3.0,4.0,null]");
  1553   logVarG(&n);
  1554   B = serialG(&n);
  1555   logI("len %u", lenG(B));
  1556   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1557   s = sToString((smallt *) B->B);
  1558   ck_assert_str_eq(s, "[0x66,0x90,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x00]");
  1559   free(s);
  1560   deserialG(&ds, B);
  1561   s = toStringG(&ds);
  1562   ck_assert_str_eq(s, "[null,1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00,null]");
  1563   free(s);
  1564   terminateG(B);
  1565   freeManyG(&n, &ds);
  1566 
  1567   // packed ints
  1568   parseG(&n, "[1,2,3,4,null]");
  1569   logVarG(&n);
  1570   B = serialG(&n);
  1571   logI("len %u", lenG(B));
  1572   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1573   s = sToString((smallt *) B->B);
  1574   ck_assert_str_eq(s, "[0x56,0x4a,0x02,0x04,0x06,0x08,0x00]");
  1575   free(s);
  1576   deserialG(&ds, B);
  1577   s = toStringG(&ds);
  1578   ck_assert_str_eq(s, "[1,2,3,4,null]");
  1579   free(s);
  1580   terminateG(B);
  1581   freeManyG(&n, &ds);
  1582 
  1583   // high nibble packed ints
  1584   parseG(&n, "[null,1,2,3,4,null]");
  1585   logVarG(&n);
  1586   B = serialG(&n);
  1587   logI("len %u", lenG(B));
  1588   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1589   s = sToString((smallt *) B->B);
  1590   ck_assert_str_eq(s, "[0x66,0xa0,0x04,0x02,0x04,0x06,0x08,0x00]");
  1591   free(s);
  1592   deserialG(&ds, B);
  1593   s = toStringG(&ds);
  1594   ck_assert_str_eq(s, "[null,1,2,3,4,null]");
  1595   free(s);
  1596   terminateG(B);
  1597   freeManyG(&n, &ds);
  1598 
  1599   // packed strings
  1600   parseG(&n, "[\"1\",\"2\",\"3\",\"4\",null]");
  1601   logVarG(&n);
  1602   B = serialG(&n);
  1603   logI("len %u", lenG(B));
  1604   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1605   s = sToString((smallt *) B->B);
  1606   ck_assert_str_eq(s, "[0x56,0x4b,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x00]");
  1607   free(s);
  1608   deserialG(&ds, B);
  1609   s = toStringG(&ds);
  1610   ck_assert_str_eq(s, "[\"1\",\"2\",\"3\",\"4\",null]");
  1611   free(s);
  1612   terminateG(B);
  1613   freeManyG(&n, &ds);
  1614 
  1615   // high nibble packed strings
  1616   parseG(&n, "[null,\"1\",\"2\",\"3\",\"4\",null]");
  1617   logVarG(&n);
  1618   B = serialG(&n);
  1619   logI("len %u", lenG(B));
  1620   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1621   s = sToString((smallt *) B->B);
  1622   ck_assert_str_eq(s, "[0x66,0xb0,0x04,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x00]");
  1623   free(s);
  1624   deserialG(&ds, B);
  1625   s = toStringG(&ds);
  1626   ck_assert_str_eq(s, "[null,\"1\",\"2\",\"3\",\"4\",null]");
  1627   free(s);
  1628   terminateG(B);
  1629   freeManyG(&n, &ds);
  1630 
  1631   // packed arrays
  1632   parseG(&n, "[[1],[2],[3],[4],null]");
  1633   logVarG(&n);
  1634   B = serialG(&n);
  1635   logI("len %u", lenG(B));
  1636   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1637   s = sToString((smallt *) B->B);
  1638   ck_assert_str_eq(s, "[0x56,0x4c,0x01,0x24,0x01,0x44,0x01,0x64,0x01,0x84,0x01,0x00]");
  1639   free(s);
  1640   deserialG(&ds, B);
  1641   s = toStringG(&ds);
  1642   ck_assert_str_eq(s, "[[1],[2],[3],[4],null]");
  1643   free(s);
  1644   terminateG(B);
  1645   freeManyG(&n, &ds);
  1646 
  1647   // high nibble packed arrays
  1648   parseG(&n, "[null,[1],[2],[3],[4],null]");
  1649   logVarG(&n);
  1650   B = serialG(&n);
  1651   logI("len %u", lenG(B));
  1652   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1653   s = sToString((smallt *) B->B);
  1654   ck_assert_str_eq(s, "[0x66,0xc0,0x04,0x01,0x24,0x01,0x44,0x01,0x64,0x01,0x84,0x01,0x00]");
  1655   free(s);
  1656   deserialG(&ds, B);
  1657   s = toStringG(&ds);
  1658   ck_assert_str_eq(s, "[null,[1],[2],[3],[4],null]");
  1659   free(s);
  1660   terminateG(B);
  1661   freeManyG(&n, &ds);
  1662 
  1663   // smallBytes
  1664   parseG(&n, "[1,2,null]");
  1665   createSmallBytes(b);
  1666   pushG(&b, 1);
  1667   pushG(&b, 2);
  1668   pushG(&b, 3);
  1669   pushG(&b, 4);
  1670   pushG(&b, 5);
  1671   pushG(&b, 6);
  1672   pushG(&n, &b);
  1673   logVarG(&n);
  1674   B = serialG(&n);
  1675   logI("len %u", lenG(B));
  1676   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1677   s = sToString((smallt *) B->B);
  1678   ck_assert_str_eq(s, "[0x46,0x24,0x44,0x70,0x06,0x01,0x02,0x03,0x04,0x05,0x06]");
  1679   free(s);
  1680   deserialG(&ds, B);
  1681   s = toStringG(&ds);
  1682   ck_assert_str_eq(s, "[1,2,null,[0x01,0x02,0x03,0x04,0x05,0x06]]");
  1683   free(s);
  1684   terminateG(B);
  1685   freeManyG(&n, &ds);
  1686 
  1687   parseG(&n, "[1,2]");
  1688   initiateG(&b);
  1689   pushG(&b, 1);
  1690   pushG(&b, 2);
  1691   pushG(&b, 3);
  1692   pushG(&b, 4);
  1693   pushG(&b, 5);
  1694   pushG(&b, 6);
  1695   pushG(&n, &b);
  1696   logVarG(&n);
  1697   B = serialG(&n);
  1698   logI("len %u", lenG(B));
  1699   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1700   s = sToString((smallt *) B->B);
  1701   ck_assert_str_eq(s, "[0x36,0x24,0x44,0x67,0x01,0x02,0x03,0x04,0x05,0x06]");
  1702   free(s);
  1703   deserialG(&ds, B);
  1704   s = toStringG(&ds);
  1705   ck_assert_str_eq(s, "[1,2,[0x01,0x02,0x03,0x04,0x05,0x06]]");
  1706   free(s);
  1707   terminateG(B);
  1708   freeManyG(&n, &ds);
  1709 
  1710 }
  1711 
  1712 
  1713 void variousT(void) {
  1714 
  1715   createNetSerial(n);
  1716   createNetSerial(ds);
  1717   char *s;
  1718   smallBytest *B;
  1719 
  1720 
  1721   // array dict int bool string
  1722   parseG(&n, "[0, \"asd\", {\"rpc\":\"ds\", \"id\":1, \"p\":true}, [true, \"user\", [[false,\"name\",1], [true, \"name2\", 12340], [false, \"zxc\", 234]]]]");
  1723   logVarG(&n);
  1724   B = serialG(&n);
  1725   logI("len %u", lenG(B));
  1726   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1727   s = sToString((smallt *) B->B);
  1728   ck_assert_str_eq(s, "[0x46,0x04,0x25,0x61,0x73,0x64,0x00,0x03,0x72,0x70,0x63,0x00,0x45,0x64,0x73,0x00,0x69,0x64,0x00,0x02,0x70,0x00,0xb1,0x36,0x51,0x75,0x73,0x65,0x72,0x00,0x6f,0x03,0x03,0x51,0x6e,0x61,0x6d,0x65,0x00,0x24,0x03,0x51,0x6e,0x61,0x6d,0x65,0x32,0x00,0x84,0x8d,0x18,0x03,0x01,0x45,0x7a,0x78,0x63,0x00,0xd4,0x03]");
  1729   free(s);
  1730   deserialG(&ds, B);
  1731   s = toStringG(&ds);
  1732   ck_assert_str_eq(s, "[0,\"asd\",{\"rpc\":\"ds\",\"id\":1,\"p\":true},[true,\"user\",[[false,\"name\",1],[true,\"name2\",12340],[false,\"zxc\",234]]]]");
  1733   free(s);
  1734   terminateG(B);
  1735   freeManyG(&n, &ds);
  1736 
  1737   parseG(&n, "[[{a:1}, null, {a:1}, {a:1}]]");
  1738   logVarG(&n);
  1739   B = serialG(&n);
  1740   logI("len %u", lenG(B));
  1741   logSI("%s",toHexSepS(getValG(B), lenG(B), " "));
  1742   s = sToString((smallt *) B->B);
  1743   ck_assert_str_eq(s, "[0x6f,0x01,0x04,0x4e,0x01,0x61,0x00,0x02,0xe0,0x14,0x61,0x00,0x02,0x4e,0x01,0x61,0x00,0x02]");
  1744   free(s);
  1745   deserialG(&ds, B);
  1746   s = toStringG(&ds);
  1747   ck_assert_str_eq(s, "[[{\"a\":1},null,{\"a\":1},{\"a\":1}]]");
  1748   free(s);
  1749   terminateG(B);
  1750   freeManyG(&n, &ds);
  1751 
  1752 }
  1753 
  1754 
  1755 int main(int n, char**v) {
  1756 
  1757 initLibsheepy(v[0]);
  1758 setLogMode(LOG_FUNC);
  1759 
  1760 topT();
  1761 uniformDictT();
  1762 uniformArrayT();
  1763 dictT();
  1764 arrayT();
  1765 variousT();
  1766 }