test_solparser_spectrum.c (14848B)
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 "solparser.h" 18 #include "solparser_sun.h" 19 #include "test_solstice_utils.h" 20 21 static void 22 test_sun(struct solparser* parser) 23 { 24 const struct solparser_sun* sun; 25 const struct solparser_spectrum* spectrum; 26 FILE* stream; 27 size_t i; 28 29 CHK((stream = tmpfile()) != NULL); 30 31 fprintf(stream, "- spectrum: &my_spectrum\n"); 32 fprintf(stream, " - { wavelength: 2, data: 2 }\n"); 33 fprintf(stream, " - { wavelength: 1, data: 1 }\n"); 34 fprintf(stream, " - { wavelength: 8, data: 8 }\n"); 35 fprintf(stream, " - { wavelength: 3, data: 3 }\n"); 36 fprintf(stream, " - { wavelength: 5, data: 5 }\n"); 37 fprintf(stream, " - { wavelength: 9, data: 9 }\n"); 38 fprintf(stream, " - { wavelength: 6, data: 6 }\n"); 39 fprintf(stream, " - { wavelength: 7, data: 7 }\n"); 40 fprintf(stream, " - { wavelength: 4, data: 4 }\n"); 41 fprintf(stream, "- sun:\n"); 42 fprintf(stream, " dni: 123.456\n"); 43 fprintf(stream, " spectrum: *my_spectrum\n"); 44 fprintf(stream, "- material: &matte { matte: { reflectivity: 1 } }\n"); 45 fprintf(stream, "- entity:\n"); 46 fprintf(stream, " name: foo-bar\n"); 47 fprintf(stream, " primary: 0\n"); 48 fprintf(stream, " geometry: [{sphere: {radius: 1}, material: *matte}]\n"); 49 rewind(stream); 50 51 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 52 CHK(solparser_load(parser) == RES_OK); 53 54 sun = solparser_get_sun(parser); 55 CHK(sun->dni == 123.456); 56 CHK(sun->radang_distrib_type == SOLPARSER_SUN_RADANG_DISTRIB_DIRECTIONAL); 57 CHK(SOLPARSER_ID_IS_VALID(sun->spectrum) == 1); 58 spectrum = solparser_get_spectrum(parser, sun->spectrum); 59 60 CHK(darray_spectrum_data_size_get(&spectrum->data) == 9); 61 62 FOR_EACH(i, 0, darray_spectrum_data_size_get(&spectrum->data)) { 63 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[i].wavelength == i+1); 64 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[i].wavelength == i+1); 65 } 66 67 CHK(solparser_load(parser) == RES_BAD_OP); 68 fclose(stream); 69 70 CHK((stream = tmpfile()) != NULL); 71 fprintf(stream, "- sun: {dni: 1}\n"); 72 rewind(stream); 73 74 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 75 CHK(solparser_load(parser) == RES_OK); 76 77 CHK(SOLPARSER_ID_IS_VALID(sun->spectrum) == 0); 78 79 CHK(solparser_load(parser) == RES_BAD_OP); 80 fclose(stream); 81 } 82 83 static void 84 test_matte(struct solparser* parser) 85 { 86 struct solparser_material_iterator mtl_it, mtl_it_end; 87 const struct solparser_material* mtl; 88 const struct solparser_material_matte* matte; 89 const struct solparser_spectrum* spectrum; 90 FILE* stream; 91 92 CHK((stream = tmpfile()) != NULL); 93 94 fprintf(stream, "- sun: { dni: 1 }\n"); 95 fprintf(stream, "- material:\n"); 96 fprintf(stream, " matte:\n"); 97 fprintf(stream, " reflectivity:\n"); 98 fprintf(stream, " - { wavelength: 3.4, data: 0.5 }\n"); 99 fprintf(stream, " - { wavelength: 1.2, data: 0.25 }\n"); 100 fprintf(stream, " - { wavelength: 6.7, data: 0.125 }\n"); 101 rewind(stream); 102 103 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 104 CHK(solparser_load(parser) == RES_OK); 105 106 solparser_material_iterator_begin(parser, &mtl_it); 107 solparser_material_iterator_end(parser, &mtl_it_end); 108 CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 0); 109 110 mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it)); 111 CHK(mtl->type == SOLPARSER_MATERIAL_MATTE); 112 matte = solparser_get_material_matte(parser, mtl->data.matte); 113 CHK(matte->reflectivity.type == SOLPARSER_MTL_DATA_SPECTRUM); 114 CHK(SOLPARSER_ID_IS_VALID(matte->normal_map) == 0); 115 spectrum = solparser_get_spectrum(parser, matte->reflectivity.value.spectrum); 116 CHK(darray_spectrum_data_size_get(&spectrum->data) == 3); 117 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 1.2); 118 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 3.4); 119 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength == 6.7); 120 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0.25); 121 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 0.5); 122 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data == 0.125); 123 124 solparser_material_iterator_next(&mtl_it); 125 CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 1); 126 127 CHK(solparser_load(parser) == RES_BAD_OP); 128 fclose(stream); 129 } 130 131 static void 132 test_mirror(struct solparser* parser) 133 { 134 struct solparser_material_iterator mtl_it, mtl_it_end; 135 const struct solparser_material* mtl; 136 const struct solparser_material_mirror* mirror; 137 const struct solparser_spectrum* spectrum; 138 FILE* stream; 139 140 CHK((stream = tmpfile()) != NULL); 141 142 fprintf(stream, "- sun: { dni: 1 }\n"); 143 fprintf(stream, "- material:\n"); 144 fprintf(stream, " mirror:\n"); 145 fprintf(stream, " reflectivity:\n"); 146 fprintf(stream, " - { wavelength: 3.4, data: 0.5 }\n"); 147 fprintf(stream, " - { wavelength: 1.2, data: 0.25 }\n"); 148 fprintf(stream, " - { wavelength: 6.7, data: 0.125 }\n"); 149 fprintf(stream, " slope_error:\n"); 150 fprintf(stream, " - { wavelength: 123, data: 0 }\n"); 151 fprintf(stream, " - { wavelength: 456, data: 1 }\n"); 152 rewind(stream); 153 154 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 155 CHK(solparser_load(parser) == RES_OK); 156 157 solparser_material_iterator_begin(parser, &mtl_it); 158 solparser_material_iterator_end(parser, &mtl_it_end); 159 CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 0); 160 161 mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it)); 162 CHK(mtl->type == SOLPARSER_MATERIAL_MIRROR); 163 mirror = solparser_get_material_mirror(parser, mtl->data.mirror); 164 CHK(mirror->reflectivity.type == SOLPARSER_MTL_DATA_SPECTRUM); 165 CHK(mirror->slope_error.type == SOLPARSER_MTL_DATA_SPECTRUM); 166 CHK(SOLPARSER_ID_IS_VALID(mirror->normal_map) == 0); 167 168 spectrum = solparser_get_spectrum(parser, mirror->reflectivity.value.spectrum); 169 CHK(darray_spectrum_data_size_get(&spectrum->data) == 3); 170 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 1.2); 171 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 3.4); 172 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength == 6.7); 173 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0.25); 174 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 0.5); 175 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data == 0.125); 176 177 spectrum = solparser_get_spectrum(parser, mirror->slope_error.value.spectrum); 178 CHK(darray_spectrum_data_size_get(&spectrum->data) == 2); 179 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 123); 180 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 456); 181 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0); 182 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 1); 183 184 solparser_material_iterator_next(&mtl_it); 185 CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 1); 186 187 CHK(solparser_load(parser) == RES_BAD_OP); 188 fclose(stream); 189 } 190 191 static void 192 test_thin_dielectric(struct solparser* parser) 193 { 194 struct solparser_material_iterator mtl_it, mtl_it_end; 195 const struct solparser_material* mtl; 196 const struct solparser_material_thin_dielectric* thin; 197 const struct solparser_medium* mdm; 198 const struct solparser_spectrum* spectrum; 199 FILE* stream; 200 201 CHK((stream = tmpfile()) != NULL); 202 203 fprintf(stream, "- sun: { dni: 1 }\n"); 204 fprintf(stream, "- spectrum: &refractive_index\n"); 205 fprintf(stream, " - { wavelength: 123, data: 1.1 }\n"); 206 fprintf(stream, " - { wavelength: 456, data: 2.2 }\n"); 207 fprintf(stream, " - { wavelength: 789, data: 3.3 }\n"); 208 fprintf(stream, "- spectrum: &absorption\n"); 209 fprintf(stream, " - { wavelength: 0.456, data: 0.2 }\n"); 210 fprintf(stream, " - { wavelength: 0.123, data: 0.1 }\n"); 211 fprintf(stream, "- material:\n"); 212 fprintf(stream, " thin_dielectric:\n"); 213 fprintf(stream, " thickness: 1\n"); 214 fprintf(stream, " medium_i: { refractive_index: 1, extinction: 0 }\n"); 215 fprintf(stream, " medium_t: \n"); 216 fprintf(stream, " refractive_index: *refractive_index\n"); 217 fprintf(stream, " extinction: *absorption\n"); 218 rewind(stream); 219 220 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 221 CHK(solparser_load(parser) == RES_OK); 222 223 solparser_material_iterator_begin(parser, &mtl_it); 224 solparser_material_iterator_end(parser, &mtl_it_end); 225 CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 0); 226 227 mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it)); 228 CHK(mtl->type == SOLPARSER_MATERIAL_THIN_DIELECTRIC); 229 thin = solparser_get_material_thin_dielectric(parser, mtl->data.thin_dielectric); 230 CHK(thin->thickness == 1); 231 CHK(SOLPARSER_ID_IS_VALID(thin->normal_map) == 0); 232 233 mdm = solparser_get_medium(parser, thin->medium_i); 234 CHK(mdm->refractive_index.type == SOLPARSER_MTL_DATA_REAL); 235 CHK(mdm->refractive_index.value.real == 1); 236 CHK(mdm->extinction.type == SOLPARSER_MTL_DATA_REAL); 237 CHK(mdm->extinction.value.real == 0); 238 239 mdm = solparser_get_medium(parser, thin->medium_t); 240 CHK(mdm->refractive_index.type == SOLPARSER_MTL_DATA_SPECTRUM); 241 spectrum = solparser_get_spectrum(parser, mdm->refractive_index.value.spectrum); 242 CHK(darray_spectrum_data_size_get(&spectrum->data) == 3); 243 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 123); 244 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 456); 245 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength == 789); 246 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 1.1); 247 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 2.2); 248 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data == 3.3); 249 spectrum = solparser_get_spectrum(parser, mdm->extinction.value.spectrum); 250 CHK(darray_spectrum_data_size_get(&spectrum->data) == 2); 251 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 0.123); 252 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 0.456); 253 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0.1); 254 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 0.2); 255 256 solparser_material_iterator_next(&mtl_it); 257 CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 1); 258 259 CHK(solparser_load(parser) == RES_BAD_OP); 260 fclose(stream); 261 } 262 263 static void 264 test_dielectric(struct solparser* parser) 265 { 266 struct solparser_material_iterator mtl_it, mtl_it_end; 267 const struct solparser_material* mtl; 268 const struct solparser_material_dielectric* dielec; 269 const struct solparser_medium* mdm; 270 const struct solparser_spectrum* spectrum; 271 FILE* stream; 272 273 CHK((stream = tmpfile()) != NULL); 274 275 fprintf(stream, "- sun: { dni: 1 }\n"); 276 fprintf(stream, "- spectrum: &refractive_index\n"); 277 fprintf(stream, " - { wavelength: 123, data: 1.1 }\n"); 278 fprintf(stream, " - { wavelength: 456, data: 2.2 }\n"); 279 fprintf(stream, " - { wavelength: 789, data: 3.3 }\n"); 280 fprintf(stream, "- spectrum: &absorption\n"); 281 fprintf(stream, " - { wavelength: 0.456, data: 0.2 }\n"); 282 fprintf(stream, " - { wavelength: 0.123, data: 0.1 }\n"); 283 fprintf(stream, "- material:\n"); 284 fprintf(stream, " dielectric:\n"); 285 fprintf(stream, " medium_i: { refractive_index: 1, extinction: 0 }\n"); 286 fprintf(stream, " medium_t: \n"); 287 fprintf(stream, " refractive_index: *refractive_index\n"); 288 fprintf(stream, " extinction: *absorption\n"); 289 rewind(stream); 290 291 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 292 CHK(solparser_load(parser) == RES_OK); 293 294 solparser_material_iterator_begin(parser, &mtl_it); 295 solparser_material_iterator_end(parser, &mtl_it_end); 296 CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 0); 297 298 mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it)); 299 CHK(mtl->type == SOLPARSER_MATERIAL_DIELECTRIC); 300 dielec = solparser_get_material_dielectric(parser, mtl->data.dielectric); 301 CHK(SOLPARSER_ID_IS_VALID(dielec->normal_map) == 0); 302 303 mdm = solparser_get_medium(parser, dielec->medium_i); 304 CHK(mdm->refractive_index.type == SOLPARSER_MTL_DATA_REAL); 305 CHK(mdm->refractive_index.value.real == 1); 306 CHK(mdm->extinction.type == SOLPARSER_MTL_DATA_REAL); 307 CHK(mdm->extinction.value.real == 0); 308 309 mdm = solparser_get_medium(parser, dielec->medium_t); 310 CHK(mdm->refractive_index.type == SOLPARSER_MTL_DATA_SPECTRUM); 311 spectrum = solparser_get_spectrum(parser, mdm->refractive_index.value.spectrum); 312 CHK(darray_spectrum_data_size_get(&spectrum->data) == 3); 313 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 123); 314 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 456); 315 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength == 789); 316 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 1.1); 317 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 2.2); 318 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data == 3.3); 319 spectrum = solparser_get_spectrum(parser, mdm->extinction.value.spectrum); 320 CHK(darray_spectrum_data_size_get(&spectrum->data) == 2); 321 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 0.123); 322 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 0.456); 323 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0.1); 324 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 0.2); 325 326 solparser_material_iterator_next(&mtl_it); 327 CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 1); 328 329 CHK(solparser_load(parser) == RES_BAD_OP); 330 fclose(stream); 331 } 332 333 int 334 main(int argc, char** argv) 335 { 336 struct mem_allocator allocator; 337 struct solparser* parser; 338 (void)argc, (void)argv; 339 340 CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK); 341 CHK(solparser_create(&allocator, &parser) == RES_OK); 342 343 test_sun(parser); 344 test_matte(parser); 345 test_mirror(parser); 346 test_thin_dielectric(parser); 347 test_dielectric(parser); 348 349 solparser_ref_put(parser); 350 351 check_memory_allocator(&allocator); 352 mem_shutdown_proxy_allocator(&allocator); 353 CHK(mem_allocated_size() == 0); 354 return 0; 355 } 356