solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit 5c1321502d8b51168f1fa189ec71a8fc1b2a4e94
parent 18f052ad97ae7c9811b74ef98377d550876e5eb6
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Thu, 22 Sep 2016 17:42:21 +0200

Add some tests (test 2x set/attach/detach API calls)

Change the way ssol_scene_attach_xxx API calls work: attaching the same
xxx twice is not an error anymore (returns RES_OK).

Diffstat:
Msrc/ssol_scene.c | 38+++++++++++++++++++++++++++++---------
Msrc/test_ssol_image.c | 1+
Msrc/test_ssol_instance.c | 1+
Msrc/test_ssol_material.c | 1+
Msrc/test_ssol_scene.c | 49++++++++++++++++++++++++++++++++++++++++++++-----
Msrc/test_ssol_spectrum.c | 1+
Msrc/test_ssol_sun.c | 18++++++++++++++++++
7 files changed, 95 insertions(+), 14 deletions(-)

diff --git a/src/ssol_scene.c b/src/ssol_scene.c @@ -115,6 +115,7 @@ ssol_scene_attach_instance (struct ssol_scene* scene, struct ssol_instance* instance) { unsigned id; + struct ssol_instance** pinst; res_T res; if(!scene || !instance) return RES_BAD_ARG; @@ -125,7 +126,12 @@ ssol_scene_attach_instance /* Register the instance against the scene */ S3D(shape_get_id(instance->shape_rt, &id)); - ASSERT(!htable_instance_find(&scene->instances_rt, &id)); + pinst = htable_instance_find(&scene->instances_rt, &id); + if (pinst) { + /* already attached */ + ASSERT(*pinst == instance); /* cannot be attached to another instance! */ + return RES_OK; + } res = htable_instance_set(&scene->instances_rt, &id, &instance); if(res != RES_OK) { S3D(scene_detach_shape(scene->scn_rt, instance->shape_rt)); @@ -192,11 +198,18 @@ ssol_scene_clear(struct ssol_scene* scene) res_T ssol_scene_attach_sun(struct ssol_scene* scene, struct ssol_sun* sun) { - if(!scene || ! sun - || sun->scene_attachment /* Should detach this sun first from its own scene */ - || scene->sun) /* Should detach previous sun first */ + if(!scene || ! sun) return RES_BAD_ARG; - + if (sun->scene_attachment || scene->sun) { + /* already attached: must be linked together */ + if (sun->scene_attachment != scene || scene->sun != sun) + /* if not detach first! */ + return RES_BAD_ARG; + else + /* nothing to change */ + return RES_OK; + } + /* no previous attachment */ SSOL(sun_ref_get(sun)); scene->sun = sun; sun->scene_attachment = scene; @@ -220,11 +233,18 @@ ssol_scene_detach_sun(struct ssol_scene* scene, struct ssol_sun* sun) res_T ssol_scene_attach_atmosphere(struct ssol_scene* scene, struct ssol_atmosphere* atm) { - if (!scene || !atm - || atm->scene_attachment /* Should detach this atmosphere first from its own scene */ - || scene->atmosphere) /* Should detach previous atm first */ + if (!scene || !atm) return RES_BAD_ARG; - + if (atm->scene_attachment || scene->atmosphere) { + /* already attached: must be linked together */ + if (atm->scene_attachment != scene || scene->atmosphere != atm) + /* if not detach first! */ + return RES_BAD_ARG; + else + /* nothing to change */ + return RES_OK; + } + /* no previous attachment */ SSOL(atmosphere_ref_get(atm)); scene->atmosphere = atm; atm->scene_attachment = scene; diff --git a/src/test_ssol_image.c b/src/test_ssol_image.c @@ -49,6 +49,7 @@ main(int argc, char** argv) CHECK(ssol_image_setup(image, 0, 128, SSOL_PIXEL_DOUBLE3), RES_BAD_ARG); CHECK(ssol_image_setup(image, 128, 0, (enum ssol_pixel_format)999), RES_BAD_ARG); CHECK(ssol_image_setup(image, 128, 128, SSOL_PIXEL_DOUBLE3), RES_OK); + CHECK(ssol_image_setup(image, 128, 128, SSOL_PIXEL_DOUBLE3), RES_OK); CHECK(ssol_image_ref_put(image), RES_OK); diff --git a/src/test_ssol_instance.c b/src/test_ssol_instance.c @@ -57,6 +57,7 @@ main(int argc, char** argv) CHECK(ssol_instance_set_transform(NULL, transform), RES_BAD_ARG); CHECK(ssol_instance_set_transform(instance, NULL), RES_BAD_ARG); CHECK(ssol_instance_set_transform(instance, transform), RES_OK); + CHECK(ssol_instance_set_transform(instance, transform), RES_OK); #define SET_RECEIVER ssol_instance_set_receiver CHECK(SET_RECEIVER(NULL, "receiver 1", NULL), RES_BAD_ARG); diff --git a/src/test_ssol_material.c b/src/test_ssol_material.c @@ -59,6 +59,7 @@ main(int argc, char** argv) CHECK(ssol_mirror_set_shader(NULL, &shader), RES_BAD_ARG); CHECK(ssol_mirror_set_shader(material, NULL), RES_BAD_ARG); CHECK(ssol_mirror_set_shader(material, &shader), RES_OK); + CHECK(ssol_mirror_set_shader(material, &shader), RES_OK); shader.normal = NULL; CHECK(ssol_mirror_set_shader(material, &shader), RES_BAD_ARG); diff --git a/src/test_ssol_scene.c b/src/test_ssol_scene.c @@ -31,8 +31,10 @@ main(int argc, char** argv) struct ssol_sun* sun; struct ssol_sun* sun2; struct ssol_scene* scene; + struct ssol_scene* scene2; struct ssol_spectrum* spectrum; struct ssol_atmosphere* atm; + struct ssol_atmosphere* atm2; double wavelengths[3] = { 10, 20, 30 }; double data[3] = { 1, 2.1, 1.5 }; double transform[12]; @@ -55,8 +57,10 @@ main(int argc, char** argv) CHECK(ssol_object_instantiate(object, &instance), RES_OK); CHECK(ssol_instance_set_transform(instance, transform), RES_OK); CHECK(ssol_sun_create_directional(dev, &sun), RES_OK); + CHECK(ssol_sun_create_directional(dev, &sun2), RES_OK); CHECK(ssol_scene_create(dev, &scene), RES_OK); + CHECK(ssol_scene_create(dev, &scene2), RES_OK); CHECK(ssol_scene_ref_get(NULL), RES_BAD_ARG); CHECK(ssol_scene_ref_get(scene), RES_OK); @@ -64,48 +68,82 @@ main(int argc, char** argv) CHECK(ssol_scene_ref_put(NULL), RES_BAD_ARG); CHECK(ssol_scene_ref_put(scene), RES_OK); + CHECK(ssol_scene_clear(NULL), RES_BAD_ARG); + CHECK(ssol_scene_clear(scene), RES_OK); + CHECK(ssol_scene_attach_instance(NULL, instance), RES_BAD_ARG); CHECK(ssol_scene_attach_instance(scene, NULL), RES_BAD_ARG); CHECK(ssol_scene_attach_instance(scene, instance), RES_OK); + CHECK(ssol_scene_attach_instance(scene, instance), RES_OK); CHECK(ssol_scene_detach_instance(NULL, instance), RES_BAD_ARG); CHECK(ssol_scene_detach_instance(scene, NULL), RES_BAD_ARG); CHECK(ssol_scene_detach_instance(scene, instance), RES_OK); + CHECK(ssol_scene_detach_instance(scene, instance), RES_BAD_ARG); CHECK(ssol_scene_attach_instance(scene, instance), RES_OK); - CHECK(ssol_scene_clear(NULL), RES_BAD_ARG); - CHECK(ssol_scene_clear(scene), RES_OK); + CHECK(ssol_scene_attach_instance(scene2, instance), RES_OK); + CHECK(ssol_scene_detach_instance(scene2, instance), RES_OK); + CHECK(ssol_scene_detach_instance(scene, instance), RES_OK); + CHECK(ssol_scene_attach_instance(scene, instance), RES_OK); + CHECK(ssol_scene_detach_instance(scene2, instance), RES_BAD_ARG); + CHECK(ssol_scene_detach_instance(scene, instance), RES_OK); CHECK(ssol_scene_attach_sun(NULL, sun), RES_BAD_ARG); CHECK(ssol_scene_attach_sun(scene, NULL), RES_BAD_ARG); CHECK(ssol_scene_attach_sun(scene, sun), RES_OK); - CHECK(ssol_scene_attach_sun(scene, sun), RES_BAD_ARG); + CHECK(ssol_scene_attach_sun(scene, sun), RES_OK); + CHECK(ssol_scene_attach_sun(scene, sun2), RES_BAD_ARG); CHECK(ssol_scene_detach_sun(NULL, sun), RES_BAD_ARG); CHECK(ssol_scene_detach_sun(scene, NULL), RES_BAD_ARG); CHECK(ssol_scene_detach_sun(scene, sun), RES_OK); CHECK(ssol_scene_detach_sun(scene, sun), RES_BAD_ARG); + CHECK(ssol_scene_attach_sun(scene, sun), RES_OK); + CHECK(ssol_scene_attach_sun(scene2, sun), RES_BAD_ARG); + CHECK(ssol_scene_detach_sun(scene2, sun), RES_BAD_ARG); + CHECK(ssol_scene_detach_sun(scene, sun), RES_OK); + CHECK(ssol_scene_attach_sun(scene2, sun), RES_OK); + CHECK(ssol_scene_detach_sun(scene, sun), RES_BAD_ARG); + CHECK(ssol_scene_detach_sun(scene2, sun), RES_OK); + CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); CHECK(ssol_spectrum_setup(spectrum, wavelengths, data, 3), RES_OK); CHECK(ssol_atmosphere_create_uniform(dev, &atm), RES_OK); CHECK(ssol_atmosphere_set_uniform_absorbtion(atm, spectrum), RES_OK); + CHECK(ssol_atmosphere_create_uniform(dev, &atm2), RES_OK); + CHECK(ssol_atmosphere_set_uniform_absorbtion(atm2, spectrum), RES_OK); CHECK(ssol_scene_attach_atmosphere(NULL, atm), RES_BAD_ARG); CHECK(ssol_scene_attach_atmosphere(scene, NULL), RES_BAD_ARG); CHECK(ssol_scene_attach_atmosphere(scene, atm), RES_OK); - CHECK(ssol_scene_attach_atmosphere(scene, atm), RES_BAD_ARG); + CHECK(ssol_scene_attach_atmosphere(scene, atm), RES_OK); + CHECK(ssol_scene_attach_atmosphere(scene, atm2), RES_BAD_ARG); CHECK(ssol_scene_detach_atmosphere(NULL, atm), RES_BAD_ARG); CHECK(ssol_scene_detach_atmosphere(scene, NULL), RES_BAD_ARG); CHECK(ssol_scene_detach_atmosphere(scene, atm), RES_OK); CHECK(ssol_scene_detach_atmosphere(scene, atm), RES_BAD_ARG); - CHECK(ssol_sun_create_directional(dev, &sun2), RES_OK); + CHECK(ssol_scene_attach_atmosphere(scene, atm), RES_OK); + CHECK(ssol_scene_attach_atmosphere(scene2, atm), RES_BAD_ARG); + CHECK(ssol_scene_detach_atmosphere(scene2, atm), RES_BAD_ARG); + CHECK(ssol_scene_detach_atmosphere(scene, atm), RES_OK); + CHECK(ssol_scene_attach_atmosphere(scene2, atm), RES_OK); + CHECK(ssol_scene_detach_atmosphere(scene, atm), RES_BAD_ARG); + CHECK(ssol_scene_detach_atmosphere(scene2, atm), RES_OK); + CHECK(ssol_scene_detach_sun(scene, sun2), RES_BAD_ARG); CHECK(ssol_sun_ref_put(sun2), RES_OK); + CHECK(ssol_scene_attach_instance(scene, instance), RES_OK); + CHECK(ssol_scene_attach_sun(scene, sun), RES_OK); + CHECK(ssol_scene_attach_atmosphere(scene, atm), RES_OK); + CHECK(ssol_scene_clear(scene), RES_OK); + CHECK(ssol_scene_ref_put(scene), RES_OK); + CHECK(ssol_scene_ref_put(scene2), RES_OK); CHECK(ssol_instance_ref_put(instance), RES_OK); CHECK(ssol_object_ref_put(object), RES_OK); @@ -113,6 +151,7 @@ main(int argc, char** argv) CHECK(ssol_sun_ref_put(sun), RES_OK); CHECK(ssol_spectrum_ref_put(spectrum), RES_OK); CHECK(ssol_atmosphere_ref_put(atm), RES_OK); + CHECK(ssol_atmosphere_ref_put(atm2), RES_OK); CHECK(ssol_material_ref_put(material), RES_OK); CHECK(ssol_device_ref_put(dev), RES_OK); diff --git a/src/test_ssol_spectrum.c b/src/test_ssol_spectrum.c @@ -54,6 +54,7 @@ main(int argc, char** argv) CHECK(ssol_spectrum_setup(spectrum, wavelengths, NULL, 3), RES_BAD_ARG); CHECK(ssol_spectrum_setup(spectrum, wavelengths, data, 0), RES_BAD_ARG); CHECK(ssol_spectrum_setup(spectrum, wavelengths, data, 3), RES_OK); + CHECK(ssol_spectrum_setup(spectrum, wavelengths, data, 3), RES_OK); CHECK(ssol_spectrum_ref_put(spectrum), RES_OK); diff --git a/src/test_ssol_sun.c b/src/test_ssol_sun.c @@ -57,11 +57,18 @@ main(int argc, char** argv) CHECK(ssol_sun_set_spectrum(NULL, spectrum), RES_BAD_ARG); CHECK(ssol_sun_set_spectrum(sun, NULL), RES_BAD_ARG); CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK); + CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK); CHECK(ssol_sun_set_direction(NULL, dir), RES_BAD_ARG); CHECK(ssol_sun_set_direction(sun, NULL), RES_BAD_ARG); CHECK(ssol_sun_set_direction(sun, dir0), RES_BAD_ARG); CHECK(ssol_sun_set_direction(sun, dir), RES_OK); + CHECK(ssol_sun_set_direction(sun, dir), RES_OK); + + CHECK(ssol_sun_set_dni(NULL, 1000), RES_BAD_ARG); + CHECK(ssol_sun_set_dni(sun, 0), RES_BAD_ARG); + CHECK(ssol_sun_set_dni(sun, 1000), RES_OK); + CHECK(ssol_sun_set_dni(sun, 1000), RES_OK); CHECK(ssol_sun_set_pillbox_aperture(NULL, 0.1), RES_BAD_ARG); CHECK(ssol_sun_set_pillbox_aperture(sun, -0.1), RES_BAD_ARG); @@ -95,11 +102,18 @@ main(int argc, char** argv) CHECK(ssol_sun_set_direction(sun, NULL), RES_BAD_ARG); CHECK(ssol_sun_set_direction(sun, dir0), RES_BAD_ARG); CHECK(ssol_sun_set_direction(sun, dir), RES_OK); + CHECK(ssol_sun_set_direction(sun, dir), RES_OK); + + CHECK(ssol_sun_set_dni(NULL, 1000), RES_BAD_ARG); + CHECK(ssol_sun_set_dni(sun, 0), RES_BAD_ARG); + CHECK(ssol_sun_set_dni(sun, 1000), RES_OK); + CHECK(ssol_sun_set_dni(sun, 1000), RES_OK); CHECK(ssol_sun_set_pillbox_aperture(NULL, 0.1), RES_BAD_ARG); CHECK(ssol_sun_set_pillbox_aperture(sun, -0.1), RES_BAD_ARG); CHECK(ssol_sun_set_pillbox_aperture(sun, 999), RES_BAD_ARG); CHECK(ssol_sun_set_pillbox_aperture(sun, 0.1), RES_OK); + CHECK(ssol_sun_set_pillbox_aperture(sun, 0.1), RES_OK); CHECK(ssol_sun_set_buie_param(NULL, 0.1), RES_BAD_ARG); CHECK(ssol_sun_set_buie_param(sun, -0.1), RES_BAD_ARG); @@ -121,15 +135,18 @@ main(int argc, char** argv) CHECK(ssol_sun_set_spectrum(NULL, spectrum), RES_BAD_ARG); CHECK(ssol_sun_set_spectrum(sun, NULL), RES_BAD_ARG); CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK); + CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK); CHECK(ssol_sun_set_direction(NULL, dir), RES_BAD_ARG); CHECK(ssol_sun_set_direction(sun, NULL), RES_BAD_ARG); CHECK(ssol_sun_set_direction(sun, dir0), RES_BAD_ARG); CHECK(ssol_sun_set_direction(sun, dir), RES_OK); + CHECK(ssol_sun_set_direction(sun, dir), RES_OK); CHECK(ssol_sun_set_dni(NULL, 1000), RES_BAD_ARG); CHECK(ssol_sun_set_dni(sun, 0), RES_BAD_ARG); CHECK(ssol_sun_set_dni(sun, 1000), RES_OK); + CHECK(ssol_sun_set_dni(sun, 1000), RES_OK); CHECK(ssol_sun_set_pillbox_aperture(NULL, 0.1), RES_BAD_ARG); CHECK(ssol_sun_set_pillbox_aperture(sun, -0.1), RES_BAD_ARG); @@ -140,6 +157,7 @@ main(int argc, char** argv) CHECK(ssol_sun_set_buie_param(sun, -0.1), RES_BAD_ARG); CHECK(ssol_sun_set_buie_param(sun, 999), RES_BAD_ARG); CHECK(ssol_sun_set_buie_param(sun, 0.1), RES_OK); + CHECK(ssol_sun_set_buie_param(sun, 0.1), RES_OK); CHECK(ssol_sun_ref_put(sun), RES_OK);