star-3dstl

Create star-3d geometries from StL files
git clone git://git.meso-star.fr/star-3dstl.git
Log | Files | Refs | README | LICENSE

test_s3dstl.c (7380B)


      1 /* Copyright (C) 2016, 2018, 2021, 2023 |Méso|Star> (contact@meso-star.com)
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 3 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program. If not, see <http://www.gnu.org/licenses/>. */
     15 
     16 #include "s3dstl.h"
     17 
     18 #include <rsys/logger.h>
     19 #include <rsys/mem_allocator.h>
     20 
     21 #include <star/s3d.h>
     22 #include <star/sstl.h>
     23 
     24 static void
     25 test_load(struct s3dstl* s3dstl)
     26 {
     27   FILE* file, *file2;
     28   struct s3d_shape* shape, *shape2;
     29   static const char* test0 =
     30     "solid my solid\n"
     31     "endsolid my solid";
     32   static const char* bad =
     33     "solid\n"
     34     "  facet normal 0.0 -1.0 0.0\n"
     35     "    outer loop\n"
     36     "      vertex 0.0 0.0 0.0\n"
     37     "      vertex 0.0 0.0 1.0\n"
     38     "    endloop\n"
     39     "  endfacet";
     40   static const char* cube[] = {
     41     "solid cube\n",
     42     "  facet normal 0 0 0\n",
     43     "    outer loop\n",
     44     "      vertex 0 0 0\n",
     45     "      vertex 0 1 0\n",
     46     "      vertex 1 1 0\n",
     47     "    endloop\n",
     48     "  endfacet\n",
     49     "  facet normal 0 0 0\n",
     50     "    outer loop\n",
     51     "      vertex 0 0 0\n",
     52     "      vertex 1 1 0\n",
     53     "      vertex 1 0 0\n",
     54     "    endloop\n",
     55     "  endfacet\n",
     56     "  facet normal 0 0 0\n",
     57     "    outer loop\n",
     58     "      vertex 0 0 0\n",
     59     "      vertex 0 0 1\n",
     60     "      vertex 0 1 1\n",
     61     "    endloop\n",
     62     "  endfacet\n",
     63     "  facet normal 0 0 0\n",
     64     "    outer loop\n",
     65     "      vertex 0 0 0\n",
     66     "      vertex 0 1 1\n",
     67     "      vertex 0 1 0\n",
     68     "    endloop\n",
     69     "  endfacet\n",
     70     "  facet normal 0 0 0\n",
     71     "    outer loop\n",
     72     "      vertex 0 0 0\n",
     73     "      vertex 1 0 0\n",
     74     "      vertex 1 0 1\n",
     75     "    endloop\n",
     76     "  endfacet\n",
     77     "  facet normal 0 0 0\n",
     78     "    outer loop\n",
     79     "      vertex 0 0 0\n",
     80     "      vertex 1 0 1\n",
     81     "      vertex 0 0 1\n",
     82     "    endloop\n",
     83     "  endfacet\n",
     84     "  facet normal 0 0 0\n",
     85     "    outer loop\n",
     86     "      vertex 0 0 1\n",
     87     "      vertex 1 0 1\n",
     88     "      vertex 1 1 1\n",
     89     "    endloop\n",
     90     "  endfacet\n",
     91     "  facet normal 0 0 0\n",
     92     "    outer loop\n",
     93     "      vertex 0 0 1\n",
     94     "      vertex 1 1 1\n",
     95     "      vertex 0 1 1\n",
     96     "    endloop\n",
     97     "  endfacet\n",
     98     "  facet normal 0 0 0\n",
     99     "    outer loop\n",
    100     "      vertex 1 0 0\n",
    101     "      vertex 1 1 0\n",
    102     "      vertex 1 1 1\n",
    103     "    endloop\n",
    104     "  endfacet\n",
    105     "  facet normal 0 0 0\n",
    106     "    outer loop\n",
    107     "      vertex 1 0 0\n",
    108     "      vertex 1 1 1\n",
    109     "      vertex 1 0 1\n",
    110     "    endloop\n",
    111     "  endfacet\n",
    112     "  facet normal 0 0 0\n",
    113     "    outer loop\n",
    114     "      vertex 0 1 0\n",
    115     "      vertex 0 1 1\n",
    116     "      vertex 1 1 1\n",
    117     "    endloop\n",
    118     "  endfacet\n",
    119     "  facet normal 0 0 0\n",
    120     "    outer loop\n",
    121     "      vertex 0 1 0\n",
    122     "      vertex 1 1 1\n",
    123     "      vertex 1 1 0\n",
    124     "    endloop\n",
    125     "  endfacet\n",
    126     "endsolid cube"
    127   };
    128   const size_t cube_nlines = sizeof(cube)/sizeof(const char*);
    129   size_t i;
    130 
    131   file = fopen("test_empty.stl", "w");
    132   CHK(file != NULL);
    133   fwrite(test0, sizeof(char), strlen(test0), file);
    134   fclose(file);
    135 
    136   CHK(s3dstl_load(NULL, NULL) == RES_BAD_ARG);
    137   CHK(s3dstl_load(s3dstl, NULL) == RES_BAD_ARG);
    138   CHK(s3dstl_load(NULL, "test_empty.stl") == RES_BAD_ARG);
    139   CHK(s3dstl_load(s3dstl, "test_none.stl") == RES_IO_ERR);
    140   CHK(s3dstl_load(s3dstl, "test_empty.stl") == RES_OK);
    141 
    142   CHK(s3dstl_get_shape(NULL, NULL) == RES_BAD_ARG);
    143   CHK(s3dstl_get_shape(s3dstl, NULL) == RES_BAD_ARG);
    144   CHK(s3dstl_get_shape(NULL, &shape) == RES_BAD_ARG);
    145   CHK(s3dstl_get_shape(s3dstl, &shape) == RES_OK);
    146   CHK(shape == NULL);
    147 
    148   file = tmpfile();
    149   FOR_EACH(i, 0, cube_nlines)
    150     fwrite(cube[i], sizeof(char), strlen(cube[i]), file);
    151   rewind(file);
    152 
    153   CHK(s3dstl_load_stream(NULL, NULL) == RES_BAD_ARG);
    154   CHK(s3dstl_load_stream(s3dstl, NULL) == RES_BAD_ARG);
    155   CHK(s3dstl_load_stream(NULL, file) == RES_BAD_ARG);
    156   CHK(s3dstl_load_stream(s3dstl, file) == RES_OK);
    157 
    158   CHK(s3dstl_get_shape(s3dstl, &shape) == RES_OK);
    159   CHK(shape != NULL);
    160 
    161   file2 = tmpfile();
    162   CHK(file2 != NULL);
    163   fwrite(bad, sizeof(char), strlen(bad), file2);
    164   rewind(file2);
    165   CHK(s3dstl_load_stream(s3dstl, file2) == RES_BAD_ARG);
    166   CHK(s3dstl_get_shape(s3dstl, &shape2) == RES_OK);
    167   CHK(shape == shape2);
    168 
    169   rewind(file);
    170   CHK(s3dstl_load_stream(s3dstl, file) == RES_OK);
    171   CHK(s3dstl_get_shape(s3dstl, &shape) == RES_OK);
    172   CHK(shape != NULL);
    173 
    174   CHK(s3dstl_clear(NULL) == RES_BAD_ARG);
    175   CHK(s3dstl_clear(s3dstl) == RES_OK);
    176   CHK(s3dstl_get_shape(s3dstl, &shape) == RES_OK);
    177   CHK(shape == NULL);
    178 
    179   CHK(fclose(file) == 0);
    180   CHK(fclose(file2) == 0);
    181 }
    182 
    183 int
    184 main(int argc, char** argv)
    185 {
    186   struct mem_allocator allocator_proxy;
    187   struct s3dstl* s3dstl;
    188   struct s3d_device* s3d;
    189   struct sstl* sstl;
    190   struct sstl* sstl2;
    191   (void)argc, (void)argv;
    192 
    193   mem_init_proxy_allocator(&allocator_proxy, &mem_default_allocator);
    194 
    195   CHK(s3d_device_create(NULL, &allocator_proxy, 0, &s3d) == RES_OK);
    196 
    197   CHK(s3dstl_create(NULL, NULL, NULL, NULL, 1, NULL) == RES_BAD_ARG);
    198   CHK(s3dstl_create(NULL, NULL, NULL, NULL, 1, &s3dstl) == RES_BAD_ARG);
    199   CHK(s3dstl_create(NULL, NULL, NULL, s3d, 1, NULL) == RES_BAD_ARG);
    200   CHK(s3dstl_create(NULL, NULL, NULL, s3d, 1, &s3dstl) == RES_OK);
    201 
    202   CHK(s3dstl_ref_get(NULL) == RES_BAD_ARG);
    203   CHK(s3dstl_ref_get(s3dstl) == RES_OK);
    204   CHK(s3dstl_ref_put(NULL) == RES_BAD_ARG);
    205   CHK(s3dstl_ref_put(s3dstl) == RES_OK);
    206   CHK(s3dstl_ref_put(s3dstl) == RES_OK);
    207 
    208   CHK(s3dstl_create(NULL, &allocator_proxy, NULL, NULL, 1, NULL) == RES_BAD_ARG);
    209   CHK(s3dstl_create(NULL, &allocator_proxy, NULL, NULL, 1, &s3dstl) == RES_BAD_ARG);
    210   CHK(s3dstl_create(NULL, &allocator_proxy, NULL, s3d, 1, NULL) == RES_BAD_ARG);
    211   CHK(s3dstl_create(NULL, &allocator_proxy, NULL, s3d, 1, &s3dstl) == RES_OK);
    212   CHK(s3dstl_ref_put(s3dstl) == RES_OK);
    213 
    214   CHK(s3dstl_create
    215     (LOGGER_DEFAULT, &allocator_proxy, NULL, s3d, 1, &s3dstl) == RES_OK);
    216 
    217   CHK(s3dstl_get_sstl(NULL, NULL) == RES_BAD_ARG);
    218   CHK(s3dstl_get_sstl(s3dstl, NULL) == RES_BAD_ARG);
    219   CHK(s3dstl_get_sstl(NULL, &sstl) == RES_BAD_ARG);
    220   CHK(s3dstl_get_sstl(s3dstl, &sstl) == RES_OK);
    221 
    222   CHK(s3dstl_ref_put(s3dstl) == RES_OK);
    223 
    224   CHK(sstl_create(NULL, &allocator_proxy, 1, &sstl) == RES_OK);
    225   CHK(s3dstl_create(NULL, &allocator_proxy, sstl, s3d, 1, &s3dstl) == RES_OK);
    226   CHK(s3dstl_get_sstl(s3dstl, &sstl2) == RES_OK);
    227   CHK(sstl == sstl2);
    228 
    229   test_load(s3dstl);
    230 
    231   CHK(s3dstl_ref_put(s3dstl) == RES_OK);
    232   CHK(s3d_device_ref_put(s3d) == RES_OK);
    233   CHK(sstl_ref_put(sstl) == RES_OK);
    234 
    235   if(MEM_ALLOCATED_SIZE(&allocator_proxy)) {
    236     char dump[512];
    237     MEM_DUMP(&allocator_proxy, dump, sizeof(dump)/sizeof(char));
    238     fprintf(stderr, "%s\n", dump);
    239     FATAL("Memory leaks\n");
    240   }
    241   mem_shutdown_proxy_allocator(&allocator_proxy);
    242   CHK(mem_allocated_size() == 0);
    243   return 0;
    244 }
    245