mrumtl

Describe materials that vary spectrally
git clone git://git.meso-star.fr/mrumtl.git
Log | Files | Refs | README | LICENSE

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 }