test_solparser2.c (10249B)
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_geometry_iterator geom_it, geom_it_end; 28 struct solparser_material_iterator mtl_it, mtl_it_end; 29 struct solparser_entity_id entity_id; 30 struct solparser_object_id obj_id; 31 struct solparser_geometry_id geom_id; 32 const struct solparser_geometry* geoms[2] = { NULL, NULL }; 33 const struct solparser_material* mtls[2] = { NULL, NULL }; 34 const struct solparser_entity* entity, *entity1a, *entity1b, *entity2, *entity3; 35 const struct solparser_geometry* geom; 36 const struct solparser_object* obj; 37 const struct solparser_shape* shape; 38 const struct solparser_material_double_sided* mtl2; 39 const struct solparser_material* mtl; 40 const struct solparser_material_matte* matte; 41 const struct solparser_material_mirror* mirror; 42 const struct solparser_shape_sphere* sphere; 43 const struct solparser_sun* sun; 44 const struct solparser_spectrum* spectrum; 45 size_t nmtls = 0; 46 size_t ngeoms = 0; 47 double tmp[3]; 48 long fp; 49 FILE* stream; 50 (void)argc, (void)argv; 51 52 CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK); 53 solparser_create(&allocator, &parser); 54 55 stream = tmpfile(); 56 CHK(stream != NULL); 57 58 fprintf(stream, "- geometry: &sphere\n"); 59 fprintf(stream, " - sphere: { radius: 1 }\n"); 60 fprintf(stream, " material: { matte: { reflectivity: 1 } }\n"); 61 fprintf(stream, "- entity:\n"); 62 fprintf(stream, " primary: 0\n"); 63 fprintf(stream, " geometry: *sphere\n"); 64 65 fp = ftell(stream); 66 fprintf(stream, " name: invalid name\n"); 67 rewind(stream); 68 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 69 CHK(solparser_load(parser) == RES_BAD_ARG); 70 71 CHK(fseek(stream, fp, SEEK_SET) != -1); 72 fprintf(stream, " name: invalid\tname\n"); 73 rewind(stream); 74 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 75 CHK(solparser_load(parser) == RES_BAD_ARG); 76 77 CHK(fseek(stream, fp, SEEK_SET) != -1); 78 fprintf(stream, " name: invalid.name\n"); 79 rewind(stream); 80 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 81 CHK(solparser_load(parser) == RES_BAD_ARG); 82 83 CHK(fseek(stream, fp, SEEK_SET) != -1); 84 fprintf(stream, " name: \t\t\t lvl0 \t \n"); 85 fprintf(stream, " transform: { translation: [1,2,3], rotation: [4,5,6]}\n"); 86 fprintf(stream, " children:\n"); 87 fprintf(stream, " - name: lvl1a\n"); 88 fprintf(stream, " primary: 1\n"); 89 fprintf(stream, " geometry: \n"); 90 fprintf(stream, " - sphere: {radius: 2}\n"); 91 fprintf(stream, " material:\n"); 92 fprintf(stream, " mirror: { reflectivity: 0.9, slope_error: 0.1 }\n"); 93 fprintf(stream, " - name: lvl1b\n"); 94 fprintf(stream, " primary: 0\n"); 95 fprintf(stream, " geometry: *sphere\n"); 96 fprintf(stream, " transform: { rotation: [3.14, 0, -1] }\n"); 97 fprintf(stream, " children:\n"); 98 fprintf(stream, " - name: lvl2\n"); 99 fprintf(stream, " primary: 0\n"); 100 fprintf(stream, " geometry: *sphere\n"); 101 fprintf(stream, "- sun:\n"); 102 fprintf(stream, " dni: 1\n"); 103 fprintf(stream, " spectrum: [ { wavelength: 1, data: 1} ]\n"); 104 fprintf(stream, "- atmosphere:\n"); 105 fprintf(stream, " extinction: 0\n"); 106 rewind(stream); 107 108 CHK(solparser_setup(parser, NULL, stream) == RES_OK); 109 CHK(solparser_load(parser) == RES_OK); 110 111 solparser_geometry_iterator_begin(parser, &geom_it); 112 solparser_geometry_iterator_end(parser, &geom_it_end); 113 ngeoms = 0; 114 while(!solparser_geometry_iterator_eq(&geom_it, &geom_it_end)) { 115 CHK(ngeoms < 2); 116 geom_id = solparser_geometry_iterator_get(&geom_it); 117 solparser_geometry_iterator_next(&geom_it); 118 geoms[ngeoms] = solparser_get_geometry(parser, geom_id); 119 ++ngeoms; 120 } 121 CHK(ngeoms == 2); 122 123 solparser_material_iterator_begin(parser, &mtl_it); 124 solparser_material_iterator_end(parser, &mtl_it_end); 125 nmtls = 0; 126 while(!solparser_material_iterator_eq(&mtl_it, &mtl_it_end)) { 127 struct solparser_material_id mtl_id; 128 CHK(nmtls < 2); 129 mtl_id = solparser_material_iterator_get(&mtl_it); 130 solparser_material_iterator_next(&mtl_it); 131 mtls[nmtls] = solparser_get_material(parser, mtl_id); 132 ++nmtls; 133 } 134 CHK(nmtls == 2); 135 136 solparser_entity_iterator_begin(parser, &it); 137 solparser_entity_iterator_end(parser, &end); 138 CHK(solparser_entity_iterator_eq(&it, &end) == 0); 139 140 entity_id = solparser_entity_iterator_get(&it); 141 entity = solparser_get_entity(parser, entity_id); 142 143 CHK(strcmp("lvl0", str_cget(&entity->name)) == 0); 144 CHK(solparser_entity_get_children_count(entity) == 2); 145 CHK(entity->type == SOLPARSER_ENTITY_GEOMETRY); 146 geom_id = entity->data.geometry; 147 geom = solparser_get_geometry(parser, entity->data.geometry); 148 CHK(geom == geoms[0] || geom == geoms[1]); 149 CHK(solparser_geometry_get_objects_count(geom) == 1); 150 obj_id = solparser_geometry_get_object(geom, 0); 151 obj = solparser_get_object(parser, obj_id); 152 CHK(d3_eq(obj->rotation, d3_splat(tmp, 0)) == 1); 153 CHK(d3_eq(obj->translation, d3_splat(tmp, 0)) == 1); 154 shape = solparser_get_shape(parser, obj->shape); 155 CHK(shape->type == SOLPARSER_SHAPE_SPHERE); 156 sphere = solparser_get_shape_sphere(parser, shape->data.sphere); 157 CHK(sphere->radius == 1); 158 mtl2 = solparser_get_material_double_sided(parser, obj->mtl2); 159 CHK(mtl2->front.i == mtl2->back.i); 160 mtl = solparser_get_material(parser, mtl2->front); 161 CHK(mtl == mtls[0] || mtl == mtls[1]); 162 CHK(mtl->type == SOLPARSER_MATERIAL_MATTE); 163 matte = solparser_get_material_matte(parser, mtl->data.matte); 164 CHK(matte->reflectivity.type == SOLPARSER_MTL_DATA_REAL); 165 CHK(matte->reflectivity.value.real == 1); 166 167 entity_id = solparser_entity_get_child(entity, 0); 168 entity1a = solparser_get_entity(parser, entity_id); 169 CHK(d3_eq(entity1a->translation, d3_splat(tmp, 0)) == 1); 170 CHK(d3_eq(entity1a->rotation, d3_splat(tmp, 0)) == 1); 171 CHK(strcmp("lvl1a", str_cget(&entity1a->name)) == 0); 172 CHK(solparser_entity_get_children_count(entity1a) == 0); 173 CHK(entity1a->type == SOLPARSER_ENTITY_GEOMETRY); 174 CHK(entity1a->primary == 1); 175 CHK(entity1a->data.geometry.i != geom_id.i); 176 geom = solparser_get_geometry(parser, entity1a->data.geometry); 177 CHK(geom == geoms[0] || geom == geoms[1]); 178 CHK(solparser_geometry_get_objects_count(geom) == 1); 179 obj_id = solparser_geometry_get_object(geom, 0); 180 obj = solparser_get_object(parser, obj_id); 181 CHK(d3_eq(obj->rotation, d3_splat(tmp, 0)) == 1); 182 CHK(d3_eq(obj->translation, d3_splat(tmp, 0)) == 1); 183 shape = solparser_get_shape(parser, obj->shape); 184 CHK(shape->type == SOLPARSER_SHAPE_SPHERE); 185 sphere = solparser_get_shape_sphere(parser, shape->data.sphere); 186 CHK(sphere->radius == 2); 187 mtl2 = solparser_get_material_double_sided(parser, obj->mtl2); 188 CHK(mtl2->front.i == mtl2->back.i); 189 mtl = solparser_get_material(parser, mtl2->front); 190 CHK(mtl == mtls[0] || mtl == mtls[1]); 191 CHK(mtl->type == SOLPARSER_MATERIAL_MIRROR); 192 mirror = solparser_get_material_mirror(parser, mtl->data.mirror); 193 CHK(mirror->reflectivity.type == SOLPARSER_MTL_DATA_REAL); 194 CHK(mirror->reflectivity.value.real == 0.9); 195 CHK(mirror->slope_error.type == SOLPARSER_MTL_DATA_REAL); 196 CHK(mirror->slope_error.value.real == 0.1); 197 198 entity_id = solparser_entity_get_child(entity, 1); 199 entity1b = solparser_get_entity(parser, entity_id); 200 CHK(d3_eq(entity1b->translation, d3_splat(tmp, 0)) == 1); 201 CHK(d3_eq_eps(entity1b->rotation, d3(tmp, 3.14, 0, -1), 1.e-6) == 1); 202 CHK(strcmp("lvl1b", str_cget(&entity1b->name)) == 0); 203 CHK(solparser_entity_get_children_count(entity1b) == 1); 204 CHK(entity1b->type == SOLPARSER_ENTITY_GEOMETRY); 205 CHK(entity1b->primary == 0); 206 CHK(entity1b->data.geometry.i == geom_id.i); 207 208 entity_id = solparser_entity_get_child(entity1b, 0); 209 entity2 = solparser_get_entity(parser, entity_id); 210 CHK(d3_eq(entity2->translation, d3_splat(tmp, 0)) == 1); 211 CHK(d3_eq(entity2->rotation, d3_splat(tmp, 0)) == 1); 212 CHK(strcmp("lvl2", str_cget(&entity2->name)) == 0); 213 CHK(solparser_entity_get_children_count(entity2) == 0); 214 CHK(entity2->type == SOLPARSER_ENTITY_GEOMETRY); 215 CHK(entity2->data.geometry.i == geom_id.i); 216 217 entity3 = solparser_find_entity(parser, "lvl0"); 218 CHK(entity3 == entity); 219 entity3 = solparser_find_entity(parser, "lvl1a"); 220 CHK(entity3 == NULL); 221 entity3 = solparser_find_entity(parser, "lvl0.lvl1a"); 222 CHK(entity3 == entity1a); 223 entity3 = solparser_find_entity(parser, "lvl0.lvl1b"); 224 CHK(entity3 == entity1b); 225 entity3 = solparser_find_entity(parser, "lvl0.lvl1b.lvl2"); 226 CHK(entity3 == entity2); 227 entity3 = solparser_find_entity(parser,"lvl0.lvl1b.bad_name"); 228 CHK(entity3 == NULL); 229 230 sun = solparser_get_sun(parser); 231 CHK(sun != NULL); 232 CHK(sun->dni == 1.0); 233 CHK(sun->radang_distrib_type == SOLPARSER_SUN_RADANG_DISTRIB_DIRECTIONAL); 234 CHK(SOLPARSER_ID_IS_VALID(sun->spectrum) == 1); 235 spectrum = solparser_get_spectrum(parser, sun->spectrum); 236 CHK(darray_spectrum_data_size_get(&spectrum->data) == 1); 237 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 1.0); 238 CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 1.0); 239 240 CHK(solparser_load(parser) == RES_BAD_OP); 241 solparser_ref_put(parser); 242 243 fclose(stream); 244 245 check_memory_allocator(&allocator); 246 mem_shutdown_proxy_allocator(&allocator); 247 CHK(mem_allocated_size() == 0); 248 return 0; 249 } 250