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:
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);