solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

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