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:
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 */