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