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 (25721B)


      1 /* Copyright (C) 2018-2026 |Meso|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 #include "solstice_args.h"
     18 #include "test_solstice_utils.h"
     19 
     20 #include <rsys/double3.h>
     21 #include <rsys/stretchy_array.h>
     22 
     23 #include <stdarg.h>
     24 #include <string.h>
     25 #include <limits.h>
     26 
     27 #ifdef COMPILER_CL
     28   #pragma warning(push)
     29   #pragma warning(disable:4706) /* Assignment within a condition */
     30 #endif
     31 
     32 static char**
     33 cmd_create(int dummy, ...)
     34 {
     35   va_list ap;
     36   va_list ap_cp;
     37   const char* str;
     38   size_t i, n = 0;
     39   char** cmd = NULL;
     40 
     41   va_start(ap, dummy);
     42   VA_COPY(ap_cp, ap);
     43   while((str = va_arg(ap, const char*))) ++n;
     44   va_end(ap);
     45 
     46   CHK((cmd = sa_add(cmd, n)) != NULL);
     47   i = 0;
     48   while((str = va_arg(ap_cp, const char*))) {
     49     cmd[i] = NULL;
     50     CHK((cmd[i] = sa_add(cmd[i], strlen(str)+1)) != NULL);
     51     strcpy(cmd[i], str);
     52     ++i;
     53   }
     54   va_end(ap_cp);
     55   return cmd;
     56 }
     57 
     58 #ifdef COMPILER_CL
     59   #pragma warning(pop)
     60 #endif
     61 
     62 static void
     63 cmd_delete(char** cmd)
     64 {
     65   size_t i = 0;
     66   const size_t n = sa_size(cmd);
     67   FOR_EACH(i, 0, n) sa_release(cmd[i]);
     68   sa_release(cmd);
     69 }
     70 
     71 static FINLINE int
     72 cmd_size(char** cmd)
     73 {
     74   return (int)sa_size(cmd);
     75 }
     76 
     77 static void
     78 test_rendering(void)
     79 {
     80   struct solstice_args args = SOLSTICE_ARGS_NULL;
     81   char** cmd = NULL;
     82   double tmp[3];
     83 
     84   cmd = cmd_create(0, "test", "-r", "img=1280x720", NULL);
     85   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
     86   CHK(args.rendering == 1);
     87   CHK(args.nexperiments == SOLSTICE_ARGS_DEFAULT.nexperiments);
     88   CHK(d3_eq(args.camera.pos, SOLSTICE_ARGS_DEFAULT.camera.pos) == 1);
     89   CHK(d3_eq(args.camera.tgt, SOLSTICE_ARGS_DEFAULT.camera.tgt) == 1);
     90   CHK(d3_eq(args.camera.up, SOLSTICE_ARGS_DEFAULT.camera.up) == 1);
     91   CHK(args.camera.fov_x == SOLSTICE_ARGS_DEFAULT.camera.fov_x);
     92   CHK(args.img.width == 1280);
     93   CHK(args.img.height == 720);
     94   CHK(args.img.spp == SOLSTICE_ARGS_DEFAULT.img.spp);
     95   CHK(args.render_mode == SOLSTICE_ARGS_DEFAULT.render_mode);
     96   CHK(args.quiet == 0);
     97   CHK(args.output_filename == NULL);
     98   solstice_args_release(&args);
     99   cmd_delete(cmd);
    100 
    101   cmd = cmd_create(0, "test", "-q", "-r", "img=640x480:fov=70:pos=1,2,3", NULL);
    102   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    103   CHK(args.rendering == 1);
    104   CHK(args.nexperiments == SOLSTICE_ARGS_DEFAULT.nexperiments);
    105   CHK(d3_eq(args.camera.pos, d3(tmp, 1, 2, 3)) == 1);
    106   CHK(d3_eq(args.camera.tgt, SOLSTICE_ARGS_DEFAULT.camera.tgt) == 1);
    107   CHK(d3_eq(args.camera.up, SOLSTICE_ARGS_DEFAULT.camera.up) == 1);
    108   CHK(args.img.width == 640);
    109   CHK(args.img.height == 480);
    110   CHK(args.img.spp == SOLSTICE_ARGS_DEFAULT.img.spp);
    111   CHK(args.render_mode == SOLSTICE_ARGS_DEFAULT.render_mode);
    112   CHK(args.quiet == 1);
    113   CHK(eq_eps(args.camera.fov_x, 70, 1.e-6) == 1);
    114   CHK(args.output_filename == NULL);
    115   solstice_args_release(&args);
    116   cmd_delete(cmd);
    117 
    118   cmd = cmd_create(0, "test", "-r", "up=0,0,1:tgt=0,-10,0:rmode=draft", NULL);
    119   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    120   CHK(args.nexperiments == SOLSTICE_ARGS_DEFAULT.nexperiments);
    121   CHK(d3_eq(args.camera.pos, SOLSTICE_ARGS_DEFAULT.camera.pos) == 1);
    122   CHK(d3_eq(args.camera.tgt, d3(tmp, 0,-10, 0)) == 1);
    123   CHK(d3_eq(args.camera.up, d3(tmp, 0, 0, 1)) == 1);
    124   CHK(args.img.width == SOLSTICE_ARGS_DEFAULT.img.width);
    125   CHK(args.img.height == SOLSTICE_ARGS_DEFAULT.img.height);
    126   CHK(args.img.spp == SOLSTICE_ARGS_DEFAULT.img.spp);
    127   CHK(args.render_mode == SOLSTICE_ARGS_RENDER_DRAFT);
    128   CHK(args.rendering == 1);
    129   CHK(args.quiet == 0);
    130   CHK(args.output_filename == NULL);
    131   solstice_args_release(&args);
    132   cmd_delete(cmd);
    133 
    134   cmd = cmd_create(0, "test", "-r", "up=0,0,1:rmode=pt:spp=4", NULL);
    135   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    136   CHK(args.nexperiments == SOLSTICE_ARGS_DEFAULT.nexperiments);
    137   CHK(d3_eq(args.camera.up, d3(tmp, 0, 0, 1)) == 1);
    138   CHK(args.img.width == SOLSTICE_ARGS_DEFAULT.img.width);
    139   CHK(args.img.height == SOLSTICE_ARGS_DEFAULT.img.height);
    140   CHK(args.rendering == 1);
    141   CHK(args.output_filename == NULL);
    142   CHK(args.img.spp == 4);
    143   CHK(args.render_mode == SOLSTICE_ARGS_RENDER_PATH_TRACING);
    144   solstice_args_release(&args);
    145   cmd_delete(cmd);
    146 
    147   cmd = cmd_create(0, "test", "-r", "up=0,10,0", "-o", "my_output", NULL);
    148   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    149   CHK(d3_eq(args.camera.up, d3(tmp, 0, 10, 0)) == 1);
    150   CHK(args.rendering == 1);
    151   CHK(args.quiet == 0);
    152   CHK(strcmp(args.output_filename, "my_output") ==  0);
    153   solstice_args_release(&args);
    154   cmd_delete(cmd);
    155 
    156   cmd = cmd_create(0, "test", "-r", "spp=16", NULL);
    157   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    158   CHK(args.img.spp == 16);
    159   solstice_args_release(&args);
    160   cmd_delete(cmd);
    161 
    162   cmd = cmd_create(0, "test", "-r", "rmode=none", NULL);
    163   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    164   cmd_delete(cmd);
    165 
    166   cmd = cmd_create(0, "test", "-r", "rmode", NULL);
    167   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    168   cmd_delete(cmd);
    169 
    170 
    171   cmd = cmd_create(0, "test", "-r", "up=0,1", NULL);
    172   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    173   cmd_delete(cmd);
    174 
    175   cmd = cmd_create(0, "test", "-r", "tgt=0:1", NULL);
    176   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    177   cmd_delete(cmd);
    178 
    179   cmd = cmd_create(0, "test", "-r", "pos=0,10,1a", NULL);
    180   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    181   cmd_delete(cmd);
    182 
    183   cmd = cmd_create(0, "test", "-r", "pos=0,10,1:::::", NULL);
    184   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    185   CHK(d3_eq(args.camera.pos, d3(tmp, 0, 10, 1)) == 1);
    186   solstice_args_release(&args);
    187   cmd_delete(cmd);
    188 
    189   cmd = cmd_create(0, "test", "-r", "spp=0", NULL);
    190   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    191   cmd_delete(cmd);
    192 
    193   cmd = cmd_create(0, "test", "-r", "img=32X32", NULL);
    194   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    195   cmd_delete(cmd);
    196 
    197   cmd = cmd_create(0, "test", "-r", "img=32x32@12", NULL);
    198   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    199   cmd_delete(cmd);
    200 
    201   cmd = cmd_create(0, "test", "-r", "img=0x64", NULL);
    202   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    203   cmd_delete(cmd);
    204 
    205   cmd = cmd_create(0, "test", "-r", "img=64x0", NULL);
    206   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    207   cmd_delete(cmd);
    208 
    209   cmd = cmd_create(0, "test", "-r", "img=32x32@12:up=0,0,1", NULL);
    210   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    211   cmd_delete(cmd);
    212 
    213   cmd = cmd_create(0, "test", "-r", "tgt=1,1,1:img=32x32:12", NULL);
    214   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    215   cmd_delete(cmd);
    216 
    217   cmd = cmd_create(0, "test", "-r", "fov=123a", NULL);
    218   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    219   cmd_delete(cmd);
    220 
    221   cmd = cmd_create(0, "test", "-r", "up", NULL);
    222   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    223   cmd_delete(cmd);
    224 
    225   cmd = cmd_create(0, "test", "-r", "img=", NULL);
    226   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    227   cmd_delete(cmd);
    228 
    229   cmd = cmd_create(0, "test", "-r", "fov::::", NULL);
    230   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    231   cmd_delete(cmd);
    232 
    233   cmd = cmd_create(0, "test", "-r", "::tgt", NULL);
    234   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    235   cmd_delete(cmd);
    236 }
    237 
    238 static void
    239 test_sun_dirs(void)
    240 {
    241   struct solstice_args args = SOLSTICE_ARGS_NULL;
    242   char** cmd = NULL;
    243 
    244   cmd = cmd_create(0, "test", "-D", "0,1", NULL);
    245   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    246   CHK(args.nsun_dirs == 1);
    247   CHK(args.sun_dirs[0].azimuth == 0);
    248   CHK(eq_eps(args.sun_dirs[0].elevation, 1, 1.e-6) == 1);
    249   solstice_args_release(&args);
    250   cmd_delete(cmd);
    251 
    252   cmd = cmd_create(0, "test", "-D", "1.2,3.4:3.14,0.123:", RES_OK);
    253   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    254   CHK(args.nsun_dirs == 2);
    255   CHK(eq_eps(args.sun_dirs[0].azimuth, 1.2, 1.e-6) == 1);
    256   CHK(eq_eps(args.sun_dirs[0].elevation, 3.4, 1.e-6) == 1);
    257   CHK(eq_eps(args.sun_dirs[1].azimuth, 3.14, 1.e-6) == 1);
    258   CHK(eq_eps(args.sun_dirs[1].elevation, 0.123, 1.e-6) == 1);
    259   solstice_args_release(&args);
    260   cmd_delete(cmd);
    261 
    262   cmd = cmd_create(0, "test", "-D", "1.2,3.4:3.14,0.123:2.01,23.1", RES_OK);
    263   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    264   CHK(args.nsun_dirs == 3);
    265   CHK(eq_eps(args.sun_dirs[0].azimuth, 1.2, 1.e-6) == 1);
    266   CHK(eq_eps(args.sun_dirs[0].elevation, 3.4, 1.e-6) == 1);
    267   CHK(eq_eps(args.sun_dirs[1].azimuth, 3.14, 1.e-6) == 1);
    268   CHK(eq_eps(args.sun_dirs[1].elevation, 0.123, 1.e-6) == 1);
    269   CHK(eq_eps(args.sun_dirs[2].azimuth, 2.01, 1.e-6) == 1);
    270   CHK(eq_eps(args.sun_dirs[2].elevation, 23.1, 1.e-6) == 1);
    271   solstice_args_release(&args);
    272   cmd_delete(cmd);
    273 
    274   cmd = cmd_create(0, "test", "-D", "1.2,3.4,5", NULL);
    275   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    276   cmd_delete(cmd);
    277 
    278   cmd = cmd_create(0, "test", "-D", "1.2,3.4:1", NULL);
    279   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    280   cmd_delete(cmd);
    281 
    282   cmd = cmd_create(0, "test", "-D", "1.2,3.4:5.2,A", NULL);
    283   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    284   cmd_delete(cmd);
    285 
    286   cmd = cmd_create(0, "test", "-D", "-0.1,2", NULL);
    287   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    288   cmd_delete(cmd);
    289 
    290   cmd = cmd_create(0, "test", "-D", "360,2", NULL);
    291   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    292   cmd_delete(cmd);
    293 
    294   cmd = cmd_create(0, "test", "-D", "0,-1", NULL);
    295   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    296   cmd_delete(cmd);
    297 
    298   cmd = cmd_create(0, "test", "-D", "0,91", NULL);
    299   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    300   cmd_delete(cmd);
    301 
    302   cmd = cmd_create(0, "test", "-D", NULL);
    303   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    304   cmd_delete(cmd);
    305 
    306   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    307   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    308   solstice_args_release(&args);
    309   cmd_delete(cmd);
    310 
    311 }
    312 
    313 static void
    314 test_realisations_count(void)
    315 {
    316   struct solstice_args args = SOLSTICE_ARGS_NULL;
    317   char** cmd = NULL;
    318 
    319   cmd = cmd_create(0, "test", "-D", "0,90", "-n", "1", NULL);
    320   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    321   CHK(args.nexperiments == 1);
    322   solstice_args_release(&args);
    323   cmd_delete(cmd);
    324 
    325   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    326   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    327   CHK(args.nexperiments == SOLSTICE_ARGS_DEFAULT.nexperiments);
    328   solstice_args_release(&args);
    329   cmd_delete(cmd);
    330 
    331   cmd = cmd_create(0, "test", "-D", "0,90", "-n", "123", NULL);
    332   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    333   CHK(args.nexperiments == 123);
    334   solstice_args_release(&args);
    335   cmd_delete(cmd);
    336 
    337   cmd = cmd_create(0, "test", "-D", "0,90", "-n", "0", NULL);
    338   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    339   cmd_delete(cmd);
    340 
    341   cmd = cmd_create(0, "test", "-D", "0,90", "-n", "3.14", NULL);
    342   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    343   cmd_delete(cmd);
    344 
    345   cmd = cmd_create(0, "test", "-D", "0,90", "-n", NULL);
    346   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    347   cmd_delete(cmd);
    348 }
    349 
    350 static void
    351 test_threads_count(void)
    352 {
    353   struct solstice_args args = SOLSTICE_ARGS_NULL;
    354   char** cmd = NULL;
    355 
    356   cmd = cmd_create(0, "test", "-D", "0,90", "-t", "1", NULL);
    357   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    358   CHK(args.nthreads == 1);
    359   solstice_args_release(&args);
    360   cmd_delete(cmd);
    361 
    362   cmd = cmd_create(0, "test", "-D", "0,90", "-t", "123", NULL);
    363   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    364   CHK(args.nthreads == 123);
    365   solstice_args_release(&args);
    366   cmd_delete(cmd);
    367 
    368   cmd = cmd_create(0, "test", "-D", "0,90", "-t", "-1", NULL);
    369   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    370   CHK(args.nthreads == UINT_MAX);
    371   solstice_args_release(&args);
    372   cmd_delete(cmd);
    373 
    374   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    375   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    376   CHK(args.nthreads == SOLSTICE_ARGS_DEFAULT.nthreads);
    377   solstice_args_release(&args);
    378   cmd_delete(cmd);
    379 
    380   cmd = cmd_create(0, "test", "-D", "0,90", "-t", "0", NULL);
    381   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    382   cmd_delete(cmd);
    383 
    384   cmd = cmd_create(0, "test", "-D", "0,90", "-t", "3.14", NULL);
    385   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    386   cmd_delete(cmd);
    387 
    388   cmd = cmd_create(0, "test", "-D", "0,90", "-t", NULL);
    389   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    390   cmd_delete(cmd);
    391 
    392 }
    393 
    394 static void
    395 test_output(void)
    396 {
    397   struct solstice_args args = SOLSTICE_ARGS_NULL;
    398   char** cmd = NULL;
    399 
    400   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    401   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    402   CHK(args.output_filename == NULL);
    403   solstice_args_release(&args);
    404   cmd_delete(cmd);
    405 
    406   cmd = cmd_create(0, "test", "-D", "0,90", "-o", "my_output", NULL);
    407   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    408   CHK(strcmp(args.output_filename, "my_output") == 0);
    409   solstice_args_release(&args);
    410   cmd_delete(cmd);
    411 
    412   cmd = cmd_create(0, "test", "-D", "0,90", "-o", "hello_world", NULL);
    413   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    414   CHK(strcmp(args.output_filename, "hello_world") == 0);
    415   solstice_args_release(&args);
    416   cmd_delete(cmd);
    417 
    418   cmd = cmd_create(0, "test", "-D", "0,90", "-o", NULL);
    419   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    420   cmd_delete(cmd);
    421 }
    422 
    423 static void
    424 test_quiet(void)
    425 {
    426   struct solstice_args args = SOLSTICE_ARGS_NULL;
    427   char** cmd = NULL;
    428 
    429   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    430   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    431   CHK(args.quiet == SOLSTICE_ARGS_DEFAULT.quiet);
    432   CHK(args.quiet == 0);
    433   solstice_args_release(&args);
    434   cmd_delete(cmd);
    435 
    436   cmd = cmd_create(0, "test", "-D", "0,90", "-q", NULL);
    437   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    438   CHK(args.quiet == 1);
    439   solstice_args_release(&args);
    440   cmd_delete(cmd);
    441 }
    442 
    443 static void
    444 test_verbose(void)
    445 {
    446   struct solstice_args args = SOLSTICE_ARGS_NULL;
    447   char** cmd = NULL;
    448 
    449   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    450   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    451   CHK(args.verbose == SOLSTICE_ARGS_DEFAULT.verbose);
    452   CHK(args.verbose == 0);
    453   solstice_args_release(&args);
    454   cmd_delete(cmd);
    455 
    456   cmd = cmd_create(0, "test", "-D", "0,90", "-v", NULL);
    457   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    458   CHK(args.verbose == 1);
    459   solstice_args_release(&args);
    460   cmd_delete(cmd);
    461 }
    462 
    463 static void
    464 test_receivers(void)
    465 {
    466   struct solstice_args args = SOLSTICE_ARGS_NULL;
    467   char** cmd = NULL;
    468 
    469   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    470   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    471   CHK(args.receivers_filename == SOLSTICE_ARGS_DEFAULT.receivers_filename);
    472   solstice_args_release(&args);
    473   cmd_delete(cmd);
    474 
    475   cmd = cmd_create(0, "test", "-D", "0,90", "-R", "my_receivers", NULL);
    476   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    477   CHK(strcmp(args.receivers_filename, "my_receivers") == 0);
    478   solstice_args_release(&args);
    479   cmd_delete(cmd);
    480 
    481   cmd = cmd_create(0, "test", "-D", "0,90", "-R", "foo bar", NULL);
    482   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    483   CHK(strcmp(args.receivers_filename, "foo bar") == 0);
    484   solstice_args_release(&args);
    485   cmd_delete(cmd);
    486 
    487   cmd = cmd_create(0, "test", "-D", "0,90", "-R", NULL);
    488   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    489   solstice_args_release(&args);
    490   cmd_delete(cmd);
    491 }
    492 
    493 static void
    494 test_input(void)
    495 {
    496   struct solstice_args args = SOLSTICE_ARGS_NULL;
    497   char** cmd = NULL;
    498 
    499   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    500   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    501   CHK(args.input_filename == SOLSTICE_ARGS_DEFAULT.input_filename);
    502   CHK(args.input_filename == NULL);
    503   solstice_args_release(&args);
    504   cmd_delete(cmd);
    505 
    506   cmd = cmd_create(0, "test", "-D", "0,90", "my_input", NULL);
    507   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    508   CHK(strcmp(args.input_filename, "my_input") == 0);
    509   solstice_args_release(&args);
    510   cmd_delete(cmd);
    511 }
    512 
    513 static void
    514 test_dump(void)
    515 {
    516   struct solstice_args args = SOLSTICE_ARGS_NULL;
    517   char** cmd = NULL;
    518 
    519   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    520   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    521   CHK(args.dump_format == SOLSTICE_ARGS_DUMP_NONE);
    522   CHK(args.dump_split_mode == SOLSTICE_ARGS_DUMP_SPLIT_NONE);
    523   solstice_args_release(&args);
    524   cmd_delete(cmd);
    525 
    526   cmd = cmd_create(0, "test", "-g", "format=obj", NULL);
    527   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    528   CHK(args.dump_format == SOLSTICE_ARGS_DUMP_OBJ);
    529   CHK(args.dump_split_mode == SOLSTICE_ARGS_DUMP_SPLIT_NONE);
    530   solstice_args_release(&args);
    531   cmd_delete(cmd);
    532 
    533   cmd = cmd_create(0, "test", "-g", "split=geometry:format=obj", NULL);
    534   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    535   CHK(args.dump_format == SOLSTICE_ARGS_DUMP_OBJ);
    536   CHK(args.dump_split_mode == SOLSTICE_ARGS_DUMP_SPLIT_GEOMETRY);
    537   solstice_args_release(&args);
    538   cmd_delete(cmd);
    539 
    540   cmd = cmd_create(0, "test", "-g", "format=obj:split=object", NULL);
    541   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    542   CHK(args.dump_format == SOLSTICE_ARGS_DUMP_OBJ);
    543   CHK(args.dump_split_mode == SOLSTICE_ARGS_DUMP_SPLIT_OBJECT);
    544   solstice_args_release(&args);
    545   cmd_delete(cmd);
    546 
    547   cmd = cmd_create(0, "test", "-g", "format=obj::::split=none", NULL);
    548   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    549   CHK(args.dump_format == SOLSTICE_ARGS_DUMP_OBJ);
    550   CHK(args.dump_split_mode == SOLSTICE_ARGS_DUMP_SPLIT_NONE);
    551   solstice_args_release(&args);
    552   cmd_delete(cmd);
    553 
    554   cmd = cmd_create(0, "test", "-g", "split=object", NULL);
    555   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    556   cmd_delete(cmd);
    557 
    558   cmd = cmd_create(0, "test", "-g", "format=stl", NULL);
    559   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    560   cmd_delete(cmd);
    561 
    562   cmd = cmd_create(0, "test", "-g", "format=obj:dummy", NULL);
    563   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    564   cmd_delete(cmd);
    565 
    566   cmd = cmd_create(0, "test", "-g", "format=obj:split", NULL);
    567   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    568   cmd_delete(cmd);
    569 
    570   cmd = cmd_create(0, "test", "-g", "format=obj", "-r", "up=0,0,1", NULL);
    571   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    572   cmd_delete(cmd);
    573 
    574   cmd = cmd_create(0, "test", "-g", "format=obj", "-p", "default", NULL);
    575   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    576   cmd_delete(cmd);
    577 }
    578 
    579 static void
    580 test_dump_paths(void)
    581 {
    582   struct solstice_args args = SOLSTICE_ARGS_NULL;
    583   char** cmd = NULL;
    584 
    585   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    586   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    587   CHK(args.dump_paths == 0);
    588   solstice_args_release(&args);
    589   cmd_delete(cmd);
    590 
    591   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "default", NULL);
    592   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    593   CHK(args.dump_paths == 1);
    594   CHK(args.infinite_ray_length == SOLSTICE_ARGS_DEFAULT.infinite_ray_length);
    595   CHK(args.sun_ray_length == SOLSTICE_ARGS_DEFAULT.sun_ray_length);
    596   solstice_args_release(&args);
    597   cmd_delete(cmd);
    598 
    599   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "irlen=3.14:srlen=1.23", NULL);
    600   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    601   CHK(args.dump_paths == 1);
    602   CHK(eq_eps(args.infinite_ray_length, 3.14, 1.e-6) == 1);
    603   CHK(eq_eps(args.sun_ray_length, 1.23, 1.e-6) == 1);
    604   solstice_args_release(&args);
    605   cmd_delete(cmd);
    606 
    607   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "irlen=0", NULL);
    608   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    609   CHK(args.dump_paths == 1);
    610   CHK(eq_eps(args.infinite_ray_length, 0, 1.e-6) == 1);
    611   CHK(args.sun_ray_length == SOLSTICE_ARGS_DEFAULT.sun_ray_length);
    612   solstice_args_release(&args);
    613   cmd_delete(cmd);
    614 
    615   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "srlen=-4", NULL);
    616   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    617   CHK(args.dump_paths == 1);
    618   CHK(args.infinite_ray_length == SOLSTICE_ARGS_DEFAULT.infinite_ray_length);
    619   CHK(eq_eps(args.sun_ray_length, -4, 1.e-6) == 1);
    620   solstice_args_release(&args);
    621   cmd_delete(cmd);
    622 
    623   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "srlen=3.14:default", NULL);
    624   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    625   CHK(args.dump_paths == 1);
    626   CHK(args.infinite_ray_length == SOLSTICE_ARGS_DEFAULT.infinite_ray_length);
    627   CHK(args.sun_ray_length == SOLSTICE_ARGS_DEFAULT.sun_ray_length);
    628   solstice_args_release(&args);
    629   cmd_delete(cmd);
    630 
    631   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "default:srlen=1:irlen=2:", NULL);
    632   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    633   CHK(args.dump_paths == 1);
    634   CHK(args.sun_ray_length == 1);
    635   CHK(args.infinite_ray_length == 2);
    636   solstice_args_release(&args);
    637   cmd_delete(cmd);
    638 
    639   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "srlen=", NULL);
    640   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    641   cmd_delete(cmd);
    642 
    643   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "irlen=", NULL);
    644   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    645   cmd_delete(cmd);
    646 
    647   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "srlen=abcd", NULL);
    648   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    649   cmd_delete(cmd);
    650 
    651   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "irlen", NULL);
    652   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    653   cmd_delete(cmd);
    654 
    655   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "=abcd", NULL);
    656   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    657   cmd_delete(cmd);
    658 
    659   cmd = cmd_create(0, "test", "-D", "0,90", "-p", NULL);
    660   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    661   cmd_delete(cmd);
    662 
    663   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "default:srlen=1:irlen=2:",
    664     "-r", "up=0,0,1", NULL);
    665   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    666   cmd_delete(cmd);
    667 
    668   cmd = cmd_create(0, "test", "-D", "0,90", "-p", "default:srlen=1:irlen=2:",
    669     "-g", "format=obj", NULL);
    670   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    671   cmd_delete(cmd);
    672 }
    673 
    674 static void
    675 test_rng(void)
    676 {
    677   struct solstice_args args = SOLSTICE_ARGS_NULL;
    678   char** cmd = NULL;
    679 
    680   cmd = cmd_create(0, "test", "-D", "0,90", NULL);
    681   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    682   CHK(args.rng_state_input_filename == NULL);
    683   CHK(args.rng_state_output_filename == NULL);
    684   solstice_args_release(&args);
    685   cmd_delete(cmd);
    686 
    687   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "ostate=/tmp/rng_output.txt", NULL);
    688   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    689   CHK(args.rng_state_input_filename == NULL);
    690   CHK(!strcmp(args.rng_state_output_filename, "/tmp/rng_output.txt"));
    691   solstice_args_release(&args);
    692   cmd_delete(cmd);
    693 
    694   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "istate=/tmp/rng_input.txt", NULL);
    695   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    696   CHK(!strcmp(args.rng_state_input_filename, "/tmp/rng_input.txt"));
    697   CHK(args.rng_state_output_filename == NULL);
    698   solstice_args_release(&args);
    699   cmd_delete(cmd);
    700 
    701   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "istate=in.txt:ostate=out.txt", NULL);
    702   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_OK);
    703   CHK(!strcmp(args.rng_state_input_filename, "in.txt"));
    704   CHK(!strcmp(args.rng_state_output_filename, "out.txt"));
    705   solstice_args_release(&args);
    706   cmd_delete(cmd);
    707 
    708   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "istate=", NULL);
    709   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    710   cmd_delete(cmd);
    711 
    712   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "ostate=", NULL);
    713   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    714   cmd_delete(cmd);
    715 
    716   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "istate=in.txt:ostate=", NULL);
    717   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    718   cmd_delete(cmd);
    719 
    720   cmd = cmd_create(0, "test", "-D", "0,90", "-G", "istate=:ostate=out", NULL);
    721   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    722   cmd_delete(cmd);
    723 
    724   cmd = cmd_create(0, "test", "-D", "0,90", "-G", NULL);
    725   CHK(solstice_args_init(&args, cmd_size(cmd), cmd) == RES_BAD_ARG);
    726   cmd_delete(cmd);
    727 }
    728 
    729 int
    730 main(int argc, char** argv)
    731 {
    732   (void)argc, (void)argv;
    733   test_rendering();
    734   test_sun_dirs();
    735   test_realisations_count();
    736   test_threads_count();
    737   test_output();
    738   test_quiet();
    739   test_verbose();
    740   test_receivers();
    741   test_input();
    742   test_dump();
    743   test_dump_paths();
    744   test_rng();
    745   CHK(mem_allocated_size() == 0);
    746   return 0;
    747 }
    748