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