star-cpr

Clip 2D meshes with 2D polygons
git clone git://git.meso-star.fr/star-cpr.git
Log | Files | Refs | README | LICENSE

commit b3ead38f781671a746209ece4088070d41709a84
parent cc65cf5d2561666768ee2eb862c084e91868c766
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri,  3 Feb 2023 16:19:05 +0100

Improve tests

Diffstat:
Msrc/test_scpr_clip.c | 73+++++++++++++++++++++++++++++++++++--------------------------------------
Msrc/test_scpr_mesh.c | 205+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/test_scpr_offset.c | 169+++++++++++++++++++++++++++++++++++--------------------------------------------
Msrc/test_scpr_polygon.c | 182++++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Msrc/test_scpr_utils.h | 13+++++++------
5 files changed, 323 insertions(+), 319 deletions(-)

diff --git a/src/test_scpr_clip.c b/src/test_scpr_clip.c @@ -31,17 +31,17 @@ dump_obj(FILE* stream, const struct scpr_mesh* mesh) CHK(stream != NULL); CHK(mesh != NULL); - CHK(scpr_mesh_get_vertices_count(mesh, &n) == RES_OK); + OK(scpr_mesh_get_vertices_count(mesh, &n)); FOR_EACH(i, 0, n) { double pos[2]; - CHK(scpr_mesh_get_position(mesh, i, pos) == RES_OK); + OK(scpr_mesh_get_position(mesh, i, pos)); fprintf(stream, "v %g %g 0\n", SPLIT2(pos)); } - CHK(scpr_mesh_get_triangles_count(mesh, &n) == RES_OK); + OK(scpr_mesh_get_triangles_count(mesh, &n)); FOR_EACH(i, 0, n) { size_t ids[3]; - CHK(scpr_mesh_get_indices(mesh, i, ids) == RES_OK); + OK(scpr_mesh_get_indices(mesh, i, ids)); fprintf(stream, "f %lu %lu %lu\n", (unsigned long)(ids[0] + 1), (unsigned long)(ids[1] + 1), @@ -73,39 +73,38 @@ test_triangle pctx.coords = clip_pos; pctx.nverts = nverts; pctx.ncomps = ncomps; - CHK(scpr_polygon_create(allocator, &poly) == RES_OK); - CHK(scpr_polygon_setup_indexed_vertices(poly, ncomps, pget_nverts, pget_pos, &pctx) - == RES_OK); + OK(scpr_polygon_create(allocator, &poly)); + OK(scpr_polygon_setup_indexed_vertices(poly, ncomps, pget_nverts, pget_pos, &pctx)); /* Check out-of-range */ mctx.coords = triangle_pos2; mctx.nverts = 3; mctx.indices = triangle_ids; mctx.ntris = 1; - CHK(scpr_mesh_setup_indexed_vertices - (mesh, mctx.ntris, mget_ids, 3, mget_pos, &mctx) == RES_BAD_ARG); + BAD(scpr_mesh_setup_indexed_vertices + (mesh, mctx.ntris, mget_ids, 3, mget_pos, &mctx)); mctx.coords = triangle_pos1; - CHK(scpr_mesh_setup_indexed_vertices - (mesh, mctx.ntris, mget_ids, 3, mget_pos, &mctx) == RES_OK); - - CHK(scpr_mesh_clip(NULL, SCPR_OPERATIONS_COUNT__, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_clip(mesh, SCPR_OPERATIONS_COUNT__, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_clip(NULL, SCPR_OPERATIONS_COUNT__, poly) == RES_BAD_ARG); - CHK(scpr_mesh_clip(mesh, SCPR_OPERATIONS_COUNT__, poly) == RES_BAD_ARG); - CHK(scpr_mesh_clip(NULL, SCPR_SUB, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_clip(mesh, SCPR_SUB, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_clip(NULL, SCPR_SUB, poly) == RES_BAD_ARG); - CHK(scpr_mesh_clip(mesh, SCPR_SUB, poly) == RES_OK); + OK(scpr_mesh_setup_indexed_vertices + (mesh, mctx.ntris, mget_ids, 3, mget_pos, &mctx)); + + BAD(scpr_mesh_clip(NULL, SCPR_OPERATIONS_COUNT__, NULL)); + BAD(scpr_mesh_clip(mesh, SCPR_OPERATIONS_COUNT__, NULL)); + BAD(scpr_mesh_clip(NULL, SCPR_OPERATIONS_COUNT__, poly)); + BAD(scpr_mesh_clip(mesh, SCPR_OPERATIONS_COUNT__, poly)); + BAD(scpr_mesh_clip(NULL, SCPR_SUB, NULL)); + BAD(scpr_mesh_clip(mesh, SCPR_SUB, NULL)); + BAD(scpr_mesh_clip(NULL, SCPR_SUB, poly)); + OK(scpr_mesh_clip(mesh, SCPR_SUB, poly)); /*dump_obj(stdout, mesh);*/ - CHK(scpr_mesh_get_triangles_count(mesh, &ntris) == RES_OK); + OK(scpr_mesh_get_triangles_count(mesh, &ntris)); CHK(ntris == 3); MEM_RM(allocator, *clip_pos); MEM_RM(allocator, clip_pos); - CHK(scpr_polygon_ref_put(poly) == RES_OK); + OK(scpr_polygon_ref_put(poly)); } static void @@ -130,24 +129,23 @@ test_quad pctx.coords = clip_pos; pctx.nverts = nverts; pctx.ncomps = ncomps; - CHK(scpr_polygon_create(allocator, &poly) == RES_OK); - CHK(scpr_polygon_setup_indexed_vertices(poly, ncomps, pget_nverts, pget_pos, &pctx) - == RES_OK); + OK(scpr_polygon_create(allocator, &poly)); + OK(scpr_polygon_setup_indexed_vertices(poly, ncomps, pget_nverts, pget_pos, &pctx)); mctx.coords = quad_pos; mctx.nverts = sizeof(quad_pos)/(2*sizeof(double)); mctx.indices = quad_ids; mctx.ntris = sizeof(quad_ids)/(3*sizeof(size_t)); - CHK(scpr_mesh_setup_indexed_vertices - (mesh, mctx.ntris, mget_ids, mctx.nverts, mget_pos, &mctx) == RES_OK); + OK(scpr_mesh_setup_indexed_vertices + (mesh, mctx.ntris, mget_ids, mctx.nverts, mget_pos, &mctx)); - CHK(scpr_mesh_clip(mesh, SCPR_AND, poly) == RES_OK); + OK(scpr_mesh_clip(mesh, SCPR_AND, poly)); /*dump_obj(stdout, mesh);*/ MEM_RM(allocator, *clip_pos); MEM_RM(allocator, clip_pos); - CHK(scpr_polygon_ref_put(poly) == RES_OK); + OK(scpr_polygon_ref_put(poly)); } static void @@ -222,18 +220,17 @@ test_disk pctx.coords = clip_pos; pctx.nverts = nverts; pctx.ncomps = ncomps; - CHK(scpr_polygon_create(allocator, &poly) == RES_OK); - CHK(scpr_polygon_setup_indexed_vertices(poly, ncomps, pget_nverts, pget_pos, &pctx) - == RES_OK); + OK(scpr_polygon_create(allocator, &poly)); + OK(scpr_polygon_setup_indexed_vertices(poly, ncomps, pget_nverts, pget_pos, &pctx)); mctx.coords = pos; mctx.nverts = sa_size(pos)/2; mctx.indices = ids; mctx.ntris = sa_size(ids)/3; - CHK(scpr_mesh_setup_indexed_vertices - (mesh, mctx.ntris, mget_ids, mctx.nverts, mget_pos, &mctx) == RES_OK); + OK(scpr_mesh_setup_indexed_vertices + (mesh, mctx.ntris, mget_ids, mctx.nverts, mget_pos, &mctx)); - CHK(scpr_mesh_clip(mesh, SCPR_SUB, poly) == RES_OK); + OK(scpr_mesh_clip(mesh, SCPR_SUB, poly)); dump_obj(stdout, mesh); @@ -241,7 +238,7 @@ test_disk MEM_RM(allocator, clip_pos); sa_release(pos); sa_release(ids); - CHK(scpr_polygon_ref_put(poly) == RES_OK); + OK(scpr_polygon_ref_put(poly)); } int @@ -253,13 +250,13 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHK(scpr_mesh_create(&allocator, &mesh) == RES_OK); + OK(scpr_mesh_create(&allocator, &mesh)); test_triangle(&allocator, mesh); test_quad(&allocator, mesh); test_disk(&allocator, mesh); - CHK(scpr_mesh_ref_put(mesh) == RES_OK); + OK(scpr_mesh_ref_put(mesh)); check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); diff --git a/src/test_scpr_mesh.c b/src/test_scpr_mesh.c @@ -55,17 +55,17 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHK(scpr_mesh_create(NULL, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_create(&allocator, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_create(NULL, &mesh) == RES_OK); + BAD(scpr_mesh_create(NULL, NULL)); + BAD(scpr_mesh_create(&allocator, NULL)); + OK(scpr_mesh_create(NULL, &mesh)); - CHK(scpr_mesh_ref_get(NULL) == RES_BAD_ARG); - CHK(scpr_mesh_ref_get(mesh) == RES_OK); - CHK(scpr_mesh_ref_put(NULL) == RES_BAD_ARG); - CHK(scpr_mesh_ref_put(mesh) == RES_OK); - CHK(scpr_mesh_ref_put(mesh) == RES_OK); + BAD(scpr_mesh_ref_get(NULL)); + OK(scpr_mesh_ref_get(mesh)); + BAD(scpr_mesh_ref_put(NULL)); + OK(scpr_mesh_ref_put(mesh)); + OK(scpr_mesh_ref_put(mesh)); - CHK(scpr_mesh_create(&allocator, &mesh) == RES_OK); + OK(scpr_mesh_create(&allocator, &mesh)); ctx.coords = coords; ctx.nverts = nverts; @@ -73,122 +73,121 @@ main(int argc, char** argv) ctx.ntris = ntris; #define SETUP scpr_mesh_setup_indexed_vertices - CHK(SETUP(NULL, 0, NULL, 0, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, NULL, 0, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, NULL, 0, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, NULL, 0, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, mget_ids, 0, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, mget_ids, 0, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, mget_ids, 0, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, mget_ids, 0, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, NULL, nverts, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, NULL, nverts, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, NULL, nverts, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, NULL, nverts, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, mget_ids, nverts, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, mget_ids, nverts, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, mget_ids, nverts, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, mget_ids, nverts, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, NULL, 0, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, NULL, 0, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, NULL, 0, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, NULL, 0, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, mget_ids, 0, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, mget_ids, 0, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, mget_ids, 0, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, mget_ids, 0, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, NULL, nverts, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, NULL, nverts, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, NULL, nverts, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, NULL, nverts, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, mget_ids, nverts, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, mget_ids, nverts, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, mget_ids, nverts, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, mget_ids, nverts, mget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, NULL, 0, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, NULL, 0, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, NULL, 0, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, NULL, 0, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, mget_ids, 0, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, mget_ids, 0, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, mget_ids, 0, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, mget_ids, 0, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, NULL, nverts, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, NULL, nverts, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, NULL, nverts, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, NULL, nverts, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, mget_ids, nverts, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, mget_ids, nverts, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, mget_ids, nverts, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, mget_ids, nverts, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, NULL, 0, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, NULL, 0, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, NULL, 0, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, NULL, 0, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, mget_ids, 0, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, mget_ids, 0, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, mget_ids, 0, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, mget_ids, 0, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, NULL, nverts, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, NULL, nverts, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, NULL, nverts, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, NULL, nverts, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, 0, mget_ids, nverts, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, 0, mget_ids, nverts, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ntris, mget_ids, nverts, mget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(mesh, ntris, mget_ids, nverts, mget_pos, &ctx) == RES_OK); + BAD(SETUP(NULL, 0, NULL, 0, NULL, NULL)); + BAD(SETUP(mesh, 0, NULL, 0, NULL, NULL)); + BAD(SETUP(NULL, ntris, NULL, 0, NULL, NULL)); + BAD(SETUP(mesh, ntris, NULL, 0, NULL, NULL)); + BAD(SETUP(NULL, 0, mget_ids, 0, NULL, NULL)); + BAD(SETUP(mesh, 0, mget_ids, 0, NULL, NULL)); + BAD(SETUP(NULL, ntris, mget_ids, 0, NULL, NULL)); + BAD(SETUP(mesh, ntris, mget_ids, 0, NULL, NULL)); + BAD(SETUP(NULL, 0, NULL, nverts, NULL, NULL)); + BAD(SETUP(mesh, 0, NULL, nverts, NULL, NULL)); + BAD(SETUP(NULL, ntris, NULL, nverts, NULL, NULL)); + BAD(SETUP(mesh, ntris, NULL, nverts, NULL, NULL)); + BAD(SETUP(NULL, 0, mget_ids, nverts, NULL, NULL)); + BAD(SETUP(mesh, 0, mget_ids, nverts, NULL, NULL)); + BAD(SETUP(NULL, ntris, mget_ids, nverts, NULL, NULL)); + BAD(SETUP(mesh, ntris, mget_ids, nverts, NULL, NULL)); + BAD(SETUP(NULL, 0, NULL, 0, mget_pos, NULL)); + BAD(SETUP(mesh, 0, NULL, 0, mget_pos, NULL)); + BAD(SETUP(NULL, ntris, NULL, 0, mget_pos, NULL)); + BAD(SETUP(mesh, ntris, NULL, 0, mget_pos, NULL)); + BAD(SETUP(NULL, 0, mget_ids, 0, mget_pos, NULL)); + BAD(SETUP(mesh, 0, mget_ids, 0, mget_pos, NULL)); + BAD(SETUP(NULL, ntris, mget_ids, 0, mget_pos, NULL)); + BAD(SETUP(mesh, ntris, mget_ids, 0, mget_pos, NULL)); + BAD(SETUP(NULL, 0, NULL, nverts, mget_pos, NULL)); + BAD(SETUP(mesh, 0, NULL, nverts, mget_pos, NULL)); + BAD(SETUP(NULL, ntris, NULL, nverts, mget_pos, NULL)); + BAD(SETUP(mesh, ntris, NULL, nverts, mget_pos, NULL)); + BAD(SETUP(NULL, 0, mget_ids, nverts, mget_pos, NULL)); + BAD(SETUP(mesh, 0, mget_ids, nverts, mget_pos, NULL)); + BAD(SETUP(NULL, ntris, mget_ids, nverts, mget_pos, NULL)); + BAD(SETUP(mesh, ntris, mget_ids, nverts, mget_pos, NULL)); + BAD(SETUP(NULL, 0, NULL, 0, NULL, &ctx)); + BAD(SETUP(mesh, 0, NULL, 0, NULL, &ctx)); + BAD(SETUP(NULL, ntris, NULL, 0, NULL, &ctx)); + BAD(SETUP(mesh, ntris, NULL, 0, NULL, &ctx)); + BAD(SETUP(NULL, 0, mget_ids, 0, NULL, &ctx)); + BAD(SETUP(mesh, 0, mget_ids, 0, NULL, &ctx)); + BAD(SETUP(NULL, ntris, mget_ids, 0, NULL, &ctx)); + BAD(SETUP(mesh, ntris, mget_ids, 0, NULL, &ctx)); + BAD(SETUP(NULL, 0, NULL, nverts, NULL, &ctx)); + BAD(SETUP(mesh, 0, NULL, nverts, NULL, &ctx)); + BAD(SETUP(NULL, ntris, NULL, nverts, NULL, &ctx)); + BAD(SETUP(mesh, ntris, NULL, nverts, NULL, &ctx)); + BAD(SETUP(NULL, 0, mget_ids, nverts, NULL, &ctx)); + BAD(SETUP(mesh, 0, mget_ids, nverts, NULL, &ctx)); + BAD(SETUP(NULL, ntris, mget_ids, nverts, NULL, &ctx)); + BAD(SETUP(mesh, ntris, mget_ids, nverts, NULL, &ctx)); + BAD(SETUP(NULL, 0, NULL, 0, mget_pos, &ctx)); + BAD(SETUP(mesh, 0, NULL, 0, mget_pos, &ctx)); + BAD(SETUP(NULL, ntris, NULL, 0, mget_pos, &ctx)); + BAD(SETUP(mesh, ntris, NULL, 0, mget_pos, &ctx)); + BAD(SETUP(NULL, 0, mget_ids, 0, mget_pos, &ctx)); + BAD(SETUP(mesh, 0, mget_ids, 0, mget_pos, &ctx)); + BAD(SETUP(NULL, ntris, mget_ids, 0, mget_pos, &ctx)); + BAD(SETUP(mesh, ntris, mget_ids, 0, mget_pos, &ctx)); + BAD(SETUP(NULL, 0, NULL, nverts, mget_pos, &ctx)); + BAD(SETUP(mesh, 0, NULL, nverts, mget_pos, &ctx)); + BAD(SETUP(NULL, ntris, NULL, nverts, mget_pos, &ctx)); + BAD(SETUP(mesh, ntris, NULL, nverts, mget_pos, &ctx)); + BAD(SETUP(NULL, 0, mget_ids, nverts, mget_pos, &ctx)); + BAD(SETUP(mesh, 0, mget_ids, nverts, mget_pos, &ctx)); + BAD(SETUP(NULL, ntris, mget_ids, nverts, mget_pos, &ctx)); + OK(SETUP(mesh, ntris, mget_ids, nverts, mget_pos, &ctx)); ctx.indices = indices_bad; - CHK(SETUP(mesh, 1, mget_ids, nverts, mget_pos, &ctx) == RES_BAD_ARG); + BAD(SETUP(mesh, 1, mget_ids, nverts, mget_pos, &ctx)); #undef SETUP - CHK(scpr_mesh_get_triangles_count(NULL, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_triangles_count(mesh, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_triangles_count(NULL, &n) == RES_BAD_ARG); - CHK(scpr_mesh_get_triangles_count(mesh, &n) == RES_OK); + BAD(scpr_mesh_get_triangles_count(NULL, NULL)); + BAD(scpr_mesh_get_triangles_count(mesh, NULL)); + BAD(scpr_mesh_get_triangles_count(NULL, &n)); + OK(scpr_mesh_get_triangles_count(mesh, &n)); CHK(n == 0); - CHK(scpr_mesh_get_vertices_count(NULL, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_vertices_count(mesh, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_vertices_count(NULL, &n) == RES_BAD_ARG); - CHK(scpr_mesh_get_vertices_count(mesh, &n) == RES_OK); + BAD(scpr_mesh_get_vertices_count(NULL, NULL)); + BAD(scpr_mesh_get_vertices_count(mesh, NULL)); + BAD(scpr_mesh_get_vertices_count(NULL, &n)); + OK(scpr_mesh_get_vertices_count(mesh, &n)); CHK(n == 0); ctx.indices = indices; - CHK(scpr_mesh_setup_indexed_vertices - (mesh, ntris, mget_ids, nverts, mget_pos, &ctx) == RES_OK); - CHK(scpr_mesh_get_triangles_count(mesh, &n) == RES_OK); + OK(scpr_mesh_setup_indexed_vertices(mesh, ntris, mget_ids, nverts, mget_pos, &ctx)); + OK(scpr_mesh_get_triangles_count(mesh, &n)); CHK(n == ntris); - CHK(scpr_mesh_get_vertices_count(mesh, &n) == RES_OK); + OK(scpr_mesh_get_vertices_count(mesh, &n)); CHK(n == nverts); - CHK(scpr_mesh_get_indices(NULL, ntris, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_indices(mesh, ntris, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_indices(NULL, 0, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_indices(mesh, 0, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_indices(NULL, ntris, ids) == RES_BAD_ARG); - CHK(scpr_mesh_get_indices(mesh, ntris, ids) == RES_BAD_ARG); - CHK(scpr_mesh_get_indices(NULL, 0, ids) == RES_BAD_ARG); + BAD(scpr_mesh_get_indices(NULL, ntris, NULL)); + BAD(scpr_mesh_get_indices(mesh, ntris, NULL)); + BAD(scpr_mesh_get_indices(NULL, 0, NULL)); + BAD(scpr_mesh_get_indices(mesh, 0, NULL)); + BAD(scpr_mesh_get_indices(NULL, ntris, ids)); + BAD(scpr_mesh_get_indices(mesh, ntris, ids)); + BAD(scpr_mesh_get_indices(NULL, 0, ids)); FOR_EACH(i, 0, ntris) { - CHK(scpr_mesh_get_indices(mesh, i, ids) == RES_OK); + OK(scpr_mesh_get_indices(mesh, i, ids)); CHK(ids[0] == indices[i*3+0]); CHK(ids[1] == indices[i*3+1]); CHK(ids[2] == indices[i*3+2]); } - CHK(scpr_mesh_get_position(NULL, nverts, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_position(mesh, nverts, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_position(NULL, 0, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_position(mesh, 0, NULL) == RES_BAD_ARG); - CHK(scpr_mesh_get_position(NULL, nverts, pos) == RES_BAD_ARG); - CHK(scpr_mesh_get_position(mesh, nverts, pos) == RES_BAD_ARG); - CHK(scpr_mesh_get_position(NULL, 0, pos) == RES_BAD_ARG); + BAD(scpr_mesh_get_position(NULL, nverts, NULL)); + BAD(scpr_mesh_get_position(mesh, nverts, NULL)); + BAD(scpr_mesh_get_position(NULL, 0, NULL)); + BAD(scpr_mesh_get_position(mesh, 0, NULL)); + BAD(scpr_mesh_get_position(NULL, nverts, pos)); + BAD(scpr_mesh_get_position(mesh, nverts, pos)); + CHK(scpr_mesh_get_position(NULL, 0, pos)); FOR_EACH(i, 0, nverts) { - CHK(scpr_mesh_get_position(mesh, i, pos) == RES_OK); + OK(scpr_mesh_get_position(mesh, i, pos)); CHK(pos[0] == coords[i*2+0]); CHK(pos[1] == coords[i*2+1]); } - CHK(scpr_mesh_ref_put(mesh) == RES_OK); + OK(scpr_mesh_ref_put(mesh)); check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); diff --git a/src/test_scpr_offset.c b/src/test_scpr_offset.c @@ -47,12 +47,6 @@ test_single(void) 1.0, 2305843009213, 0.0, 1.0 }; - const double coords3[] = { - 9223372036855, 0.0, - 0.0, 1.0, - 1.0, 2305843009214, - 1.0, 0.0 - }; double** coords; size_t nverts[] = { 4 }; size_t ncomps = 1; @@ -68,52 +62,54 @@ test_single(void) *coords = (double*)MEM_CALLOC(&allocator, nverts[0], 2*sizeof(**coords)); memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); - CHK(scpr_polygon_create(&allocator, &polygon) == RES_OK); - CHK(scpr_polygon_create(&allocator, &expected) == RES_OK); + OK(scpr_polygon_create(&allocator, &polygon)); + OK(scpr_polygon_create(&allocator, &expected)); ctx.coords = coords; ctx.nverts = nverts; ctx.ncomps = ncomps; - CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx)); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); /* Offset 0 = unchanged */ - CHK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); CHK(check_stability(polygon)); /* Offset 1 */ memcpy(*coords, coords1, 2*nverts[0]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, 1, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, 1, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); CHK(check_stability(polygon)); /* Offset -1: back to original polygon */ memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, -1, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, -1, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); + CHK(eq); + CHK(check_stability(polygon)); + + /* Non representable offset: truncation will ensure stability */ + OK(scpr_offset_polygon(polygon, 0.123456789, SCPR_JOIN_MITER)); + OK(scpr_offset_polygon(expected, 0.123457, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); CHK(check_stability(polygon)); /* Offset -5: empty polygon */ ncomps = 0; ctx.ncomps = ncomps; - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, -5, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, -5, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); CHK(check_stability(polygon)); @@ -123,33 +119,29 @@ test_single(void) ncomps = 1; ctx.ncomps = ncomps; - CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx)); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); /* Offset 0 = unchanged */ - CHK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); CHK(check_stability(polygon)); /* Check non-effect of CW/CCW */ memcpy(*coords, coords2_reverse, 2*nverts[0]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx)); + OK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); CHK(check_stability(polygon)); - /* Check out of range */ - memcpy(*coords, coords3, 2*nverts[0]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx) - == RES_BAD_ARG); + /* Check out of range after offset being detected */ + BAD(scpr_offset_polygon(polygon, 1, SCPR_JOIN_MITER)); /* Cleanup */ - CHK(scpr_polygon_ref_put(polygon) == RES_OK); - CHK(scpr_polygon_ref_put(expected) == RES_OK); + OK(scpr_polygon_ref_put(polygon)); + OK(scpr_polygon_ref_put(expected)); MEM_RM(&allocator, *coords); MEM_RM(&allocator, coords); @@ -209,66 +201,60 @@ test_double(void) memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords)); - CHK(scpr_polygon_create(&allocator, &polygon) == RES_OK); - CHK(scpr_polygon_create(&allocator, &expected) == RES_OK); + OK(scpr_polygon_create(&allocator, &polygon)); + OK(scpr_polygon_create(&allocator, &expected)); ctx.coords = coords; ctx.nverts = nverts; ctx.ncomps = ncomps; - CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx)); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); /* Offset 0 = unchanged */ - CHK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); /* Offset 1 */ memcpy(*coords, coords2, 2*nverts[0]*sizeof(**coords)); memcpy(*(coords+1), coords3, 2*nverts[1]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, 1, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, 1, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); /* Offset -1: back to original polygon */ memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, -1, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, -1, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); /* Offset 4.5: the 2 squares merge */ ncomps = 1; ctx.ncomps = ncomps; memcpy(*coords, coords4, 2*nverts[0]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, 4.5, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, 4.5, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); /* Offset -5: empty polygon */ ncomps = 0; ctx.ncomps = ncomps; - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, -5, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, -5, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); - CHK(scpr_polygon_ref_put(polygon) == RES_OK); - CHK(scpr_polygon_ref_put(expected) == RES_OK); + OK(scpr_polygon_ref_put(polygon)); + OK(scpr_polygon_ref_put(expected)); MEM_RM(&allocator, *coords); MEM_RM(&allocator, *(coords+1)); @@ -329,52 +315,47 @@ test_internal(void) memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords)); - CHK(scpr_polygon_create(&allocator, &polygon) == RES_OK); - CHK(scpr_polygon_create(&allocator, &expected) == RES_OK); + OK(scpr_polygon_create(&allocator, &polygon)); + OK(scpr_polygon_create(&allocator, &expected)); ctx.coords = coords; ctx.nverts = nverts; ctx.ncomps = ncomps; - CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx)); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); /* Offset 0 = unchanged */ - CHK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); /* Offset -1 */ memcpy(*coords, coords3, 2*nverts[0]*sizeof(**coords)); memcpy(*(coords+1), coords2, 2*nverts[1]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, -1, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, -1, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); /* Offset 1: back to original polygon */ memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, 1, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, 1, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); /* Offset 5: internal path disappears */ ncomps = 1; ctx.ncomps = ncomps; memcpy(*coords, coords4, 2*nverts[0]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, 5, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, 5, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); /* From the original polygon, offset -2.5: empty polygon */ @@ -382,20 +363,18 @@ test_internal(void) ctx.ncomps = ncomps; memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords)); - CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx)); ncomps = 0; ctx.ncomps = ncomps; - CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx) - == RES_OK); + OK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)); - CHK(scpr_offset_polygon(polygon, -2.5, SCPR_JOIN_MITER) == RES_OK); - CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK); + OK(scpr_offset_polygon(polygon, -2.5, SCPR_JOIN_MITER)); + OK(scpr_polygon_eq(polygon, expected, &eq)); CHK(eq); - CHK(scpr_polygon_ref_put(polygon) == RES_OK); - CHK(scpr_polygon_ref_put(expected) == RES_OK); + OK(scpr_polygon_ref_put(polygon)); + OK(scpr_polygon_ref_put(expected)); MEM_RM(&allocator, *coords); MEM_RM(&allocator, *(coords+1)); diff --git a/src/test_scpr_polygon.c b/src/test_scpr_polygon.c @@ -26,17 +26,28 @@ main(int argc, char** argv) { double coords0[] = { 0.0, 0.0, - 0.0, 0.5, - 0.0, 1.0, 0.5, 0.0, - 0.5, 0.5, - 0.5, 1.0, 1.0, 0.0, - 1.0, 0.5, - 1.0, 1.0 + 1.0, 1.0, + 1.0, 1.0, + 0.0, 1.0 + }; + double coords0_reduced[] = { + 0.0, 0.0, + 1.0, 0.0, + 1.0, 1.0, + 0.0, 1.0 + }; + const double coords1[] = { + 0.0, 0.0, + 0.5, 0.0, + 0.0, 1.0, + 1.0, 1.0, + 1.0, 2305843009214, + 1.0, 0.0 }; double** coords; - size_t nverts[] = { 9 }; + size_t nverts[] = { 6 }; size_t ncomps = 1; double pos[2]; size_t i, c, n; @@ -53,21 +64,21 @@ main(int argc, char** argv) *coords = (double*)MEM_CALLOC(&allocator, nverts[0], 2*sizeof(**coords)); memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); - CHK(scpr_polygon_create(NULL, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_create(&allocator, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_create(NULL, &polygon) == RES_OK); - CHK(scpr_polygon_create(NULL, &copy) == RES_OK); - CHK(scpr_polygon_ref_put(copy) == RES_OK); + BAD(scpr_polygon_create(NULL, NULL)); + BAD(scpr_polygon_create(&allocator, NULL)); + OK(scpr_polygon_create(NULL, &polygon)); + OK(scpr_polygon_create(NULL, &copy)); + OK(scpr_polygon_ref_put(copy)); - CHK(scpr_polygon_ref_get(NULL) == RES_BAD_ARG); - CHK(scpr_polygon_ref_get(polygon) == RES_OK); - CHK(scpr_polygon_ref_put(NULL) == RES_BAD_ARG); - CHK(scpr_polygon_ref_put(polygon) == RES_OK); - CHK(scpr_polygon_ref_put(polygon) == RES_OK); + BAD(scpr_polygon_ref_get(NULL)); + OK(scpr_polygon_ref_get(polygon)); + BAD(scpr_polygon_ref_put(NULL)); + OK(scpr_polygon_ref_put(polygon)); + OK(scpr_polygon_ref_put(polygon)); - CHK(scpr_polygon_create(&allocator, &polygon) == RES_OK); + OK(scpr_polygon_create(&allocator, &polygon)); - CHK(scpr_polygon_get_components_count(polygon, &n) == RES_OK); + OK(scpr_polygon_get_components_count(polygon, &n)); CHK(n == 0); ctx.coords = coords; @@ -75,79 +86,96 @@ main(int argc, char** argv) ctx.ncomps = ncomps; #define SETUP scpr_polygon_setup_indexed_vertices - CHK(SETUP(NULL, ncomps, NULL, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(polygon, ncomps, NULL, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ncomps, pget_nverts, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(polygon, ncomps, pget_nverts, NULL, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ncomps, NULL, pget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(polygon, ncomps, NULL, pget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ncomps, pget_nverts, pget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(polygon, ncomps, pget_nverts, pget_pos, NULL) == RES_BAD_ARG); - CHK(SETUP(NULL, ncomps, NULL, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(polygon, ncomps, NULL, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ncomps, pget_nverts, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(polygon, ncomps, pget_nverts, NULL, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ncomps, NULL, pget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(polygon, ncomps, NULL, pget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(NULL, ncomps, pget_nverts, pget_pos, &ctx) == RES_BAD_ARG); - CHK(SETUP(polygon, ncomps, pget_nverts, pget_pos, &ctx) == RES_OK); + BAD(SETUP(NULL, ncomps, NULL, NULL, NULL)); + BAD(SETUP(polygon, ncomps, NULL, NULL, NULL)); + BAD(SETUP(NULL, ncomps, pget_nverts, NULL, NULL)); + BAD(SETUP(polygon, ncomps, pget_nverts, NULL, NULL)); + BAD(SETUP(NULL, ncomps, NULL, pget_pos, NULL)); + BAD(SETUP(polygon, ncomps, NULL, pget_pos, NULL)); + BAD(SETUP(NULL, ncomps, pget_nverts, pget_pos, NULL)); + BAD(SETUP(polygon, ncomps, pget_nverts, pget_pos, NULL)); + BAD(SETUP(NULL, ncomps, NULL, NULL, &ctx)); + BAD(SETUP(polygon, ncomps, NULL, NULL, &ctx)); + BAD(SETUP(NULL, ncomps, pget_nverts, NULL, &ctx)); + BAD(SETUP(polygon, ncomps, pget_nverts, NULL, &ctx)); + BAD(SETUP(NULL, ncomps, NULL, pget_pos, &ctx)); + BAD(SETUP(polygon, ncomps, NULL, pget_pos, &ctx)); + BAD(SETUP(NULL, ncomps, pget_nverts, pget_pos, &ctx)); + /* Check out of range data being detected at setup */ + memcpy(*coords, coords1, 2*nverts[0]*sizeof(**coords)); + BAD(SETUP(polygon, ncomps, pget_nverts, pget_pos, &ctx)); + /* Check polygon was simplified to 4 vertices */ + memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords)); + OK(SETUP(polygon, ncomps, pget_nverts, pget_pos, &ctx)); + OK(scpr_polygon_get_vertices_count(polygon, 0, &n)); + CHK(n == sizeof(coords0_reduced)/(2*sizeof(*coords0_reduced))); #undef SETUP - CHK(scpr_polygon_get_components_count(NULL, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_get_components_count(polygon, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_get_components_count(NULL, &n) == RES_BAD_ARG); - CHK(scpr_polygon_get_components_count(polygon, &n) == RES_OK); + BAD(scpr_polygon_get_components_count(NULL, NULL)); + BAD(scpr_polygon_get_components_count(polygon, NULL)); + BAD(scpr_polygon_get_components_count(NULL, &n)); + OK(scpr_polygon_get_components_count(polygon, &n)); CHK(n == ncomps); - CHK(scpr_polygon_get_vertices_count(NULL, ncomps, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_get_vertices_count(polygon, ncomps, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_get_vertices_count(NULL, 0, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_get_vertices_count(polygon, 0, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_get_vertices_count(NULL, ncomps, &n) == RES_BAD_ARG); - CHK(scpr_polygon_get_vertices_count(polygon, ncomps, &n) == RES_BAD_ARG); - CHK(scpr_polygon_get_vertices_count(NULL, 0, &n) == RES_BAD_ARG); - CHK(scpr_polygon_get_vertices_count(polygon, 0, &n) == RES_OK); - CHK(n == nverts[0]); - - CHK(scpr_polygon_eq(NULL, NULL, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_eq(polygon, NULL, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_eq(NULL, polygon, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_eq(polygon, polygon, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_eq(NULL, NULL, &eq) == RES_BAD_ARG); - CHK(scpr_polygon_eq(polygon, NULL, &eq) == RES_BAD_ARG); - CHK(scpr_polygon_eq(polygon, 0, &eq) == RES_BAD_ARG); - CHK(scpr_polygon_eq(polygon, polygon, &eq) == RES_OK); + BAD(scpr_polygon_get_vertices_count(NULL, ncomps, NULL)); + BAD(scpr_polygon_get_vertices_count(polygon, ncomps, NULL)); + BAD(scpr_polygon_get_vertices_count(NULL, 0, NULL)); + BAD(scpr_polygon_get_vertices_count(polygon, 0, NULL)); + BAD(scpr_polygon_get_vertices_count(NULL, ncomps, &n)); + BAD(scpr_polygon_get_vertices_count(polygon, ncomps, &n)); + BAD(scpr_polygon_get_vertices_count(NULL, 0, &n)); + OK(scpr_polygon_get_vertices_count(polygon, 0, &n)); + + BAD(scpr_polygon_eq(NULL, NULL, NULL)); + BAD(scpr_polygon_eq(polygon, NULL, NULL)); + BAD(scpr_polygon_eq(NULL, polygon, NULL)); + BAD(scpr_polygon_eq(polygon, polygon, NULL)); + BAD(scpr_polygon_eq(NULL, NULL, &eq)); + BAD(scpr_polygon_eq(polygon, NULL, &eq)); + BAD(scpr_polygon_eq(polygon, 0, &eq)); + OK(scpr_polygon_eq(polygon, polygon, &eq)); CHK(eq); - CHK(scpr_polygon_get_position(NULL, ncomps, nverts[0], pos) == RES_BAD_ARG); - CHK(scpr_polygon_get_position(NULL, ncomps, nverts[0], pos) == RES_BAD_ARG); - CHK(scpr_polygon_get_position(NULL, ncomps, nverts[0], pos) == RES_BAD_ARG); - CHK(scpr_polygon_get_position(NULL, ncomps, nverts[0], pos) == RES_BAD_ARG); - CHK(scpr_polygon_get_position(NULL, ncomps, nverts[0], pos) == RES_BAD_ARG); - CHK(scpr_polygon_get_position(NULL, ncomps, nverts[0], pos) == RES_BAD_ARG); - CHK(scpr_polygon_get_position(NULL, ncomps, nverts[0], pos) == RES_BAD_ARG); + BAD(scpr_polygon_get_position(NULL, ncomps, nverts[0], NULL)); + BAD(scpr_polygon_get_position(NULL, ncomps, nverts[0], pos)); + BAD(scpr_polygon_get_position(NULL, ncomps, 0, NULL)); + BAD(scpr_polygon_get_position(NULL, ncomps, 0, pos)); + BAD(scpr_polygon_get_position(NULL, 0, nverts[0], NULL)); + BAD(scpr_polygon_get_position(NULL, 0, nverts[0], pos)); + BAD(scpr_polygon_get_position(NULL, 0, 0, NULL)); + BAD(scpr_polygon_get_position(NULL, 0, 0, pos)); + BAD(scpr_polygon_get_position(polygon, ncomps, nverts[0], NULL)); + BAD(scpr_polygon_get_position(polygon, ncomps, nverts[0], pos)); + BAD(scpr_polygon_get_position(polygon, ncomps, 0, NULL)); + BAD(scpr_polygon_get_position(polygon, ncomps, 0, pos)); + BAD(scpr_polygon_get_position(polygon, 0, nverts[0], NULL)); + BAD(scpr_polygon_get_position(polygon, 0, nverts[0], pos)); + BAD(scpr_polygon_get_position(polygon, 0, 0, NULL)); + memcpy(*coords, coords0_reduced, sizeof(coords0_reduced)); FOR_EACH(c, 0, ncomps) { - FOR_EACH(i, 0, nverts[c]) { - CHK(scpr_polygon_get_position(polygon, c, i, pos) == RES_OK); + size_t count; + OK(scpr_polygon_get_vertices_count(polygon, c, &count)); + FOR_EACH(i, 0, count) { + OK(scpr_polygon_get_position(polygon, c, i, pos)); CHK(pos[0] == coords[c][i*2+0]); CHK(pos[1] == coords[c][i*2+1]); } } - CHK(scpr_polygon_create_copy(NULL, NULL, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_create_copy(NULL, NULL, &copy) == RES_BAD_ARG); - CHK(scpr_polygon_create_copy(NULL, polygon, NULL) == RES_BAD_ARG); - CHK(scpr_polygon_create_copy(NULL, polygon, &copy) == RES_OK); - CHK(scpr_polygon_eq(polygon, copy, &eq) == RES_OK); + BAD(scpr_polygon_create_copy(NULL, NULL, NULL)); + BAD(scpr_polygon_create_copy(NULL, NULL, &copy)); + BAD(scpr_polygon_create_copy(NULL, polygon, NULL)); + OK(scpr_polygon_create_copy(NULL, polygon, &copy)); + OK(scpr_polygon_eq(polygon, copy, &eq)); CHK(eq); - CHK(scpr_offset_polygon(NULL, 0, SCPR_JOIN_TYPES_COUNT__) == RES_BAD_ARG); - CHK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_TYPES_COUNT__) == RES_BAD_ARG); - CHK(scpr_offset_polygon(NULL, 0, SCPR_JOIN_MITER) == RES_BAD_ARG); - CHK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER) == RES_OK); + BAD(scpr_offset_polygon(NULL, 0, SCPR_JOIN_TYPES_COUNT__)); + BAD(scpr_offset_polygon(polygon, 0, SCPR_JOIN_TYPES_COUNT__)); + BAD(scpr_offset_polygon(NULL, 0, SCPR_JOIN_MITER)); + OK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER)); - CHK(scpr_polygon_ref_put(polygon) == RES_OK); - CHK(scpr_polygon_ref_put(copy) == RES_OK); + OK(scpr_polygon_ref_put(polygon)); + OK(scpr_polygon_ref_put(copy)); MEM_RM(&allocator, *coords); MEM_RM(&allocator, coords); diff --git a/src/test_scpr_utils.h b/src/test_scpr_utils.h @@ -23,6 +23,10 @@ #include <stdio.h> #include <math.h> +#define ERR(Expr) { if((res = (Expr)) != RES_OK) goto error; } (void)0 +#define BAD(Expr) CHK((Expr) == RES_BAD_ARG); +#define OK(Expr) CHK((Expr) == RES_OK); + struct polygon_context { double** coords; size_t* nverts; @@ -104,17 +108,14 @@ check_stability size_t i, j, ccount, vcount; ASSERT(polygon); - res = scpr_polygon_get_components_count(polygon, &ccount); - if(res != RES_OK) goto error; + ERR(scpr_polygon_get_components_count(polygon, &ccount)); for(i = 0; i < ccount; i++) { - res = scpr_polygon_get_vertices_count(polygon, i, &vcount); - if(res != RES_OK) goto error; + ERR(scpr_polygon_get_vertices_count(polygon, i, &vcount)); for(j = 0; j < vcount; j++) { double pt[2], tmp[2]; int64_t tmp2[2]; - res = scpr_polygon_get_position(polygon, i, j, pt); - if(res != RES_OK) goto error; + ERR(scpr_polygon_get_position(polygon, i, j, pt)); tmp2[0] = llround(pt[0] * scale); tmp2[1] = llround(pt[1] * scale); tmp[0] = (double)tmp2[0] / scale;