star-enclosures-2d

Extract enclosures from 2D geometry
git clone git://git.meso-star.fr/star-enclosures-2d.git
Log | Files | Refs | README | LICENSE

commit e9ba9d9e9c5a464d7ec512fc2d2d6990997c729d
parent 20335d659475e245f61017ef1d5858f2f1749188
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed, 26 Sep 2018 18:22:29 +0200

Add some tests.

Diffstat:
Msrc/test_senc2d_enclosure.c | 65++++++++++++++++++++++++++++++++++++++++++++++-------------------
Msrc/test_senc2d_inconsistant_square.c | 47-----------------------------------------------
Msrc/test_senc2d_utils.h | 50+++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 95 insertions(+), 67 deletions(-)

diff --git a/src/test_senc2d_enclosure.c b/src/test_senc2d_enclosure.c @@ -21,8 +21,8 @@ #include <star/s2d.h> -int -main(int argc, char** argv) +void +test(enum senc2d_convention convention) { struct mem_allocator allocator; struct senc2d_descriptor* desc = NULL; @@ -36,20 +36,24 @@ main(int argc, char** argv) struct s2d_shape* s2d_shp = NULL; struct s2d_vertex_data s2d_attribs; unsigned indices[2][2]; - unsigned medium[2]; + unsigned medium, media[2]; unsigned gid; double vrtx[2]; struct context ctx; unsigned i, n, t, ecount; - (void)argc, (void)argv; + enum senc2d_convention conv; + int is_front, is_in; CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK); CHK(senc2d_device_create(NULL, &allocator, SENC2D_NTHREADS_DEFAULT, 1, &dev) == RES_OK); - CHK(senc2d_scene_create(dev, - SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, &scn) - == RES_OK); + CHK(senc2d_scene_create(dev, convention, &scn) == RES_OK); + + CHK(senc2d_scene_get_convention(scn, &conv) == RES_OK); + CHK(conv == convention); + is_front = (conv & SENC2D_CONVENTION_NORMAL_FRONT) != 0; + is_in = (conv & SENC2D_CONVENTION_NORMAL_INSIDE) != 0; s2d_attribs.type = S2D_FLOAT2; s2d_attribs.usage = S2D_POSITION; @@ -108,18 +112,18 @@ main(int argc, char** argv) CHK(senc2d_enclosure_get_vertex(NULL, nvertices, NULL) == RES_BAD_ARG); CHK(senc2d_enclosure_get_vertex(enclosure, 0, vrtx) == RES_OK); - CHK(senc2d_enclosure_get_segment_media(NULL, 0, medium) == RES_BAD_ARG); - CHK(senc2d_enclosure_get_segment_media(enclosure, nsegments, medium) + CHK(senc2d_enclosure_get_segment_media(NULL, 0, media) == RES_BAD_ARG); + CHK(senc2d_enclosure_get_segment_media(enclosure, nsegments, media) == RES_BAD_ARG); CHK(senc2d_enclosure_get_segment_media(enclosure, 0, NULL) == RES_BAD_ARG); - CHK(senc2d_enclosure_get_segment_media(NULL, nsegments, medium) + CHK(senc2d_enclosure_get_segment_media(NULL, nsegments, media) == RES_BAD_ARG); CHK(senc2d_enclosure_get_segment_media(NULL, 0, NULL) == RES_BAD_ARG); CHK(senc2d_enclosure_get_segment_media(enclosure, nsegments, NULL) == RES_BAD_ARG); CHK(senc2d_enclosure_get_segment_media(NULL, nsegments, NULL) == RES_BAD_ARG); - CHK(senc2d_enclosure_get_segment_media(enclosure, 0, medium) == RES_OK); + CHK(senc2d_enclosure_get_segment_media(enclosure, 0, media) == RES_OK); CHK(senc2d_enclosure_get_segment_global_id(NULL, 0, &gid) == RES_BAD_ARG); CHK(senc2d_enclosure_get_segment_global_id(enclosure, nsegments, &gid) @@ -135,14 +139,14 @@ main(int argc, char** argv) == RES_BAD_ARG); CHK(senc2d_enclosure_get_segment_global_id(enclosure, 0, &gid) == RES_OK); - CHK(senc2d_enclosure_get_medium(NULL, 0, medium) == RES_BAD_ARG); - CHK(senc2d_enclosure_get_medium(enclosure, 2, medium) == RES_BAD_ARG); + CHK(senc2d_enclosure_get_medium(NULL, 0, &medium) == RES_BAD_ARG); + CHK(senc2d_enclosure_get_medium(enclosure, 2, &medium) == RES_BAD_ARG); CHK(senc2d_enclosure_get_medium(enclosure, 0, NULL) == RES_BAD_ARG); - CHK(senc2d_enclosure_get_medium(NULL, 2, medium) == RES_BAD_ARG); + CHK(senc2d_enclosure_get_medium(NULL, 2, &medium) == RES_BAD_ARG); CHK(senc2d_enclosure_get_medium(NULL, 0, NULL) == RES_BAD_ARG); CHK(senc2d_enclosure_get_medium(enclosure, 2, NULL) == RES_BAD_ARG); CHK(senc2d_enclosure_get_medium(NULL, 2, NULL) == RES_BAD_ARG); - CHK(senc2d_enclosure_get_medium(enclosure, 0, medium) == RES_OK); + CHK(senc2d_enclosure_get_medium(enclosure, 0, &medium) == RES_OK); CHK(senc2d_enclosure_ref_put(enclosure) == RES_OK); @@ -156,6 +160,11 @@ main(int argc, char** argv) CHK(header.enclosure_id == i); CHK(header.enclosed_media_count == 1); + CHK(senc2d_enclosure_get_medium(enclosure, 0, &medium) == RES_OK); + /* Geometrical normals point outside the square in input segments: + * if convention is front, front medium (0) is outside, + * that is medium 0's enclosure is infinite */ + CHK(is_front == ((medium == 0) == header.is_infinite)); CHK(header.segment_count == nsegments); CHK(header.unique_segment_count == nsegments); CHK(header.vertices_count == nvertices); @@ -171,12 +180,20 @@ main(int argc, char** argv) FOR_EACH(i, 0, 2) CHK(senc2d_descriptor_get_enclosure(desc, i, enclosures + i) == RES_OK); FOR_EACH(n, 0, nsegments) { + int same, reversed; /* Read same segments in both enclosures */ FOR_EACH(i, 0, 2) CHK(senc2d_enclosure_get_segment(enclosures[i], n, indices[i]) == RES_OK); - /* Same segments, opposite sides */ - CHK(indices[0][0] == indices[1][1]); - CHK(indices[0][1] == indices[1][0]); + /* Same segments and opposite sides for the 2 enclosures */ + FOR_EACH(i, 0, 2) CHK(indices[0][i] == indices[1][1 - i]); + /* Enclosure 0 is outside (and contains medium 0 if convention is front). + * Geometrical normals in output data point in the same direction that those + * of input segments for enclosure 0 iff convention is inside. + * The opposite holds for enclosure 1. */ + cmp_seg(n, enclosures[0], box_indices + 2 * n, box_vertices, &same, &reversed); + CHK(same && !reversed == is_in); + cmp_seg(n, enclosures[1], box_indices + 2 * n, box_vertices, &same, &reversed); + CHK(same && reversed == is_in); } FOR_EACH(i, 0, 2) CHK(senc2d_enclosure_ref_put(enclosures[i]) == RES_OK); @@ -253,6 +270,15 @@ main(int argc, char** argv) check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHK(mem_allocated_size() == 0); +} +int +main(int argc, char** argv) +{ + (void) argc, (void) argv; + test(SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE); + test(SENC2D_CONVENTION_NORMAL_BACK | SENC2D_CONVENTION_NORMAL_INSIDE); + test(SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_OUTSIDE); + test(SENC2D_CONVENTION_NORMAL_BACK | SENC2D_CONVENTION_NORMAL_OUTSIDE); return 0; -} +} +\ No newline at end of file diff --git a/src/test_senc2d_inconsistant_square.c b/src/test_senc2d_inconsistant_square.c @@ -44,53 +44,6 @@ static const unsigned inconsistant_medium_back[4] = { 0, 1, 1, 1 }; void -cmp_seg - (const unsigned iseg, - const struct senc2d_enclosure* enclosure, - const unsigned seg2[2], - const double* vertices2, - int* seg_eq, - int* seg_reversed) -{ - unsigned seg1[2]; - double s1[2][2]; - double s2[2][2]; - unsigned seg1_eq[2] = { 2, 2 }; - unsigned i, j; - - ASSERT(enclosure && seg2 && vertices2 && seg_eq && seg_reversed); - - CHK(senc2d_enclosure_get_segment(enclosure, iseg, seg1) == RES_OK); - FOR_EACH(i, 0, 2) { - CHK(senc2d_enclosure_get_vertex(enclosure, seg1[i], s1[i]) == RES_OK); - d2_set(s2[i], vertices2 + (2 * seg2[i])); - } - FOR_EACH(i, 0, 2) { - FOR_EACH(j, 0, 2) { - if (d2_eq(s1[i], s2[j])) { - seg1_eq[i] = j; - break; - } - } - } - FOR_EACH(i, 0, 2) { - if(seg1_eq[i] == 2) { - *seg_eq = 0; - return; - } - if(seg1_eq[i] == seg1_eq[(i + 1) % 2]) { - *seg_eq = 0; - return; - } - } - /* Same 2 vertices */ - *seg_eq = 1; - - *seg_reversed = (0 != seg1_eq[0]); - ASSERT(*seg_reversed == (1 != seg1_eq[1])); -} - -void test(enum senc2d_convention convention) { struct mem_allocator allocator; diff --git a/src/test_senc2d_utils.h b/src/test_senc2d_utils.h @@ -19,6 +19,7 @@ #include <rsys/rsys.h> #include <rsys/mem_allocator.h> #include <rsys/stretchy_array.h> +#include <rsys/double2.h> #include <stdio.h> @@ -274,5 +275,52 @@ static INLINE void check_desc(struct senc2d_descriptor* desc) ASSERT(e_cpt >= ecount); /* Every enc has been visited at least once */ } -#endif /* TEST_UTILS2_H */ +/* Compare the itri-th segment of enclosure with a segment described by seg2 & vertices2 */ +static void +cmp_seg + (const unsigned iseg, + const struct senc2d_enclosure* enclosure, + const unsigned seg2[2], + const double* vertices2, + int* seg_eq, + int* seg_reversed) +{ + unsigned seg1[2]; + double s1[2][2]; + double s2[2][2]; + unsigned seg1_eq[2] = { 2, 2 }; + unsigned i, j; + + ASSERT(enclosure && seg2 && vertices2 && seg_eq && seg_reversed); + + CHK(senc2d_enclosure_get_segment(enclosure, iseg, seg1) == RES_OK); + FOR_EACH(i, 0, 2) { + CHK(senc2d_enclosure_get_vertex(enclosure, seg1[i], s1[i]) == RES_OK); + d2_set(s2[i], vertices2 + (2 * seg2[i])); + } + FOR_EACH(i, 0, 2) { + FOR_EACH(j, 0, 2) { + if (d2_eq(s1[i], s2[j])) { + seg1_eq[i] = j; + break; + } + } + } + FOR_EACH(i, 0, 2) { + if(seg1_eq[i] == 2) { + *seg_eq = 0; + return; + } + if(seg1_eq[i] == seg1_eq[(i + 1) % 2]) { + *seg_eq = 0; + return; + } + } + /* Same 2 vertices */ + *seg_eq = 1; + *seg_reversed = (0 != seg1_eq[0]); + ASSERT(*seg_reversed == (1 != seg1_eq[1])); +} + +#endif /* TEST_UTILS2_H */