commit e0327dccacb1bf2d71e704d56151134c2f9ceefa
parent 9f0380b99c4c0b3e58c369b89ff1dd5444d17648
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Mon, 24 Apr 2017 15:25:38 +0200
Test the parsing of the spectral materials
Diffstat:
1 file changed, 254 insertions(+), 0 deletions(-)
diff --git a/src/parser/test_solparser_spectrum.c b/src/parser/test_solparser_spectrum.c
@@ -79,6 +79,256 @@ test_sun(struct solparser* parser)
fclose(stream);
}
+static void
+test_matte(struct solparser* parser)
+{
+ struct solparser_material_iterator mtl_it, mtl_it_end;
+ const struct solparser_material* mtl;
+ const struct solparser_material_matte* matte;
+ const struct solparser_spectrum* spectrum;
+ FILE* stream;
+
+ NCHECK(stream = tmpfile(), NULL);
+
+ fprintf(stream, "- sun: { dni: 1 }\n");
+ fprintf(stream, "- material:\n");
+ fprintf(stream, " matte:\n");
+ fprintf(stream, " reflectivity:\n");
+ fprintf(stream, " - { wavelength: 3.4, data: 0.5 }\n");
+ fprintf(stream, " - { wavelength: 1.2, data: 0.25 }\n");
+ fprintf(stream, " - { wavelength: 6.7, data: 0.125 }\n");
+ rewind(stream);
+
+ CHECK(solparser_setup(parser, NULL, stream), RES_OK);
+ CHECK(solparser_load(parser), RES_OK);
+
+ solparser_material_iterator_begin(parser, &mtl_it);
+ solparser_material_iterator_end(parser, &mtl_it_end);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 0);
+
+ mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
+ CHECK(mtl->type, SOLPARSER_MATERIAL_MATTE);
+ matte = solparser_get_material_matte(parser, mtl->data.matte);
+ CHECK(matte->reflectivity.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ CHECK(SOLPARSER_ID_IS_VALID(matte->normal_map), 0);
+ spectrum = solparser_get_spectrum(parser, matte->reflectivity.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 1.2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 3.4);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 6.7);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0.25);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 0.5);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 0.125);
+
+ solparser_material_iterator_next(&mtl_it);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 1);
+
+ CHECK(solparser_load(parser), RES_BAD_OP);
+ fclose(stream);
+}
+
+static void
+test_mirror(struct solparser* parser)
+{
+ struct solparser_material_iterator mtl_it, mtl_it_end;
+ const struct solparser_material* mtl;
+ const struct solparser_material_mirror* mirror;
+ const struct solparser_spectrum* spectrum;
+ FILE* stream;
+
+ NCHECK(stream = tmpfile(), NULL);
+
+ fprintf(stream, "- sun: { dni: 1 }\n");
+ fprintf(stream, "- material:\n");
+ fprintf(stream, " mirror:\n");
+ fprintf(stream, " reflectivity:\n");
+ fprintf(stream, " - { wavelength: 3.4, data: 0.5 }\n");
+ fprintf(stream, " - { wavelength: 1.2, data: 0.25 }\n");
+ fprintf(stream, " - { wavelength: 6.7, data: 0.125 }\n");
+ fprintf(stream, " roughness:\n");
+ fprintf(stream, " - { wavelength: 123, data: 0 }\n");
+ fprintf(stream, " - { wavelength: 456, data: 1 }\n");
+ rewind(stream);
+
+ CHECK(solparser_setup(parser, NULL, stream), RES_OK);
+ CHECK(solparser_load(parser), RES_OK);
+
+ solparser_material_iterator_begin(parser, &mtl_it);
+ solparser_material_iterator_end(parser, &mtl_it_end);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 0);
+
+ mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
+ CHECK(mtl->type, SOLPARSER_MATERIAL_MIRROR);
+ mirror = solparser_get_material_mirror(parser, mtl->data.mirror);
+ CHECK(mirror->reflectivity.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ CHECK(mirror->roughness.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ CHECK(SOLPARSER_ID_IS_VALID(mirror->normal_map), 0);
+
+ spectrum = solparser_get_spectrum(parser, mirror->reflectivity.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 1.2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 3.4);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 6.7);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0.25);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 0.5);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 0.125);
+
+ spectrum = solparser_get_spectrum(parser, mirror->roughness.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 123);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 456);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 1);
+
+ solparser_material_iterator_next(&mtl_it);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 1);
+
+ CHECK(solparser_load(parser), RES_BAD_OP);
+ fclose(stream);
+}
+
+static void
+test_thin_dielectric(struct solparser* parser)
+{
+ struct solparser_material_iterator mtl_it, mtl_it_end;
+ const struct solparser_material* mtl;
+ const struct solparser_material_thin_dielectric* thin;
+ const struct solparser_medium* mdm;
+ const struct solparser_spectrum* spectrum;
+ FILE* stream;
+
+ NCHECK(stream = tmpfile(), NULL);
+
+ fprintf(stream, "- sun: { dni: 1 }\n");
+ fprintf(stream, "- spectrum: &refractive_index\n");
+ fprintf(stream, " - { wavelength: 123, data: 1.1 }\n");
+ fprintf(stream, " - { wavelength: 456, data: 2.2 }\n");
+ fprintf(stream, " - { wavelength: 789, data: 3.3 }\n");
+ fprintf(stream, "- spectrum: &absorptivity\n");
+ fprintf(stream, " - { wavelength: 0.456, data: 0.2 }\n");
+ fprintf(stream, " - { wavelength: 0.123, data: 0.1 }\n");
+ fprintf(stream, "- material:\n");
+ fprintf(stream, " thin_dielectric:\n");
+ fprintf(stream, " thickness: 1\n");
+ fprintf(stream, " medium_i: { refractive_index: 1, absorptivity: 0 }\n");
+ fprintf(stream, " medium_t: \n");
+ fprintf(stream, " refractive_index: *refractive_index\n");
+ fprintf(stream, " absorptivity: *absorptivity\n");
+ rewind(stream);
+
+ CHECK(solparser_setup(parser, NULL, stream), RES_OK);
+ CHECK(solparser_load(parser), RES_OK);
+
+ solparser_material_iterator_begin(parser, &mtl_it);
+ solparser_material_iterator_end(parser, &mtl_it_end);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 0);
+
+ mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
+ CHECK(mtl->type, SOLPARSER_MATERIAL_THIN_DIELECTRIC);
+ thin = solparser_get_material_thin_dielectric(parser, mtl->data.thin_dielectric);
+ CHECK(thin->thickness, 1);
+ CHECK(SOLPARSER_ID_IS_VALID(thin->normal_map), 0);
+
+ mdm = solparser_get_medium(parser, thin->medium_i);
+ CHECK(mdm->refractive_index.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mdm->refractive_index.value.real, 1);
+ CHECK(mdm->absorptivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mdm->absorptivity.value.real, 0);
+
+ mdm = solparser_get_medium(parser, thin->medium_t);
+ CHECK(mdm->refractive_index.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ spectrum = solparser_get_spectrum(parser, mdm->refractive_index.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 123);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 456);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 789);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 1.1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 2.2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 3.3);
+ spectrum = solparser_get_spectrum(parser, mdm->absorptivity.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 0.123);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 0.456);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0.1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 0.2);
+
+ solparser_material_iterator_next(&mtl_it);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 1);
+
+ CHECK(solparser_load(parser), RES_BAD_OP);
+ fclose(stream);
+}
+
+static void
+test_dielectric(struct solparser* parser)
+{
+ struct solparser_material_iterator mtl_it, mtl_it_end;
+ const struct solparser_material* mtl;
+ const struct solparser_material_dielectric* dielec;
+ const struct solparser_medium* mdm;
+ const struct solparser_spectrum* spectrum;
+ FILE* stream;
+
+ NCHECK(stream = tmpfile(), NULL);
+
+ fprintf(stream, "- sun: { dni: 1 }\n");
+ fprintf(stream, "- spectrum: &refractive_index\n");
+ fprintf(stream, " - { wavelength: 123, data: 1.1 }\n");
+ fprintf(stream, " - { wavelength: 456, data: 2.2 }\n");
+ fprintf(stream, " - { wavelength: 789, data: 3.3 }\n");
+ fprintf(stream, "- spectrum: &absorptivity\n");
+ fprintf(stream, " - { wavelength: 0.456, data: 0.2 }\n");
+ fprintf(stream, " - { wavelength: 0.123, data: 0.1 }\n");
+ fprintf(stream, "- material:\n");
+ fprintf(stream, " dielectric:\n");
+ fprintf(stream, " medium_i: { refractive_index: 1, absorptivity: 0 }\n");
+ fprintf(stream, " medium_t: \n");
+ fprintf(stream, " refractive_index: *refractive_index\n");
+ fprintf(stream, " absorptivity: *absorptivity\n");
+ rewind(stream);
+
+ CHECK(solparser_setup(parser, NULL, stream), RES_OK);
+ CHECK(solparser_load(parser), RES_OK);
+
+ solparser_material_iterator_begin(parser, &mtl_it);
+ solparser_material_iterator_end(parser, &mtl_it_end);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 0);
+
+ mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
+ CHECK(mtl->type, SOLPARSER_MATERIAL_DIELECTRIC);
+ dielec = solparser_get_material_dielectric(parser, mtl->data.dielectric);
+ CHECK(SOLPARSER_ID_IS_VALID(dielec->normal_map), 0);
+
+ mdm = solparser_get_medium(parser, dielec->medium_i);
+ CHECK(mdm->refractive_index.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mdm->refractive_index.value.real, 1);
+ CHECK(mdm->absorptivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mdm->absorptivity.value.real, 0);
+
+ mdm = solparser_get_medium(parser, dielec->medium_t);
+ CHECK(mdm->refractive_index.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ spectrum = solparser_get_spectrum(parser, mdm->refractive_index.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 123);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 456);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 789);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 1.1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 2.2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 3.3);
+ spectrum = solparser_get_spectrum(parser, mdm->absorptivity.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 0.123);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 0.456);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0.1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 0.2);
+
+ solparser_material_iterator_next(&mtl_it);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 1);
+
+ CHECK(solparser_load(parser), RES_BAD_OP);
+ fclose(stream);
+}
+
int
main(int argc, char** argv)
{
@@ -90,6 +340,10 @@ main(int argc, char** argv)
CHECK(solparser_create(&allocator, &parser), RES_OK);
test_sun(parser);
+ test_matte(parser);
+ test_mirror(parser);
+ test_thin_dielectric(parser);
+ test_dielectric(parser);
solparser_ref_put(parser);