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