test_mrumtl_bands.c (11378B)
1 /* Copyright (C) 2020-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 "mrumtl.h" 17 #include <rsys/mem_allocator.h> 18 19 #include <stdio.h> 20 21 static void 22 test_load1(struct mrumtl* mrumtl) 23 { 24 FILE* fp = NULL; 25 const char* filename = "test_file_band.mrumtl"; 26 const struct mrumtl_brdf* brdf = NULL; 27 struct mrumtl_brdf_lambertian lambertian = MRUMTL_BRDF_LAMBERTIAN_NULL; 28 struct mrumtl_brdf_specular specular = MRUMTL_BRDF_SPECULAR_NULL; 29 30 CHK(fp = fopen(filename, "w+")); 31 fprintf(fp, "# Comment\n"); 32 fprintf(fp, "bands 2 # Comment at the end of a line\n"); 33 fprintf(fp, "200.1 280.3 lambertian 1\n"); 34 fprintf(fp, "381 700.4 specular 0.4\n"); 35 rewind(fp); 36 37 CHK(mrumtl_load_stream(NULL, fp, filename) == RES_BAD_ARG); 38 CHK(mrumtl_load_stream(mrumtl, NULL, filename) == RES_BAD_ARG); 39 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_OK); 40 41 rewind(fp); 42 CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); 43 44 CHK(mrumtl_load(NULL, filename) == RES_BAD_ARG); 45 CHK(mrumtl_load(mrumtl, NULL) == RES_BAD_ARG); 46 CHK(mrumtl_load(mrumtl, "invalid") == RES_IO_ERR); 47 CHK(mrumtl_load(mrumtl, filename) == RES_OK); 48 49 CHK(mrumtl_get_brdfs_count(mrumtl) == 2); 50 51 CHK(brdf = mrumtl_get_brdf(mrumtl, 0)); 52 CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); 53 54 CHK(mrumtl_brdf_get_lambertian(NULL, &lambertian) == RES_BAD_ARG); 55 CHK(mrumtl_brdf_get_lambertian(brdf, NULL) == RES_BAD_ARG); 56 CHK(mrumtl_brdf_get_lambertian(brdf, &lambertian) == RES_OK); 57 CHK(lambertian.wavelengths[0] == 200.1); 58 CHK(lambertian.wavelengths[1] == 280.3); 59 CHK(lambertian.reflectivity == 1); 60 61 CHK(brdf = mrumtl_get_brdf(mrumtl, 1)); 62 CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR); 63 64 CHK(mrumtl_brdf_get_specular(NULL, &specular) == RES_BAD_ARG); 65 CHK(mrumtl_brdf_get_specular(brdf, NULL) == RES_BAD_ARG); 66 CHK(mrumtl_brdf_get_specular(brdf, &specular) == RES_OK); 67 CHK(specular.wavelengths[0] == 381); 68 CHK(specular.wavelengths[1] == 700.4); 69 CHK(specular.reflectivity == 0.4); 70 71 CHK(fclose(fp) == 0); 72 } 73 74 static void 75 test_load2(struct mrumtl* mrumtl) 76 { 77 struct mrumtl_brdf_lambertian lambertian = MRUMTL_BRDF_LAMBERTIAN_NULL; 78 struct mrumtl_brdf_specular specular = MRUMTL_BRDF_SPECULAR_NULL; 79 const struct mrumtl_brdf* brdf = NULL; 80 FILE* fp = NULL; 81 82 CHK(fp = tmpfile()); 83 fprintf(fp, "bands 6\n"); 84 fprintf(fp, "200.0 200.0 lambertian 1\n"); 85 fprintf(fp, "200.1 200.2 specular 0\n"); 86 fprintf(fp, "200.2 200.5 specular 0.3\n"); 87 fprintf(fp, "300.4 480.2 specular 0.6\n"); 88 fprintf(fp, "500.0 501.0 lambertian 0.5\n"); 89 fprintf(fp, "680.6 780.7 specular 0.63\n"); 90 rewind(fp); 91 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_OK); 92 93 CHK(mrumtl_get_brdfs_count(mrumtl) == 6); 94 95 CHK(brdf = mrumtl_get_brdf(mrumtl, 0)); 96 CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); 97 CHK(mrumtl_brdf_get_specular(brdf, &specular) == RES_BAD_ARG); 98 CHK(mrumtl_brdf_get_lambertian(brdf, &lambertian) == RES_OK); 99 CHK(lambertian.wavelengths[0] == 200.0 && lambertian.wavelengths[1] == 200.0); 100 CHK(lambertian.reflectivity == 1); 101 102 CHK(brdf = mrumtl_get_brdf(mrumtl, 1)); 103 CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR); 104 CHK(mrumtl_brdf_get_lambertian(brdf, &lambertian) == RES_BAD_ARG); 105 CHK(mrumtl_brdf_get_specular(brdf, &specular) == RES_OK); 106 CHK(specular.wavelengths[0] == 200.1 && specular.wavelengths[1] == 200.2); 107 CHK(specular.reflectivity == 0); 108 109 CHK(brdf = mrumtl_get_brdf(mrumtl, 2)); 110 CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR); 111 CHK(mrumtl_brdf_get_specular(brdf, &specular) == RES_OK); 112 CHK(specular.wavelengths[0] == 200.2 && specular.wavelengths[1] == 200.5); 113 CHK(specular.reflectivity == 0.3); 114 115 CHK(brdf = mrumtl_get_brdf(mrumtl, 3)); 116 CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR); 117 CHK(mrumtl_brdf_get_specular(brdf, &specular) == RES_OK); 118 CHK(specular.wavelengths[0] == 300.4 && specular.wavelengths[1] == 480.2); 119 CHK(specular.reflectivity == 0.6); 120 121 CHK(brdf = mrumtl_get_brdf(mrumtl, 4)); 122 CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); 123 CHK(mrumtl_brdf_get_lambertian(brdf, &lambertian) == RES_OK); 124 CHK(lambertian.wavelengths[0] == 500.0 && lambertian.wavelengths[1] == 501.0); 125 CHK(lambertian.reflectivity == 0.5); 126 127 CHK(brdf = mrumtl_get_brdf(mrumtl, 5)); 128 CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR); 129 CHK(mrumtl_brdf_get_specular(brdf, &specular) == RES_OK); 130 CHK(specular.wavelengths[0] == 680.6 && specular.wavelengths[1] == 780.7); 131 CHK(specular.reflectivity == 0.63); 132 133 fclose(fp); 134 } 135 136 static void 137 test_fetch(struct mrumtl* mrumtl) 138 { 139 FILE* fp = NULL; 140 size_t ibrdf = 0; 141 142 CHK(fp = tmpfile()); 143 fprintf(fp, "bands 0\n"); 144 rewind(fp); 145 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_OK); 146 CHK(fclose(fp) == 0); 147 148 CHK(mrumtl_fetch_brdf(NULL, 400, 0.5, &ibrdf) == RES_BAD_ARG); 149 CHK(mrumtl_fetch_brdf(mrumtl, -1, 0.5, &ibrdf) == RES_BAD_ARG); 150 CHK(mrumtl_fetch_brdf(mrumtl, 400, -0.1, &ibrdf) == RES_BAD_ARG); 151 CHK(mrumtl_fetch_brdf(mrumtl, 400, 1, &ibrdf) == RES_BAD_ARG); 152 CHK(mrumtl_fetch_brdf(mrumtl, 400, 0.5, NULL) == RES_BAD_ARG); 153 CHK(mrumtl_fetch_brdf(mrumtl, 400, 0.5, &ibrdf) == RES_OK); 154 CHK(ibrdf >= mrumtl_get_brdfs_count(mrumtl)); 155 156 CHK(fp = tmpfile()); 157 fprintf(fp, "bands 2\n"); 158 fprintf(fp, "200 300 lambertian 0.0\n"); 159 fprintf(fp, "300 400 lambertian 0.1\n"); 160 rewind(fp); 161 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_OK); 162 CHK(fclose(fp) == 0); 163 164 CHK(mrumtl_fetch_brdf(mrumtl, 100, 0, &ibrdf) == RES_OK); 165 CHK(ibrdf == 0); 166 CHK(mrumtl_fetch_brdf(mrumtl, 450, 0, &ibrdf) == RES_OK); 167 CHK(ibrdf == 1); 168 CHK(mrumtl_fetch_brdf(mrumtl, 300, 0, &ibrdf) == RES_OK); 169 CHK(ibrdf == 0); 170 CHK(mrumtl_fetch_brdf(mrumtl, 300.1, 0, &ibrdf) == RES_OK); 171 CHK(ibrdf == 1); 172 173 CHK(fp = tmpfile()); 174 fprintf(fp, "bands 4\n"); 175 fprintf(fp, "100 150 lambertian 0\n"); 176 fprintf(fp, "200 200 lambertian 1\n"); 177 fprintf(fp, "300 400 lambertian 0.1\n"); 178 fprintf(fp, "400 401 specular 0.5\n"); 179 rewind(fp); 180 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_OK); 181 CHK(fclose(fp) == 0); 182 183 CHK(mrumtl_fetch_brdf(mrumtl, 160, 0, &ibrdf) == RES_OK); 184 CHK(ibrdf == 0); 185 CHK(mrumtl_fetch_brdf(mrumtl, 160, 0.5, &ibrdf) == RES_OK); 186 CHK(ibrdf == 0); 187 CHK(mrumtl_fetch_brdf(mrumtl, 160, 0.8, &ibrdf) == RES_OK); 188 CHK(ibrdf == 1); 189 CHK(mrumtl_fetch_brdf(mrumtl, 200, 0, &ibrdf) == RES_OK); 190 CHK(ibrdf == 1); 191 CHK(mrumtl_fetch_brdf(mrumtl, 250, 0.49, &ibrdf) == RES_OK); 192 CHK(ibrdf == 1); 193 CHK(mrumtl_fetch_brdf(mrumtl, 250, 0.5, &ibrdf) == RES_OK); 194 CHK(ibrdf == 2); 195 CHK(mrumtl_fetch_brdf(mrumtl, 400.1, 0, &ibrdf) == RES_OK); 196 CHK(ibrdf == 3); 197 } 198 199 static void 200 test_load_fail(struct mrumtl* mrumtl) 201 { 202 FILE* fp = NULL; 203 204 /* Invalid keyword */ 205 CHK(fp = tmpfile()); 206 fprintf(fp, "bande 1\n"); 207 fprintf(fp, "200.0 200.1 lambertian 1\n"); 208 rewind(fp); 209 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 210 CHK(fclose(fp) == 0); 211 212 /* No band count */ 213 CHK(fp = tmpfile()); 214 fprintf(fp, "bands\n"); 215 rewind(fp); 216 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 217 CHK(fclose(fp) == 0); 218 219 /* Missing a band definition */ 220 CHK(fp = tmpfile()); 221 fprintf(fp, "bands 2\n"); 222 fprintf(fp, "200.0 200.1 lambertian 1\n"); 223 rewind(fp); 224 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 225 CHK(fclose(fp) == 0); 226 227 /* Invalid wavelengths */ 228 CHK(fp = tmpfile()); 229 fprintf(fp, "bands 1\n"); 230 fprintf(fp, "-200.0 200.1 lambertian 1\n"); 231 rewind(fp); 232 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 233 CHK(fclose(fp) == 0); 234 235 /* Missing a band boundary */ 236 CHK(fp = tmpfile()); 237 fprintf(fp, "bands 1\n"); 238 fprintf(fp, "200.0 lambertian 1\n"); 239 rewind(fp); 240 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 241 CHK(fclose(fp) == 0); 242 243 /* Invalid BRDF */ 244 CHK(fp = tmpfile()); 245 fprintf(fp, "bands 1\n"); 246 fprintf(fp, "200.0 200.1 Lambertian 1\n"); 247 rewind(fp); 248 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 249 CHK(fclose(fp) == 0); 250 251 /* Invalid reflectivity */ 252 CHK(fp = tmpfile()); 253 fprintf(fp, "bands 1\n"); 254 fprintf(fp, "200.0 200.1 lambertian -0.1\n"); 255 rewind(fp); 256 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 257 CHK(fclose(fp) == 0); 258 259 /* Invalid reflectivity */ 260 CHK(fp = tmpfile()); 261 fprintf(fp, "bands 1\n"); 262 fprintf(fp, "200.1 200.2 specular 1.1\n"); 263 rewind(fp); 264 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 265 CHK(fclose(fp) == 0); 266 267 268 /* Additional parameters. Print a warning */ 269 CHK(fp = tmpfile()); 270 fprintf(fp, "bands 1 additional_text\n"); 271 fprintf(fp, "200.0 200.1 lambertian 0.1\n"); 272 rewind(fp); 273 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_OK); 274 CHK(fclose(fp) == 0); 275 276 /* Unsorted BRDFs */ 277 CHK(fp = tmpfile()); 278 fprintf(fp, "bands 2\n"); 279 fprintf(fp, "200.1 200.2 specular 0\n"); 280 fprintf(fp, "200.0 200.1 lambertian 0.1\n"); 281 rewind(fp); 282 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 283 CHK(fclose(fp) == 0); 284 285 /* BRDFs overlap */ 286 CHK(fp = tmpfile()); 287 fprintf(fp, "bands 2\n"); 288 fprintf(fp, "200.0 200.2 lambertian 0.1\n"); 289 fprintf(fp, "200.1 200.3 specular 0\n"); 290 rewind(fp); 291 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 292 CHK(fclose(fp) == 0); 293 294 /* Missing data */ 295 CHK(fp = tmpfile()); 296 fprintf(fp, "bands 1\n"); 297 fprintf(fp, "200"); 298 rewind(fp); 299 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 300 CHK(fclose(fp) == 0); 301 302 /* Missing data */ 303 CHK(fp = tmpfile()); 304 fprintf(fp, "bands 1\n"); 305 fprintf(fp, "200 300"); 306 rewind(fp); 307 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 308 CHK(fclose(fp) == 0); 309 310 /* Missing data */ 311 CHK(fp = tmpfile()); 312 fprintf(fp, "bands 1\n"); 313 fprintf(fp, "200 300 lambertian"); 314 rewind(fp); 315 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 316 CHK(fclose(fp) == 0); 317 318 /* Missing data */ 319 CHK(fp = tmpfile()); 320 fprintf(fp, "bands 1\n"); 321 fprintf(fp, "200 300 specular"); 322 rewind(fp); 323 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_BAD_ARG); 324 CHK(fclose(fp) == 0); 325 326 /* Additional parameters. Print a warning */ 327 CHK(fp = tmpfile()); 328 fprintf(fp, "bands 1\n"); 329 fprintf(fp, "200 300 specular 1 additional_text"); 330 rewind(fp); 331 CHK(mrumtl_load_stream(mrumtl, fp, NULL) == RES_OK); 332 CHK(fclose(fp) == 0); 333 } 334 335 int 336 main(int argc, char** argv) 337 { 338 struct mrumtl_create_args args = MRUMTL_CREATE_ARGS_DEFAULT; 339 struct mrumtl* mrumtl = NULL; 340 (void)argc, (void)argv; 341 342 args.verbose = 1; 343 CHK(mrumtl_create(&args, &mrumtl) == RES_OK); 344 CHK(mrumtl_get_brdfs_count(mrumtl) == 0); 345 346 test_load1(mrumtl); 347 test_load2(mrumtl); 348 test_fetch(mrumtl); 349 test_load_fail(mrumtl); 350 351 CHK(mrumtl_ref_put(mrumtl) == RES_OK); 352 CHK(mem_allocated_size() == 0); 353 return 0; 354 }