test_solparser7.c (6262B)
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 int 22 main(int argc, char** argv) 23 { 24 struct mem_allocator allocator; 25 struct solparser* parser; 26 struct solparser_entity_iterator it, end; 27 struct solparser_entity_id entity_id; 28 struct solparser_object_id obj_id; 29 const struct solparser_entity* entity; 30 const struct solparser_geometry* geom; 31 const struct solparser_material_double_sided* mtl2; 32 const struct solparser_material* mtl; 33 const struct solparser_material_thin_dielectric* thin; 34 const struct solparser_medium* medium; 35 const struct solparser_object* obj; 36 const struct solparser_shape* shape; 37 const struct solparser_spectrum* spectrum; 38 FILE* stream; 39 (void)argc, (void)argv; 40 41 CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK); 42 solparser_create(&allocator, &parser); 43 44 stream = tmpfile(); 45 CHK(stream != NULL); 46 47 fprintf(stream, "- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1 }] }\n"); 48 fprintf(stream, "- entity:\n"); 49 fprintf(stream, " name: test\n"); 50 fprintf(stream, " primary: 0\n"); 51 fprintf(stream, " geometry:\n"); 52 fprintf(stream, " - sphere: { radius: 1 }\n"); 53 fprintf(stream, " material:\n"); 54 fprintf(stream, " thin_dielectric:\n"); 55 fprintf(stream, " thickness: 0.123\n"); 56 fprintf(stream, " medium_i: &outside\n"); 57 fprintf(stream, " refractive_index: 1\n"); 58 fprintf(stream, " extinction: 0\n"); 59 fprintf(stream, " medium_t: &inside\n"); 60 fprintf(stream, " refractive_index: \n"); 61 fprintf(stream, " - {wavelength: 1.2, data: 2.3}\n"); 62 fprintf(stream, " - {wavelength: 4.5, data: 6.7}\n"); 63 fprintf(stream, " - {wavelength: 0.5, data: 0.25}\n"); 64 fprintf(stream, " extinction:\n"); 65 fprintf(stream, " - {wavelength: 3, data: 3}\n"); 66 fprintf(stream, " - {wavelength: 1, data: 1}\n"); 67 fprintf(stream, " - {wavelength: 5, data: 5}\n"); 68 fprintf(stream, " - {wavelength: 4, data: 4}\n"); 69 fprintf(stream, " - {wavelength: 2, data: 2}\n"); 70 rewind(stream); 71 72 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 73 CHK(solparser_load(parser) == RES_OK); 74 75 solparser_entity_iterator_begin(parser, &it); 76 solparser_entity_iterator_end(parser, &end); 77 CHK(solparser_entity_iterator_eq(&it, &end) == 0); 78 79 entity_id = solparser_entity_iterator_get(&it); 80 entity = solparser_get_entity(parser, entity_id); 81 82 CHK(strcmp("test", str_cget(&entity->name)) == 0); 83 CHK(solparser_entity_get_children_count(entity) == 0); 84 CHK(entity->type == SOLPARSER_ENTITY_GEOMETRY); 85 geom = solparser_get_geometry(parser, entity->data.geometry); 86 CHK(solparser_geometry_get_objects_count(geom) == 1); 87 obj_id = solparser_geometry_get_object(geom, 0); 88 obj = solparser_get_object(parser, obj_id); 89 shape = solparser_get_shape(parser, obj->shape); 90 CHK(shape->type == SOLPARSER_SHAPE_SPHERE); 91 mtl2 = solparser_get_material_double_sided(parser, obj->mtl2); 92 CHK(mtl2->front.i == mtl2->back.i); 93 mtl = solparser_get_material(parser, mtl2->front); 94 CHK(mtl->type == SOLPARSER_MATERIAL_THIN_DIELECTRIC); 95 thin = solparser_get_material_thin_dielectric 96 (parser, mtl->data.thin_dielectric); 97 CHK(thin->thickness == 0.123); 98 99 medium = solparser_get_medium(parser, thin->medium_i); 100 CHK(medium->refractive_index.type == SOLPARSER_MTL_DATA_REAL); 101 CHK(medium->refractive_index.value.real == 1); 102 CHK(medium->extinction.type == SOLPARSER_MTL_DATA_REAL); 103 CHK(medium->extinction.value.real == 0); 104 medium = solparser_get_medium(parser, thin->medium_t); 105 106 CHK(medium->refractive_index.type == SOLPARSER_MTL_DATA_SPECTRUM); 107 spectrum = solparser_get_spectrum(parser, medium->refractive_index.value.spectrum); 108 CHK(darray_spectrum_data_size_get(&spectrum->data) == 3); 109 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 0.5); 110 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 1.2); 111 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength == 4.5); 112 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0.25); 113 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 2.3); 114 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data == 6.7); 115 116 CHK(medium->extinction.type == SOLPARSER_MTL_DATA_SPECTRUM); 117 spectrum = solparser_get_spectrum(parser, medium->extinction.value.spectrum); 118 CHK(darray_spectrum_data_size_get(&spectrum->data) == 5); 119 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 1); 120 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 2); 121 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength == 3); 122 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[3].wavelength == 4); 123 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[4].wavelength == 5); 124 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 1); 125 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 2); 126 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data == 3); 127 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[3].data == 4); 128 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[4].data == 5); 129 130 CHK(solparser_load(parser) == RES_BAD_OP); 131 solparser_ref_put(parser); 132 133 fclose(stream); 134 135 check_memory_allocator(&allocator); 136 mem_shutdown_proxy_allocator(&allocator); 137 CHK(mem_allocated_size() == 0); 138 return 0; 139 }