solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

test_solstice_args.c (31140B)


      1 /* Copyright (C) 2018-2026 |Méso|Star> (contact@meso-star.com)
      2  * Copyright (C) 2016-2018 CNRS
      3  *
      4  * This program is free software: you can redistribute it and/or modify
      5  * it under the terms of the GNU General Public License as published by
      6  * the Free Software Foundation, either version 3 of the License, or
      7  * (at your option) any later version.
      8  *
      9  * This program is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     12  * GNU General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU General Public License
     15  * along with this program. If not, see <http://www.gnu.org/licenses/>. */
     16 
     17 #define _XOPEN_SOURCE /* strptime support */
     18 
     19 #include "solstice_args.h"
     20 
     21 #include <rsys/double3.h>
     22 #include <rsys/stretchy_array.h>
     23 
     24 #include <stdarg.h>
     25 #include <string.h>
     26 #include <limits.h>
     27 #include <time.h>
     28 
     29 static char**
     30 cmd_create(int dummy, ...)
     31 {
     32   va_list ap;
     33   va_list ap_cp;
     34   const char* str;
     35   size_t i, n = 0;
     36   char** cmd = NULL;
     37 
     38   va_start(ap, dummy);
     39   VA_COPY(ap_cp, ap);
     40   while((str = va_arg(ap, const char*))) ++n;
     41   va_end(ap);
     42 
     43   CHK((cmd = sa_add(cmd, n)) != NULL);
     44   i = 0;
     45   while((str = va_arg(ap_cp, const char*))) {
     46     cmd[i] = NULL;
     47     CHK((cmd[i] = sa_add(cmd[i], strlen(str)+1)) != NULL);
     48     strcpy(cmd[i], str);
     49     ++i;
     50   }
     51   va_end(ap_cp);
     52   return cmd;
     53 }
     54 
     55 static void
     56 cmd_delete(char** cmd)
     57 {
     58   size_t i = 0;
     59   const size_t n = sa_size(cmd);
     60   FOR_EACH(i, 0, n) sa_release(cmd[i]);
     61   sa_release(cmd);
     62 }
     63 
     64 static FINLINE int
     65 cmd_size(char** cmd)
     66 {
     67   return (int)sa_size(cmd);
     68 }
     69 
     70 static void
     71 test_rendering(void)
     72 {
     73   struct solstice_args args = SOLSTICE_ARGS_NULL;
     74   char** cmd = NULL;
     75   double tmp[3];
     76 
     77   cmd = cmd_create(0, "test", "-r", "img=1280x720", NULL);
     78   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
     79   CHK(args.rendering == 1);
     80   CHK(args.nexperiments == SOLSTICE_ARGS_DEFAULT.nexperiments);
     81   CHK(d3_eq(args.camera.pos, SOLSTICE_ARGS_DEFAULT.camera.pos) == 1);
     82   CHK(d3_eq(args.camera.tgt, SOLSTICE_ARGS_DEFAULT.camera.tgt) == 1);
     83   CHK(d3_eq(args.camera.up, SOLSTICE_ARGS_DEFAULT.camera.up) == 1);
     84   CHK(args.camera.fov_x == SOLSTICE_ARGS_DEFAULT.camera.fov_x);
     85   CHK(args.img.width == 1280);
     86   CHK(args.img.height == 720);
     87   CHK(args.img.spp == SOLSTICE_ARGS_DEFAULT.img.spp);
     88   CHK(args.render_mode == SOLSTICE_ARGS_DEFAULT.render_mode);
     89   CHK(args.quiet == 0);
     90   CHK(args.output_filename == NULL);
     91   solstice_args_release(&args);
     92   cmd_delete(cmd);
     93 
     94   cmd = cmd_create(0, "test", "-q", "-r", "img=640x480:fov=70:pos=1,2,3", NULL);
     95   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
     96   CHK(args.rendering == 1);
     97   CHK(args.nexperiments == SOLSTICE_ARGS_DEFAULT.nexperiments);
     98   CHK(d3_eq(args.camera.pos, d3(tmp, 1, 2, 3)) == 1);
     99   CHK(d3_eq(args.camera.tgt, SOLSTICE_ARGS_DEFAULT.camera.tgt) == 1);
    100   CHK(d3_eq(args.camera.up, SOLSTICE_ARGS_DEFAULT.camera.up) == 1);
    101   CHK(args.img.width == 640);
    102   CHK(args.img.height == 480);
    103   CHK(args.img.spp == SOLSTICE_ARGS_DEFAULT.img.spp);
    104   CHK(args.render_mode == SOLSTICE_ARGS_DEFAULT.render_mode);
    105   CHK(args.quiet == 1);
    106   CHK(eq_eps(args.camera.fov_x, 70, 1.e-6) == 1);
    107   CHK(args.output_filename == NULL);
    108   solstice_args_release(&args);
    109   cmd_delete(cmd);
    110 
    111   cmd = cmd_create(0, "test", "-r", "up=0,0,1:tgt=0,-10,0:rmode=draft", NULL);
    112   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    113   CHK(args.nexperiments == SOLSTICE_ARGS_DEFAULT.nexperiments);
    114   CHK(d3_eq(args.camera.pos, SOLSTICE_ARGS_DEFAULT.camera.pos) == 1);
    115   CHK(d3_eq(args.camera.tgt, d3(tmp, 0,-10, 0)) == 1);
    116   CHK(d3_eq(args.camera.up, d3(tmp, 0, 0, 1)) == 1);
    117   CHK(args.img.width == SOLSTICE_ARGS_DEFAULT.img.width);
    118   CHK(args.img.height == SOLSTICE_ARGS_DEFAULT.img.height);
    119   CHK(args.img.spp == SOLSTICE_ARGS_DEFAULT.img.spp);
    120   CHK(args.render_mode == SOLSTICE_ARGS_RENDER_DRAFT);
    121   CHK(args.rendering == 1);
    122   CHK(args.quiet == 0);
    123   CHK(args.output_filename == NULL);
    124   solstice_args_release(&args);
    125   cmd_delete(cmd);
    126 
    127   cmd = cmd_create(0, "test", "-r", "up=0,0,1:rmode=pt:spp=4", NULL);
    128   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    129   CHK(args.nexperiments == SOLSTICE_ARGS_DEFAULT.nexperiments);
    130   CHK(d3_eq(args.camera.up, d3(tmp, 0, 0, 1)) == 1);
    131   CHK(args.img.width == SOLSTICE_ARGS_DEFAULT.img.width);
    132   CHK(args.img.height == SOLSTICE_ARGS_DEFAULT.img.height);
    133   CHK(args.rendering == 1);
    134   CHK(args.output_filename == NULL);
    135   CHK(args.img.spp == 4);
    136   CHK(args.render_mode == SOLSTICE_ARGS_RENDER_PATH_TRACING);
    137   solstice_args_release(&args);
    138   cmd_delete(cmd);
    139 
    140   cmd = cmd_create(0, "test", "-r", "up=0,10,0", "-o", "my_output", NULL);
    141   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    142   CHK(d3_eq(args.camera.up, d3(tmp, 0, 10, 0)) == 1);
    143   CHK(args.rendering == 1);
    144   CHK(args.quiet == 0);
    145   CHK(strcmp(args.output_filename, "my_output") ==  0);
    146   solstice_args_release(&args);
    147   cmd_delete(cmd);
    148 
    149   cmd = cmd_create(0, "test", "-r", "spp=16", NULL);
    150   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    151   CHK(args.img.spp == 16);
    152   solstice_args_release(&args);
    153   cmd_delete(cmd);
    154 
    155   cmd = cmd_create(0, "test", "-r", "rmode=none", NULL);
    156   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    157   cmd_delete(cmd);
    158 
    159   cmd = cmd_create(0, "test", "-r", "rmode", NULL);
    160   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    161   cmd_delete(cmd);
    162 
    163 
    164   cmd = cmd_create(0, "test", "-r", "up=0,1", NULL);
    165   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    166   cmd_delete(cmd);
    167 
    168   cmd = cmd_create(0, "test", "-r", "tgt=0:1", NULL);
    169   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    170   cmd_delete(cmd);
    171 
    172   cmd = cmd_create(0, "test", "-r", "pos=0,10,1a", NULL);
    173   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    174   cmd_delete(cmd);
    175 
    176   cmd = cmd_create(0, "test", "-r", "pos=0,10,1:::::", NULL);
    177   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    178   CHK(d3_eq(args.camera.pos, d3(tmp, 0, 10, 1)) == 1);
    179   solstice_args_release(&args);
    180   cmd_delete(cmd);
    181 
    182   cmd = cmd_create(0, "test", "-r", "spp=0", NULL);
    183   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    184   cmd_delete(cmd);
    185 
    186   cmd = cmd_create(0, "test", "-r", "img=32X32", NULL);
    187   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    188   cmd_delete(cmd);
    189 
    190   cmd = cmd_create(0, "test", "-r", "img=32x32@12", NULL);
    191   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    192   cmd_delete(cmd);
    193 
    194   cmd = cmd_create(0, "test", "-r", "img=0x64", NULL);
    195   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    196   cmd_delete(cmd);
    197 
    198   cmd = cmd_create(0, "test", "-r", "img=64x0", NULL);
    199   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    200   cmd_delete(cmd);
    201 
    202   cmd = cmd_create(0, "test", "-r", "img=32x32@12:up=0,0,1", NULL);
    203   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    204   cmd_delete(cmd);
    205 
    206   cmd = cmd_create(0, "test", "-r", "tgt=1,1,1:img=32x32:12", NULL);
    207   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    208   cmd_delete(cmd);
    209 
    210   cmd = cmd_create(0, "test", "-r", "fov=123a", NULL);
    211   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    212   cmd_delete(cmd);
    213 
    214   cmd = cmd_create(0, "test", "-r", "up", NULL);
    215   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    216   cmd_delete(cmd);
    217 
    218   cmd = cmd_create(0, "test", "-r", "img=", NULL);
    219   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    220   cmd_delete(cmd);
    221 
    222   cmd = cmd_create(0, "test", "-r", "fov::::", NULL);
    223   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    224   cmd_delete(cmd);
    225 
    226   cmd = cmd_create(0, "test", "-r", "::tgt", NULL);
    227   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    228   cmd_delete(cmd);
    229 }
    230 
    231 static int
    232 tm_equal(const struct tm* tm1, const struct tm* tm2) {
    233   if(tm1->tm_year != tm2->tm_year) return 0;
    234   if(tm1->tm_mon != tm2->tm_mon) return 0;
    235   if(tm1->tm_mday != tm2->tm_mday) return 0;
    236   if(tm1->tm_hour != tm2->tm_hour) return 0;
    237   if(tm1->tm_min != tm2->tm_min) return 0;
    238   if(tm1->tm_sec != tm2->tm_sec) return 0;
    239   return 1;
    240 }
    241 
    242 static void
    243 test_sun_dirs(void)
    244 {
    245   struct tm ref;
    246   struct solstice_args args = SOLSTICE_ARGS_NULL;
    247   char *p;
    248   char timeOK[] = "2020-10-20T10:10:10";
    249   char* dirsBAD[] = {
    250   "1.2,3.4,5",
    251   "1.2,3.4:1",
    252   "1.2,3.4:5.2,A",
    253   "-0.1,2",
    254   "360,2",
    255   "0,-1",
    256   "0,91",
    257   NULL
    258   };
    259   char* locsBAD[] = {
    260     "-100,0",
    261     "100,0",
    262     "0,-200",
    263     "0,200",
    264     ",0",
    265     "0,",
    266     "0;0",
    267     "0,0,0",
    268     "A,0",
    269     "0,A",
    270     NULL
    271   };
    272   char* timeBAD[] = {
    273     "2020-10-20t10:10:10",
    274     "2020_10-20T10:10:10",
    275     "2020-10_20T10:10:10",
    276     "2020-10-20T10;10:10",
    277     "2020-10-20T10:10;10",
    278     "2020-19-20T10:10:10",
    279     "2020-10-20T10:10:100",
    280     "2020-10T10:10:10",
    281     "2020-10-20T10:10",
    282     "2020-A-20T10:10:10",
    283     "2020-10-20T10:10:A",
    284     "2020-10-20-5T10:10:10",
    285     "2020-10-20T10:10:10:10",
    286     "2020--20T10:10:10",
    287     "2020-10-20T10::10",
    288     "-10-20T10:10:10",
    289     "2020-10-20T:10:10",
    290     "2020-10-T10:10:10",
    291     "2020-10-20T10:10:",
    292     NULL
    293   };
    294   size_t i;
    295   char** cmd = NULL;
    296 
    297   p = strptime(timeOK, "%Y-%m-%dT%H:%M:%S", &ref);
    298   CHK(p != NULL && *p == '\0');
    299 
    300   cmd = cmd_create(0, "test", "-D", "0,1", NULL);
    301   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    302   CHK(args.nsun_dirs == 1);
    303   CHK(args.sun_dirs[0].type == SOLSTICE_ARGS_SPHERICAL);
    304   CHK(args.sun_dirs[0].spherical.azimuth == 0);
    305   CHK(eq_eps(args.sun_dirs[0].spherical.elevation, 1, 1.e-6) == 1);
    306   solstice_args_release(&args);
    307   cmd_delete(cmd);
    308 
    309   cmd = cmd_create(0, "test", "-D", "1.2,3.4", "-D", "3.14,0.123", NULL);
    310   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    311   CHK(args.nsun_dirs == 2);
    312 
    313   CHK(args.sun_dirs[0].type == SOLSTICE_ARGS_SPHERICAL);
    314   CHK(eq_eps(args.sun_dirs[0].spherical.azimuth, 1.2, 1.e-6) == 1);
    315   CHK(eq_eps(args.sun_dirs[0].spherical.elevation, 3.4, 1.e-6) == 1);
    316   CHK(args.sun_dirs[1].type == SOLSTICE_ARGS_SPHERICAL);
    317   CHK(eq_eps(args.sun_dirs[1].spherical.azimuth, 3.14, 1.e-6) == 1);
    318   CHK(eq_eps(args.sun_dirs[1].spherical.elevation, 0.123, 1.e-6) == 1);
    319   solstice_args_release(&args);
    320   cmd_delete(cmd);
    321 
    322   cmd = cmd_create(0, "test", "-L", "1.2,3.4", "-T", timeOK, NULL);
    323   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    324   CHK(args.nsun_dirs == 1);
    325 
    326   CHK(args.sun_dirs[0].type == SOLSTICE_ARGS_LOCATION_TIME);
    327   CHK(eq_eps(args.sun_dirs[0].location_time.latitude, 1.2, 1.e-6) == 1);
    328   CHK(eq_eps(args.sun_dirs[0].location_time.longitude, 3.4, 1.e-6) == 1);
    329   CHK(tm_equal(&args.sun_dirs[0].location_time.time, &ref) == 1);
    330   solstice_args_release(&args);
    331   cmd_delete(cmd);
    332 
    333   cmd = cmd_create(0, "test", "-L", "1,4", "-L", "1.2,3.4", "-T", timeOK, NULL);
    334   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    335   CHK(args.nsun_dirs == 1);
    336 
    337   CHK(args.sun_dirs[0].type == SOLSTICE_ARGS_LOCATION_TIME);
    338   CHK(eq_eps(args.sun_dirs[0].location_time.latitude, 1.2, 1.e-6) == 1);
    339   CHK(eq_eps(args.sun_dirs[0].location_time.longitude, 3.4, 1.e-6) == 1);
    340   CHK(tm_equal(&args.sun_dirs[0].location_time.time, &ref) == 1);
    341   solstice_args_release(&args);
    342   cmd_delete(cmd);
    343 
    344   cmd = cmd_create(0, "test", "-L", "1.2,3.4", "-T", timeOK, "-T", timeOK, NULL);
    345   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    346   CHK(args.nsun_dirs == 2);
    347 
    348   CHK(args.sun_dirs[0].type == SOLSTICE_ARGS_LOCATION_TIME);
    349   CHK(eq_eps(args.sun_dirs[0].location_time.latitude, 1.2, 1.e-6) == 1);
    350   CHK(eq_eps(args.sun_dirs[0].location_time.longitude, 3.4, 1.e-6) == 1);
    351   CHK(tm_equal(&args.sun_dirs[0].location_time.time, &ref) == 1);
    352   CHK(args.sun_dirs[1].type == SOLSTICE_ARGS_LOCATION_TIME);
    353   CHK(eq_eps(args.sun_dirs[1].location_time.latitude, 1.2, 1.e-6) == 1);
    354   CHK(eq_eps(args.sun_dirs[1].location_time.longitude, 3.4, 1.e-6) == 1);
    355   CHK(tm_equal(&args.sun_dirs[1].location_time.time, &ref) == 1);
    356   solstice_args_release(&args);
    357   cmd_delete(cmd);
    358 
    359   cmd = cmd_create(0, "test", "-L", "1,3", "-T", timeOK, "-L", "2,4", "-T", timeOK, NULL);
    360   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    361   CHK(args.nsun_dirs == 2);
    362 
    363   CHK(args.sun_dirs[0].type == SOLSTICE_ARGS_LOCATION_TIME);
    364   CHK(eq_eps(args.sun_dirs[0].location_time.latitude, 1, 1.e-6) == 1);
    365   CHK(eq_eps(args.sun_dirs[0].location_time.longitude, 3, 1.e-6) == 1);
    366   CHK(tm_equal(&args.sun_dirs[0].location_time.time, &ref) == 1);
    367   CHK(args.sun_dirs[1].type == SOLSTICE_ARGS_LOCATION_TIME);
    368   CHK(eq_eps(args.sun_dirs[1].location_time.latitude, 2, 1.e-6) == 1);
    369   CHK(eq_eps(args.sun_dirs[1].location_time.longitude, 4, 1.e-6) == 1);
    370   CHK(tm_equal(&args.sun_dirs[1].location_time.time, &ref) == 1);
    371   solstice_args_release(&args);
    372   cmd_delete(cmd);
    373 
    374   cmd = cmd_create(0, "test", "-D", "1.2,3.4", "-L", "1.2,3.4", "-T", timeOK, NULL);
    375   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    376   CHK(args.nsun_dirs == 2);
    377 
    378   CHK(args.sun_dirs[0].type == SOLSTICE_ARGS_SPHERICAL);
    379   CHK(eq_eps(args.sun_dirs[0].spherical.azimuth, 1.2, 1.e-6) == 1);
    380   CHK(eq_eps(args.sun_dirs[0].spherical.elevation, 3.4, 1.e-6) == 1);
    381   CHK(args.sun_dirs[1].type == SOLSTICE_ARGS_LOCATION_TIME);
    382   CHK(eq_eps(args.sun_dirs[1].location_time.latitude, 1.2, 1.e-6) == 1);
    383   CHK(eq_eps(args.sun_dirs[1].location_time.longitude, 3.4, 1.e-6) == 1);
    384   CHK(tm_equal(&args.sun_dirs[1].location_time.time, &ref) == 1);
    385   solstice_args_release(&args);
    386   cmd_delete(cmd);
    387 
    388   cmd = cmd_create(0, "test", "-D", "1.2,3.4", "-D", "3.14,0.123", "-D", "2.01,23.1", NULL);
    389   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    390   CHK(args.nsun_dirs == 3);
    391 
    392   CHK(args.sun_dirs[0].type == SOLSTICE_ARGS_SPHERICAL);
    393   CHK(eq_eps(args.sun_dirs[0].spherical.azimuth, 1.2, 1.e-6) == 1);
    394   CHK(eq_eps(args.sun_dirs[0].spherical.elevation, 3.4, 1.e-6) == 1);
    395   CHK(args.sun_dirs[1].type == SOLSTICE_ARGS_SPHERICAL);
    396   CHK(eq_eps(args.sun_dirs[1].spherical.azimuth, 3.14, 1.e-6) == 1);
    397   CHK(eq_eps(args.sun_dirs[1].spherical.elevation, 0.123, 1.e-6) == 1);
    398   CHK(args.sun_dirs[2].type == SOLSTICE_ARGS_SPHERICAL);
    399   CHK(eq_eps(args.sun_dirs[2].spherical.azimuth, 2.01, 1.e-6) == 1);
    400   CHK(eq_eps(args.sun_dirs[2].spherical.elevation, 23.1, 1.e-6) == 1);
    401   solstice_args_release(&args);
    402   cmd_delete(cmd);
    403 
    404   cmd = cmd_create(0, "test", "-T", timeOK, "-L", "1.2,3.4", NULL);
    405   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    406   cmd_delete(cmd);
    407 
    408   for(i = 0; i < sizeof(dirsBAD)/sizeof(*dirsBAD); i++) {
    409   cmd = cmd_create(0, "test", "-D", dirsBAD[i], NULL);
    410     CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    411     cmd_delete(cmd);
    412   }
    413 
    414   for(i = 0; i < sizeof(locsBAD)/sizeof(*locsBAD); i++) {
    415     cmd = cmd_create(0, "test", "-L", locsBAD[i], NULL);
    416     CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    417     cmd_delete(cmd);
    418   }
    419 
    420   for(i = 0; i < sizeof(timeBAD)/sizeof(*timeBAD); i++) {
    421     cmd = cmd_create(0, "test", "-L", "1.2,3.4", "-T", timeBAD[i], NULL);
    422     CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    423     cmd_delete(cmd);
    424   }
    425 
    426   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    427   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    428   solstice_args_release(&args);
    429   cmd_delete(cmd);
    430 }
    431 
    432 static void
    433 test_realisations_count(void)
    434 {
    435   struct solstice_args args = SOLSTICE_ARGS_NULL;
    436   char** cmd = NULL;
    437 
    438   cmd = cmd_create(0, "test", "-D", "0,90", "-n", "1", NULL);
    439   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    440   CHK(args.nexperiments == 1);
    441   solstice_args_release(&args);
    442   cmd_delete(cmd);
    443 
    444   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    445   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    446   CHK(args.nexperiments == SOLSTICE_ARGS_DEFAULT.nexperiments);
    447   solstice_args_release(&args);
    448   cmd_delete(cmd);
    449 
    450   cmd = cmd_create(0, "test", "-D", "0,90", "-n", "123", NULL);
    451   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    452   CHK(args.nexperiments == 123);
    453   solstice_args_release(&args);
    454   cmd_delete(cmd);
    455 
    456   cmd = cmd_create(0, "test", "-D", "0,90", "-n", "0", NULL);
    457   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    458   cmd_delete(cmd);
    459 
    460   cmd = cmd_create(0, "test", "-D", "0,90", "-n", "3.14", NULL);
    461   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    462   cmd_delete(cmd);
    463 
    464   cmd = cmd_create(0, "test", "-D", "0,90", "-n", NULL);
    465   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    466   cmd_delete(cmd);
    467 }
    468 
    469 static void
    470 test_threads_count(void)
    471 {
    472   struct solstice_args args = SOLSTICE_ARGS_NULL;
    473   char** cmd = NULL;
    474 
    475   cmd = cmd_create(0, "test", "-D", "0,90", "-t", "1", NULL);
    476   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    477   CHK(args.nthreads == 1);
    478   solstice_args_release(&args);
    479   cmd_delete(cmd);
    480 
    481   cmd = cmd_create(0, "test", "-D", "0,90", "-t", "123", NULL);
    482   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    483   CHK(args.nthreads == 123);
    484   solstice_args_release(&args);
    485   cmd_delete(cmd);
    486 
    487   cmd = cmd_create(0, "test", "-D", "0,90", "-t", "-1", NULL);
    488   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    489   CHK(args.nthreads == UINT_MAX);
    490   solstice_args_release(&args);
    491   cmd_delete(cmd);
    492 
    493   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    494   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    495   CHK(args.nthreads == SOLSTICE_ARGS_DEFAULT.nthreads);
    496   solstice_args_release(&args);
    497   cmd_delete(cmd);
    498 
    499   cmd = cmd_create(0, "test", "-D", "0,90", "-t", "0", NULL);
    500   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    501   cmd_delete(cmd);
    502 
    503   cmd = cmd_create(0, "test", "-D", "0,90", "-t", "3.14", NULL);
    504   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    505   cmd_delete(cmd);
    506 
    507   cmd = cmd_create(0, "test", "-D", "0,90", "-t", NULL);
    508   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    509   cmd_delete(cmd);
    510 }
    511 
    512 static void
    513 test_output(void)
    514 {
    515   struct solstice_args args = SOLSTICE_ARGS_NULL;
    516   char** cmd = NULL;
    517 
    518   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    519   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    520   CHK(args.output_filename == NULL);
    521   solstice_args_release(&args);
    522   cmd_delete(cmd);
    523 
    524   cmd = cmd_create(0, "test", "-D", "0,90", "-o", "my_output", NULL);
    525   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    526   CHK(strcmp(args.output_filename, "my_output") == 0);
    527   solstice_args_release(&args);
    528   cmd_delete(cmd);
    529 
    530   cmd = cmd_create(0, "test", "-D", "0,90", "-o", "hello_world", NULL);
    531   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    532   CHK(strcmp(args.output_filename, "hello_world") == 0);
    533   solstice_args_release(&args);
    534   cmd_delete(cmd);
    535 
    536   cmd = cmd_create(0, "test", "-D", "0,90", "-o", NULL);
    537   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    538   cmd_delete(cmd);
    539 }
    540 
    541 static void
    542 test_quiet(void)
    543 {
    544   struct solstice_args args = SOLSTICE_ARGS_NULL;
    545   char** cmd = NULL;
    546 
    547   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    548   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    549   CHK(args.quiet == SOLSTICE_ARGS_DEFAULT.quiet);
    550   CHK(args.quiet == 0);
    551   solstice_args_release(&args);
    552   cmd_delete(cmd);
    553 
    554   cmd = cmd_create(0, "test", "-D", "0,90", "-q", NULL);
    555   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    556   CHK(args.quiet == 1);
    557   solstice_args_release(&args);
    558   cmd_delete(cmd);
    559 }
    560 
    561 static void
    562 test_verbose(void)
    563 {
    564   struct solstice_args args = SOLSTICE_ARGS_NULL;
    565   char** cmd = NULL;
    566 
    567   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    568   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    569   CHK(args.verbose == SOLSTICE_ARGS_DEFAULT.verbose);
    570   CHK(args.verbose == 0);
    571   solstice_args_release(&args);
    572   cmd_delete(cmd);
    573 
    574   cmd = cmd_create(0, "test", "-D", "0,90", "-v", NULL);
    575   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    576   CHK(args.verbose == 1);
    577   solstice_args_release(&args);
    578   cmd_delete(cmd);
    579 }
    580 
    581 static void
    582 test_receivers(void)
    583 {
    584   struct solstice_args args = SOLSTICE_ARGS_NULL;
    585   char** cmd = NULL;
    586 
    587   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    588   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    589   CHK(args.receivers_filename == SOLSTICE_ARGS_DEFAULT.receivers_filename);
    590   solstice_args_release(&args);
    591   cmd_delete(cmd);
    592 
    593   cmd = cmd_create(0, "test", "-D", "0,90", "-R", "my_receivers", NULL);
    594   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    595   CHK(strcmp(args.receivers_filename, "my_receivers") == 0);
    596   solstice_args_release(&args);
    597   cmd_delete(cmd);
    598 
    599   cmd = cmd_create(0, "test", "-D", "0,90", "-R", "foo bar", NULL);
    600   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    601   CHK(strcmp(args.receivers_filename, "foo bar") == 0);
    602   solstice_args_release(&args);
    603   cmd_delete(cmd);
    604 
    605   cmd = cmd_create(0, "test", "-D", "0,90", "-R", NULL);
    606   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    607   solstice_args_release(&args);
    608   cmd_delete(cmd);
    609 }
    610 
    611 static void
    612 test_input(void)
    613 {
    614   struct solstice_args args = SOLSTICE_ARGS_NULL;
    615   char** cmd = NULL;
    616 
    617   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    618   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    619   CHK(args.input_filename == SOLSTICE_ARGS_DEFAULT.input_filename);
    620   CHK(args.input_filename == NULL);
    621   solstice_args_release(&args);
    622   cmd_delete(cmd);
    623 
    624   cmd = cmd_create(0, "test", "-D", "0,90", "my_input", NULL);
    625   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    626   CHK(strcmp(args.input_filename, "my_input") == 0);
    627   solstice_args_release(&args);
    628   cmd_delete(cmd);
    629 }
    630 
    631 static void
    632 test_dump(void)
    633 {
    634   struct solstice_args args = SOLSTICE_ARGS_NULL;
    635   char** cmd = NULL;
    636 
    637   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    638   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    639   CHK(args.dump_format == SOLSTICE_ARGS_DUMP_NONE);
    640   CHK(args.dump_split_mode == SOLSTICE_ARGS_DUMP_SPLIT_NONE);
    641   solstice_args_release(&args);
    642   cmd_delete(cmd);
    643 
    644   cmd = cmd_create(0, "test", "-g", "format=obj", NULL);
    645   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    646   CHK(args.dump_format == SOLSTICE_ARGS_DUMP_OBJ);
    647   CHK(args.dump_split_mode == SOLSTICE_ARGS_DUMP_SPLIT_NONE);
    648   solstice_args_release(&args);
    649   cmd_delete(cmd);
    650 
    651   cmd = cmd_create(0, "test", "-g", "split=geometry:format=obj", NULL);
    652   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    653   CHK(args.dump_format == SOLSTICE_ARGS_DUMP_OBJ);
    654   CHK(args.dump_split_mode == SOLSTICE_ARGS_DUMP_SPLIT_GEOMETRY);
    655   solstice_args_release(&args);
    656   cmd_delete(cmd);
    657 
    658   cmd = cmd_create(0, "test", "-g", "format=obj:split=object", NULL);
    659   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    660   CHK(args.dump_format == SOLSTICE_ARGS_DUMP_OBJ);
    661   CHK(args.dump_split_mode == SOLSTICE_ARGS_DUMP_SPLIT_OBJECT);
    662   solstice_args_release(&args);
    663   cmd_delete(cmd);
    664 
    665   cmd = cmd_create(0, "test", "-g", "format=obj::::split=none", NULL);
    666   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    667   CHK(args.dump_format == SOLSTICE_ARGS_DUMP_OBJ);
    668   CHK(args.dump_split_mode == SOLSTICE_ARGS_DUMP_SPLIT_NONE);
    669   solstice_args_release(&args);
    670   cmd_delete(cmd);
    671 
    672   cmd = cmd_create(0, "test", "-g", "split=object", NULL);
    673   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    674   cmd_delete(cmd);
    675 
    676   cmd = cmd_create(0, "test", "-g", "format=stl", NULL);
    677   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    678   cmd_delete(cmd);
    679 
    680   cmd = cmd_create(0, "test", "-g", "format=obj:dummy", NULL);
    681   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    682   cmd_delete(cmd);
    683 
    684   cmd = cmd_create(0, "test", "-g", "format=obj:split", NULL);
    685   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    686   cmd_delete(cmd);
    687 
    688   cmd = cmd_create(0, "test", "-g", "format=obj", "-r", "up=0,0,1", NULL);
    689   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    690   cmd_delete(cmd);
    691 
    692   cmd = cmd_create(0, "test", "-g", "format=obj", "-p", "default", NULL);
    693   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    694   cmd_delete(cmd);
    695 }
    696 
    697 static void
    698 test_dump_paths(void)
    699 {
    700   struct solstice_args args = SOLSTICE_ARGS_NULL;
    701   char** cmd = NULL;
    702 
    703   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    704   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    705   CHK(args.dump_paths == 0);
    706   solstice_args_release(&args);
    707   cmd_delete(cmd);
    708 
    709   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "default", NULL);
    710   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    711   CHK(args.dump_paths == 1);
    712   CHK(args.infinite_ray_length == SOLSTICE_ARGS_DEFAULT.infinite_ray_length);
    713   CHK(args.sun_ray_length == SOLSTICE_ARGS_DEFAULT.sun_ray_length);
    714   solstice_args_release(&args);
    715   cmd_delete(cmd);
    716 
    717   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "irlen=3.14:srlen=1.23", NULL);
    718   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    719   CHK(args.dump_paths == 1);
    720   CHK(eq_eps(args.infinite_ray_length, 3.14, 1.e-6) == 1);
    721   CHK(eq_eps(args.sun_ray_length, 1.23, 1.e-6) == 1);
    722   solstice_args_release(&args);
    723   cmd_delete(cmd);
    724 
    725   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "irlen=0", NULL);
    726   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    727   CHK(args.dump_paths == 1);
    728   CHK(eq_eps(args.infinite_ray_length, 0, 1.e-6) == 1);
    729   CHK(args.sun_ray_length == SOLSTICE_ARGS_DEFAULT.sun_ray_length);
    730   solstice_args_release(&args);
    731   cmd_delete(cmd);
    732 
    733   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "srlen=-4", NULL);
    734   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    735   CHK(args.dump_paths == 1);
    736   CHK(args.infinite_ray_length == SOLSTICE_ARGS_DEFAULT.infinite_ray_length);
    737   CHK(eq_eps(args.sun_ray_length, -4, 1.e-6) == 1);
    738   solstice_args_release(&args);
    739   cmd_delete(cmd);
    740 
    741   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "srlen=3.14:default", NULL);
    742   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    743   CHK(args.dump_paths == 1);
    744   CHK(args.infinite_ray_length == SOLSTICE_ARGS_DEFAULT.infinite_ray_length);
    745   CHK(args.sun_ray_length == SOLSTICE_ARGS_DEFAULT.sun_ray_length);
    746   solstice_args_release(&args);
    747   cmd_delete(cmd);
    748 
    749   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "default:srlen=1:irlen=2:", NULL);
    750   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    751   CHK(args.dump_paths == 1);
    752   CHK(args.sun_ray_length == 1);
    753   CHK(args.infinite_ray_length == 2);
    754   solstice_args_release(&args);
    755   cmd_delete(cmd);
    756 
    757   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "srlen=", NULL);
    758   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    759   cmd_delete(cmd);
    760 
    761   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "irlen=", NULL);
    762   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    763   cmd_delete(cmd);
    764 
    765   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "srlen=abcd", NULL);
    766   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    767   cmd_delete(cmd);
    768 
    769   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "irlen", NULL);
    770   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    771   cmd_delete(cmd);
    772 
    773   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "=abcd", NULL);
    774   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    775   cmd_delete(cmd);
    776 
    777   cmd = cmd_create(0, "test", "-D", "0,90", "-p", NULL);
    778   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    779   cmd_delete(cmd);
    780 
    781   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "default:srlen=1:irlen=2:",
    782     "-r", "up=0,0,1", NULL);
    783   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    784   cmd_delete(cmd);
    785 
    786   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "default:srlen=1:irlen=2:",
    787     "-g", "format=obj", NULL);
    788   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    789   cmd_delete(cmd);
    790 }
    791 
    792 static void
    793 test_rng(void)
    794 {
    795   struct solstice_args args = SOLSTICE_ARGS_NULL;
    796   char** cmd = NULL;
    797 
    798   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    799   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    800   CHK(args.rng_state_input_filename == NULL);
    801   CHK(args.rng_state_output_filename == NULL);
    802   solstice_args_release(&args);
    803   cmd_delete(cmd);
    804 
    805   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "ostate=/tmp/rng_output.txt", NULL);
    806   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    807   CHK(args.rng_state_input_filename == NULL);
    808   CHK(!strcmp(args.rng_state_output_filename, "/tmp/rng_output.txt"));
    809   solstice_args_release(&args);
    810   cmd_delete(cmd);
    811 
    812   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "istate=/tmp/rng_input.txt", NULL);
    813   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    814   CHK(!strcmp(args.rng_state_input_filename, "/tmp/rng_input.txt"));
    815   CHK(args.rng_state_output_filename == NULL);
    816   solstice_args_release(&args);
    817   cmd_delete(cmd);
    818 
    819   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "istate=in.txt:ostate=out.txt", NULL);
    820   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    821   CHK(!strcmp(args.rng_state_input_filename, "in.txt"));
    822   CHK(!strcmp(args.rng_state_output_filename, "out.txt"));
    823   solstice_args_release(&args);
    824   cmd_delete(cmd);
    825 
    826   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "istate=", NULL);
    827   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    828   cmd_delete(cmd);
    829 
    830   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "ostate=", NULL);
    831   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    832   cmd_delete(cmd);
    833 
    834   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "istate=in.txt:ostate=", NULL);
    835   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    836   cmd_delete(cmd);
    837 
    838   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "istate=:ostate=out", NULL);
    839   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    840   cmd_delete(cmd);
    841 
    842   cmd = cmd_create(0, "test", "-D", "0,90", "-G", NULL);
    843   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    844   cmd_delete(cmd);
    845 }
    846 
    847 static void
    848 test_dni(void)
    849 {
    850   struct solstice_args args = SOLSTICE_ARGS_NULL;
    851   char** cmd = NULL;
    852 
    853   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    854   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    855   CHK(args.dni == -1);
    856   solstice_args_release(&args);
    857   cmd_delete(cmd);
    858 
    859   cmd = cmd_create(0, "test", "-D", "0,90", "-I", "1", NULL);
    860   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    861   CHK(args.dni == 1);
    862   solstice_args_release(&args);
    863   cmd_delete(cmd);
    864 
    865   cmd = cmd_create(0, "test", "-D", "0,90", "-I", "0", NULL);
    866   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    867   solstice_args_release(&args);
    868   cmd_delete(cmd);
    869 
    870   cmd = cmd_create(0, "test", "-D", "0,90", "-I", NULL);
    871   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    872   cmd_delete(cmd);
    873 }
    874 
    875 int
    876 main(int argc, char** argv)
    877 {
    878   (void)argc, (void)argv;
    879   test_rendering();
    880   test_sun_dirs();
    881   test_realisations_count();
    882   test_threads_count();
    883   test_output();
    884   test_quiet();
    885   test_verbose();
    886   test_receivers();
    887   test_input();
    888   test_dump();
    889   test_dump_paths();
    890   test_rng();
    891   test_dni();
    892   CHK(mem_allocated_size() == 0);
    893   return 0;
    894 }
    895