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