star-cad

Geometric operators for computer-aided design
git clone git://git.meso-star.fr/star-cad.git
Log | Files | Refs | README | LICENSE

commit 910365e0b8a4c16b5a21aad3fce9f027f81ee104
parent 0150e13b08c8cc08169c8fde75ebed2b1ca55d41
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue,  2 Sep 2025 10:29:28 +0200

Completion of test_api

A lot of API calls where just untested. They now have complete arg test.
Some of the more complicated stuff have now more complex tests,
including return value tests.

Diffstat:
Msrc/test_api.c | 1517++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 1387 insertions(+), 130 deletions(-)

diff --git a/src/test_api.c b/src/test_api.c @@ -20,12 +20,25 @@ #include <rsys/rsys.h> #include <rsys/str.h> #include <rsys/math.h> +#include <rsys/double3.h> #include <rsys/mem_allocator.h> #include <rsys/dynamic_array_double.h> #include <stdlib.h> #include <stdio.h> +#define STRINGIZE(x) STRINGIZE2(x) +#define STRINGIZE2(x) #x +#define LINE_STRING STRINGIZE(__LINE__) + +static void +dummy_release + (void* data) +{ + (void) data; + return; +} + static void get_position (const size_t ivert, double pos[2], void* data) @@ -41,9 +54,14 @@ int main(int argc, char* argv[]) { res_T res = RES_OK; - double p1[3] = {0, 0, 0}; - double p2[3] = {0.25, 0.25, 0.8}; - double d1[3] = {1, 1, 1}; + const double p1[3] = {0, 0, 0}; + const double p2[3] = {0.25, 0.25, 0.8}; + const double p3[3] = {0.85, 0, 0}; + const double p4[3] = {1, 0, 0}; + const double d0[3] = {0.1, 0.1, 0.1}; + const double d1[3] = {1, 1, 1}; + const double d2[3] = {1, 1, 0}; + const double s[3] = {1, 1, 1}; double coord[] = {0, 1.6, 0.5, 0.9, 0.8, 0.6}; struct scad_geometry* geom1 = NULL; struct scad_geometry* geom2 = NULL; @@ -55,250 +73,1489 @@ main(int argc, char* argv[]) struct mem_allocator allocator; struct darray_double trg; struct scad_options options = SCAD_DEFAULT_OPTIONS; - const char* name; + const char *name, *name2; + double m, tmp[3], tmp2[3]; + double affine[16] = { 1, 0, 0, 0.25, 0, 1, 0, 0.25, 0, 0, 1, 0.8, 0, 0, 0, 1 }; size_t i, c; + int e; + void* data; (void)argc; (void)argv; OK(mem_init_proxy_allocator(&allocator, &mem_default_allocator)); /* cannot call any API function before a successful call to scad_initialize */ + geom1 = geom2 = geom = + (struct scad_geometry*)1; /* To allow tests go past arg!=NULL */ BAD(scad_finalize()); - BAD(scad_set_options(NULL)); - BAD(scad_synchronize()); + BAD(scad_set_options(&options)); + BAD(scad_get_options(&options)); + BAD(scad_scene_count(&c)); BAD(scad_scene_clear()); - BAD(scad_add_rectangle(p1, d1, &geom)); + BAD(scad_scene_write("test.step")); + BAD(scad_scene_mesh()); + BAD(scad_add_rectangle(p1, d2, &geom)); BAD(scad_add_disk(p1, 1, &geom)); BAD(scad_add_polygon(get_position, coord, 0, 3, &geom)); BAD(scad_add_box(p1, d1, &geom)); BAD(scad_add_cylinder(p1, d1, 2, 1, &geom)); BAD(scad_add_sphere(p1, 1, &geom)); - BAD(scad_step_import("test.step", NULL, &geom_array, &c)); - BAD(scad_scene_mesh()); + BAD(scad_add_cone(p1, d1, 1, 1, 2*PI, &geom)); + BAD(scad_add_torus(p1, 1, 1, 2*PI, NULL, &geom)); + BAD(scad_geometry_dilate(geom1, p1, p1, &geom)); + BAD(scad_geometry_translate(geom1, p1, &geom)); + BAD(scad_geometry_rotate(geom1, p1, p1, 2, &geom)); + BAD(scad_geometry_extrude(geom1, p1, &geom)); + BAD(scad_geometry_explode(NULL, geom1, &geom_array, &c)); + BAD(scad_geometry_ref_get(geom1)); + BAD(scad_geometry_ref_put(geom1)); + BAD(scad_geometry_get_count(geom1, NULL)); + BAD(scad_geometry_is_empty(geom1, &e)); + BAD(scad_geometry_set_custom_data(geom1, NULL, NULL)); + BAD(scad_geometry_get_custom_data(geom1, (void*)&trg)); + BAD(scad_geometry_set_name(geom1, name)); + BAD(scad_geometry_get_name(geom1, &name)); + BAD(scad_geometries_swap(&geom1, &geom2, 1, 0)); + BAD(scad_geometry_get_mass(geom1, &m)); + BAD(scad_geometry_get_centerofmass(geom1, tmp)); + BAD(scad_geometry_get_closest_point(geom1, p1, tmp, &m, NULL)); + BAD(scad_geometry_get_normal(geom1, tmp, tmp, &geom)); + BAD(scad_geometry_get_bounding_box(geom1, tmp, tmp)); + BAD(scad_geometry_equal(geom1, geom2, &e)); + BAD(scad_geometry_is_included(geom1, &geom2, 1, &e)); + BAD(scad_geometries_collect(&geom1, 1, &geom2)); + BAD(scad_geometries_fuse(&geom1, 1, &geom2, 1, &geom)); + BAD(scad_geometries_cut(&geom1, 1, &geom2, 1, &geom)); + BAD(scad_geometries_intersect(&geom1, 1, &geom2, 1, &geom)); + BAD(scad_geometries_partition(&geom1, 1, 0, &geom)); + BAD(scad_geometries_common_boundaries(NULL, &geom1, 1, &geom2, 1, &geom_array, &c)); + BAD(scad_geometries_boundary(NULL, &geom1, 1, &geom_array, &c)); + BAD(scad_geometry_copy(geom1, &geom2)); + BAD(scad_geometry_set_visibility(geom1, 0, 0)); + BAD(scad_geometries_set_periodic(&geom1, 1, &geom2, 1, affine)); + BAD(scad_geometries_set_mesh_size_modifier(&geom1, 1, SCAD_ABSOLUTE_SIZE, 1)); + BAD(scad_geometries_set_mesh_algorithm(&geom1, 1, SCAD_QUASI_STRUCTURED)); + BAD(scad_geometries_clear_mesh(&geom1, 1)); + BAD(scad_step_import("prefix", "test.step", &geom_array, &c)); + BAD(scad_stl_export(geom1, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_export_partial(geom1, &geom1, 1, "test.stl", + SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_export_split(geom1, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_get_data(geom1, &trg)); + BAD(scad_stl_get_data_partial(geom1, &geom2, 1, &trg)); + BAD(scad_stl_data_write(&trg, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0)); BAD(scad_run_ui()); - BAD(scad_geometry_get_name(geom, &name)); + BAD(scad_synchronize()); + CHK(SIZE_MAX == scad_get_dimtag_refcount(3, 0)); + BAD(scad_dump_geometry(geom)); + BAD(scad_dump_geometries()); /* cannot call any API function after a successful call to scad_finalize */ OK(scad_initialize(NULL, &allocator, 3)); OK(scad_finalize()); BAD(scad_finalize()); - BAD(scad_set_options(NULL)); - BAD(scad_synchronize()); + BAD(scad_set_options(&options)); + BAD(scad_get_options(&options)); + BAD(scad_scene_count(&c)); BAD(scad_scene_clear()); - BAD(scad_add_rectangle(p1, d1, &geom)); + BAD(scad_scene_write("test.step")); + BAD(scad_scene_mesh()); + BAD(scad_add_rectangle(p1, d2, &geom)); BAD(scad_add_disk(p1, 1, &geom)); BAD(scad_add_polygon(get_position, coord, 0, 3, &geom)); BAD(scad_add_box(p1, d1, &geom)); BAD(scad_add_cylinder(p1, d1, 2, 1, &geom)); BAD(scad_add_sphere(p1, 1, &geom)); - BAD(scad_step_import("test.step", NULL, &geom_array, &c)); - BAD(scad_scene_mesh()); + BAD(scad_add_cone(p1, d1, 1, 1, 2*PI, &geom)); + BAD(scad_add_torus(p1, 1, 1, 2*PI, NULL, &geom)); + BAD(scad_geometry_dilate(geom1, p1, p1, &geom)); + BAD(scad_geometry_translate(geom1, p1, &geom)); + BAD(scad_geometry_rotate(geom1, p1, p1, 2, &geom)); + BAD(scad_geometry_extrude(geom1, p1, &geom)); + BAD(scad_geometry_explode(NULL, geom1, &geom_array, &c)); + BAD(scad_geometry_ref_get(geom1)); + BAD(scad_geometry_ref_put(geom1)); + BAD(scad_geometry_get_count(geom1, NULL)); + BAD(scad_geometry_is_empty(geom1, &e)); + BAD(scad_geometry_set_custom_data(geom1, NULL, NULL)); + BAD(scad_geometry_get_custom_data(geom1, (void*)&trg)); + BAD(scad_geometry_set_name(geom1, name)); + BAD(scad_geometry_get_name(geom1, &name)); + BAD(scad_geometries_swap(&geom1, &geom2, 1, 0)); + BAD(scad_geometry_get_mass(geom1, &m)); + BAD(scad_geometry_get_centerofmass(geom1, tmp)); + BAD(scad_geometry_get_closest_point(geom1, tmp, tmp, &m, NULL)); + BAD(scad_geometry_get_normal(geom1, tmp, tmp, &geom)); + BAD(scad_geometry_get_bounding_box(geom1, tmp, tmp)); + BAD(scad_geometry_equal(geom1, geom2, &e)); + BAD(scad_geometry_is_included(geom1, &geom2, 1, &e)); + BAD(scad_geometries_collect(&geom1, 1, &geom2)); + BAD(scad_geometries_fuse(&geom1, 1, &geom2, 1, &geom)); + BAD(scad_geometries_cut(&geom1, 1, &geom2, 1, &geom)); + BAD(scad_geometries_intersect(&geom1, 1, &geom2, 1, &geom)); + BAD(scad_geometries_partition(&geom1, 1, 0, &geom)); + BAD(scad_geometries_common_boundaries(NULL, &geom1, 1, &geom2, 1, &geom_array, &c)); + BAD(scad_geometries_boundary(NULL, &geom1, 1, &geom_array, &c)); + BAD(scad_geometry_copy(geom1, &geom2)); + BAD(scad_geometry_set_visibility(geom1, 0, 0)); + BAD(scad_geometries_set_periodic(&geom1, 1, &geom2, 1, affine)); + BAD(scad_geometries_set_mesh_size_modifier(&geom1, 1, SCAD_ABSOLUTE_SIZE, 1)); + BAD(scad_geometries_set_mesh_algorithm(&geom1, 1, SCAD_QUASI_STRUCTURED)); + BAD(scad_geometries_clear_mesh(&geom1, 1)); + BAD(scad_step_import("prefix", "test.step", &geom_array, &c)); + BAD(scad_stl_export(geom1, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_export_partial(geom1, &geom1, 1, "test.stl", + SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_export_split(geom1, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_get_data(geom1, &trg)); + BAD(scad_stl_get_data_partial(geom1, &geom2, 1, &trg)); + BAD(scad_stl_data_write(&trg, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0)); BAD(scad_run_ui()); - BAD(scad_geometry_get_name(geom, &name)); + BAD(scad_synchronize()); + CHK(SIZE_MAX == scad_get_dimtag_refcount(3, 0)); + BAD(scad_dump_geometry(geom)); + BAD(scad_dump_geometries()); BAD(scad_initialize(NULL, &allocator, 4)); BAD(scad_initialize(NULL, &allocator, -1)); - OK(scad_initialize(NULL, &allocator, 3)); + OK(scad_scene_count(&c)); + CHK(c == 0); + OK(scad_set_options(NULL)); OK(scad_set_options(&options)); - OK(scad_add_sphere(p1, .1, &geom1)); - OK(scad_add_sphere(p2, .2, &geom2)); - geoms[0] = geom1; - geoms[1] = geom2; + OK(scad_scene_count(&c)); + CHK(c == 0); - OK(scad_add_sphere(p1, .1, &geom)); - BAD(scad_geometry_ref_get(NULL)); - OK(scad_geometry_ref_get(geom)); - BAD(scad_geometry_ref_put(NULL)); - OK(scad_geometry_ref_put(geom)); + BAD(scad_get_options(NULL)); + OK(scad_get_options(&options)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + BAD(scad_scene_count(NULL)); + OK(scad_scene_count(&c)); + CHK(c == 0); + OK(scad_add_rectangle(p1, d2, &geom)); + OK(scad_scene_count(&c)); + CHK(c == 1); OK(scad_geometry_ref_put(geom)); - BAD(scad_geometry_get_count(NULL, &c)); - BAD(scad_geometry_get_count(geom1, NULL)); - OK(scad_geometry_get_count(geom1, &c)); + OK(scad_scene_count(&c)); + CHK(c == 0); - BAD(scad_add_rectangle(NULL, d1, &geom)); + BAD(scad_scene_write(NULL)); + ERR(scad_scene_write("")); + ERR(scad_scene_write("/tmp/test.bad")); + OK(scad_scene_write("/tmp/test"LINE_STRING".step")); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + BAD(scad_add_rectangle(NULL, NULL, NULL)); + BAD(scad_add_rectangle(NULL, NULL, &geom)); + BAD(scad_add_rectangle(NULL, d1, NULL)); + BAD(scad_add_rectangle(p1, NULL, NULL)); + BAD(scad_add_rectangle(NULL, d2, &geom)); BAD(scad_add_rectangle(p1, NULL, &geom)); - BAD(scad_add_rectangle(p1, d1, NULL)); - OK(scad_add_rectangle(p1, d1, &geom)); + BAD(scad_add_rectangle(p1, d2, NULL)); + OK(scad_add_rectangle(p1, d2, &geom)); OK(scad_geometry_ref_put(geom)); + OK(scad_scene_count(&c)); + CHK(c == 0); + + BAD(scad_add_disk(NULL, -1, NULL)); + BAD(scad_add_disk(NULL, -1, &geom)); + BAD(scad_add_disk(NULL, 1, NULL)); + BAD(scad_add_disk(p1, -1, NULL)); BAD(scad_add_disk(NULL, 1, &geom)); - BAD(scad_add_disk(p1, 0, &geom)); + BAD(scad_add_disk(p1, -1, &geom)); BAD(scad_add_disk(p1, 1, NULL)); OK(scad_add_disk(p1, 1, &geom)); OK(scad_geometry_ref_put(geom)); + OK(scad_scene_count(&c)); + CHK(c == 0); + + BAD(scad_add_polygon(NULL, coord, 0, 0, NULL)); + BAD(scad_add_polygon(get_position, coord, 0, 0, NULL)); + BAD(scad_add_polygon(NULL, coord, 0, 3, NULL)); + BAD(scad_add_polygon(NULL, coord, 0, 0, &poly)); BAD(scad_add_polygon(NULL, coord, 0, 3, &poly)); - BAD(scad_add_polygon(get_position, coord, 0, 2, &poly)); - BAD(scad_add_polygon(get_position, coord, 0, 2, &poly)); + BAD(scad_add_polygon(get_position, coord, 0, 0, &poly)); BAD(scad_add_polygon(get_position, coord, 0, 3, NULL)); OK(scad_add_polygon(get_position, coord, 0, 3, &poly)); + OK(scad_geometry_ref_put(poly)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + BAD(scad_add_box(NULL, NULL, NULL)); + BAD(scad_add_box(NULL, NULL, &geom)); + BAD(scad_add_box(NULL, d1, NULL)); + BAD(scad_add_box(p1, NULL, NULL)); BAD(scad_add_box(NULL, d1, &geom)); BAD(scad_add_box(p1, NULL, &geom)); BAD(scad_add_box(p1, d1, NULL)); OK(scad_add_box(p1, d1, &geom)); OK(scad_geometry_ref_put(geom)); - BAD(scad_add_cylinder(NULL, d1, 2, 1, &geom)); - BAD(scad_add_cylinder(p1, NULL, 2, 1, &geom)); - BAD(scad_add_cylinder(p1, d1, 0, 1, &geom)); - BAD(scad_add_cylinder(p1, d1, 2, -1, &geom)); - BAD(scad_add_cylinder(p1, d1, 2, 3*PI, &geom)); - BAD(scad_add_cylinder(p1, d1, 2, 1, NULL)); - OK(scad_add_cylinder(p1, d1, 2, 1, &geom)); + OK(scad_scene_count(&c)); + CHK(c == 0); + + BAD(scad_add_cylinder(NULL, NULL, -1, -1, NULL)); + BAD(scad_add_cylinder(NULL, NULL, -1, -1, &geom)); + BAD(scad_add_cylinder(NULL, NULL, -1, 1, NULL)); + BAD(scad_add_cylinder(NULL, NULL, 1, -1, NULL)); + BAD(scad_add_cylinder(NULL, d1, -1, -1, NULL)); + BAD(scad_add_cylinder(p1, NULL, -1, -1, NULL)); + BAD(scad_add_cylinder(NULL, NULL, -1, 1, &geom)); + BAD(scad_add_cylinder(NULL, NULL, 1, -1, &geom)); + BAD(scad_add_cylinder(NULL, d1, -1, -1, &geom)); + BAD(scad_add_cylinder(p1, NULL, -1, -1, &geom)); + BAD(scad_add_cylinder(NULL, NULL, 1, 1, NULL)); + BAD(scad_add_cylinder(NULL, d1, -1, 1, NULL)); + BAD(scad_add_cylinder(p1, NULL, -1, 1, NULL)); + BAD(scad_add_cylinder(NULL, d1, 1, -1, NULL)); + BAD(scad_add_cylinder(p1, NULL, 1, -1, NULL)); + BAD(scad_add_cylinder(p1, d1, -1, -1, NULL)); + BAD(scad_add_cylinder(NULL, NULL, 1, 1, &geom)); + BAD(scad_add_cylinder(NULL, d1, -1, 1, &geom)); + BAD(scad_add_cylinder(p1, NULL, -1, 1, &geom)); + BAD(scad_add_cylinder(NULL, d1, 1, -1, &geom)); + BAD(scad_add_cylinder(p1, NULL, 1, -1, &geom)); + BAD(scad_add_cylinder(p1, d1, -1, -1, &geom)); + BAD(scad_add_cylinder(NULL, d1, 1, 1, NULL)); + BAD(scad_add_cylinder(p1, NULL, 1, 1, NULL)); + BAD(scad_add_cylinder(p1, d1, -1, 1, NULL)); + BAD(scad_add_cylinder(p1, d1, 1, -1, NULL)); + BAD(scad_add_cylinder(NULL, d1, 1, 1, &geom)); + BAD(scad_add_cylinder(p1, NULL, 1, 1, &geom)); + BAD(scad_add_cylinder(p1, d1, -1, 1, &geom)); + BAD(scad_add_cylinder(p1, d1, 1, 3*PI, &geom)); + BAD(scad_add_cylinder(p1, d1, 1, 1, NULL)); + OK(scad_add_cylinder(p1, d1, 1, 1, &geom)); OK(scad_geometry_ref_put(geom)); + OK(scad_scene_count(&c)); + CHK(c == 0); + + BAD(scad_add_sphere(NULL, -1, NULL)); + BAD(scad_add_sphere(NULL, -1, &geom)); + BAD(scad_add_sphere(NULL, 1, NULL)); + BAD(scad_add_sphere(p1, -1, NULL)); BAD(scad_add_sphere(NULL, 1, &geom)); BAD(scad_add_sphere(p1, 0, &geom)); BAD(scad_add_sphere(p1, 1, NULL)); OK(scad_add_sphere(p1, 1, &geom)); OK(scad_geometry_ref_put(geom)); - /* BAD(scad_geometries_fuse(NULL, NULL, 0, geoms, 2, &geom)); */ - BAD(scad_geometries_fuse(geoms, 2, NULL, 0, &geom)); - BAD(scad_geometries_fuse(NULL, 1, &geom2, 1, &geom)); + + + + OK(scad_scene_count(&c)); + CHK(c == 0); + + BAD(scad_add_cone(NULL, NULL, -1, -1, -1, NULL)); + BAD(scad_add_cone(NULL, NULL, -1, -1, -1, &geom)); + BAD(scad_add_cone(NULL, NULL, -1, -1, 2*PI, NULL)); + BAD(scad_add_cone(NULL, NULL, -1, -1, 2*PI, &geom)); + BAD(scad_add_cone(NULL, NULL, -1, 1, -1, NULL)); + BAD(scad_add_cone(NULL, NULL, -1, 1, -1, &geom)); + BAD(scad_add_cone(NULL, NULL, -1, 1, 2*PI, NULL)); + BAD(scad_add_cone(NULL, NULL, -1, 1, 2*PI, &geom)); + BAD(scad_add_cone(NULL, NULL, 0, -1, -1, NULL)); + BAD(scad_add_cone(NULL, NULL, 0, -1, -1, &geom)); + BAD(scad_add_cone(NULL, NULL, 0, -1, 2*PI, NULL)); + BAD(scad_add_cone(NULL, NULL, 0, -1, 2*PI, &geom)); + BAD(scad_add_cone(NULL, NULL, 0, 1, -1, NULL)); + BAD(scad_add_cone(NULL, NULL, 0, 1, -1, &geom)); + BAD(scad_add_cone(NULL, NULL, 0, 1, 2*PI, NULL)); + BAD(scad_add_cone(NULL, NULL, 0, 1, 2*PI, &geom)); + BAD(scad_add_cone(NULL, d1, -1, -1, -1, NULL)); + BAD(scad_add_cone(NULL, d1, -1, -1, -1, &geom)); + BAD(scad_add_cone(NULL, d1, -1, -1, 2*PI, NULL)); + BAD(scad_add_cone(NULL, d1, -1, -1, 2*PI, &geom)); + BAD(scad_add_cone(NULL, d1, -1, 1, -1, NULL)); + BAD(scad_add_cone(NULL, d1, -1, 1, -1, &geom)); + BAD(scad_add_cone(NULL, d1, -1, 1, 2*PI, NULL)); + BAD(scad_add_cone(NULL, d1, -1, 1, 2*PI, &geom)); + BAD(scad_add_cone(NULL, d1, 0, -1, -1, NULL)); + BAD(scad_add_cone(NULL, d1, 0, -1, -1, &geom)); + BAD(scad_add_cone(NULL, d1, 0, -1, 2*PI, NULL)); + BAD(scad_add_cone(NULL, d1, 0, -1, 2*PI, &geom)); + BAD(scad_add_cone(NULL, d1, 0, 1, -1, NULL)); + BAD(scad_add_cone(NULL, d1, 0, 1, -1, &geom)); + BAD(scad_add_cone(NULL, d1, 0, 1, 2*PI, NULL)); + BAD(scad_add_cone(NULL, d1, 0, 1, 2*PI, &geom)); + BAD(scad_add_cone(p1, NULL, -1, -1, -1, NULL)); + BAD(scad_add_cone(p1, NULL, -1, -1, -1, &geom)); + BAD(scad_add_cone(p1, NULL, -1, -1, 2*PI, NULL)); + BAD(scad_add_cone(p1, NULL, -1, -1, 2*PI, &geom)); + BAD(scad_add_cone(p1, NULL, -1, 1, -1, NULL)); + BAD(scad_add_cone(p1, NULL, -1, 1, -1, &geom)); + BAD(scad_add_cone(p1, NULL, -1, 1, 2*PI, NULL)); + BAD(scad_add_cone(p1, NULL, -1, 1, 2*PI, &geom)); + BAD(scad_add_cone(p1, NULL, 0, -1, -1, NULL)); + BAD(scad_add_cone(p1, NULL, 0, -1, -1, &geom)); + BAD(scad_add_cone(p1, NULL, 0, -1, 2*PI, NULL)); + BAD(scad_add_cone(p1, NULL, 0, -1, 2*PI, &geom)); + BAD(scad_add_cone(p1, NULL, 0, 1, -1, NULL)); + BAD(scad_add_cone(p1, NULL, 0, 1, -1, &geom)); + BAD(scad_add_cone(p1, NULL, 0, 1, 2*PI, NULL)); + BAD(scad_add_cone(p1, NULL, 0, 1, 2*PI, &geom)); + BAD(scad_add_cone(p1, d1, -1, -1, -1, NULL)); + BAD(scad_add_cone(p1, d1, -1, -1, -1, &geom)); + BAD(scad_add_cone(p1, d1, -1, -1, 2*PI, NULL)); + BAD(scad_add_cone(p1, d1, -1, -1, 2*PI, &geom)); + BAD(scad_add_cone(p1, d1, -1, 1, -1, NULL)); + BAD(scad_add_cone(p1, d1, -1, 1, -1, &geom)); + BAD(scad_add_cone(p1, d1, -1, 1, 2*PI, NULL)); + BAD(scad_add_cone(p1, d1, -1, 1, 2*PI, &geom)); + BAD(scad_add_cone(p1, d1, 0, -1, -1, NULL)); + BAD(scad_add_cone(p1, d1, 0, -1, -1, &geom)); + BAD(scad_add_cone(p1, d1, 0, -1, 2*PI, NULL)); + BAD(scad_add_cone(p1, d1, 0, -1, 2*PI, &geom)); + BAD(scad_add_cone(p1, d1, 0, 1, -1, NULL)); + BAD(scad_add_cone(p1, d1, 0, 1, -1, &geom)); + BAD(scad_add_cone(p1, d1, 0, 1, 2*PI, NULL)); + OK(scad_add_cone(p1, d1, 0, 1, 2*PI, &geom)); + OK(scad_geometry_ref_put(geom)); + BAD(scad_add_cone(p1, d1, 1, 1, 2*PI, &geom)); /* r1 == r2 */ + + OK(scad_scene_count(&c)); + CHK(c == 0); + + BAD(scad_add_torus(NULL, 0, 0, -1, NULL, NULL)); + BAD(scad_add_torus(NULL, 0, 0, -1, NULL, &geom)); + BAD(scad_add_torus(NULL, 0, 0, -1, d1, NULL)); + BAD(scad_add_torus(NULL, 0, 0, -1, d1, &geom)); + BAD(scad_add_torus(NULL, 0, 0, 2*PI, NULL, NULL)); + BAD(scad_add_torus(NULL, 0, 0, 2*PI, NULL, &geom)); + BAD(scad_add_torus(NULL, 0, 0, 2*PI, d1, NULL)); + BAD(scad_add_torus(NULL, 0, 0, 2*PI, d1, &geom)); + BAD(scad_add_torus(NULL, 0, 1, -1, NULL, NULL)); + BAD(scad_add_torus(NULL, 0, 1, -1, NULL, &geom)); + BAD(scad_add_torus(NULL, 0, 1, -1, d1, NULL)); + BAD(scad_add_torus(NULL, 0, 1, -1, d1, &geom)); + BAD(scad_add_torus(NULL, 0, 1, 2*PI, NULL, NULL)); + BAD(scad_add_torus(NULL, 0, 1, 2*PI, NULL, &geom)); + BAD(scad_add_torus(NULL, 0, 1, 2*PI, d1, NULL)); + BAD(scad_add_torus(NULL, 0, 1, 2*PI, d1, &geom)); + BAD(scad_add_torus(NULL, 1, 0, -1, NULL, NULL)); + BAD(scad_add_torus(NULL, 1, 0, -1, NULL, &geom)); + BAD(scad_add_torus(NULL, 1, 0, -1, d1, NULL)); + BAD(scad_add_torus(NULL, 1, 0, -1, d1, &geom)); + BAD(scad_add_torus(NULL, 1, 0, 2*PI, NULL, NULL)); + BAD(scad_add_torus(NULL, 1, 0, 2*PI, NULL, &geom)); + BAD(scad_add_torus(NULL, 1, 0, 2*PI, d1, NULL)); + BAD(scad_add_torus(NULL, 1, 0, 2*PI, d1, &geom)); + BAD(scad_add_torus(NULL, 1, 1, -1, NULL, NULL)); + BAD(scad_add_torus(NULL, 1, 1, -1, NULL, &geom)); + BAD(scad_add_torus(NULL, 1, 1, -1, d1, NULL)); + BAD(scad_add_torus(NULL, 1, 1, -1, d1, &geom)); + BAD(scad_add_torus(NULL, 1, 1, 2*PI, NULL, NULL)); + BAD(scad_add_torus(NULL, 1, 1, 2*PI, NULL, &geom)); + BAD(scad_add_torus(NULL, 1, 1, 2*PI, d1, NULL)); + BAD(scad_add_torus(NULL, 1, 1, 2*PI, d1, &geom)); + BAD(scad_add_torus(p1, 0, 0, -1, NULL, NULL)); + BAD(scad_add_torus(p1, 0, 0, -1, NULL, &geom)); + BAD(scad_add_torus(p1, 0, 0, -1, d1, NULL)); + BAD(scad_add_torus(p1, 0, 0, -1, d1, &geom)); + BAD(scad_add_torus(p1, 0, 0, 2*PI, NULL, NULL)); + BAD(scad_add_torus(p1, 0, 0, 2*PI, NULL, &geom)); + BAD(scad_add_torus(p1, 0, 0, 2*PI, d1, NULL)); + BAD(scad_add_torus(p1, 0, 0, 2*PI, d1, &geom)); + BAD(scad_add_torus(p1, 0, 1, -1, NULL, NULL)); + BAD(scad_add_torus(p1, 0, 1, -1, NULL, &geom)); + BAD(scad_add_torus(p1, 0, 1, -1, d1, NULL)); + BAD(scad_add_torus(p1, 0, 1, -1, d1, &geom)); + BAD(scad_add_torus(p1, 0, 1, 2*PI, NULL, NULL)); + BAD(scad_add_torus(p1, 0, 1, 2*PI, NULL, &geom)); + BAD(scad_add_torus(p1, 0, 1, 2*PI, d1, NULL)); + BAD(scad_add_torus(p1, 0, 1, 2*PI, d1, &geom)); + BAD(scad_add_torus(p1, 1, 0, -1, NULL, NULL)); + BAD(scad_add_torus(p1, 1, 0, -1, NULL, &geom)); + BAD(scad_add_torus(p1, 1, 0, -1, d1, NULL)); + BAD(scad_add_torus(p1, 1, 0, -1, d1, &geom)); + BAD(scad_add_torus(p1, 1, 0, 2*PI, NULL, NULL)); + BAD(scad_add_torus(p1, 1, 0, 2*PI, NULL, &geom)); + BAD(scad_add_torus(p1, 1, 0, 2*PI, d1, NULL)); + BAD(scad_add_torus(p1, 1, 0, 2*PI, d1, &geom)); + BAD(scad_add_torus(p1, 1, 1, -1, NULL, NULL)); + BAD(scad_add_torus(p1, 1, 1, -1, NULL, &geom)); + BAD(scad_add_torus(p1, 1, 1, -1, d1, NULL)); + BAD(scad_add_torus(p1, 1, 1, -1, d1, &geom)); + BAD(scad_add_torus(p1, 1, 1, 2*PI, NULL, NULL)); + OK(scad_add_torus(p1, 1, 1, 2*PI, NULL, &geom)); + OK(scad_geometry_ref_put(geom)); + BAD(scad_add_torus(p1, 1, 1, 2*PI, d1, NULL)); + OK(scad_add_torus(p1, 1, 1, 2*PI, d1, &geom)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom1)); + BAD(scad_geometry_dilate(NULL, NULL, NULL, NULL)); + BAD(scad_geometry_dilate(NULL, NULL, NULL, &geom)); + BAD(scad_geometry_dilate(NULL, NULL, s, NULL)); + BAD(scad_geometry_dilate(NULL, p1, NULL, NULL)); + BAD(scad_geometry_dilate(geom1, NULL, NULL, NULL)); + BAD(scad_geometry_dilate(NULL, NULL, s, &geom)); + BAD(scad_geometry_dilate(NULL, p1, NULL, &geom)); + BAD(scad_geometry_dilate(geom1, NULL, NULL, &geom)); + BAD(scad_geometry_dilate(NULL, p1, s, NULL)); + BAD(scad_geometry_dilate(geom1, NULL, s, NULL)); + BAD(scad_geometry_dilate(NULL, p1, s, &geom)); + BAD(scad_geometry_dilate(geom1, NULL, p1, &geom)); + BAD(scad_geometry_dilate(geom1, p1, NULL, &geom)); + BAD(scad_geometry_dilate(geom1, p1, s, NULL)); + OK(scad_geometry_dilate(geom1, p1, s, &geom)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom1)); + BAD(scad_geometry_translate(NULL, NULL, NULL)); + BAD(scad_geometry_translate(NULL, NULL, &geom)); + BAD(scad_geometry_translate(NULL, d1, NULL)); + BAD(scad_geometry_translate(geom1, NULL, NULL)); + BAD(scad_geometry_translate(NULL, d1, &geom)); + BAD(scad_geometry_translate(geom1, NULL, &geom)); + BAD(scad_geometry_translate(geom1, d1, NULL)); + OK(scad_geometry_translate(geom1, d1, &geom)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom1)); + BAD(scad_geometry_rotate(NULL, NULL, NULL, 1, NULL)); + BAD(scad_geometry_rotate(NULL, NULL, NULL, 1, &geom)); + BAD(scad_geometry_rotate(NULL, NULL, d1, 1, NULL)); + BAD(scad_geometry_rotate(NULL, p1, NULL, 1, NULL)); + BAD(scad_geometry_rotate(geom1, NULL, NULL, 1, NULL)); + BAD(scad_geometry_rotate(NULL, NULL, d1, 1, &geom)); + BAD(scad_geometry_rotate(NULL, p1, NULL, 1, &geom)); + BAD(scad_geometry_rotate(geom1, NULL, NULL, 1, &geom)); + BAD(scad_geometry_rotate(NULL, p1, d1, 1, NULL)); + BAD(scad_geometry_rotate(geom1, NULL, d1, 1, NULL)); + BAD(scad_geometry_rotate(geom1, p1, NULL, 1, NULL)); + BAD(scad_geometry_rotate(NULL, p1, d1, 1, &geom)); + BAD(scad_geometry_rotate(geom1, NULL, d1, 1, &geom)); + BAD(scad_geometry_rotate(geom1, p1, NULL, 1, &geom)); + BAD(scad_geometry_rotate(geom1, p1, d1, 1, NULL)); + OK(scad_geometry_rotate(geom1, p1, d1, 1, &geom)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_polygon(get_position, coord, 0, 3, &poly)); + BAD(scad_geometry_extrude(NULL, NULL, NULL)); + BAD(scad_geometry_extrude(NULL, NULL, &geom)); + BAD(scad_geometry_extrude(NULL, d1, NULL)); + BAD(scad_geometry_extrude(poly, NULL, NULL)); + BAD(scad_geometry_extrude(NULL, d1, &geom)); + BAD(scad_geometry_extrude(poly, NULL, &geom)); + BAD(scad_geometry_extrude(poly, d1, NULL)); + OK(scad_geometry_extrude(poly, d1, &geom)); + OK(scad_geometry_ref_put(poly)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_polygon(get_position, coord, 0, 3, geoms+0)); + OK(scad_geometry_translate(geoms[0], d1, geoms+1)); + OK(scad_geometries_collect(geoms, 2, &poly)); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + OK(scad_geometry_extrude(poly, d1, &geom)); + OK(scad_geometry_ref_put(poly)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom)); + BAD(scad_geometry_extrude(geom, d1, &geom2)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, geoms+0)); + OK(scad_add_sphere(p2, 2, geoms+1)); + OK(scad_geometries_collect(geoms, 2, &geom)); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + BAD(scad_geometry_explode(NULL, NULL, NULL, NULL)); + BAD(scad_geometry_explode(NULL, NULL, NULL, &c)); + BAD(scad_geometry_explode(NULL, NULL, &geom_array, NULL)); + BAD(scad_geometry_explode(NULL, geom, NULL, NULL)); + BAD(scad_geometry_explode(NULL, NULL, &geom_array, &c)); + BAD(scad_geometry_explode(NULL, geom, NULL, &c)); + BAD(scad_geometry_explode(NULL, geom, &geom_array, NULL)); + OK(scad_geometry_explode(NULL, geom, &geom_array, &c)); + OK(scad_geometry_ref_put(geom)); + CHK(c == 2); + OK(scad_geometry_ref_put(geom_array[0])); + OK(scad_geometry_ref_put(geom_array[1])); + MEM_RM(&allocator, geom_array); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom)); + BAD(scad_geometry_ref_get(NULL)); + OK(scad_geometry_ref_get(geom)); + BAD(scad_geometry_ref_put(NULL)); + OK(scad_geometry_ref_put(geom)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + BAD(scad_geometry_get_count(NULL, &c)); + BAD(scad_geometry_get_count(geom, NULL)); + OK(scad_add_sphere(p1, 1, &geom)); + OK(scad_geometry_get_count(geom, &c)); + CHK(c == 1); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 0.1, &geom)); + OK(scad_add_sphere(p3, 0.1, &geom1)); + OK(scad_geometries_intersect(&geom, 1, &geom1, 1, &geom2)); + BAD(scad_geometry_is_empty(NULL, &e)); + BAD(scad_geometry_is_empty(geom, NULL)); + OK(scad_geometry_is_empty(geom, &e)); + CHK(e == 0); + OK(scad_geometry_is_empty(geom2, &e)); + CHK(e == 1); + OK(scad_geometry_ref_put(geom)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom)); + BAD(scad_geometry_set_custom_data(NULL, NULL, NULL)); + OK(scad_geometry_set_custom_data(geom, NULL, NULL)); + OK(scad_geometry_set_custom_data(geom, NULL, (void*)&e)); + OK(scad_geometry_set_custom_data(geom, dummy_release, NULL)); + OK(scad_geometry_set_custom_data(geom, dummy_release, (void*)&e)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom)); + BAD(scad_geometry_get_custom_data(NULL, NULL)); + BAD(scad_geometry_get_custom_data(geom, NULL)); + OK(scad_geometry_get_custom_data(geom, &data)); + CHK(data == NULL); /* NULL when unset */ + OK(scad_geometry_set_custom_data(geom, NULL, (void*)&c)); + OK(scad_geometry_get_custom_data(geom, &data)); + CHK(data == (void*)&c); + OK(scad_geometry_set_custom_data(geom, NULL, NULL)); + OK(scad_geometry_get_custom_data(geom, &data)); + CHK(data == NULL); + OK(scad_geometry_set_custom_data(geom, dummy_release, (void*)&c)); + OK(scad_geometry_get_custom_data(geom, &data)); + CHK(data == (void*)&c); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom1)); + OK(scad_add_sphere(p2, 2, &geom2)); + BAD(scad_geometry_set_name(NULL, NULL)); + OK(scad_geometry_set_name(geom1, "sphere 1")); + OK(scad_geometry_set_name(geom1, "sphere 1")); /* Same geometry: OK */ + name = "sphere 2"; + OK(scad_geometry_set_name(geom2, name)); + BAD(scad_geometry_set_name(geom2, "sphere 1")); /* Name already in use */ + OK(scad_geometry_get_name(geom2, &name2)); + CHK(0 == strcmp(name, name2)); /* Name was left unchanged */ + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + OK(scad_add_sphere(p1, 1, &geom)); + BAD(scad_geometry_get_name(NULL, &name)); + BAD(scad_geometry_get_name(geom, NULL)); + OK(scad_geometry_get_name(geom, &name)); + CHK(name == NULL); + name = "sphere 1"; + OK(scad_geometry_set_name(geom, name)); + OK(scad_geometry_get_name(geom, &name2)); + CHK(0 == strcmp(name, name2)); + OK(scad_geometry_set_name(geom, NULL)); + OK(scad_geometry_get_name(geom, &name)); + CHK(name == NULL); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom1)); + OK(scad_add_sphere(p2, 2, &geom2)); + /* Sharing content */ + OK(scad_geometries_collect(&geom1, 1, geoms+0)); + OK(scad_geometries_collect(&geom2, 1, geoms+1)); + OK(scad_geometry_set_name(geom1, "sphere 1")); + OK(scad_geometry_set_name(geom2, "sphere 2")); + BAD(scad_geometries_swap(NULL, NULL, 0, 0)); + BAD(scad_geometries_swap(NULL, NULL, 0, SCAD_SWAP_GEOMETRY)); + BAD(scad_geometries_swap(NULL, NULL, 1, 0)); + BAD(scad_geometries_swap(NULL, &geom2, 0, 0)); + BAD(scad_geometries_swap(&geom1, NULL, 0, 0)); + BAD(scad_geometries_swap(NULL, NULL, 1, SCAD_SWAP_GEOMETRY)); + BAD(scad_geometries_swap(NULL, &geom2, 0, SCAD_SWAP_GEOMETRY)); + BAD(scad_geometries_swap(&geom1, NULL, 0, SCAD_SWAP_GEOMETRY)); + BAD(scad_geometries_swap(NULL, &geom2, 1, 0)); + BAD(scad_geometries_swap(&geom1, NULL, 1, 0)); + BAD(scad_geometries_swap(&geom1, &geom2, 0, 0)); + BAD(scad_geometries_swap(NULL, &geom2, 1, SCAD_SWAP_GEOMETRY)); + BAD(scad_geometries_swap(&geom1, NULL, 1, SCAD_SWAP_GEOMETRY)); + BAD(scad_geometries_swap(&geom1, &geom2, 0, SCAD_SWAP_GEOMETRY)); + BAD(scad_geometries_swap(&geom1, &geom2, 1, 0)); + OK(scad_geometries_swap(&geom1, &geom2, 1, SCAD_SWAP_GEOMETRY)); + /* Names not swapped */ + OK(scad_geometry_get_name(geom1, &name)); + OK(scad_geometry_get_name(geom2, &name2)); + CHK(0 == strcmp(name, "sphere 1")); + CHK(0 == strcmp(name2, "sphere 2")); + /* Geometries swaped */ + OK(scad_geometry_equal(geom1, geoms[1], &e)); + CHK(e); + OK(scad_geometry_equal(geom2, geoms[0], &e)); + CHK(e); + OK(scad_geometries_swap(&geom1, &geom2, 1, SCAD_SWAP_NAME)); + /* Names swapped */ + OK(scad_geometry_get_name(geom1, &name)); + OK(scad_geometry_get_name(geom2, &name2)); + CHK(0 == strcmp(name, "sphere 2")); + CHK(0 == strcmp(name2, "sphere 1")); + /* Geometries not swaped */ + OK(scad_geometry_equal(geom1, geoms[1], &e)); + CHK(e); + OK(scad_geometry_equal(geom2, geoms[0], &e)); + CHK(e); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_rectangle(p1, d2, &geom1)); + BAD(scad_geometry_get_mass(NULL, NULL)); + BAD(scad_geometry_get_mass(NULL, &m)); + BAD(scad_geometry_get_mass(geom1, NULL)); + OK(scad_geometry_get_mass(geom1, &m)); + CHK(eq_eps(m, 1, 1e-6)); /* Mass of 2D object is its surface */ + OK(scad_geometry_ref_put(geom1)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom1)); + OK(scad_geometry_get_mass(geom1, &m)); + CHK(eq_eps(m, PI*4/3, 1e-6)); /* Mass of 3D object is its volume */ + OK(scad_geometry_ref_put(geom1)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_rectangle(p1, d2, &geom1)); + d3_add(tmp2, p1, d3_muld(tmp2, d2, 0.5)); + BAD(scad_geometry_get_centerofmass(NULL, NULL)); + BAD(scad_geometry_get_centerofmass(NULL, tmp)); + BAD(scad_geometry_get_centerofmass(geom1, NULL)); + OK(scad_geometry_get_centerofmass(geom1, tmp)); + CHK(d3_eq_eps(tmp, tmp2, 1e-6)); + OK(scad_geometry_ref_put(geom1)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_rectangle(p1, d2, geoms+0)); + OK(scad_add_rectangle(p2, d2, geoms+1)); + d3_add(tmp2, d3_muld(tmp2, d3_add(tmp2, p1, p2), 0.5), d3_muld(tmp, d2, 0.5)); + OK(scad_geometries_collect(geoms, 2, &geom1)); + OK(scad_geometry_get_centerofmass(geom1, tmp)); + CHK(d3_eq_eps(tmp, tmp2, 1e-6)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom1)); + OK(scad_geometry_get_centerofmass(geom1, tmp)); + CHK(d3_eq_eps(tmp, p1, 1e-6)); + OK(scad_geometry_ref_put(geom1)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, geoms+0)); + OK(scad_add_sphere(p2, 1, geoms+1)); + OK(scad_geometries_collect(geoms, 2, &geom1)); + d3_muld(tmp2, d3_add(tmp2, p1, p2), 0.5); + OK(scad_geometry_get_centerofmass(geom1, tmp)); + CHK(d3_eq_eps(tmp, tmp2, 1e-6)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_rectangle(p1, d2, &geom1)); + BAD(scad_geometry_get_closest_point(NULL, NULL, NULL, NULL, NULL)); + BAD(scad_geometry_get_closest_point(NULL, NULL, NULL, &m, NULL)); + BAD(scad_geometry_get_closest_point(NULL, NULL, tmp, NULL, NULL)); + BAD(scad_geometry_get_closest_point(NULL, p3, NULL, NULL, NULL)); + BAD(scad_geometry_get_closest_point(geom1, NULL, NULL, NULL, NULL)); + BAD(scad_geometry_get_closest_point(NULL, NULL, tmp, &m, NULL)); + BAD(scad_geometry_get_closest_point(NULL, p3, NULL, &m, NULL)); + BAD(scad_geometry_get_closest_point(geom1, NULL, NULL, &m, NULL)); + BAD(scad_geometry_get_closest_point(NULL, p3, tmp, NULL, NULL)); + BAD(scad_geometry_get_closest_point(geom1, NULL, tmp, NULL, NULL)); + BAD(scad_geometry_get_closest_point(geom1, p3, NULL, NULL, NULL)); + BAD(scad_geometry_get_closest_point(geom1, p3, tmp, NULL, NULL)); + BAD(scad_geometry_get_closest_point(geom1, p3, NULL, &m, NULL)); + BAD(scad_geometry_get_closest_point(geom1, NULL, tmp, &m, NULL)); + BAD(scad_geometry_get_closest_point(NULL, p3, tmp, &m, NULL)); + OK(scad_geometry_get_closest_point(geom1, p3, tmp, &m, NULL)); + OK(scad_geometry_get_closest_point(geom1, p3, tmp, &m, &geom)); + CHK(d3_eq_eps(tmp, p3, 1e-6)); + CHK(eq_eps(m, 0, 1e-6)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom1)); + d3_normalize(tmp, p2); + d3_muld(tmp2, tmp, 0.9999); + OK(scad_geometry_get_closest_point(geom1, tmp2, tmp, &m, NULL)); + OK(scad_geometry_get_closest_point(geom1, tmp2, tmp, &m, &geom)); + CHK(d3_eq_eps(tmp2, tmp, 1e-3)); + CHK(eq_eps(m, d3_len(d3_sub(tmp, tmp2, tmp)), 1e-6)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_rectangle(p1, d2, &geom1)); + BAD(scad_geometry_get_normal(NULL, NULL, NULL, NULL)); + BAD(scad_geometry_get_normal(NULL, NULL, tmp, NULL)); + BAD(scad_geometry_get_normal(NULL, p3, NULL, NULL)); + BAD(scad_geometry_get_normal(geom1, NULL, NULL, NULL)); + BAD(scad_geometry_get_normal(NULL, p3, tmp, NULL)); + BAD(scad_geometry_get_normal(geom1, NULL, tmp, NULL)); + BAD(scad_geometry_get_normal(geom1, p3, NULL, NULL)); + d3(tmp2, 0.3, 0.3, 0); + OK(scad_geometry_get_normal(geom1, tmp2, tmp, NULL)); + OK(scad_geometry_get_normal(geom1, tmp2, tmp, &geom)); + d3(tmp2, 0, 0, 1); + CHK(d3_eq_eps(tmp, tmp2, 1e-6)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom1)); + d3_normalize(tmp2, p2); + OK(scad_geometry_get_normal(geom1, tmp2, tmp, NULL)); + OK(scad_geometry_get_normal(geom1, tmp2, tmp, &geom)); + CHK(d3_eq_eps(tmp, tmp2, 1e-6)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom)); + BAD(scad_geometry_get_bounding_box(NULL, NULL, NULL)); + BAD(scad_geometry_get_bounding_box(NULL, NULL, tmp2)); + BAD(scad_geometry_get_bounding_box(NULL, tmp, NULL)); + BAD(scad_geometry_get_bounding_box(geom, NULL, NULL)); + BAD(scad_geometry_get_bounding_box(NULL, tmp, tmp2)); + BAD(scad_geometry_get_bounding_box(geom, NULL, tmp2)); + BAD(scad_geometry_get_bounding_box(geom, tmp, NULL)); + OK(scad_geometry_get_bounding_box(geom, tmp, tmp2)); + CHK(d3_eq_eps(d3_muld(tmp, tmp, -1), tmp2, 1e-6)); + d3(tmp, 1,1,1); + CHK(d3_eq_eps(tmp, tmp2, 1e-6)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom)); + OK(scad_geometries_collect(&geom, 1, &geom2)); + BAD(scad_geometry_equal(NULL, NULL, NULL)); + BAD(scad_geometry_equal(NULL, NULL, &e)); + BAD(scad_geometry_equal(NULL, geom2, NULL)); + BAD(scad_geometry_equal(geom, NULL, NULL)); + BAD(scad_geometry_equal(NULL, geom2, &e)); + BAD(scad_geometry_equal(geom, NULL, &e)); + BAD(scad_geometry_equal(geom, geom2, NULL)); + OK(scad_geometry_equal(geom, geom2, &e)); + CHK(e == 1); + OK(scad_geometry_ref_put(geom2)); + OK(scad_add_sphere(p1, 1, &geom2)); + OK(scad_geometry_equal(geom, geom2, &e)); + CHK(e == 0); + OK(scad_geometry_ref_put(geom)); + OK(scad_geometry_ref_put(geom2)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom)); + OK(scad_geometries_collect(&geom, 1, &geom2)); + BAD(scad_geometry_is_included(NULL, NULL, 0, NULL)); + BAD(scad_geometry_is_included(NULL, NULL, 0, &e)); + BAD(scad_geometry_is_included(NULL, NULL, 1, NULL)); + BAD(scad_geometry_is_included(NULL, &geom2, 0, NULL)); + BAD(scad_geometry_is_included(geom, NULL, 0, NULL)); + BAD(scad_geometry_is_included(NULL, NULL, 1, &e)); + BAD(scad_geometry_is_included(NULL, &geom2, 0, &e)); + BAD(scad_geometry_is_included(geom, NULL, 0, &e)); + BAD(scad_geometry_is_included(NULL, &geom2, 1, NULL)); + BAD(scad_geometry_is_included(geom, NULL, 1, NULL)); + BAD(scad_geometry_is_included(geom, &geom2, 0, NULL)); + BAD(scad_geometry_is_included(geom, &geom2, 1, NULL)); + BAD(scad_geometry_is_included(geom, &geom2, 0, &e)); + BAD(scad_geometry_is_included(geom, NULL, 1, &e)); + BAD(scad_geometry_is_included(NULL, &geom2, 1, &e)); + OK(scad_geometry_is_included(geom, &geom2, 1, &e)); + CHK(e == 1); + OK(scad_geometry_ref_put(geom2)); + OK(scad_add_sphere(p1, 1, &geom2)); + OK(scad_geometry_is_included(geom, &geom2, 1, &e)); + CHK(e == 0); + OK(scad_geometry_ref_put(geom)); + OK(scad_geometry_ref_put(geom2)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom)); + BAD(scad_geometries_collect(NULL, 0, NULL)); + BAD(scad_geometries_collect(NULL, 0, &geom2)); + BAD(scad_geometries_collect(NULL, 1, NULL)); + BAD(scad_geometries_collect(&geom, 0, NULL)); + BAD(scad_geometries_collect(NULL, 1, &geom2)); + BAD(scad_geometries_collect(&geom, 0, &geom2)); + BAD(scad_geometries_collect(&geom, 1, NULL)); + OK(scad_geometries_collect(&geom, 1, &geom2)); + OK(scad_geometry_ref_put(geom)); + OK(scad_geometry_ref_put(geom2)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d0, &geom1)); + OK(scad_add_box(p2, d0, &geom2)); + BAD(scad_geometries_fuse(NULL, 0, NULL, 0, NULL)); + BAD(scad_geometries_fuse(NULL, 0, NULL, 0, &geom)); + BAD(scad_geometries_fuse(NULL, 0, NULL, 1, NULL)); + BAD(scad_geometries_fuse(NULL, 0, &geom2, 0, NULL)); + BAD(scad_geometries_fuse(NULL, 1, NULL, 0, NULL)); + BAD(scad_geometries_fuse(&geom1, 0, NULL, 0, NULL)); + BAD(scad_geometries_fuse(NULL, 0, NULL, 1, &geom)); + BAD(scad_geometries_fuse(NULL, 0, &geom2, 0, &geom)); + BAD(scad_geometries_fuse(NULL, 1, NULL, 0, &geom)); + BAD(scad_geometries_fuse(&geom1, 0, NULL, 0, &geom)); + BAD(scad_geometries_fuse(NULL, 0, &geom2, 1, NULL)); + BAD(scad_geometries_fuse(NULL, 1, NULL, 1, NULL)); + BAD(scad_geometries_fuse(&geom1, 0, NULL, 1, NULL)); + BAD(scad_geometries_fuse(NULL, 1, &geom2, 0, NULL)); + BAD(scad_geometries_fuse(&geom1, 0, &geom2, 0, NULL)); + BAD(scad_geometries_fuse(&geom1, 1, NULL, 0, NULL)); + BAD(scad_geometries_fuse(NULL, 0, &geom2, 1, &geom)); + BAD(scad_geometries_fuse(NULL, 1, NULL, 1, &geom)); + BAD(scad_geometries_fuse(&geom1, 0, NULL, 1, &geom)); + BAD(scad_geometries_fuse(NULL, 1, &geom2, 0, &geom)); + BAD(scad_geometries_fuse(&geom, 0, &geom2, 0, &geom)); + BAD(scad_geometries_fuse(&geom, 1, NULL, 0, &geom)); + BAD(scad_geometries_fuse(NULL, 1, &geom2, 1, NULL)); + BAD(scad_geometries_fuse(&geom, 0, &geom2, 1, NULL)); BAD(scad_geometries_fuse(&geom1, 1, NULL, 1, &geom)); + BAD(scad_geometries_fuse(&geom, 1, &geom2, 0, NULL)); BAD(scad_geometries_fuse(&geom1, 1, &geom2, 1, NULL)); - OK(scad_geometries_fuse(&geom1, 1, &geom2, 1, &geom)); + BAD(scad_geometries_fuse(&geom1, 1, &geom2, 0, &geom)); + BAD(scad_geometries_fuse(&geom1, 1, NULL, 1, &geom)); + BAD(scad_geometries_fuse(&geom1, 0, &geom2, 1, &geom)); + BAD(scad_geometries_fuse(NULL, 1, &geom2, 1, &geom)); + OK(scad_geometries_fuse(&geom1, 1, &geom2, 1, &geom)); /* disjoint geometries */ + OK(scad_geometry_get_count(geom, &c)); + CHK(c == 2); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); OK(scad_geometry_ref_put(geom)); - /* BAD(scad_geometries_cut(NULL, NULL, 0, geoms, 2, &geom)); */ - BAD(scad_geometries_cut(geoms, 2, NULL, 0, &geom)); - BAD(scad_geometries_cut(NULL, 1, &geom2, 1, &geom)); + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geom1)); + OK(scad_add_box(p2, d1, &geom2)); + OK(scad_geometries_fuse(&geom1, 1, &geom2, 1, &geom)); /* non-disjoint geometries */ + OK(scad_geometry_get_count(geom, &c)); + CHK(c == 1); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d0, &geom1)); + OK(scad_add_box(p2, d0, &geom2)); + BAD(scad_geometries_cut(NULL, 0, NULL, 0, &geom)); + BAD(scad_geometries_cut(NULL, 0, NULL, 1, NULL)); + BAD(scad_geometries_cut(NULL, 0, &geom2, 0, NULL)); + BAD(scad_geometries_cut(NULL, 1, NULL, 0, NULL)); + BAD(scad_geometries_cut(&geom1, 0, NULL, 0, NULL)); + BAD(scad_geometries_cut(NULL, 0, NULL, 1, &geom)); + BAD(scad_geometries_cut(NULL, 0, &geom2, 0, &geom)); + BAD(scad_geometries_cut(NULL, 1, NULL, 0, &geom)); + BAD(scad_geometries_cut(&geom1, 0, NULL, 0, &geom)); + BAD(scad_geometries_cut(NULL, 0, &geom2, 1, NULL)); + BAD(scad_geometries_cut(NULL, 1, NULL, 1, NULL)); + BAD(scad_geometries_cut(&geom1, 0, NULL, 1, NULL)); + BAD(scad_geometries_cut(NULL, 1, &geom2, 0, NULL)); + BAD(scad_geometries_cut(&geom1, 0, &geom2, 0, NULL)); + BAD(scad_geometries_cut(&geom1, 1, NULL, 0, NULL)); + BAD(scad_geometries_cut(NULL, 0, &geom2, 1, &geom)); + BAD(scad_geometries_cut(NULL, 1, NULL, 1, &geom)); + BAD(scad_geometries_cut(&geom1, 0, NULL, 1, &geom)); + BAD(scad_geometries_cut(NULL, 1, &geom2, 0, &geom)); + BAD(scad_geometries_cut(&geom, 0, &geom2, 0, &geom)); + BAD(scad_geometries_cut(&geom, 1, NULL, 0, &geom)); + BAD(scad_geometries_cut(NULL, 1, &geom2, 1, NULL)); + BAD(scad_geometries_cut(&geom, 0, &geom2, 1, NULL)); BAD(scad_geometries_cut(&geom1, 1, NULL, 1, &geom)); + BAD(scad_geometries_cut(&geom, 1, &geom2, 0, NULL)); BAD(scad_geometries_cut(&geom1, 1, &geom2, 1, NULL)); - OK(scad_geometries_cut(&geom1, 1, &geom2, 1, &geom)); + BAD(scad_geometries_cut(&geom1, 1, &geom2, 0, &geom)); + BAD(scad_geometries_cut(&geom1, 1, NULL, 1, &geom)); + BAD(scad_geometries_cut(&geom1, 0, &geom2, 1, &geom)); + BAD(scad_geometries_cut(NULL, 1, &geom2, 1, &geom)); + OK(scad_geometries_cut(&geom1, 1, &geom2, 1, &geom)); /* disjoint geometries */ + OK(scad_geometry_is_empty(geom, &e)); + CHK(e == 0); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); OK(scad_geometry_ref_put(geom)); - /* BAD(scad_geometries_intersect(NULL, NULL, 0, geoms, 2, &geom)); */ - BAD(scad_geometries_intersect(geoms, 2, NULL, 0, &geom)); - BAD(scad_geometries_intersect(NULL, 1, &geom2, 1, &geom)); + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geom1)); + OK(scad_add_box(p2, d1, &geom2)); + OK(scad_geometries_cut(&geom1, 1, &geom2, 1, &geom)); /* non-disjoint geometries */ + OK(scad_geometry_is_empty(geom, &e)); + CHK(e == 0); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geom1)); + OK(scad_geometries_cut(&geom1, 1, &geom1, 1, &geom)); + OK(scad_geometry_is_empty(geom, &e)); + CHK(e == 1); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 1, &geom1)); + OK(scad_geometries_cut(&geom1, 1, &geom1, 1, &geom)); + OK(scad_geometry_is_empty(geom, &e)); + CHK(e == 1); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d0, &geom1)); + OK(scad_add_box(p2, d0, &geom2)); + BAD(scad_geometries_intersect(NULL, 0, NULL, 0, &geom)); + BAD(scad_geometries_intersect(NULL, 0, NULL, 1, NULL)); + BAD(scad_geometries_intersect(NULL, 0, &geom2, 0, NULL)); + BAD(scad_geometries_intersect(NULL, 1, NULL, 0, NULL)); + BAD(scad_geometries_intersect(&geom1, 0, NULL, 0, NULL)); + BAD(scad_geometries_intersect(NULL, 0, NULL, 1, &geom)); + BAD(scad_geometries_intersect(NULL, 0, &geom2, 0, &geom)); + BAD(scad_geometries_intersect(NULL, 1, NULL, 0, &geom)); + BAD(scad_geometries_intersect(&geom1, 0, NULL, 0, &geom)); + BAD(scad_geometries_intersect(NULL, 0, &geom2, 1, NULL)); + BAD(scad_geometries_intersect(NULL, 1, NULL, 1, NULL)); + BAD(scad_geometries_intersect(&geom1, 0, NULL, 1, NULL)); + BAD(scad_geometries_intersect(NULL, 1, &geom2, 0, NULL)); + BAD(scad_geometries_intersect(&geom1, 0, &geom2, 0, NULL)); + BAD(scad_geometries_intersect(&geom1, 1, NULL, 0, NULL)); + BAD(scad_geometries_intersect(NULL, 0, &geom2, 1, &geom)); + BAD(scad_geometries_intersect(NULL, 1, NULL, 1, &geom)); + BAD(scad_geometries_intersect(&geom1, 0, NULL, 1, &geom)); + BAD(scad_geometries_intersect(NULL, 1, &geom2, 0, &geom)); + BAD(scad_geometries_intersect(&geom, 0, &geom2, 0, &geom)); + BAD(scad_geometries_intersect(&geom, 1, NULL, 0, &geom)); + BAD(scad_geometries_intersect(NULL, 1, &geom2, 1, NULL)); + BAD(scad_geometries_intersect(&geom, 0, &geom2, 1, NULL)); BAD(scad_geometries_intersect(&geom1, 1, NULL, 1, &geom)); + BAD(scad_geometries_intersect(&geom, 1, &geom2, 0, NULL)); BAD(scad_geometries_intersect(&geom1, 1, &geom2, 1, NULL)); + BAD(scad_geometries_intersect(&geom1, 1, &geom2, 0, &geom)); + BAD(scad_geometries_intersect(&geom1, 1, NULL, 1, &geom)); + BAD(scad_geometries_intersect(&geom1, 0, &geom2, 1, &geom)); + BAD(scad_geometries_intersect(NULL, 1, &geom2, 1, &geom)); + OK(scad_geometries_intersect(&geom1, 1, &geom2, 1, &geom)); + OK(scad_geometry_is_empty(geom, &e)); + CHK(e == 1); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geom1)); + OK(scad_add_box(p2, d1, &geom2)); OK(scad_geometries_intersect(&geom1, 1, &geom2, 1, &geom)); + OK(scad_geometry_is_empty(geom, &e)); + CHK(e == 0); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); OK(scad_geometry_ref_put(geom)); - /* BAD(scad_geometries_common_boundaries(NULL, NULL, 0, geoms, 2, &geom)); */ - BAD(scad_geometries_common_boundaries(NULL, geoms, 2, NULL, 0, &geom_array, &c)); - BAD(scad_geometries_common_boundaries(NULL, NULL, 1, &geom2, 1, &geom_array, &c)); - BAD(scad_geometries_common_boundaries(NULL, &geom1, 1, NULL, 1, &geom_array, &c)); - BAD(scad_geometries_common_boundaries(NULL, &geom1, 1, &geom2, 1, &geom_array, NULL)); - BAD(scad_geometries_common_boundaries(NULL, &geom1, 1, &geom2, 1, NULL, &c)); - OK(scad_geometries_common_boundaries(NULL, &geom1, 1, &geom2, 1, &geom_array, &c)); + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 0.1, &geom)); + OK(scad_add_sphere(p3, 0.1, &geom1)); + OK(scad_geometries_intersect(&geom, 1, &geom1, 1, &geom2)); + OK(scad_geometry_is_empty(geom2, &e)); + CHK(e == 1); + OK(scad_geometry_ref_put(geom)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); + + OK(scad_add_box(p1, d0, geoms+0)); + OK(scad_add_box(p2, d0, geoms+1)); + BAD(scad_geometries_partition(NULL, 0, 9, NULL)); + BAD(scad_geometries_partition(NULL, 0, 9, out_geoms)); + BAD(scad_geometries_partition(NULL, 0, 0, NULL)); + BAD(scad_geometries_partition(NULL, 2, 9, NULL)); + BAD(scad_geometries_partition(geoms, 0, 9, NULL)); + BAD(scad_geometries_partition(NULL, 0, 0, out_geoms)); + BAD(scad_geometries_partition(NULL, 2, 9, out_geoms)); + BAD(scad_geometries_partition(geoms, 0, 9, out_geoms)); + BAD(scad_geometries_partition(NULL, 2, 0, NULL)); + BAD(scad_geometries_partition(geoms, 0, 0, NULL)); + BAD(scad_geometries_partition(geoms, 2, 9, NULL)); + BAD(scad_geometries_partition(geoms, 2, 0, NULL)); + BAD(scad_geometries_partition(geoms, 2, 9, out_geoms)); + BAD(scad_geometries_partition(geoms, 0, 0, out_geoms)); + BAD(scad_geometries_partition(NULL, 2, 0, out_geoms)); + OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms)); + OK(scad_geometry_equal(geoms[0], out_geoms[0], &e)); + CHK(e == 1); + OK(scad_geometry_equal(geoms[1], out_geoms[1], &e)); + CHK(e == 1); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + OK(scad_geometry_ref_put(out_geoms[0])); + OK(scad_geometry_ref_put(out_geoms[1])); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, geoms+0)); + OK(scad_add_box(p2, d1, geoms+1)); + BAD(scad_geometries_partition(geoms, 2, SCAD_DUMP_ON_OVERLAPPING_ERROR, out_geoms)); + OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms)); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + OK(scad_geometry_ref_put(out_geoms[0])); + OK(scad_geometry_ref_put(out_geoms[1])); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 0.1, &geoms[0])); + OK(scad_add_sphere(p3, 0.1, &geoms[1])); + OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms)); + OK(scad_geometries_swap(geoms, out_geoms, 2, SCAD_SWAP_GEOMETRY)); + OK(scad_geometry_ref_put(out_geoms[0])); + OK(scad_geometry_ref_put(out_geoms[1])); + BAD(scad_geometries_common_boundaries(NULL, geoms+0, 2, NULL, 0, &geom_array, &c)); + BAD(scad_geometries_common_boundaries(NULL, NULL, 1, geoms+1, 1, &geom_array, &c)); + BAD(scad_geometries_common_boundaries(NULL, geoms+0, 1, NULL, 1, &geom_array, &c)); + BAD(scad_geometries_common_boundaries(NULL, geoms+0, 1, geoms+1, 1, &geom_array, NULL)); + BAD(scad_geometries_common_boundaries(NULL, geoms+0, 1, geoms+1, 1, NULL, &c)); + OK(scad_geometries_common_boundaries(NULL, geoms+0, 1, geoms+1, 1, &geom_array, &c)); + CHK(c == 0); + MEM_RM(&allocator, geom_array); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geoms[0])); + OK(scad_add_box(p3, d1, &geoms[1])); + OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms)); + OK(scad_geometries_swap(geoms, out_geoms, 2, SCAD_SWAP_GEOMETRY)); + OK(scad_geometry_ref_put(out_geoms[0])); + OK(scad_geometry_ref_put(out_geoms[1])); + OK(scad_geometries_common_boundaries(NULL, geoms+0, 1, geoms+1, 1, &geom_array, &c)); + CHK(c == 4); for(i = 0; i < c; i++) { OK(scad_geometry_ref_put(geom_array[i])); } MEM_RM(&allocator, geom_array); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); - BAD(scad_geometries_partition(NULL, 2, 1, out_geoms)); - BAD(scad_geometries_partition(geoms, 0, 1, out_geoms)); - BAD(scad_geometries_partition(geoms, 2, 1, NULL)); - OK(scad_geometries_partition(geoms, 2, 1, out_geoms)); + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geoms[0])); + OK(scad_add_box(p4, d1, &geoms[1])); + OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms)); + OK(scad_geometries_swap(geoms, out_geoms, 2, SCAD_SWAP_GEOMETRY)); OK(scad_geometry_ref_put(out_geoms[0])); OK(scad_geometry_ref_put(out_geoms[1])); + OK(scad_geometries_common_boundaries(NULL, geoms+0, 1, geoms+1, 1, &geom_array, &c)); + CHK(c == 1); + for(i = 0; i < c; i++) { + OK(scad_geometry_ref_put(geom_array[i])); + } + MEM_RM(&allocator, geom_array); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 0.1, &geom1)); + BAD(scad_geometries_boundary(NULL, NULL, 0, NULL, NULL)); + BAD(scad_geometries_boundary(NULL, NULL, 0, NULL, &c)); + BAD(scad_geometries_boundary(NULL, NULL, 0, &geom_array, NULL)); + BAD(scad_geometries_boundary(NULL, NULL, 1, NULL, NULL)); + BAD(scad_geometries_boundary(NULL, &geom1, 0, NULL, NULL)); BAD(scad_geometries_boundary(NULL, NULL, 0, &geom_array, &c)); + BAD(scad_geometries_boundary(NULL, NULL, 1, NULL, &c)); + BAD(scad_geometries_boundary(NULL, &geom1, 0, NULL, &c)); + BAD(scad_geometries_boundary(NULL, NULL, 1, &geom_array, NULL)); + BAD(scad_geometries_boundary(NULL, &geom1, 0, &geom_array, NULL)); + BAD(scad_geometries_boundary(NULL, &geom1, 1, NULL, NULL)); + BAD(scad_geometries_boundary(NULL, &geom1, 1, &geom_array, NULL)); BAD(scad_geometries_boundary(NULL, &geom1, 1, NULL, &c)); - BAD(scad_geometries_boundary(NULL, NULL, 0, &geom_array, NULL)); + BAD(scad_geometries_boundary(NULL, &geom1, 0, &geom_array, &c)); + BAD(scad_geometries_boundary(NULL, NULL, 1, &geom_array, &c)); OK(scad_geometries_boundary(NULL, &geom1, 1, &geom_array, &c)); for(i = 0; i < c; i++) { OK(scad_geometry_ref_put(geom_array[i])); } MEM_RM(&allocator, geom_array); + OK(scad_geometry_ref_put(geom1)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + OK(scad_add_sphere(p1, 0.1, &geom1)); BAD(scad_geometry_copy(NULL, &geom)); BAD(scad_geometry_copy(geom1, NULL)); - BAD(scad_geometry_copy(geom1, NULL)); /* Name already in use */ OK(scad_geometry_copy(geom1, &geom)); OK(scad_geometry_ref_put(geom)); + OK(scad_geometry_ref_put(geom1)); - BAD(scad_geometry_set_name(NULL, NULL)); - OK(scad_geometry_set_name(geom1, "sphere 1")); - BAD(scad_geometry_set_name(geom2, "sphere 1")); /* Name already in use */ - OK(scad_geometry_set_name(geom2, NULL)); + OK(scad_scene_count(&c)); + CHK(c == 0); - BAD(scad_geometry_translate(NULL, NULL, NULL)); - BAD(scad_geometry_translate(NULL, NULL, &geom)); - BAD(scad_geometry_translate(NULL, d1, NULL)); - BAD(scad_geometry_translate(NULL, d1, &geom)); - BAD(scad_geometry_translate(geom1, NULL, NULL)); - BAD(scad_geometry_translate(geom1, NULL, &geom)); - BAD(scad_geometry_translate(geom1, d1, NULL)); - OK(scad_geometry_translate(geom1, d1, &geom)); + OK(scad_add_sphere(p1, 0.1, &geom)); + BAD(scad_geometry_set_visibility(NULL, 1, 1)); + OK(scad_geometry_set_visibility(geom, 1, 1)); OK(scad_geometry_ref_put(geom)); - BAD(scad_geometry_rotate(NULL, NULL, NULL, 1, NULL)); - BAD(scad_geometry_rotate(NULL, NULL, NULL, 1, &geom)); - BAD(scad_geometry_rotate(NULL, NULL, d1, 1, NULL)); - BAD(scad_geometry_rotate(NULL, NULL, d1, 1, &geom)); - BAD(scad_geometry_rotate(NULL, p1, NULL, 1, NULL)); - BAD(scad_geometry_rotate(NULL, p1, NULL, 1, &geom)); - BAD(scad_geometry_rotate(NULL, p1, d1, 1, NULL)); - BAD(scad_geometry_rotate(NULL, p1, d1, 1, &geom)); - BAD(scad_geometry_rotate(geom1, NULL, NULL, 1, NULL)); - BAD(scad_geometry_rotate(geom1, NULL, NULL, 1, &geom)); - BAD(scad_geometry_rotate(geom1, NULL, d1, 1, NULL)); - BAD(scad_geometry_rotate(geom1, NULL, d1, 1, &geom)); - BAD(scad_geometry_rotate(geom1, p1, NULL, 1, NULL)); - BAD(scad_geometry_rotate(geom1, p1, NULL, 1, &geom)); - BAD(scad_geometry_rotate(geom1, p1, d1, 1, NULL)); - OK(scad_geometry_rotate(geom1, p1, d1, 1, &geom)); + OK(scad_scene_count(&c)); + CHK(c == 0); - BAD(scad_geometry_extrude(NULL, d1, &geom)); - BAD(scad_geometry_extrude(poly, NULL, &geom)); - BAD(scad_geometry_extrude(poly, d1, NULL)); - OK(scad_geometry_extrude(poly, d1, &geom)); - OK(scad_geometry_ref_put(poly)); - OK(scad_geometry_ref_put(geom)); + OK(scad_add_rectangle(p1, d2, &geom1)); + OK(scad_add_rectangle(p2, d2, &geom2)); + BAD(scad_geometries_set_periodic(NULL, 0, NULL, 0, NULL)); + BAD(scad_geometries_set_periodic(NULL, 0, NULL, 1, NULL)); + BAD(scad_geometries_set_periodic(NULL, 0, &geom2, 0, NULL)); + BAD(scad_geometries_set_periodic(NULL, 1, NULL, 0, NULL)); + BAD(scad_geometries_set_periodic(&geom1, 0, NULL, 0, NULL)); + BAD(scad_geometries_set_periodic(NULL, 0, &geom2, 1, NULL)); + BAD(scad_geometries_set_periodic(NULL, 1, NULL, 1, NULL)); + BAD(scad_geometries_set_periodic(&geom1, 0, NULL, 1, NULL)); + BAD(scad_geometries_set_periodic(NULL, 1, &geom2, 0, NULL)); + BAD(scad_geometries_set_periodic(&geom1, 0, &geom2, 0, NULL)); + BAD(scad_geometries_set_periodic(&geom1, 1, NULL, 0, NULL)); + BAD(scad_geometries_set_periodic(&geom1, 1, &geom2, 0, NULL)); + BAD(scad_geometries_set_periodic(&geom1, 1, NULL, 1, NULL)); + BAD(scad_geometries_set_periodic(&geom1, 0, &geom2, 1, NULL)); + BAD(scad_geometries_set_periodic(NULL, 1, &geom2, 1, NULL)); + BAD(scad_geometries_set_periodic(&geom1, 1, &geom2, 1, NULL)); + BAD(scad_geometries_set_periodic(NULL, 0, NULL, 0, affine)); + BAD(scad_geometries_set_periodic(NULL, 0, NULL, 1, affine)); + BAD(scad_geometries_set_periodic(NULL, 0, &geom2, 0, affine)); + BAD(scad_geometries_set_periodic(NULL, 1, NULL, 0, affine)); + BAD(scad_geometries_set_periodic(&geom1, 0, NULL, 0, affine)); + BAD(scad_geometries_set_periodic(NULL, 0, &geom2, 1, affine)); + BAD(scad_geometries_set_periodic(NULL, 1, NULL, 1, affine)); + BAD(scad_geometries_set_periodic(&geom1, 0, NULL, 1, affine)); + BAD(scad_geometries_set_periodic(NULL, 1, &geom2, 0, affine)); + BAD(scad_geometries_set_periodic(&geom1, 0, &geom2, 0, affine)); + BAD(scad_geometries_set_periodic(&geom1, 1, NULL, 0, affine)); + BAD(scad_geometries_set_periodic(&geom1, 1, &geom2, 0, affine)); + BAD(scad_geometries_set_periodic(&geom1, 1, NULL, 1, affine)); + BAD(scad_geometries_set_periodic(&geom1, 0, &geom2, 1, affine)); + BAD(scad_geometries_set_periodic(NULL, 1, &geom2, 1, affine)); + OK(scad_geometries_set_periodic(&geom1, 1, &geom2, 1, affine)); + OK(scad_geometry_ref_put(geom2)); + OK(scad_add_rectangle(p4, d2, &geom2)); + ERR(scad_geometries_set_periodic(&geom1, 1, &geom2, 1, affine)); + OK(scad_geometry_ref_put(geom1)); + OK(scad_geometry_ref_put(geom2)); - BAD(scad_scene_write(NULL)); - ERR(scad_scene_write("")); - OK(scad_scene_write("/tmp/test.step")); + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 0.1, &geom1)); + BAD(scad_geometries_set_mesh_size_modifier(NULL, 0, 2, -1.5)); + BAD(scad_geometries_set_mesh_size_modifier(NULL, 0, 2, 1.5)); + BAD(scad_geometries_set_mesh_size_modifier(NULL, 0, SCAD_ABSOLUTE_SIZE, -1.5)); + BAD(scad_geometries_set_mesh_size_modifier(NULL, 1, 2, -1.5)); + BAD(scad_geometries_set_mesh_size_modifier(&geom1, 0, 2, -1.5)); + BAD(scad_geometries_set_mesh_size_modifier(NULL, 0, SCAD_ABSOLUTE_SIZE, 1.5)); + BAD(scad_geometries_set_mesh_size_modifier(NULL, 1, 2, 1.5)); + BAD(scad_geometries_set_mesh_size_modifier(&geom1, 0, 2, 1.5)); + BAD(scad_geometries_set_mesh_size_modifier(NULL, 1, SCAD_ABSOLUTE_SIZE, -1.5)); + BAD(scad_geometries_set_mesh_size_modifier(&geom1, 0, SCAD_ABSOLUTE_SIZE, -1.5)); + BAD(scad_geometries_set_mesh_size_modifier(&geom1, 1, 2, -1.5)); + BAD(scad_geometries_set_mesh_size_modifier(&geom1, 1, SCAD_ABSOLUTE_SIZE, -1.5)); + BAD(scad_geometries_set_mesh_size_modifier(&geom1, 1, 2, 1.5)); + BAD(scad_geometries_set_mesh_size_modifier(&geom1, 0, SCAD_ABSOLUTE_SIZE, 1.5)); + BAD(scad_geometries_set_mesh_size_modifier(NULL, 1, SCAD_ABSOLUTE_SIZE, 1.5)); + OK(scad_geometries_set_mesh_size_modifier(&geom1, 1, SCAD_ABSOLUTE_SIZE, 1.5)); + OK(scad_geometry_ref_put(geom1)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 0.1, &geom1)); + BAD(scad_geometries_set_mesh_algorithm(NULL, 0, 0)); + BAD(scad_geometries_set_mesh_algorithm(NULL, 0, SCAD_AUTOMATIC)); + BAD(scad_geometries_set_mesh_algorithm(NULL, 1, 0)); + BAD(scad_geometries_set_mesh_algorithm(&geom1, 0, 0)); + BAD(scad_geometries_set_mesh_algorithm(NULL, 1, SCAD_AUTOMATIC)); + BAD(scad_geometries_set_mesh_algorithm(&geom1, 0, SCAD_AUTOMATIC)); + BAD(scad_geometries_set_mesh_algorithm(&geom1, 1, 0)); + OK(scad_geometries_set_mesh_algorithm(&geom1, 1, SCAD_AUTOMATIC)); + OK(scad_geometry_ref_put(geom1)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_sphere(p1, 0.1, &geom1)); + BAD(scad_geometries_clear_mesh(NULL, 0)); + BAD(scad_geometries_clear_mesh(NULL, 1)); + BAD(scad_geometries_clear_mesh(&geom1, 0)); + OK(scad_geometries_clear_mesh(&geom1, 1)); + OK(scad_geometry_ref_put(geom1)); + + OK(scad_scene_count(&c)); + CHK(c == 0); - BAD(scad_step_import(NULL, "step", &geom_array, &c)); - BAD(scad_step_import("/tmp/test.step", "step", NULL, &c)); - BAD(scad_step_import("/tmp/test.step", "step", &geom_array, NULL)); - ERR(scad_step_import("dont_exist.step", "step", &geom_array, &c)); - OK(scad_step_import("/tmp/test.step", "step", &geom_array, &c)); + OK(scad_add_box(p1, d1, &geoms[0])); + OK(scad_add_box(p4, d1, &geoms[1])); + name = "/tmp/test"LINE_STRING".step"; + OK(scad_scene_write(name)); + BAD(scad_step_import(NULL, NULL, NULL, NULL)); + BAD(scad_step_import(NULL, NULL, NULL, &c)); + BAD(scad_step_import(NULL, NULL, &geom_array, NULL)); + BAD(scad_step_import(NULL, "/tmp/test.step", NULL, NULL)); + BAD(scad_step_import(NULL, NULL, &geom_array, &c)); + BAD(scad_step_import(NULL, "/tmp/test.step", NULL, &c)); + BAD(scad_step_import(NULL, "/tmp/test.step", &geom_array, NULL)); + ERR(scad_step_import(NULL, "dont_exist.step", &geom_array, &c)); + OK(scad_step_import(NULL, name, &geom_array, &c)); + CHK(c == 2); + for(i = 0; i < 2; i++) { + OK(scad_geometries_cut(geoms+i, 1, geom_array+i, 1, &geom)); + OK(scad_geometry_is_empty(geom, &e)); + OK(scad_geometry_ref_put(geom)); + CHK(e == 1); + } for(i = 0; i < c; i++) { OK(scad_geometry_ref_put(geom_array[i])); } MEM_RM(&allocator, geom_array); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geom)); + BAD(scad_stl_export(NULL, NULL, 9, 0)); + BAD(scad_stl_export(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_export(geom, NULL, 9, 0)); + BAD(scad_stl_export(geom, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + OK(scad_stl_export(geom, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1)); + OK(scad_geometry_set_name(geom, "name")); + BAD(scad_stl_export(NULL, NULL, 9, 0)); + BAD(scad_stl_export(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_export(geom, NULL, 9, 0)); + OK(scad_stl_export(geom, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + OK(scad_stl_export(geom, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geoms[0])); + OK(scad_add_box(p4, d1, &geoms[1])); + OK(scad_geometries_collect(geoms, 2, &geom)); + BAD(scad_stl_export_partial(NULL, geoms, 1, NULL, 9, 0)); + BAD(scad_stl_export_partial(NULL, geoms, 1, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_export_partial(geom, geoms, 1, NULL, 9, 0)); + BAD(scad_stl_export_partial(geom, geoms, 1, NULL, SCAD_FORCE_NORMALS_INWARD, 0)); + OK(scad_stl_export_partial(geom, geoms, 1, "/tmp/test"LINE_STRING, + SCAD_FORCE_NORMALS_OUTWARD, 1)); + OK(scad_geometry_set_name(geom, "name")); + BAD(scad_stl_export_partial(NULL, geoms, 1, NULL, 9, 0)); + BAD(scad_stl_export_partial(NULL, geoms, 1, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_export_partial(geom, geoms, 1, NULL, 9, 0)); + OK(scad_stl_export_partial(geom, geoms, 1, NULL, SCAD_FORCE_NORMALS_INWARD, 0)); + OK(scad_stl_export_partial(geom, geoms, 1, "/tmp/test"LINE_STRING, + SCAD_FORCE_NORMALS_OUTWARD, 1)); + OK(scad_stl_export_partial(geom, NULL, 0, "/tmp/test"LINE_STRING, + SCAD_FORCE_NORMALS_OUTWARD, 1)); + OK(scad_geometry_ref_put(geom)); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geom)); + BAD(scad_stl_export_split(NULL, NULL, 9, 0)); + BAD(scad_stl_export_split(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_export_split(geom, NULL, 9, 0)); + BAD(scad_stl_export_split(geom, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + OK(scad_stl_export_split(geom, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1)); + OK(scad_geometry_set_name(geom, "name")); + BAD(scad_stl_export_split(NULL, NULL, 9, 0)); + BAD(scad_stl_export_split(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_export_split(geom, NULL, 9, 0)); + OK(scad_stl_export_split(geom, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + OK(scad_stl_export_split(geom, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geom)); darray_double_init(&allocator, &trg); + options.Mesh.MeshSizeExtendFromBoundary = 0; + options.Mesh.MeshSizeFromPoints = 0; + OK(scad_set_options(&options)); + OK(scad_geometries_set_mesh_algorithm(&geom, 1, SCAD_INITIAL_MESH_ONLY)); + OK(scad_scene_mesh()); BAD(scad_stl_get_data(NULL, NULL)); - BAD(scad_stl_get_data(geom2, NULL)); - OK(scad_stl_get_data(geom2, &trg)); - BAD(scad_stl_data_write(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); - BAD(scad_stl_data_write(&trg, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); - BAD(scad_stl_data_write(NULL, "/tmp/test", SCAD_KEEP_NORMALS_UNCHANGED, 0)); - OK(scad_stl_data_write(&trg, "/tmp/test", SCAD_KEEP_NORMALS_UNCHANGED, 0)); - OK(scad_stl_data_write(&trg, "/tmp/test", SCAD_KEEP_NORMALS_UNCHANGED, 1)); + BAD(scad_stl_get_data(NULL, &trg)); + BAD(scad_stl_get_data(geom, NULL)); + OK(scad_stl_get_data(geom, &trg)); + CHK(12 * 9 == darray_double_size_get(&trg)); darray_double_release(&trg); + OK(scad_geometry_ref_put(geom)); - BAD(scad_stl_export(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); - BAD(scad_stl_export(geom2, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); /* geom2 has no name */ - OK(scad_stl_export(geom2, "/tmp/test", SCAD_KEEP_NORMALS_UNCHANGED, 0)); - OK(scad_stl_export(geom2, "/tmp/test", SCAD_FORCE_NORMALS_INWARD, 1)); - OK(scad_stl_export(geom1, NULL, SCAD_FORCE_NORMALS_OUTWARD, 1)); + OK(scad_scene_count(&c)); + CHK(c == 0); - BAD(scad_stl_export_split(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); - BAD(scad_stl_export_split(geom2, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); /* geom2 has no name */ - OK(scad_stl_export_split(geom2, "/tmp/test", SCAD_KEEP_NORMALS_UNCHANGED, 0)); - OK(scad_stl_export_split(geom2, "/tmp/testb", SCAD_KEEP_NORMALS_UNCHANGED, 1)); - OK(scad_stl_export_split(geom1, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); - OK(scad_stl_export_split(geom1, "different_names", SCAD_KEEP_NORMALS_UNCHANGED, 1)); + OK(scad_add_box(p1, d1, &geoms[0])); + OK(scad_add_box(p4, d1, &geoms[1])); + OK(scad_geometries_collect(geoms, 2, &geom)); + darray_double_init(&allocator, &trg); + options.Mesh.MeshSizeExtendFromBoundary = 0; + options.Mesh.MeshSizeFromPoints = 0; + OK(scad_set_options(&options)); + OK(scad_geometries_set_mesh_algorithm(geoms, 2, SCAD_INITIAL_MESH_ONLY)); + OK(scad_scene_mesh()); + BAD(scad_stl_get_data_partial(NULL, NULL, 0, NULL)); + BAD(scad_stl_get_data_partial(NULL, NULL, 0, &trg)); + BAD(scad_stl_get_data_partial(geom, NULL, 0, NULL)); + OK(scad_stl_get_data_partial(geom, NULL, 0, &trg)); + CHK(2 * 12 * 9 == darray_double_size_get(&trg)); + darray_double_clear(&trg); + OK(scad_stl_get_data_partial(geom, geoms, 1, &trg)); + CHK(12 * 9 == darray_double_size_get(&trg)); + darray_double_clear(&trg); + OK(scad_stl_get_data_partial(geom, geoms, 2, &trg)); + CHK(0 == darray_double_size_get(&trg)); + darray_double_release(&trg); + OK(scad_geometry_ref_put(geom)); + OK(scad_geometry_ref_put(geoms[0])); + OK(scad_geometry_ref_put(geoms[1])); - BAD(scad_geometry_get_name(NULL, &name)); - BAD(scad_geometry_get_name(geom1, NULL)); - OK(scad_geometry_get_name(geom1, &name)); - OK(scad_geometry_get_name(geom2, &name)); + OK(scad_scene_count(&c)); + CHK(c == 0); + + OK(scad_add_box(p1, d1, &geom)); + darray_double_init(&allocator, &trg); + OK(scad_stl_get_data(geom, &trg)); + BAD(scad_stl_data_write(NULL, NULL, 9, 0)); + BAD(scad_stl_data_write(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + BAD(scad_stl_data_write(&trg, NULL, 9, 0)); + BAD(scad_stl_data_write(&trg, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); + OK(scad_stl_data_write(&trg, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1)); + CHK(0 == darray_double_size_get(&trg)); + OK(scad_geometry_ref_put(geom)); + + OK(scad_scene_count(&c)); + CHK(c == 0); + + options.Misc.LogRefCounting = SCAD_LOG_DIMTAGS_ONLY_UNDELETED; + OK(scad_set_options(&options)); OK(scad_finalize());