star-cad

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

test_api.c (72964B)


      1 /* Copyright (C) 2022-2024 |Méso|Star> (contact@meso-star.com)
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 3 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program. If not, see <http://www.gnu.org/licenses/>. */
     15 
     16 #include "scad.h"
     17 #include "scad_geometry.h"
     18 #include "test_common.h"
     19 
     20 #include <rsys/rsys.h>
     21 #include <rsys/str.h>
     22 #include <rsys/math.h>
     23 #include <rsys/double3.h>
     24 #include <rsys/mem_allocator.h>
     25 #include <rsys/dynamic_array_double.h>
     26 
     27 #include <stdlib.h>
     28 #include <stdio.h>
     29 
     30 #define STRINGIZE(x) STRINGIZE2(x)
     31 #define STRINGIZE2(x) #x
     32 #define LINE_STRING STRINGIZE(__LINE__)
     33 
     34 static void
     35 dummy_release
     36   (void* data)
     37 {
     38   (void) data;
     39   return;
     40 }
     41 
     42 static void
     43 get_position
     44   (const size_t ivert, double pos[2], void* data)
     45 {
     46   double* coord = data;
     47   ASSERT(pos && coord);
     48   pos[0] = coord[2*ivert];
     49   pos[1] = coord[1+2*ivert];
     50 }
     51 
     52 int
     53 main(int argc, char* argv[])
     54 {
     55   res_T res = RES_OK;
     56   const double p1[3] = {0, 0, 0};
     57   const double p2[3] = {0.25, 0.25, 0.8};
     58   const double p3[3] = {0.85, 0, 0};
     59   const double p4[3] = {1, 0, 0};
     60   const double d0[3] = {0.1, 0.1, 0.1};
     61   const double d1[3] = {1, 1, 1};
     62   const double d2[3] = {1, 1, 0};
     63   const double s[3] = {1, 1, 1};
     64   double coord[] = {0, 1.6,  0.5, 0.9,  0.8, 0.6};
     65   struct scad_geometry* geom1 = NULL;
     66   struct scad_geometry* geom2 = NULL;
     67   struct scad_geometry* geom = NULL;
     68   struct scad_geometry* poly = NULL;
     69   struct scad_geometry** geom_array = NULL;
     70   struct scad_geometry* geoms[2];
     71   struct scad_geometry* out_geoms[2];
     72   struct mem_allocator allocator;
     73   struct darray_double trg;
     74   struct scad_options options = SCAD_DEFAULT_OPTIONS;
     75   struct scad_options opt = SCAD_DEFAULT_OPTIONS;
     76   const char *name, *name2;
     77   double m, tmp[3], tmp2[3];
     78   double affine[16] = { 1, 0, 0, 0.25,  0, 1, 0, 0.25,  0, 0, 1, 0.8,  0, 0, 0, 1 };
     79   size_t i, c;
     80   int e;
     81   void* data;
     82 
     83   (void)argc; (void)argv;
     84 
     85   OK(mem_init_proxy_allocator(&allocator, &mem_default_allocator));
     86 
     87   options.Misc.DebugEmptyContext = 1;
     88   options.Mesh.MeshSizeExtendFromBoundary = 0;
     89   options.Mesh.MeshSizeFromPoints = 0;
     90 
     91   /* cannot call any API function before a successful call to scad_initialize */
     92   geom1 = geom2 = geom =
     93     (struct scad_geometry*)1; /* To allow tests go past arg!=NULL */
     94   BAD(scad_finalize());
     95   BAD(scad_set_options(&options));
     96   BAD(scad_get_options(&options));
     97   BAD(scad_scene_count(&c));
     98   BAD(scad_scene_clear());
     99   BAD(scad_scene_write("test.step"));
    100   BAD(scad_scene_mesh());
    101   BAD(scad_add_rectangle(p1, d2, &geom));
    102   BAD(scad_add_disk(p1, 1, &geom));
    103   BAD(scad_add_polygon(get_position, coord, 0, 3, &geom));
    104   BAD(scad_add_box(p1, d1, &geom));
    105   BAD(scad_add_cylinder(p1, d1, 2, 1, &geom));
    106   BAD(scad_add_sphere(p1, 1, &geom));
    107   BAD(scad_add_cone(p1, d1, 1, 1, 2*PI, &geom));
    108   BAD(scad_add_torus(p1, 1, 1, 2*PI, NULL, &geom));
    109   BAD(scad_geometry_dilate(geom1, p1, p1, &geom));
    110   BAD(scad_geometry_translate(geom1, p1, &geom));
    111   BAD(scad_geometry_rotate(geom1, p1, p1, 2, &geom));
    112   BAD(scad_geometry_extrude(geom1, p1, &geom));
    113   BAD(scad_geometry_explode(geom1, &geom_array, &c));
    114   BAD(scad_geometry_ref_get(geom1));
    115   BAD(scad_geometry_ref_put(geom1));
    116   BAD(scad_geometry_get_count(geom1, NULL));
    117   BAD(scad_geometry_is_empty(geom1, &e));
    118   BAD(scad_geometry_set_custom_data(geom1, NULL, NULL));
    119   BAD(scad_geometry_get_custom_data(geom1, (void*)&trg));
    120   BAD(scad_geometry_set_name(geom1, name));
    121   BAD(scad_geometries_set_name(&geom1, 1, name, 0));
    122   BAD(scad_geometry_get_name(geom1, &name));
    123   BAD(scad_geometries_swap(&geom1, &geom2, 1, 0));
    124   BAD(scad_geometry_get_mass(geom1, &m));
    125   BAD(scad_geometry_get_centerofmass(geom1, tmp));
    126   BAD(scad_geometry_get_closest_point(geom1, p1, tmp, &m, NULL));
    127   BAD(scad_geometry_get_normal(geom1, tmp, tmp, &geom));
    128   BAD(scad_geometry_get_bounding_box(geom1, tmp, tmp));
    129   BAD(scad_geometry_equal(geom1, geom2, &e));
    130   BAD(scad_geometry_is_included(geom1, &geom2, 1, &e));
    131   BAD(scad_geometries_collect(&geom1, 1, &geom2));
    132   BAD(scad_geometries_fuse(&geom1, 1, &geom2, 1, &geom));
    133   BAD(scad_geometries_cut(&geom1, 1, &geom2, 1, &geom));
    134   BAD(scad_geometries_intersect(&geom1, 1, &geom2, 1, &geom));
    135   BAD(scad_geometries_partition(&geom1, 1, 0, &geom));
    136   BAD(scad_geometries_common_boundaries(&geom1, 1, &geom2, 1, &geom_array, &c));
    137   BAD(scad_geometries_common_boundary(&geom1, 1, &geom2, 1, &geom));
    138   BAD(scad_geometries_boundaries(&geom1, 1, &geom_array, &c));
    139   BAD(scad_geometries_boundary(&geom1, 1, &geom));
    140   BAD(scad_geometry_copy(geom1, &geom2));
    141   BAD(scad_geometry_set_visibility(geom1, 0, 0));
    142   BAD(scad_geometries_set_periodic(&geom1, 1, &geom2, 1, affine));
    143   BAD(scad_geometries_set_mesh_size_modifier(&geom1, 1, SCAD_ABSOLUTE_SIZE, 1));
    144   BAD(scad_geometries_set_mesh_algorithm(&geom1, 1, SCAD_QUASI_STRUCTURED));
    145   BAD(scad_geometries_clear_mesh(&geom1, 1));
    146   BAD(scad_step_import("test.step", &geom_array, &c));
    147   BAD(scad_stl_export(geom1, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0));
    148   BAD(scad_stl_export_partial(geom1, &geom1, 1, "test.stl",
    149         SCAD_KEEP_NORMALS_UNCHANGED, 0));
    150   BAD(scad_stl_export_split(geom1, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0));
    151   BAD(scad_stl_get_data(geom1, &trg));
    152   BAD(scad_stl_get_data_partial(geom1, &geom2, 1, &trg));
    153   BAD(scad_stl_data_write(&trg, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0));
    154   BAD(scad_run_ui());
    155   BAD(scad_synchronize());
    156   CHK(SIZE_MAX == scad_get_dimtag_refcount(3, 0));
    157   BAD(scad_dump_geometry(geom));
    158   BAD(scad_dump_geometries());
    159 
    160   /* cannot call any API function after a successful call to scad_finalize */
    161   OK(scad_initialize(NULL, &allocator, 3));
    162   OK(scad_finalize());
    163 
    164   BAD(scad_finalize());
    165   BAD(scad_set_options(&options));
    166   BAD(scad_get_options(&options));
    167   BAD(scad_scene_count(&c));
    168   BAD(scad_scene_clear());
    169   BAD(scad_scene_write("test.step"));
    170   BAD(scad_scene_mesh());
    171   BAD(scad_add_rectangle(p1, d2, &geom));
    172   BAD(scad_add_disk(p1, 1, &geom));
    173   BAD(scad_add_polygon(get_position, coord, 0, 3, &geom));
    174   BAD(scad_add_box(p1, d1, &geom));
    175   BAD(scad_add_cylinder(p1, d1, 2, 1, &geom));
    176   BAD(scad_add_sphere(p1, 1, &geom));
    177   BAD(scad_add_cone(p1, d1, 1, 1, 2*PI, &geom));
    178   BAD(scad_add_torus(p1, 1, 1, 2*PI, NULL, &geom));
    179   BAD(scad_geometry_dilate(geom1, p1, p1, &geom));
    180   BAD(scad_geometry_translate(geom1, p1, &geom));
    181   BAD(scad_geometry_rotate(geom1, p1, p1, 2, &geom));
    182   BAD(scad_geometry_extrude(geom1, p1, &geom));
    183   BAD(scad_geometry_explode(geom1, &geom_array, &c));
    184   BAD(scad_geometry_ref_get(geom1));
    185   BAD(scad_geometry_ref_put(geom1));
    186   BAD(scad_geometry_get_count(geom1, NULL));
    187   BAD(scad_geometry_is_empty(geom1, &e));
    188   BAD(scad_geometry_set_custom_data(geom1, NULL, NULL));
    189   BAD(scad_geometry_get_custom_data(geom1, (void*)&trg));
    190   BAD(scad_geometry_set_name(geom1, name));
    191   BAD(scad_geometries_set_name(&geom1, 1, name, 0));
    192   BAD(scad_geometry_get_name(geom1, &name));
    193   BAD(scad_geometries_swap(&geom1, &geom2, 1, 0));
    194   BAD(scad_geometry_get_mass(geom1, &m));
    195   BAD(scad_geometry_get_centerofmass(geom1, tmp));
    196   BAD(scad_geometry_get_closest_point(geom1, tmp, tmp, &m, NULL));
    197   BAD(scad_geometry_get_normal(geom1, tmp, tmp, &geom));
    198   BAD(scad_geometry_get_bounding_box(geom1, tmp, tmp));
    199   BAD(scad_geometry_equal(geom1, geom2, &e));
    200   BAD(scad_geometry_is_included(geom1, &geom2, 1, &e));
    201   BAD(scad_geometries_collect(&geom1, 1, &geom2));
    202   BAD(scad_geometries_fuse(&geom1, 1, &geom2, 1, &geom));
    203   BAD(scad_geometries_cut(&geom1, 1, &geom2, 1, &geom));
    204   BAD(scad_geometries_intersect(&geom1, 1, &geom2, 1, &geom));
    205   BAD(scad_geometries_partition(&geom1, 1, 0, &geom));
    206   BAD(scad_geometries_common_boundaries(&geom1, 1, &geom2, 1, &geom_array, &c));
    207   BAD(scad_geometries_common_boundary(&geom1, 1, &geom2, 1, &geom));
    208   BAD(scad_geometries_boundaries(&geom1, 1, &geom_array, &c));
    209   BAD(scad_geometries_boundary(&geom1, 1, &geom));
    210   BAD(scad_geometry_copy(geom1, &geom2));
    211   BAD(scad_geometry_set_visibility(geom1, 0, 0));
    212   BAD(scad_geometries_set_periodic(&geom1, 1, &geom2, 1, affine));
    213   BAD(scad_geometries_set_mesh_size_modifier(&geom1, 1, SCAD_ABSOLUTE_SIZE, 1));
    214   BAD(scad_geometries_set_mesh_algorithm(&geom1, 1, SCAD_QUASI_STRUCTURED));
    215   BAD(scad_geometries_clear_mesh(&geom1, 1));
    216   BAD(scad_step_import("test.step", &geom_array, &c));
    217   BAD(scad_stl_export(geom1, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0));
    218   BAD(scad_stl_export_partial(geom1, &geom1, 1, "test.stl",
    219         SCAD_KEEP_NORMALS_UNCHANGED, 0));
    220   BAD(scad_stl_export_split(geom1, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0));
    221   BAD(scad_stl_get_data(geom1, &trg));
    222   BAD(scad_stl_get_data_partial(geom1, &geom2, 1, &trg));
    223   BAD(scad_stl_data_write(&trg, "test.stl", SCAD_KEEP_NORMALS_UNCHANGED, 0));
    224   BAD(scad_run_ui());
    225   BAD(scad_synchronize());
    226   CHK(SIZE_MAX == scad_get_dimtag_refcount(3, 0));
    227   BAD(scad_dump_geometry(geom));
    228   BAD(scad_dump_geometries());
    229 
    230   BAD(scad_initialize(NULL, &allocator, 4));
    231   BAD(scad_initialize(NULL, &allocator, -1));
    232   OK(scad_initialize(NULL, &allocator, 3));
    233 
    234   OK(scad_scene_count(&c));
    235   CHK(c == 0);
    236 
    237   OK(scad_set_options(NULL));
    238   OK(scad_set_options(&options));
    239 
    240   OK(scad_scene_count(&c));
    241   CHK(c == 0);
    242 
    243   BAD(scad_get_options(NULL));
    244   OK(scad_get_options(&opt));
    245 
    246   OK(scad_scene_count(&c));
    247   CHK(c == 0);
    248 
    249   BAD(scad_scene_count(NULL));
    250   OK(scad_scene_count(&c));
    251   CHK(c == 0);
    252   OK(scad_add_rectangle(p1, d2, &geom));
    253   OK(scad_scene_count(&c));
    254   CHK(c == 1);
    255   OK(scad_geometry_ref_put(geom));
    256 
    257   OK(scad_scene_count(&c));
    258   CHK(c == 0);
    259 
    260   OK(scad_scene_clear());
    261   OK(scad_scene_count(&c));
    262   CHK(c == 0);
    263   OK(scad_add_rectangle(p1, d2, &geom));
    264   OK(scad_scene_clear());
    265   OK(scad_scene_count(&c));
    266   CHK(c == 0);
    267   OK(scad_add_rectangle(p1, d2, &geom));
    268   OK(scad_geometry_ref_get(geom));
    269   OK(scad_scene_clear());
    270   OK(scad_scene_count(&c));
    271   CHK(c == 0);
    272 
    273   OK(scad_scene_count(&c));
    274   CHK(c == 0);
    275 
    276   BAD(scad_scene_write(NULL));
    277   ERR(scad_scene_write(""));
    278   ERR(scad_scene_write("/tmp/test.bad"));
    279   OK(scad_scene_write("/tmp/test"LINE_STRING".step"));
    280 
    281   OK(scad_scene_count(&c));
    282   CHK(c == 0);
    283 
    284   BAD(scad_add_rectangle(NULL, NULL, NULL));
    285   BAD(scad_add_rectangle(NULL, NULL, &geom));
    286   BAD(scad_add_rectangle(NULL, d1, NULL));
    287   BAD(scad_add_rectangle(p1, NULL, NULL));
    288   BAD(scad_add_rectangle(NULL, d2, &geom));
    289   BAD(scad_add_rectangle(p1, NULL, &geom));
    290   BAD(scad_add_rectangle(p1, d2, NULL));
    291   OK(scad_add_rectangle(p1, d2, &geom));
    292   OK(scad_geometry_ref_put(geom));
    293 
    294   OK(scad_scene_count(&c));
    295   CHK(c == 0);
    296 
    297   BAD(scad_add_disk(NULL, -1, NULL));
    298   BAD(scad_add_disk(NULL, -1, &geom));
    299   BAD(scad_add_disk(NULL, 1, NULL));
    300   BAD(scad_add_disk(p1, -1, NULL));
    301   BAD(scad_add_disk(NULL, 1, &geom));
    302   BAD(scad_add_disk(p1, -1, &geom));
    303   BAD(scad_add_disk(p1, 1, NULL));
    304   OK(scad_add_disk(p1, 1, &geom));
    305   OK(scad_geometry_ref_put(geom));
    306 
    307   OK(scad_scene_count(&c));
    308   CHK(c == 0);
    309 
    310   BAD(scad_add_polygon(NULL, coord, 0, 0, NULL));
    311   BAD(scad_add_polygon(get_position, coord, 0, 0, NULL));
    312   BAD(scad_add_polygon(NULL, coord, 0, 3, NULL));
    313   BAD(scad_add_polygon(NULL, coord, 0, 0, &poly));
    314   BAD(scad_add_polygon(NULL, coord, 0, 3, &poly));
    315   BAD(scad_add_polygon(get_position, coord, 0, 0, &poly));
    316   BAD(scad_add_polygon(get_position, coord, 0, 3, NULL));
    317   OK(scad_add_polygon(get_position, coord, 0, 3, &poly));
    318   OK(scad_geometry_ref_put(poly));
    319 
    320   OK(scad_scene_count(&c));
    321   CHK(c == 0);
    322 
    323   BAD(scad_add_box(NULL, NULL, NULL));
    324   BAD(scad_add_box(NULL, NULL, &geom));
    325   BAD(scad_add_box(NULL, d1, NULL));
    326   BAD(scad_add_box(p1, NULL, NULL));
    327   BAD(scad_add_box(NULL, d1, &geom));
    328   BAD(scad_add_box(p1, NULL, &geom));
    329   BAD(scad_add_box(p1, d1, NULL));
    330   OK(scad_add_box(p1, d1, &geom));
    331   OK(scad_geometry_ref_put(geom));
    332 
    333   OK(scad_scene_count(&c));
    334   CHK(c == 0);
    335 
    336   BAD(scad_add_cylinder(NULL, NULL, -1, -1, NULL));
    337   BAD(scad_add_cylinder(NULL, NULL, -1, -1, &geom));
    338   BAD(scad_add_cylinder(NULL, NULL, -1, 1, NULL));
    339   BAD(scad_add_cylinder(NULL, NULL, 1, -1, NULL));
    340   BAD(scad_add_cylinder(NULL, d1, -1, -1, NULL));
    341   BAD(scad_add_cylinder(p1, NULL, -1, -1, NULL));
    342   BAD(scad_add_cylinder(NULL, NULL, -1, 1, &geom));
    343   BAD(scad_add_cylinder(NULL, NULL, 1, -1, &geom));
    344   BAD(scad_add_cylinder(NULL, d1, -1, -1, &geom));
    345   BAD(scad_add_cylinder(p1, NULL, -1, -1, &geom));
    346   BAD(scad_add_cylinder(NULL, NULL, 1, 1, NULL));
    347   BAD(scad_add_cylinder(NULL, d1, -1, 1, NULL));
    348   BAD(scad_add_cylinder(p1, NULL, -1, 1, NULL));
    349   BAD(scad_add_cylinder(NULL, d1, 1, -1, NULL));
    350   BAD(scad_add_cylinder(p1, NULL, 1, -1, NULL));
    351   BAD(scad_add_cylinder(p1, d1, -1, -1, NULL));
    352   BAD(scad_add_cylinder(NULL, NULL, 1, 1, &geom));
    353   BAD(scad_add_cylinder(NULL, d1, -1, 1, &geom));
    354   BAD(scad_add_cylinder(p1, NULL, -1, 1, &geom));
    355   BAD(scad_add_cylinder(NULL, d1, 1, -1, &geom));
    356   BAD(scad_add_cylinder(p1, NULL, 1, -1, &geom));
    357   BAD(scad_add_cylinder(p1, d1, -1, -1, &geom));
    358   BAD(scad_add_cylinder(NULL, d1, 1, 1, NULL));
    359   BAD(scad_add_cylinder(p1, NULL, 1, 1, NULL));
    360   BAD(scad_add_cylinder(p1, d1, -1, 1, NULL));
    361   BAD(scad_add_cylinder(p1, d1, 1, -1, NULL));
    362   BAD(scad_add_cylinder(NULL, d1, 1, 1, &geom));
    363   BAD(scad_add_cylinder(p1, NULL, 1, 1, &geom));
    364   BAD(scad_add_cylinder(p1, d1, -1, 1, &geom));
    365   BAD(scad_add_cylinder(p1, d1, 1, 3*PI, &geom));
    366   BAD(scad_add_cylinder(p1, d1, 1, 1, NULL));
    367   OK(scad_add_cylinder(p1, d1, 1, 1, &geom));
    368   OK(scad_geometry_ref_put(geom));
    369 
    370   OK(scad_scene_count(&c));
    371   CHK(c == 0);
    372 
    373   BAD(scad_add_sphere(NULL, -1, NULL));
    374   BAD(scad_add_sphere(NULL, -1, &geom));
    375   BAD(scad_add_sphere(NULL, 1, NULL));
    376   BAD(scad_add_sphere(p1, -1, NULL));
    377   BAD(scad_add_sphere(NULL, 1, &geom));
    378   BAD(scad_add_sphere(p1, 0, &geom));
    379   BAD(scad_add_sphere(p1, 1, NULL));
    380   OK(scad_add_sphere(p1, 1, &geom));
    381   OK(scad_geometry_ref_put(geom));
    382 
    383   OK(scad_scene_count(&c));
    384   CHK(c == 0);
    385 
    386   BAD(scad_add_cone(NULL, NULL, -1, -1, -1, NULL));
    387   BAD(scad_add_cone(NULL, NULL, -1, -1, -1, &geom));
    388   BAD(scad_add_cone(NULL, NULL, -1, -1, 2*PI, NULL));
    389   BAD(scad_add_cone(NULL, NULL, -1, -1, 2*PI, &geom));
    390   BAD(scad_add_cone(NULL, NULL, -1, 1, -1, NULL));
    391   BAD(scad_add_cone(NULL, NULL, -1, 1, -1, &geom));
    392   BAD(scad_add_cone(NULL, NULL, -1, 1, 2*PI, NULL));
    393   BAD(scad_add_cone(NULL, NULL, -1, 1, 2*PI, &geom));
    394   BAD(scad_add_cone(NULL, NULL, 0, -1, -1, NULL));
    395   BAD(scad_add_cone(NULL, NULL, 0, -1, -1, &geom));
    396   BAD(scad_add_cone(NULL, NULL, 0, -1, 2*PI, NULL));
    397   BAD(scad_add_cone(NULL, NULL, 0, -1, 2*PI, &geom));
    398   BAD(scad_add_cone(NULL, NULL, 0, 1, -1, NULL));
    399   BAD(scad_add_cone(NULL, NULL, 0, 1, -1, &geom));
    400   BAD(scad_add_cone(NULL, NULL, 0, 1, 2*PI, NULL));
    401   BAD(scad_add_cone(NULL, NULL, 0, 1, 2*PI, &geom));
    402   BAD(scad_add_cone(NULL, d1, -1, -1, -1, NULL));
    403   BAD(scad_add_cone(NULL, d1, -1, -1, -1, &geom));
    404   BAD(scad_add_cone(NULL, d1, -1, -1, 2*PI, NULL));
    405   BAD(scad_add_cone(NULL, d1, -1, -1, 2*PI, &geom));
    406   BAD(scad_add_cone(NULL, d1, -1, 1, -1, NULL));
    407   BAD(scad_add_cone(NULL, d1, -1, 1, -1, &geom));
    408   BAD(scad_add_cone(NULL, d1, -1, 1, 2*PI, NULL));
    409   BAD(scad_add_cone(NULL, d1, -1, 1, 2*PI, &geom));
    410   BAD(scad_add_cone(NULL, d1, 0, -1, -1, NULL));
    411   BAD(scad_add_cone(NULL, d1, 0, -1, -1, &geom));
    412   BAD(scad_add_cone(NULL, d1, 0, -1, 2*PI, NULL));
    413   BAD(scad_add_cone(NULL, d1, 0, -1, 2*PI, &geom));
    414   BAD(scad_add_cone(NULL, d1, 0, 1, -1, NULL));
    415   BAD(scad_add_cone(NULL, d1, 0, 1, -1, &geom));
    416   BAD(scad_add_cone(NULL, d1, 0, 1, 2*PI, NULL));
    417   BAD(scad_add_cone(NULL, d1, 0, 1, 2*PI, &geom));
    418   BAD(scad_add_cone(p1, NULL, -1, -1, -1, NULL));
    419   BAD(scad_add_cone(p1, NULL, -1, -1, -1, &geom));
    420   BAD(scad_add_cone(p1, NULL, -1, -1, 2*PI, NULL));
    421   BAD(scad_add_cone(p1, NULL, -1, -1, 2*PI, &geom));
    422   BAD(scad_add_cone(p1, NULL, -1, 1, -1, NULL));
    423   BAD(scad_add_cone(p1, NULL, -1, 1, -1, &geom));
    424   BAD(scad_add_cone(p1, NULL, -1, 1, 2*PI, NULL));
    425   BAD(scad_add_cone(p1, NULL, -1, 1, 2*PI, &geom));
    426   BAD(scad_add_cone(p1, NULL, 0, -1, -1, NULL));
    427   BAD(scad_add_cone(p1, NULL, 0, -1, -1, &geom));
    428   BAD(scad_add_cone(p1, NULL, 0, -1, 2*PI, NULL));
    429   BAD(scad_add_cone(p1, NULL, 0, -1, 2*PI, &geom));
    430   BAD(scad_add_cone(p1, NULL, 0, 1, -1, NULL));
    431   BAD(scad_add_cone(p1, NULL, 0, 1, -1, &geom));
    432   BAD(scad_add_cone(p1, NULL, 0, 1, 2*PI, NULL));
    433   BAD(scad_add_cone(p1, NULL, 0, 1, 2*PI, &geom));
    434   BAD(scad_add_cone(p1, d1, -1, -1, -1, NULL));
    435   BAD(scad_add_cone(p1, d1, -1, -1, -1, &geom));
    436   BAD(scad_add_cone(p1, d1, -1, -1, 2*PI, NULL));
    437   BAD(scad_add_cone(p1, d1, -1, -1, 2*PI, &geom));
    438   BAD(scad_add_cone(p1, d1, -1, 1, -1, NULL));
    439   BAD(scad_add_cone(p1, d1, -1, 1, -1, &geom));
    440   BAD(scad_add_cone(p1, d1, -1, 1, 2*PI, NULL));
    441   BAD(scad_add_cone(p1, d1, -1, 1, 2*PI, &geom));
    442   BAD(scad_add_cone(p1, d1, 0, -1, -1, NULL));
    443   BAD(scad_add_cone(p1, d1, 0, -1, -1, &geom));
    444   BAD(scad_add_cone(p1, d1, 0, -1, 2*PI, NULL));
    445   BAD(scad_add_cone(p1, d1, 0, -1, 2*PI, &geom));
    446   BAD(scad_add_cone(p1, d1, 0, 1, -1, NULL));
    447   BAD(scad_add_cone(p1, d1, 0, 1, -1, &geom));
    448   BAD(scad_add_cone(p1, d1, 0, 1, 2*PI, NULL));
    449   OK(scad_add_cone(p1, d1, 0, 1, 2*PI, &geom));
    450   OK(scad_geometry_ref_put(geom));
    451   BAD(scad_add_cone(p1, d1, 1, 1, 2*PI, &geom)); /* r1 == r2 */
    452 
    453   OK(scad_scene_count(&c));
    454   CHK(c == 0);
    455 
    456   BAD(scad_add_torus(NULL, 0, 0, -1, NULL, NULL));
    457   BAD(scad_add_torus(NULL, 0, 0, -1, NULL, &geom));
    458   BAD(scad_add_torus(NULL, 0, 0, -1, d1, NULL));
    459   BAD(scad_add_torus(NULL, 0, 0, -1, d1, &geom));
    460   BAD(scad_add_torus(NULL, 0, 0, 2*PI, NULL, NULL));
    461   BAD(scad_add_torus(NULL, 0, 0, 2*PI, NULL, &geom));
    462   BAD(scad_add_torus(NULL, 0, 0, 2*PI, d1, NULL));
    463   BAD(scad_add_torus(NULL, 0, 0, 2*PI, d1, &geom));
    464   BAD(scad_add_torus(NULL, 0, 1, -1, NULL, NULL));
    465   BAD(scad_add_torus(NULL, 0, 1, -1, NULL, &geom));
    466   BAD(scad_add_torus(NULL, 0, 1, -1, d1, NULL));
    467   BAD(scad_add_torus(NULL, 0, 1, -1, d1, &geom));
    468   BAD(scad_add_torus(NULL, 0, 1, 2*PI, NULL, NULL));
    469   BAD(scad_add_torus(NULL, 0, 1, 2*PI, NULL, &geom));
    470   BAD(scad_add_torus(NULL, 0, 1, 2*PI, d1, NULL));
    471   BAD(scad_add_torus(NULL, 0, 1, 2*PI, d1, &geom));
    472   BAD(scad_add_torus(NULL, 1, 0, -1, NULL, NULL));
    473   BAD(scad_add_torus(NULL, 1, 0, -1, NULL, &geom));
    474   BAD(scad_add_torus(NULL, 1, 0, -1, d1, NULL));
    475   BAD(scad_add_torus(NULL, 1, 0, -1, d1, &geom));
    476   BAD(scad_add_torus(NULL, 1, 0, 2*PI, NULL, NULL));
    477   BAD(scad_add_torus(NULL, 1, 0, 2*PI, NULL, &geom));
    478   BAD(scad_add_torus(NULL, 1, 0, 2*PI, d1, NULL));
    479   BAD(scad_add_torus(NULL, 1, 0, 2*PI, d1, &geom));
    480   BAD(scad_add_torus(NULL, 1, 1, -1, NULL, NULL));
    481   BAD(scad_add_torus(NULL, 1, 1, -1, NULL, &geom));
    482   BAD(scad_add_torus(NULL, 1, 1, -1, d1, NULL));
    483   BAD(scad_add_torus(NULL, 1, 1, -1, d1, &geom));
    484   BAD(scad_add_torus(NULL, 1, 1, 2*PI, NULL, NULL));
    485   BAD(scad_add_torus(NULL, 1, 1, 2*PI, NULL, &geom));
    486   BAD(scad_add_torus(NULL, 1, 1, 2*PI, d1, NULL));
    487   BAD(scad_add_torus(NULL, 1, 1, 2*PI, d1, &geom));
    488   BAD(scad_add_torus(p1, 0, 0, -1, NULL, NULL));
    489   BAD(scad_add_torus(p1, 0, 0, -1, NULL, &geom));
    490   BAD(scad_add_torus(p1, 0, 0, -1, d1, NULL));
    491   BAD(scad_add_torus(p1, 0, 0, -1, d1, &geom));
    492   BAD(scad_add_torus(p1, 0, 0, 2*PI, NULL, NULL));
    493   BAD(scad_add_torus(p1, 0, 0, 2*PI, NULL, &geom));
    494   BAD(scad_add_torus(p1, 0, 0, 2*PI, d1, NULL));
    495   BAD(scad_add_torus(p1, 0, 0, 2*PI, d1, &geom));
    496   BAD(scad_add_torus(p1, 0, 1, -1, NULL, NULL));
    497   BAD(scad_add_torus(p1, 0, 1, -1, NULL, &geom));
    498   BAD(scad_add_torus(p1, 0, 1, -1, d1, NULL));
    499   BAD(scad_add_torus(p1, 0, 1, -1, d1, &geom));
    500   BAD(scad_add_torus(p1, 0, 1, 2*PI, NULL, NULL));
    501   BAD(scad_add_torus(p1, 0, 1, 2*PI, NULL, &geom));
    502   BAD(scad_add_torus(p1, 0, 1, 2*PI, d1, NULL));
    503   BAD(scad_add_torus(p1, 0, 1, 2*PI, d1, &geom));
    504   BAD(scad_add_torus(p1, 1, 0, -1, NULL, NULL));
    505   BAD(scad_add_torus(p1, 1, 0, -1, NULL, &geom));
    506   BAD(scad_add_torus(p1, 1, 0, -1, d1, NULL));
    507   BAD(scad_add_torus(p1, 1, 0, -1, d1, &geom));
    508   BAD(scad_add_torus(p1, 1, 0, 2*PI, NULL, NULL));
    509   BAD(scad_add_torus(p1, 1, 0, 2*PI, NULL, &geom));
    510   BAD(scad_add_torus(p1, 1, 0, 2*PI, d1, NULL));
    511   BAD(scad_add_torus(p1, 1, 0, 2*PI, d1, &geom));
    512   BAD(scad_add_torus(p1, 1, 1, -1, NULL, NULL));
    513   BAD(scad_add_torus(p1, 1, 1, -1, NULL, &geom));
    514   BAD(scad_add_torus(p1, 1, 1, -1, d1, NULL));
    515   BAD(scad_add_torus(p1, 1, 1, -1, d1, &geom));
    516   BAD(scad_add_torus(p1, 1, 1, 2*PI, NULL, NULL));
    517   OK(scad_add_torus(p1, 1, 1, 2*PI, NULL, &geom));
    518   OK(scad_geometry_ref_put(geom));
    519   BAD(scad_add_torus(p1, 1, 1, 2*PI, d1, NULL));
    520   OK(scad_add_torus(p1, 1, 1, 2*PI, d1, &geom));
    521   OK(scad_geometry_ref_put(geom));
    522 
    523   OK(scad_scene_count(&c));
    524   CHK(c == 0);
    525 
    526   OK(scad_add_sphere(p1, 1, &geom1));
    527   BAD(scad_geometry_dilate(NULL, NULL, NULL, NULL));
    528   BAD(scad_geometry_dilate(NULL, NULL, NULL, &geom));
    529   BAD(scad_geometry_dilate(NULL, NULL, s, NULL));
    530   BAD(scad_geometry_dilate(NULL, p1, NULL, NULL));
    531   BAD(scad_geometry_dilate(geom1, NULL, NULL, NULL));
    532   BAD(scad_geometry_dilate(NULL, NULL, s, &geom));
    533   BAD(scad_geometry_dilate(NULL, p1, NULL, &geom));
    534   BAD(scad_geometry_dilate(geom1, NULL, NULL, &geom));
    535   BAD(scad_geometry_dilate(NULL, p1, s, NULL));
    536   BAD(scad_geometry_dilate(geom1, NULL, s, NULL));
    537   BAD(scad_geometry_dilate(NULL, p1, s, &geom));
    538   BAD(scad_geometry_dilate(geom1, NULL, p1, &geom));
    539   BAD(scad_geometry_dilate(geom1, p1, NULL, &geom));
    540   BAD(scad_geometry_dilate(geom1, p1, s, NULL));
    541   OK(scad_geometry_dilate(geom1, p1, s, &geom));
    542   OK(scad_geometry_ref_put(geom1));
    543   OK(scad_geometry_ref_put(geom));
    544 
    545   OK(scad_scene_count(&c));
    546   CHK(c == 0);
    547 
    548   OK(scad_add_sphere(p1, 1, &geom1));
    549   BAD(scad_geometry_translate(NULL, NULL, NULL));
    550   BAD(scad_geometry_translate(NULL, NULL, &geom));
    551   BAD(scad_geometry_translate(NULL, d1, NULL));
    552   BAD(scad_geometry_translate(geom1, NULL, NULL));
    553   BAD(scad_geometry_translate(NULL, d1, &geom));
    554   BAD(scad_geometry_translate(geom1, NULL, &geom));
    555   BAD(scad_geometry_translate(geom1, d1, NULL));
    556   OK(scad_geometry_translate(geom1, d1, &geom));
    557   OK(scad_geometry_ref_put(geom1));
    558   OK(scad_geometry_ref_put(geom));
    559 
    560   OK(scad_scene_count(&c));
    561   CHK(c == 0);
    562 
    563   OK(scad_add_sphere(p1, 1, &geom1));
    564   BAD(scad_geometry_rotate(NULL, NULL, NULL, 1, NULL));
    565   BAD(scad_geometry_rotate(NULL, NULL, NULL, 1, &geom));
    566   BAD(scad_geometry_rotate(NULL, NULL, d1, 1, NULL));
    567   BAD(scad_geometry_rotate(NULL, p1, NULL, 1, NULL));
    568   BAD(scad_geometry_rotate(geom1, NULL, NULL, 1, NULL));
    569   BAD(scad_geometry_rotate(NULL, NULL, d1, 1, &geom));
    570   BAD(scad_geometry_rotate(NULL, p1, NULL, 1, &geom));
    571   BAD(scad_geometry_rotate(geom1, NULL, NULL, 1, &geom));
    572   BAD(scad_geometry_rotate(NULL, p1, d1, 1, NULL));
    573   BAD(scad_geometry_rotate(geom1, NULL, d1, 1, NULL));
    574   BAD(scad_geometry_rotate(geom1, p1, NULL, 1, NULL));
    575   BAD(scad_geometry_rotate(NULL, p1, d1, 1, &geom));
    576   BAD(scad_geometry_rotate(geom1, NULL, d1, 1, &geom));
    577   BAD(scad_geometry_rotate(geom1, p1, NULL, 1, &geom));
    578   BAD(scad_geometry_rotate(geom1, p1, d1, 1, NULL));
    579   OK(scad_geometry_rotate(geom1, p1, d1, 1, &geom));
    580   OK(scad_geometry_ref_put(geom1));
    581   OK(scad_geometry_ref_put(geom));
    582 
    583   OK(scad_scene_count(&c));
    584   CHK(c == 0);
    585 
    586   OK(scad_add_polygon(get_position, coord, 0, 3, &poly));
    587   BAD(scad_geometry_extrude(NULL, NULL, NULL));
    588   BAD(scad_geometry_extrude(NULL, NULL, &geom));
    589   BAD(scad_geometry_extrude(NULL, d1, NULL));
    590   BAD(scad_geometry_extrude(poly, NULL, NULL));
    591   BAD(scad_geometry_extrude(NULL, d1, &geom));
    592   BAD(scad_geometry_extrude(poly, NULL, &geom));
    593   BAD(scad_geometry_extrude(poly, d1, NULL));
    594   OK(scad_geometry_extrude(poly, d1, &geom));
    595   OK(scad_geometry_ref_put(poly));
    596   OK(scad_geometry_ref_put(geom));
    597 
    598   OK(scad_scene_count(&c));
    599   CHK(c == 0);
    600 
    601   OK(scad_add_polygon(get_position, coord, 0, 3, geoms+0));
    602   OK(scad_geometry_translate(geoms[0], d1, geoms+1));
    603   OK(scad_geometries_collect(geoms, 2, &poly));
    604   OK(scad_geometry_ref_put(geoms[0]));
    605   OK(scad_geometry_ref_put(geoms[1]));
    606   OK(scad_geometry_extrude(poly, d1, &geom));
    607   OK(scad_geometry_ref_put(poly));
    608   OK(scad_geometry_ref_put(geom));
    609 
    610   OK(scad_scene_count(&c));
    611   CHK(c == 0);
    612 
    613   OK(scad_add_sphere(p1, 1, &geom));
    614   BAD(scad_geometry_extrude(geom, d1, &geom2));
    615   OK(scad_geometry_ref_put(geom));
    616 
    617   OK(scad_scene_count(&c));
    618   CHK(c == 0);
    619 
    620   OK(scad_add_sphere(p1, 1, geoms+0));
    621   OK(scad_add_sphere(p2, 2, geoms+1));
    622   OK(scad_geometries_collect(geoms, 2, &geom));
    623   OK(scad_geometry_ref_put(geoms[0]));
    624   OK(scad_geometry_ref_put(geoms[1]));
    625   BAD(scad_geometry_explode(NULL, NULL, NULL));
    626   BAD(scad_geometry_explode(NULL, NULL, &c));
    627   BAD(scad_geometry_explode(NULL, &geom_array, NULL));
    628   BAD(scad_geometry_explode(geom, NULL, NULL));
    629   BAD(scad_geometry_explode(NULL, &geom_array, &c));
    630   BAD(scad_geometry_explode(geom, NULL, &c));
    631   BAD(scad_geometry_explode(geom, &geom_array, NULL));
    632   OK(scad_geometry_explode(geom, &geom_array, &c));
    633   OK(scad_geometry_ref_put(geom));
    634   CHK(c == 2);
    635   OK(scad_geometry_ref_put(geom_array[0]));
    636   OK(scad_geometry_ref_put(geom_array[1]));
    637   MEM_RM(&allocator, geom_array);
    638 
    639   OK(scad_scene_count(&c));
    640   CHK(c == 0);
    641 
    642   OK(scad_add_sphere(p1, 1, &geom));
    643   BAD(scad_geometry_ref_get(NULL));
    644   OK(scad_geometry_ref_get(geom));
    645   BAD(scad_geometry_ref_put(NULL));
    646   OK(scad_geometry_ref_put(geom));
    647   OK(scad_geometry_ref_put(geom));
    648 
    649   OK(scad_scene_count(&c));
    650   CHK(c == 0);
    651 
    652   BAD(scad_geometry_get_count(NULL, &c));
    653   BAD(scad_geometry_get_count(geom, NULL));
    654   OK(scad_add_sphere(p1, 1, &geom));
    655   OK(scad_geometry_get_count(geom, &c));
    656   CHK(c == 1);
    657   OK(scad_geometry_ref_put(geom));
    658 
    659   OK(scad_scene_count(&c));
    660   CHK(c == 0);
    661 
    662   OK(scad_add_sphere(p1, 0.1, &geom));
    663   OK(scad_add_sphere(p3, 0.1, &geom1));
    664   OK(scad_geometries_intersect(&geom, 1, &geom1, 1, &geom2));
    665   BAD(scad_geometry_is_empty(NULL, &e));
    666   BAD(scad_geometry_is_empty(geom, NULL));
    667   OK(scad_geometry_is_empty(geom, &e));
    668   CHK(e == 0);
    669   OK(scad_geometry_is_empty(geom2, &e));
    670   CHK(e == 1);
    671   OK(scad_geometry_ref_put(geom));
    672   OK(scad_geometry_ref_put(geom1));
    673   OK(scad_geometry_ref_put(geom2));
    674 
    675   OK(scad_scene_count(&c));
    676   CHK(c == 0);
    677 
    678   OK(scad_add_sphere(p1, 1, &geom));
    679   BAD(scad_geometry_set_custom_data(NULL, NULL, NULL));
    680   OK(scad_geometry_set_custom_data(geom, NULL, NULL));
    681   OK(scad_geometry_set_custom_data(geom, NULL, (void*)&e));
    682   OK(scad_geometry_set_custom_data(geom, dummy_release, NULL));
    683   OK(scad_geometry_set_custom_data(geom, dummy_release, (void*)&e));
    684   OK(scad_geometry_ref_put(geom));
    685 
    686   OK(scad_scene_count(&c));
    687   CHK(c == 0);
    688 
    689   OK(scad_add_sphere(p1, 1, &geom));
    690   BAD(scad_geometry_get_custom_data(NULL, NULL));
    691   BAD(scad_geometry_get_custom_data(geom, NULL));
    692   OK(scad_geometry_get_custom_data(geom, &data));
    693   CHK(data == NULL); /* NULL when unset */
    694   OK(scad_geometry_set_custom_data(geom, NULL, (void*)&c));
    695   OK(scad_geometry_get_custom_data(geom, &data));
    696   CHK(data == (void*)&c);
    697   OK(scad_geometry_set_custom_data(geom, NULL, NULL));
    698   OK(scad_geometry_get_custom_data(geom, &data));
    699   CHK(data == NULL);
    700   OK(scad_geometry_set_custom_data(geom, dummy_release, (void*)&c));
    701   OK(scad_geometry_get_custom_data(geom, &data));
    702   CHK(data == (void*)&c);
    703   OK(scad_geometry_ref_put(geom));
    704 
    705   OK(scad_scene_count(&c));
    706   CHK(c == 0);
    707 
    708   OK(scad_add_sphere(p1, 1, &geom1));
    709   OK(scad_add_sphere(p2, 2, &geom2));
    710   BAD(scad_geometry_set_name(NULL, NULL));
    711   OK(scad_geometry_set_name(geom1, "sphere 1"));
    712   OK(scad_geometry_set_name(geom1, "sphere 1")); /* Same geometry: OK */
    713   name = "sphere 2";
    714   OK(scad_geometry_set_name(geom2, name));
    715   BAD(scad_geometry_set_name(geom2, "sphere 1")); /* Name already in use */
    716   OK(scad_geometry_get_name(geom2, &name2));
    717   CHK(0 == strcmp(name, name2)); /* Name was left unchanged */
    718   OK(scad_geometry_ref_put(geom1));
    719   OK(scad_geometry_ref_put(geom2));
    720 
    721   OK(scad_scene_count(&c));
    722   CHK(c == 0);
    723 
    724   OK(scad_add_sphere(p1, 1, &geoms[0]));
    725   OK(scad_add_sphere(p2, 2, &geoms[1]));
    726   BAD(scad_geometries_set_name(NULL, 0, NULL, 0));
    727   BAD(scad_geometries_set_name(NULL, 2, NULL, 0));
    728   BAD(scad_geometries_set_name(geoms, 0, NULL, 0));
    729   OK(scad_geometries_set_name(geoms, 2, NULL, 0));
    730   BAD(scad_geometries_set_name(NULL, 0, "name", 0));
    731   BAD(scad_geometries_set_name(NULL, 2, "name", 0));
    732   BAD(scad_geometries_set_name(geoms, 0, "name", 0));
    733   OK(scad_geometries_set_name(geoms, 2, "name", 0));
    734   OK(scad_geometries_set_name(geoms, 2, "name", 0)); /* Same geometries: OK */
    735   OK(scad_geometry_get_name(geoms[1], &name));
    736   BAD(scad_geometries_set_name(geoms+1, 1, "name", 0)); /* Name already in use */
    737   OK(scad_geometry_get_name(geoms[1], &name2));
    738   CHK(0 == strcmp(name, name2)); /* Name was left unchanged */
    739   OK(scad_geometry_ref_put(geoms[0]));
    740   OK(scad_geometry_ref_put(geoms[1]));
    741 
    742   OK(scad_scene_count(&c));
    743   CHK(c == 0);
    744 
    745   OK(scad_scene_count(&c));
    746   CHK(c == 0);
    747   OK(scad_add_sphere(p1, 1, &geom));
    748   BAD(scad_geometry_get_name(NULL, &name));
    749   BAD(scad_geometry_get_name(geom, NULL));
    750   OK(scad_geometry_get_name(geom, &name));
    751   CHK(name == NULL);
    752   name = "sphere 1";
    753   OK(scad_geometry_set_name(geom, name));
    754   OK(scad_geometry_get_name(geom, &name2));
    755   CHK(0 == strcmp(name, name2));
    756   OK(scad_geometry_set_name(geom, NULL));
    757   OK(scad_geometry_get_name(geom, &name));
    758   CHK(name == NULL);
    759   OK(scad_geometry_ref_put(geom));
    760 
    761   OK(scad_scene_count(&c));
    762   CHK(c == 0);
    763 
    764   OK(scad_add_sphere(p1, 1, &geom1));
    765   OK(scad_add_sphere(p2, 2, &geom2));
    766   /* Sharing content */
    767   OK(scad_geometries_collect(&geom1, 1, geoms+0));
    768   OK(scad_geometries_collect(&geom2, 1, geoms+1));
    769   OK(scad_geometry_set_name(geom1, "sphere 1"));
    770   OK(scad_geometry_set_name(geom2, "sphere 2"));
    771   BAD(scad_geometries_swap(NULL, NULL, 0, 0));
    772   BAD(scad_geometries_swap(NULL, NULL, 0, SCAD_SWAP_GEOMETRY));
    773   BAD(scad_geometries_swap(NULL, NULL, 1, 0));
    774   BAD(scad_geometries_swap(NULL, &geom2, 0, 0));
    775   BAD(scad_geometries_swap(&geom1, NULL, 0, 0));
    776   BAD(scad_geometries_swap(NULL, NULL, 1, SCAD_SWAP_GEOMETRY));
    777   BAD(scad_geometries_swap(NULL, &geom2, 0, SCAD_SWAP_GEOMETRY));
    778   BAD(scad_geometries_swap(&geom1, NULL, 0, SCAD_SWAP_GEOMETRY));
    779   BAD(scad_geometries_swap(NULL, &geom2, 1, 0));
    780   BAD(scad_geometries_swap(&geom1, NULL, 1, 0));
    781   BAD(scad_geometries_swap(&geom1, &geom2, 0, 0));
    782   BAD(scad_geometries_swap(NULL, &geom2, 1, SCAD_SWAP_GEOMETRY));
    783   BAD(scad_geometries_swap(&geom1, NULL, 1, SCAD_SWAP_GEOMETRY));
    784   BAD(scad_geometries_swap(&geom1, &geom2, 0, SCAD_SWAP_GEOMETRY));
    785   BAD(scad_geometries_swap(&geom1, &geom2, 1, 0));
    786   OK(scad_geometries_swap(&geom1, &geom2, 1, SCAD_SWAP_GEOMETRY));
    787   /* Names not swapped */
    788   OK(scad_geometry_get_name(geom1, &name));
    789   OK(scad_geometry_get_name(geom2, &name2));
    790   CHK(0 == strcmp(name, "sphere 1"));
    791   CHK(0 == strcmp(name2, "sphere 2"));
    792   /* Geometries swaped */
    793   OK(scad_geometry_equal(geom1, geoms[1], &e));
    794   CHK(e);
    795   OK(scad_geometry_equal(geom2, geoms[0], &e));
    796   CHK(e);
    797   OK(scad_geometries_swap(&geom1, &geom2, 1, SCAD_SWAP_NAME));
    798   /* Names swapped */
    799   OK(scad_geometry_get_name(geom1, &name));
    800   OK(scad_geometry_get_name(geom2, &name2));
    801   CHK(0 == strcmp(name, "sphere 2"));
    802   CHK(0 == strcmp(name2, "sphere 1"));
    803   /* Geometries not swaped */
    804   OK(scad_geometry_equal(geom1, geoms[1], &e));
    805   CHK(e);
    806   OK(scad_geometry_equal(geom2, geoms[0], &e));
    807   CHK(e);
    808   OK(scad_geometry_ref_put(geom1));
    809   OK(scad_geometry_ref_put(geom2));
    810   OK(scad_geometry_ref_put(geoms[0]));
    811   OK(scad_geometry_ref_put(geoms[1]));
    812 
    813   OK(scad_scene_count(&c));
    814   CHK(c == 0);
    815 
    816   OK(scad_add_rectangle(p1, d2, &geom1));
    817   BAD(scad_geometry_get_mass(NULL, NULL));
    818   BAD(scad_geometry_get_mass(NULL, &m));
    819   BAD(scad_geometry_get_mass(geom1, NULL));
    820   OK(scad_geometry_get_mass(geom1, &m));
    821   CHK(eq_eps(m, 1, 1e-6)); /* Mass of 2D object is its surface */
    822   OK(scad_geometry_ref_put(geom1));
    823 
    824   OK(scad_scene_count(&c));
    825   CHK(c == 0);
    826 
    827   OK(scad_add_sphere(p1, 1, &geom1));
    828   OK(scad_geometry_get_mass(geom1, &m));
    829   CHK(eq_eps(m, PI*4/3, 1e-6)); /* Mass of 3D object is its volume */
    830   OK(scad_geometry_ref_put(geom1));
    831 
    832   OK(scad_scene_count(&c));
    833   CHK(c == 0);
    834 
    835   OK(scad_add_rectangle(p1, d2, &geom1));
    836   d3_add(tmp2, p1, d3_muld(tmp2, d2, 0.5));
    837   BAD(scad_geometry_get_centerofmass(NULL, NULL));
    838   BAD(scad_geometry_get_centerofmass(NULL, tmp));
    839   BAD(scad_geometry_get_centerofmass(geom1, NULL));
    840   OK(scad_geometry_get_centerofmass(geom1, tmp));
    841   CHK(d3_eq_eps(tmp, tmp2, 1e-6));
    842   OK(scad_geometry_ref_put(geom1));
    843 
    844   OK(scad_scene_count(&c));
    845   CHK(c == 0);
    846 
    847   OK(scad_add_rectangle(p1, d2, geoms+0));
    848   OK(scad_add_rectangle(p2, d2, geoms+1));
    849   d3_add(tmp2, d3_muld(tmp2, d3_add(tmp2, p1, p2), 0.5), d3_muld(tmp, d2, 0.5));
    850   OK(scad_geometries_collect(geoms, 2, &geom1));
    851   OK(scad_geometry_get_centerofmass(geom1, tmp));
    852   CHK(d3_eq_eps(tmp, tmp2, 1e-6));
    853   OK(scad_geometry_ref_put(geom1));
    854   OK(scad_geometry_ref_put(geoms[0]));
    855   OK(scad_geometry_ref_put(geoms[1]));
    856 
    857   OK(scad_scene_count(&c));
    858   CHK(c == 0);
    859 
    860   OK(scad_add_sphere(p1, 1, &geom1));
    861   OK(scad_geometry_get_centerofmass(geom1, tmp));
    862   CHK(d3_eq_eps(tmp, p1, 1e-6));
    863   OK(scad_geometry_ref_put(geom1));
    864 
    865   OK(scad_scene_count(&c));
    866   CHK(c == 0);
    867 
    868   OK(scad_add_sphere(p1, 1, geoms+0));
    869   OK(scad_add_sphere(p2, 1, geoms+1));
    870   OK(scad_geometries_collect(geoms, 2, &geom1));
    871   d3_muld(tmp2, d3_add(tmp2, p1, p2), 0.5);
    872   OK(scad_geometry_get_centerofmass(geom1, tmp));
    873   CHK(d3_eq_eps(tmp, tmp2, 1e-6));
    874   OK(scad_geometry_ref_put(geom1));
    875   OK(scad_geometry_ref_put(geoms[0]));
    876   OK(scad_geometry_ref_put(geoms[1]));
    877 
    878   OK(scad_scene_count(&c));
    879   CHK(c == 0);
    880 
    881   OK(scad_add_rectangle(p1, d2, &geom1));
    882   BAD(scad_geometry_get_closest_point(NULL, NULL, NULL, NULL, NULL));
    883   BAD(scad_geometry_get_closest_point(NULL, NULL, NULL, &m, NULL));
    884   BAD(scad_geometry_get_closest_point(NULL, NULL, tmp, NULL, NULL));
    885   BAD(scad_geometry_get_closest_point(NULL, p3, NULL, NULL, NULL));
    886   BAD(scad_geometry_get_closest_point(geom1, NULL, NULL, NULL, NULL));
    887   BAD(scad_geometry_get_closest_point(NULL, NULL, tmp, &m, NULL));
    888   BAD(scad_geometry_get_closest_point(NULL, p3, NULL, &m, NULL));
    889   BAD(scad_geometry_get_closest_point(geom1, NULL, NULL, &m, NULL));
    890   BAD(scad_geometry_get_closest_point(NULL, p3, tmp, NULL, NULL));
    891   BAD(scad_geometry_get_closest_point(geom1, NULL, tmp, NULL, NULL));
    892   BAD(scad_geometry_get_closest_point(geom1, p3, NULL, NULL, NULL));
    893   BAD(scad_geometry_get_closest_point(geom1, p3, tmp, NULL, NULL));
    894   BAD(scad_geometry_get_closest_point(geom1, p3, NULL, &m, NULL));
    895   BAD(scad_geometry_get_closest_point(geom1, NULL, tmp, &m, NULL));
    896   BAD(scad_geometry_get_closest_point(NULL, p3, tmp, &m, NULL));
    897   OK(scad_geometry_get_closest_point(geom1, p3, tmp, &m, NULL));
    898   OK(scad_geometry_get_closest_point(geom1, p3, tmp, &m, &geom));
    899   CHK(d3_eq_eps(tmp, p3, 1e-6));
    900   CHK(eq_eps(m, 0, 1e-6));
    901   OK(scad_geometry_ref_put(geom1));
    902   OK(scad_geometry_ref_put(geom));
    903 
    904   OK(scad_scene_count(&c));
    905   CHK(c == 0);
    906 
    907   OK(scad_add_sphere(p1, 1, &geom1));
    908   d3_normalize(tmp, p2);
    909   d3_muld(tmp2, tmp, 0.9999);
    910   OK(scad_geometry_get_closest_point(geom1, tmp2, tmp, &m, NULL));
    911   OK(scad_geometry_get_closest_point(geom1, tmp2, tmp, &m, &geom));
    912   CHK(d3_eq_eps(tmp2, tmp, 1e-3));
    913   CHK(eq_eps(m, d3_len(d3_sub(tmp, tmp2, tmp)), 1e-6));
    914   OK(scad_geometry_ref_put(geom1));
    915   OK(scad_geometry_ref_put(geom));
    916 
    917   OK(scad_scene_count(&c));
    918   CHK(c == 0);
    919 
    920   OK(scad_add_rectangle(p1, d2, &geom1));
    921   BAD(scad_geometry_get_normal(NULL, NULL, NULL, NULL));
    922   BAD(scad_geometry_get_normal(NULL, NULL, tmp, NULL));
    923   BAD(scad_geometry_get_normal(NULL, p3, NULL, NULL));
    924   BAD(scad_geometry_get_normal(geom1, NULL, NULL, NULL));
    925   BAD(scad_geometry_get_normal(NULL, p3, tmp, NULL));
    926   BAD(scad_geometry_get_normal(geom1, NULL, tmp, NULL));
    927   BAD(scad_geometry_get_normal(geom1, p3, NULL, NULL));
    928   d3(tmp2, 0.3, 0.3, 0);
    929   OK(scad_geometry_get_normal(geom1, tmp2, tmp, NULL));
    930   OK(scad_geometry_get_normal(geom1, tmp2, tmp, &geom));
    931   d3(tmp2, 0, 0, 1);
    932   CHK(d3_eq_eps(tmp, tmp2, 1e-6));
    933   OK(scad_geometry_ref_put(geom1));
    934   OK(scad_geometry_ref_put(geom));
    935 
    936   OK(scad_scene_count(&c));
    937   CHK(c == 0);
    938 
    939   OK(scad_add_sphere(p1, 1, &geom1));
    940   d3_normalize(tmp2, p2);
    941   OK(scad_geometry_get_normal(geom1, tmp2, tmp, NULL));
    942   OK(scad_geometry_get_normal(geom1, tmp2, tmp, &geom));
    943   CHK(d3_eq_eps(tmp, tmp2, 1e-6));
    944   OK(scad_geometry_ref_put(geom1));
    945   OK(scad_geometry_ref_put(geom));
    946 
    947   OK(scad_scene_count(&c));
    948   CHK(c == 0);
    949 
    950   OK(scad_add_sphere(p1, 1, &geom));
    951   BAD(scad_geometry_get_bounding_box(NULL, NULL, NULL));
    952   BAD(scad_geometry_get_bounding_box(NULL, NULL, tmp2));
    953   BAD(scad_geometry_get_bounding_box(NULL, tmp, NULL));
    954   BAD(scad_geometry_get_bounding_box(geom, NULL, NULL));
    955   BAD(scad_geometry_get_bounding_box(NULL, tmp, tmp2));
    956   BAD(scad_geometry_get_bounding_box(geom, NULL, tmp2));
    957   BAD(scad_geometry_get_bounding_box(geom, tmp, NULL));
    958   OK(scad_geometry_get_bounding_box(geom, tmp, tmp2));
    959   CHK(d3_eq_eps(d3_muld(tmp, tmp, -1), tmp2, 1e-6));
    960   d3(tmp, 1,1,1);
    961   CHK(d3_eq_eps(tmp, tmp2, 1e-6));
    962   OK(scad_geometry_ref_put(geom));
    963 
    964   OK(scad_scene_count(&c));
    965   CHK(c == 0);
    966 
    967   OK(scad_add_sphere(p1, 1, &geom));
    968   OK(scad_geometries_collect(&geom, 1, &geom2));
    969   BAD(scad_geometry_equal(NULL, NULL, NULL));
    970   BAD(scad_geometry_equal(NULL, NULL, &e));
    971   BAD(scad_geometry_equal(NULL, geom2, NULL));
    972   BAD(scad_geometry_equal(geom, NULL, NULL));
    973   BAD(scad_geometry_equal(NULL, geom2, &e));
    974   BAD(scad_geometry_equal(geom, NULL, &e));
    975   BAD(scad_geometry_equal(geom, geom2, NULL));
    976   OK(scad_geometry_equal(geom, geom2, &e));
    977   CHK(e == 1);
    978   OK(scad_geometry_ref_put(geom2));
    979   OK(scad_add_sphere(p1, 1, &geom2));
    980   OK(scad_geometry_equal(geom, geom2, &e));
    981   CHK(e == 0);
    982   OK(scad_geometry_ref_put(geom));
    983   OK(scad_geometry_ref_put(geom2));
    984 
    985   OK(scad_scene_count(&c));
    986   CHK(c == 0);
    987 
    988   OK(scad_add_sphere(p1, 1, &geom));
    989   OK(scad_geometries_collect(&geom, 1, &geom2));
    990   BAD(scad_geometry_is_included(NULL, NULL, 0, NULL));
    991   BAD(scad_geometry_is_included(NULL, NULL, 0, &e));
    992   BAD(scad_geometry_is_included(NULL, NULL, 1, NULL));
    993   BAD(scad_geometry_is_included(NULL, &geom2, 0, NULL));
    994   BAD(scad_geometry_is_included(geom, NULL, 0, NULL));
    995   BAD(scad_geometry_is_included(NULL, NULL, 1, &e));
    996   BAD(scad_geometry_is_included(NULL, &geom2, 0, &e));
    997   BAD(scad_geometry_is_included(geom, NULL, 0, &e));
    998   BAD(scad_geometry_is_included(NULL, &geom2, 1, NULL));
    999   BAD(scad_geometry_is_included(geom, NULL, 1, NULL));
   1000   BAD(scad_geometry_is_included(geom, &geom2, 0, NULL));
   1001   BAD(scad_geometry_is_included(geom, &geom2, 1, NULL));
   1002   BAD(scad_geometry_is_included(geom, &geom2, 0, &e));
   1003   BAD(scad_geometry_is_included(geom, NULL, 1, &e));
   1004   BAD(scad_geometry_is_included(NULL, &geom2, 1, &e));
   1005   OK(scad_geometry_is_included(geom, &geom2, 1, &e));
   1006   CHK(e == 1);
   1007   OK(scad_geometry_ref_put(geom2));
   1008   OK(scad_add_sphere(p1, 1, &geom2));
   1009   OK(scad_geometry_is_included(geom, &geom2, 1, &e));
   1010   CHK(e == 0);
   1011   OK(scad_geometry_ref_put(geom));
   1012   OK(scad_geometry_ref_put(geom2));
   1013 
   1014   OK(scad_scene_count(&c));
   1015   CHK(c == 0);
   1016 
   1017   OK(scad_add_sphere(p1, 1, &geom));
   1018   BAD(scad_geometries_collect(NULL, 0, NULL));
   1019   BAD(scad_geometries_collect(NULL, 0, &geom2));
   1020   BAD(scad_geometries_collect(NULL, 1, NULL));
   1021   BAD(scad_geometries_collect(&geom, 0, NULL));
   1022   BAD(scad_geometries_collect(NULL, 1, &geom2));
   1023   BAD(scad_geometries_collect(&geom, 0, &geom2));
   1024   BAD(scad_geometries_collect(&geom, 1, NULL));
   1025   OK(scad_geometries_collect(&geom, 1, &geom2));
   1026   OK(scad_geometry_ref_put(geom));
   1027   OK(scad_geometry_ref_put(geom2));
   1028 
   1029   OK(scad_scene_count(&c));
   1030   CHK(c == 0);
   1031 
   1032   OK(scad_add_box(p1, d0, &geom1));
   1033   OK(scad_add_box(p2, d0, &geom2));
   1034   BAD(scad_geometries_fuse(NULL, 0, NULL, 0, NULL));
   1035   BAD(scad_geometries_fuse(NULL, 0, NULL, 0, &geom));
   1036   BAD(scad_geometries_fuse(NULL, 0, NULL, 1, NULL));
   1037   BAD(scad_geometries_fuse(NULL, 0, &geom2, 0, NULL));
   1038   BAD(scad_geometries_fuse(NULL, 1, NULL, 0, NULL));
   1039   BAD(scad_geometries_fuse(&geom1, 0, NULL, 0, NULL));
   1040   BAD(scad_geometries_fuse(NULL, 0, NULL, 1, &geom));
   1041   BAD(scad_geometries_fuse(NULL, 0, &geom2, 0, &geom));
   1042   BAD(scad_geometries_fuse(NULL, 1, NULL, 0, &geom));
   1043   BAD(scad_geometries_fuse(&geom1, 0, NULL, 0, &geom));
   1044   BAD(scad_geometries_fuse(NULL, 0, &geom2, 1, NULL));
   1045   BAD(scad_geometries_fuse(NULL, 1, NULL, 1, NULL));
   1046   BAD(scad_geometries_fuse(&geom1, 0, NULL, 1, NULL));
   1047   BAD(scad_geometries_fuse(NULL, 1, &geom2, 0, NULL));
   1048   BAD(scad_geometries_fuse(&geom1, 0, &geom2, 0, NULL));
   1049   BAD(scad_geometries_fuse(&geom1, 1, NULL, 0, NULL));
   1050   BAD(scad_geometries_fuse(NULL, 0, &geom2, 1, &geom));
   1051   BAD(scad_geometries_fuse(NULL, 1, NULL, 1, &geom));
   1052   BAD(scad_geometries_fuse(&geom1, 0, NULL, 1, &geom));
   1053   BAD(scad_geometries_fuse(NULL, 1, &geom2, 0, &geom));
   1054   BAD(scad_geometries_fuse(&geom, 0, &geom2, 0, &geom));
   1055   BAD(scad_geometries_fuse(&geom, 1, NULL, 0, &geom));
   1056   BAD(scad_geometries_fuse(NULL, 1, &geom2, 1, NULL));
   1057   BAD(scad_geometries_fuse(&geom, 0, &geom2, 1, NULL));
   1058   BAD(scad_geometries_fuse(&geom1, 1, NULL, 1, &geom));
   1059   BAD(scad_geometries_fuse(&geom, 1, &geom2, 0, NULL));
   1060   BAD(scad_geometries_fuse(&geom1, 1, &geom2, 1, NULL));
   1061   BAD(scad_geometries_fuse(&geom1, 1, &geom2, 0, &geom));
   1062   BAD(scad_geometries_fuse(&geom1, 1, NULL, 1, &geom));
   1063   BAD(scad_geometries_fuse(&geom1, 0, &geom2, 1, &geom));
   1064   BAD(scad_geometries_fuse(NULL, 1, &geom2, 1, &geom));
   1065   OK(scad_geometries_fuse(&geom1, 1, &geom2, 1, &geom)); /* disjoint geometries */
   1066   OK(scad_geometry_get_count(geom, &c));
   1067   CHK(c == 2);
   1068   OK(scad_geometry_ref_put(geom1));
   1069   OK(scad_geometry_ref_put(geom2));
   1070   OK(scad_geometry_ref_put(geom));
   1071 
   1072   OK(scad_scene_count(&c));
   1073   CHK(c == 0);
   1074 
   1075   OK(scad_add_box(p1, d1, &geom1));
   1076   OK(scad_add_box(p2, d1, &geom2));
   1077   OK(scad_geometries_fuse(&geom1, 1, &geom2, 1, &geom)); /* non-disjoint geometries */
   1078   OK(scad_geometry_get_count(geom, &c));
   1079   CHK(c == 1);
   1080   OK(scad_geometry_ref_put(geom1));
   1081   OK(scad_geometry_ref_put(geom2));
   1082   OK(scad_geometry_ref_put(geom));
   1083 
   1084   OK(scad_scene_count(&c));
   1085   CHK(c == 0);
   1086 
   1087   OK(scad_add_box(p1, d0, &geom1));
   1088   OK(scad_add_box(p2, d0, &geom2));
   1089   BAD(scad_geometries_cut(NULL, 0, NULL, 0, &geom));
   1090   BAD(scad_geometries_cut(NULL, 0, NULL, 1, NULL));
   1091   BAD(scad_geometries_cut(NULL, 0, &geom2, 0, NULL));
   1092   BAD(scad_geometries_cut(NULL, 1, NULL, 0, NULL));
   1093   BAD(scad_geometries_cut(&geom1, 0, NULL, 0, NULL));
   1094   BAD(scad_geometries_cut(NULL, 0, NULL, 1, &geom));
   1095   BAD(scad_geometries_cut(NULL, 0, &geom2, 0, &geom));
   1096   BAD(scad_geometries_cut(NULL, 1, NULL, 0, &geom));
   1097   BAD(scad_geometries_cut(&geom1, 0, NULL, 0, &geom));
   1098   BAD(scad_geometries_cut(NULL, 0, &geom2, 1, NULL));
   1099   BAD(scad_geometries_cut(NULL, 1, NULL, 1, NULL));
   1100   BAD(scad_geometries_cut(&geom1, 0, NULL, 1, NULL));
   1101   BAD(scad_geometries_cut(NULL, 1, &geom2, 0, NULL));
   1102   BAD(scad_geometries_cut(&geom1, 0, &geom2, 0, NULL));
   1103   BAD(scad_geometries_cut(&geom1, 1, NULL, 0, NULL));
   1104   BAD(scad_geometries_cut(NULL, 0, &geom2, 1, &geom));
   1105   BAD(scad_geometries_cut(NULL, 1, NULL, 1, &geom));
   1106   BAD(scad_geometries_cut(&geom1, 0, NULL, 1, &geom));
   1107   BAD(scad_geometries_cut(NULL, 1, &geom2, 0, &geom));
   1108   BAD(scad_geometries_cut(&geom, 0, &geom2, 0, &geom));
   1109   BAD(scad_geometries_cut(&geom, 1, NULL, 0, &geom));
   1110   BAD(scad_geometries_cut(NULL, 1, &geom2, 1, NULL));
   1111   BAD(scad_geometries_cut(&geom, 0, &geom2, 1, NULL));
   1112   BAD(scad_geometries_cut(&geom1, 1, NULL, 1, &geom));
   1113   BAD(scad_geometries_cut(&geom, 1, &geom2, 0, NULL));
   1114   BAD(scad_geometries_cut(&geom1, 1, &geom2, 1, NULL));
   1115   BAD(scad_geometries_cut(&geom1, 1, &geom2, 0, &geom));
   1116   BAD(scad_geometries_cut(&geom1, 1, NULL, 1, &geom));
   1117   BAD(scad_geometries_cut(&geom1, 0, &geom2, 1, &geom));
   1118   BAD(scad_geometries_cut(NULL, 1, &geom2, 1, &geom));
   1119   OK(scad_geometries_cut(&geom1, 1, &geom2, 1, &geom)); /* disjoint geometries */
   1120   OK(scad_geometry_is_empty(geom, &e));
   1121   CHK(e == 0);
   1122   OK(scad_geometry_ref_put(geom1));
   1123   OK(scad_geometry_ref_put(geom2));
   1124   OK(scad_geometry_ref_put(geom));
   1125 
   1126   OK(scad_scene_count(&c));
   1127   CHK(c == 0);
   1128 
   1129   OK(scad_add_box(p1, d1, &geom1));
   1130   OK(scad_add_box(p2, d1, &geom2));
   1131   OK(scad_geometries_cut(&geom1, 1, &geom2, 1, &geom)); /* non-disjoint geometries */
   1132   OK(scad_geometry_is_empty(geom, &e));
   1133   CHK(e == 0);
   1134   OK(scad_geometry_ref_put(geom1));
   1135   OK(scad_geometry_ref_put(geom2));
   1136   OK(scad_geometry_ref_put(geom));
   1137 
   1138   OK(scad_scene_count(&c));
   1139   CHK(c == 0);
   1140 
   1141   OK(scad_add_box(p1, d1, &geom1));
   1142   OK(scad_geometries_cut(&geom1, 1, &geom1, 1, &geom));
   1143   OK(scad_geometry_is_empty(geom, &e));
   1144   CHK(e == 1);
   1145   OK(scad_geometry_ref_put(geom1));
   1146   OK(scad_geometry_ref_put(geom));
   1147 
   1148   OK(scad_scene_count(&c));
   1149   CHK(c == 0);
   1150 
   1151   OK(scad_add_sphere(p1, 1, &geom1));
   1152   OK(scad_geometries_cut(&geom1, 1, &geom1, 1, &geom));
   1153   OK(scad_geometry_is_empty(geom, &e));
   1154   CHK(e == 1);
   1155   OK(scad_geometry_ref_put(geom1));
   1156   OK(scad_geometry_ref_put(geom));
   1157 
   1158   OK(scad_scene_count(&c));
   1159   CHK(c == 0);
   1160 
   1161   OK(scad_add_box(p1, d0, &geom1));
   1162   OK(scad_add_box(p2, d0, &geom2));
   1163   BAD(scad_geometries_intersect(NULL, 0, NULL, 0, &geom));
   1164   BAD(scad_geometries_intersect(NULL, 0, NULL, 1, NULL));
   1165   BAD(scad_geometries_intersect(NULL, 0, &geom2, 0, NULL));
   1166   BAD(scad_geometries_intersect(NULL, 1, NULL, 0, NULL));
   1167   BAD(scad_geometries_intersect(&geom1, 0, NULL, 0, NULL));
   1168   BAD(scad_geometries_intersect(NULL, 0, NULL, 1, &geom));
   1169   BAD(scad_geometries_intersect(NULL, 0, &geom2, 0, &geom));
   1170   BAD(scad_geometries_intersect(NULL, 1, NULL, 0, &geom));
   1171   BAD(scad_geometries_intersect(&geom1, 0, NULL, 0, &geom));
   1172   BAD(scad_geometries_intersect(NULL, 0, &geom2, 1, NULL));
   1173   BAD(scad_geometries_intersect(NULL, 1, NULL, 1, NULL));
   1174   BAD(scad_geometries_intersect(&geom1, 0, NULL, 1, NULL));
   1175   BAD(scad_geometries_intersect(NULL, 1, &geom2, 0, NULL));
   1176   BAD(scad_geometries_intersect(&geom1, 0, &geom2, 0, NULL));
   1177   BAD(scad_geometries_intersect(&geom1, 1, NULL, 0, NULL));
   1178   BAD(scad_geometries_intersect(NULL, 0, &geom2, 1, &geom));
   1179   BAD(scad_geometries_intersect(NULL, 1, NULL, 1, &geom));
   1180   BAD(scad_geometries_intersect(&geom1, 0, NULL, 1, &geom));
   1181   BAD(scad_geometries_intersect(NULL, 1, &geom2, 0, &geom));
   1182   BAD(scad_geometries_intersect(&geom, 0, &geom2, 0, &geom));
   1183   BAD(scad_geometries_intersect(&geom, 1, NULL, 0, &geom));
   1184   BAD(scad_geometries_intersect(NULL, 1, &geom2, 1, NULL));
   1185   BAD(scad_geometries_intersect(&geom, 0, &geom2, 1, NULL));
   1186   BAD(scad_geometries_intersect(&geom1, 1, NULL, 1, &geom));
   1187   BAD(scad_geometries_intersect(&geom, 1, &geom2, 0, NULL));
   1188   BAD(scad_geometries_intersect(&geom1, 1, &geom2, 1, NULL));
   1189   BAD(scad_geometries_intersect(&geom1, 1, &geom2, 0, &geom));
   1190   BAD(scad_geometries_intersect(&geom1, 1, NULL, 1, &geom));
   1191   BAD(scad_geometries_intersect(&geom1, 0, &geom2, 1, &geom));
   1192   BAD(scad_geometries_intersect(NULL, 1, &geom2, 1, &geom));
   1193   OK(scad_geometries_intersect(&geom1, 1, &geom2, 1, &geom));
   1194   OK(scad_geometry_is_empty(geom, &e));
   1195   CHK(e == 1);
   1196   OK(scad_geometry_ref_put(geom1));
   1197   OK(scad_geometry_ref_put(geom2));
   1198   OK(scad_geometry_ref_put(geom));
   1199 
   1200   OK(scad_scene_count(&c));
   1201   CHK(c == 0);
   1202 
   1203   OK(scad_add_box(p1, d1, &geom1));
   1204   OK(scad_add_box(p2, d1, &geom2));
   1205   OK(scad_geometries_intersect(&geom1, 1, &geom2, 1, &geom));
   1206   OK(scad_geometry_is_empty(geom, &e));
   1207   CHK(e == 0);
   1208   OK(scad_geometry_ref_put(geom1));
   1209   OK(scad_geometry_ref_put(geom2));
   1210   OK(scad_geometry_ref_put(geom));
   1211 
   1212   OK(scad_scene_count(&c));
   1213   CHK(c == 0);
   1214 
   1215   OK(scad_add_sphere(p1, 0.1, &geom));
   1216   OK(scad_add_sphere(p3, 0.1, &geom1));
   1217   OK(scad_geometries_intersect(&geom, 1, &geom1, 1, &geom2));
   1218   OK(scad_geometry_is_empty(geom2, &e));
   1219   CHK(e == 1);
   1220   OK(scad_geometry_ref_put(geom));
   1221   OK(scad_geometry_ref_put(geom1));
   1222   OK(scad_geometry_ref_put(geom2));
   1223 
   1224   OK(scad_add_box(p1, d0, geoms+0));
   1225   OK(scad_add_box(p2, d0, geoms+1));
   1226   BAD(scad_geometries_partition(NULL, 0, 9, NULL));
   1227   BAD(scad_geometries_partition(NULL, 0, 9, out_geoms));
   1228   BAD(scad_geometries_partition(NULL, 0, 0, NULL));
   1229   BAD(scad_geometries_partition(NULL, 2, 9, NULL));
   1230   BAD(scad_geometries_partition(geoms, 0, 9, NULL));
   1231   BAD(scad_geometries_partition(NULL, 0, 0, out_geoms));
   1232   BAD(scad_geometries_partition(NULL, 2, 9, out_geoms));
   1233   BAD(scad_geometries_partition(geoms, 0, 9, out_geoms));
   1234   BAD(scad_geometries_partition(NULL, 2, 0, NULL));
   1235   BAD(scad_geometries_partition(geoms, 0, 0, NULL));
   1236   BAD(scad_geometries_partition(geoms, 2, 9, NULL));
   1237   BAD(scad_geometries_partition(geoms, 2, 0, NULL));
   1238   BAD(scad_geometries_partition(geoms, 2, 9, out_geoms));
   1239   BAD(scad_geometries_partition(geoms, 0, 0, out_geoms));
   1240   BAD(scad_geometries_partition(NULL, 2, 0, out_geoms));
   1241   OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms));
   1242   OK(scad_geometry_equal(geoms[0], out_geoms[0], &e));
   1243   CHK(e == 1);
   1244   OK(scad_geometry_equal(geoms[1], out_geoms[1], &e));
   1245   CHK(e == 1);
   1246   OK(scad_geometry_ref_put(geoms[0]));
   1247   OK(scad_geometry_ref_put(geoms[1]));
   1248   OK(scad_geometry_ref_put(out_geoms[0]));
   1249   OK(scad_geometry_ref_put(out_geoms[1]));
   1250 
   1251   OK(scad_scene_count(&c));
   1252   CHK(c == 0);
   1253 
   1254   OK(scad_add_box(p1, d1, geoms+0));
   1255   OK(scad_add_box(p2, d1, geoms+1));
   1256   BAD(scad_geometries_partition(geoms, 2, SCAD_DUMP_ON_OVERLAPPING_ERROR, out_geoms));
   1257   OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms));
   1258   OK(scad_geometry_ref_put(geoms[0]));
   1259   OK(scad_geometry_ref_put(geoms[1]));
   1260   OK(scad_geometry_ref_put(out_geoms[0]));
   1261   OK(scad_geometry_ref_put(out_geoms[1]));
   1262 
   1263   OK(scad_scene_count(&c));
   1264   CHK(c == 0);
   1265 
   1266   OK(scad_add_sphere(p1, 0.1, &geoms[0]));
   1267   OK(scad_add_sphere(p3, 0.1, &geoms[1]));
   1268   OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms));
   1269   OK(scad_geometries_swap(geoms, out_geoms, 2, SCAD_SWAP_GEOMETRY));
   1270   OK(scad_geometry_ref_put(out_geoms[0]));
   1271   OK(scad_geometry_ref_put(out_geoms[1]));
   1272 
   1273 
   1274   BAD(scad_geometries_common_boundaries(NULL, 0, NULL, 0, NULL, NULL));
   1275   BAD(scad_geometries_common_boundaries(NULL, 0, NULL, 0, NULL, &c));
   1276   BAD(scad_geometries_common_boundaries(NULL, 0, NULL, 0, &geom_array, NULL));
   1277   BAD(scad_geometries_common_boundaries(NULL, 0, NULL, 0, &geom_array, &c));
   1278   BAD(scad_geometries_common_boundaries(NULL, 0, NULL, 1, NULL, NULL));
   1279   BAD(scad_geometries_common_boundaries(NULL, 0, NULL, 1, NULL, &c));
   1280   BAD(scad_geometries_common_boundaries(NULL, 0, NULL, 1, &geom_array, NULL));
   1281   BAD(scad_geometries_common_boundaries(NULL, 0, NULL, 1, &geom_array, &c));
   1282   BAD(scad_geometries_common_boundaries(NULL, 0, geoms+1, 0, NULL, NULL));
   1283   BAD(scad_geometries_common_boundaries(NULL, 0, geoms+1, 0, NULL, &c));
   1284   BAD(scad_geometries_common_boundaries(NULL, 0, geoms+1, 0, &geom_array, NULL));
   1285   BAD(scad_geometries_common_boundaries(NULL, 0, geoms+1, 0, &geom_array, &c));
   1286   BAD(scad_geometries_common_boundaries(NULL, 0, geoms+1, 1, NULL, NULL));
   1287   BAD(scad_geometries_common_boundaries(NULL, 0, geoms+1, 1, NULL, &c));
   1288   BAD(scad_geometries_common_boundaries(NULL, 0, geoms+1, 1, &geom_array, NULL));
   1289   BAD(scad_geometries_common_boundaries(NULL, 0, geoms+1, 1, &geom_array, &c));
   1290   BAD(scad_geometries_common_boundaries(NULL, 1, NULL, 0, NULL, NULL));
   1291   BAD(scad_geometries_common_boundaries(NULL, 1, NULL, 0, NULL, &c));
   1292   BAD(scad_geometries_common_boundaries(NULL, 1, NULL, 0, &geom_array, NULL));
   1293   BAD(scad_geometries_common_boundaries(NULL, 1, NULL, 0, &geom_array, &c));
   1294   BAD(scad_geometries_common_boundaries(NULL, 1, NULL, 1, NULL, NULL));
   1295   BAD(scad_geometries_common_boundaries(NULL, 1, NULL, 1, NULL, &c));
   1296   BAD(scad_geometries_common_boundaries(NULL, 1, NULL, 1, &geom_array, NULL));
   1297   BAD(scad_geometries_common_boundaries(NULL, 1, NULL, 1, &geom_array, &c));
   1298   BAD(scad_geometries_common_boundaries(NULL, 1, geoms+1, 0, NULL, NULL));
   1299   BAD(scad_geometries_common_boundaries(NULL, 1, geoms+1, 0, NULL, &c));
   1300   BAD(scad_geometries_common_boundaries(NULL, 1, geoms+1, 0, &geom_array, NULL));
   1301   BAD(scad_geometries_common_boundaries(NULL, 1, geoms+1, 0, &geom_array, &c));
   1302   BAD(scad_geometries_common_boundaries(NULL, 1, geoms+1, 1, NULL, NULL));
   1303   BAD(scad_geometries_common_boundaries(NULL, 1, geoms+1, 1, NULL, &c));
   1304   BAD(scad_geometries_common_boundaries(NULL, 1, geoms+1, 1, &geom_array, NULL));
   1305   BAD(scad_geometries_common_boundaries(NULL, 1, geoms+1, 1, &geom_array, &c));
   1306   BAD(scad_geometries_common_boundaries(geoms, 0, NULL, 0, NULL, NULL));
   1307   BAD(scad_geometries_common_boundaries(geoms, 0, NULL, 0, NULL, &c));
   1308   BAD(scad_geometries_common_boundaries(geoms, 0, NULL, 0, &geom_array, NULL));
   1309   BAD(scad_geometries_common_boundaries(geoms, 0, NULL, 0, &geom_array, &c));
   1310   BAD(scad_geometries_common_boundaries(geoms, 0, NULL, 1, NULL, NULL));
   1311   BAD(scad_geometries_common_boundaries(geoms, 0, NULL, 1, NULL, &c));
   1312   BAD(scad_geometries_common_boundaries(geoms, 0, NULL, 1, &geom_array, NULL));
   1313   BAD(scad_geometries_common_boundaries(geoms, 0, NULL, 1, &geom_array, &c));
   1314   BAD(scad_geometries_common_boundaries(geoms, 0, geoms+1, 0, NULL, NULL));
   1315   BAD(scad_geometries_common_boundaries(geoms, 0, geoms+1, 0, NULL, &c));
   1316   BAD(scad_geometries_common_boundaries(geoms, 0, geoms+1, 0, &geom_array, NULL));
   1317   BAD(scad_geometries_common_boundaries(geoms, 0, geoms+1, 0, &geom_array, &c));
   1318   BAD(scad_geometries_common_boundaries(geoms, 0, geoms+1, 1, NULL, NULL));
   1319   BAD(scad_geometries_common_boundaries(geoms, 0, geoms+1, 1, NULL, &c));
   1320   BAD(scad_geometries_common_boundaries(geoms, 0, geoms+1, 1, &geom_array, NULL));
   1321   BAD(scad_geometries_common_boundaries(geoms, 0, geoms+1, 1, &geom_array, &c));
   1322   BAD(scad_geometries_common_boundaries(geoms, 1, NULL, 0, NULL, NULL));
   1323   BAD(scad_geometries_common_boundaries(geoms, 1, NULL, 0, NULL, &c));
   1324   BAD(scad_geometries_common_boundaries(geoms, 1, NULL, 0, &geom_array, NULL));
   1325   BAD(scad_geometries_common_boundaries(geoms, 1, NULL, 0, &geom_array, &c));
   1326   BAD(scad_geometries_common_boundaries(geoms, 1, NULL, 1, NULL, NULL));
   1327   BAD(scad_geometries_common_boundaries(geoms, 1, NULL, 1, NULL, &c));
   1328   BAD(scad_geometries_common_boundaries(geoms, 1, NULL, 1, &geom_array, NULL));
   1329   BAD(scad_geometries_common_boundaries(geoms, 1, NULL, 1, &geom_array, &c));
   1330   BAD(scad_geometries_common_boundaries(geoms, 1, geoms+1, 0, NULL, NULL));
   1331   BAD(scad_geometries_common_boundaries(geoms, 1, geoms+1, 0, NULL, &c));
   1332   BAD(scad_geometries_common_boundaries(geoms, 1, geoms+1, 0, &geom_array, NULL));
   1333   BAD(scad_geometries_common_boundaries(geoms, 1, geoms+1, 0, &geom_array, &c));
   1334   BAD(scad_geometries_common_boundaries(geoms, 1, geoms+1, 1, NULL, NULL));
   1335   BAD(scad_geometries_common_boundaries(geoms, 1, geoms+1, 1, NULL, &c));
   1336   BAD(scad_geometries_common_boundaries(geoms, 1, geoms+1, 1, &geom_array, NULL));
   1337   OK(scad_geometries_common_boundaries(geoms, 1, geoms+1, 1, &geom_array, &c));
   1338   CHK(c == 0);
   1339   MEM_RM(&allocator, geom_array);
   1340   OK(scad_geometry_ref_put(geoms[0]));
   1341   OK(scad_geometry_ref_put(geoms[1]));
   1342 
   1343   OK(scad_scene_count(&c));
   1344   CHK(c == 0);
   1345 
   1346   OK(scad_add_box(p1, d1, &geoms[0]));
   1347   OK(scad_add_box(p3, d1, &geoms[1]));
   1348   OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms));
   1349   OK(scad_geometries_swap(geoms, out_geoms, 2, SCAD_SWAP_GEOMETRY));
   1350   OK(scad_geometry_ref_put(out_geoms[0]));
   1351   OK(scad_geometry_ref_put(out_geoms[1]));
   1352   OK(scad_geometries_common_boundaries(geoms+0, 1, geoms+1, 1, &geom_array, &c));
   1353   CHK(c == 4);
   1354   for(i = 0; i < c; i++) {
   1355     OK(scad_geometry_ref_put(geom_array[i]));
   1356   }
   1357   MEM_RM(&allocator, geom_array);
   1358   OK(scad_geometry_ref_put(geoms[0]));
   1359   OK(scad_geometry_ref_put(geoms[1]));
   1360 
   1361   OK(scad_scene_count(&c));
   1362   CHK(c == 0);
   1363 
   1364   OK(scad_add_box(p1, d1, &geoms[0]));
   1365   OK(scad_add_box(p4, d1, &geoms[1]));
   1366   OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms));
   1367   OK(scad_geometries_swap(geoms, out_geoms, 2, SCAD_SWAP_GEOMETRY));
   1368   OK(scad_geometry_ref_put(out_geoms[0]));
   1369   OK(scad_geometry_ref_put(out_geoms[1]));
   1370   OK(scad_geometries_common_boundaries(geoms+0, 1, geoms+1, 1, &geom_array, &c));
   1371   CHK(c == 1);
   1372   for(i = 0; i < c; i++) {
   1373     OK(scad_geometry_ref_put(geom_array[i]));
   1374   }
   1375   MEM_RM(&allocator, geom_array);
   1376   OK(scad_geometry_ref_put(geoms[0]));
   1377   OK(scad_geometry_ref_put(geoms[1]));
   1378 
   1379   OK(scad_scene_count(&c));
   1380   CHK(c == 0);
   1381 
   1382   OK(scad_add_sphere(p1, 0.1, &geoms[0]));
   1383   OK(scad_add_sphere(p3, 0.1, &geoms[1]));
   1384   OK(scad_geometries_partition(geoms, 2, SCAD_ALLOW_OVERLAPPING, out_geoms));
   1385   OK(scad_geometries_swap(geoms, out_geoms, 2, SCAD_SWAP_GEOMETRY));
   1386   OK(scad_geometry_ref_put(out_geoms[0]));
   1387   OK(scad_geometry_ref_put(out_geoms[1]));
   1388   BAD(scad_geometries_common_boundary(NULL, 0, NULL, 0, NULL));
   1389   BAD(scad_geometries_common_boundary(NULL, 0, NULL, 0, &geom));
   1390   BAD(scad_geometries_common_boundary(NULL, 0, NULL, 1, NULL));
   1391   BAD(scad_geometries_common_boundary(NULL, 0, NULL, 1, &geom));
   1392   BAD(scad_geometries_common_boundary(NULL, 0, geoms+1, 0, NULL));
   1393   BAD(scad_geometries_common_boundary(NULL, 0, geoms+1, 0, &geom));
   1394   BAD(scad_geometries_common_boundary(NULL, 0, geoms+1, 1, NULL));
   1395   BAD(scad_geometries_common_boundary(NULL, 0, geoms+1, 1, &geom));
   1396   BAD(scad_geometries_common_boundary(NULL, 1, NULL, 0, NULL));
   1397   BAD(scad_geometries_common_boundary(NULL, 1, NULL, 0, &geom));
   1398   BAD(scad_geometries_common_boundary(NULL, 1, NULL, 1, NULL));
   1399   BAD(scad_geometries_common_boundary(NULL, 1, NULL, 1, &geom));
   1400   BAD(scad_geometries_common_boundary(NULL, 1, geoms+1, 0, NULL));
   1401   BAD(scad_geometries_common_boundary(NULL, 1, geoms+1, 0, &geom));
   1402   BAD(scad_geometries_common_boundary(NULL, 1, geoms+1, 1, NULL));
   1403   BAD(scad_geometries_common_boundary(NULL, 1, geoms+1, 1, &geom));
   1404   BAD(scad_geometries_common_boundary(geoms, 0, NULL, 0, NULL));
   1405   BAD(scad_geometries_common_boundary(geoms, 0, NULL, 0, &geom));
   1406   BAD(scad_geometries_common_boundary(geoms, 0, NULL, 1, NULL));
   1407   BAD(scad_geometries_common_boundary(geoms, 0, NULL, 1, &geom));
   1408   BAD(scad_geometries_common_boundary(geoms, 0, geoms+1, 0, NULL));
   1409   BAD(scad_geometries_common_boundary(geoms, 0, geoms+1, 0, &geom));
   1410   BAD(scad_geometries_common_boundary(geoms, 0, geoms+1, 1, NULL));
   1411   BAD(scad_geometries_common_boundary(geoms, 0, geoms+1, 1, &geom));
   1412   BAD(scad_geometries_common_boundary(geoms, 1, NULL, 0, NULL));
   1413   BAD(scad_geometries_common_boundary(geoms, 1, NULL, 0, &geom));
   1414   BAD(scad_geometries_common_boundary(geoms, 1, NULL, 1, NULL));
   1415   BAD(scad_geometries_common_boundary(geoms, 1, NULL, 1, &geom));
   1416   BAD(scad_geometries_common_boundary(geoms, 1, geoms+1, 0, NULL));
   1417   BAD(scad_geometries_common_boundary(geoms, 1, geoms+1, 0, &geom));
   1418   BAD(scad_geometries_common_boundary(geoms, 1, geoms+1, 1, NULL));
   1419   OK(scad_geometries_common_boundary(geoms, 1, geoms+1, 1, &geom));
   1420   OK(scad_geometry_ref_put(geoms[0]));
   1421   OK(scad_geometry_ref_put(geoms[1]));
   1422   OK(scad_geometry_ref_put(geom));
   1423 
   1424   OK(scad_scene_count(&c));
   1425   CHK(c == 0);
   1426 
   1427   OK(scad_add_sphere(p1, 0.1, &geom1));
   1428   BAD(scad_geometries_boundaries(NULL, 0, NULL, NULL));
   1429   BAD(scad_geometries_boundaries(NULL, 0, NULL, &c));
   1430   BAD(scad_geometries_boundaries(NULL, 0, &geom_array, NULL));
   1431   BAD(scad_geometries_boundaries(NULL, 1, NULL, NULL));
   1432   BAD(scad_geometries_boundaries(&geom1, 0, NULL, NULL));
   1433   BAD(scad_geometries_boundaries(NULL, 0, &geom_array, &c));
   1434   BAD(scad_geometries_boundaries(NULL, 1, NULL, &c));
   1435   BAD(scad_geometries_boundaries(&geom1, 0, NULL, &c));
   1436   BAD(scad_geometries_boundaries(NULL, 1, &geom_array, NULL));
   1437   BAD(scad_geometries_boundaries(&geom1, 0, &geom_array, NULL));
   1438   BAD(scad_geometries_boundaries(&geom1, 1, NULL, NULL));
   1439   BAD(scad_geometries_boundaries(&geom1, 1, &geom_array, NULL));
   1440   BAD(scad_geometries_boundaries(&geom1, 1, NULL, &c));
   1441   BAD(scad_geometries_boundaries(&geom1, 0, &geom_array, &c));
   1442   BAD(scad_geometries_boundaries(NULL, 1, &geom_array, &c));
   1443   OK(scad_geometries_boundaries(&geom1, 1, &geom_array, &c));
   1444   CHK(c == 1);
   1445   for(i = 0; i < c; i++) {
   1446     OK(scad_geometry_ref_put(geom_array[i]));
   1447   }
   1448   MEM_RM(&allocator, geom_array);
   1449   OK(scad_geometry_ref_put(geom1));
   1450 
   1451   OK(scad_scene_count(&c));
   1452   CHK(c == 0);
   1453 
   1454   OK(scad_add_sphere(p1, 0.1, &geom1));
   1455   BAD(scad_geometries_boundary(NULL, 0, NULL));
   1456   BAD(scad_geometries_boundary(NULL, 0, &geom));
   1457   BAD(scad_geometries_boundary(NULL, 1, NULL));
   1458   BAD(scad_geometries_boundary(&geom1, 0, NULL));
   1459   BAD(scad_geometries_boundary(NULL, 1, &geom));
   1460   BAD(scad_geometries_boundary(&geom1, 0, &geom));
   1461   BAD(scad_geometries_boundary(&geom1, 1, NULL));
   1462   OK(scad_geometries_boundary(&geom1, 1, &geom));
   1463   OK(scad_geometry_ref_put(geom1));
   1464   OK(scad_geometry_ref_put(geom));
   1465 
   1466   OK(scad_scene_count(&c));
   1467   CHK(c == 0);
   1468 
   1469   OK(scad_add_sphere(p1, 0.1, &geom1));
   1470   BAD(scad_geometry_copy(NULL, &geom));
   1471   BAD(scad_geometry_copy(geom1, NULL));
   1472   OK(scad_geometry_copy(geom1, &geom));
   1473   OK(scad_geometry_ref_put(geom));
   1474   OK(scad_geometry_ref_put(geom1));
   1475 
   1476   OK(scad_scene_count(&c));
   1477   CHK(c == 0);
   1478 
   1479   OK(scad_add_sphere(p1, 0.1, &geom));
   1480   BAD(scad_geometry_set_visibility(NULL, 1, 1));
   1481   OK(scad_geometry_set_visibility(geom, 1, 1));
   1482   OK(scad_geometry_ref_put(geom));
   1483 
   1484   OK(scad_scene_count(&c));
   1485   CHK(c == 0);
   1486 
   1487   OK(scad_add_rectangle(p1, d2, &geom1));
   1488   OK(scad_add_rectangle(p2, d2, &geom2));
   1489   BAD(scad_geometries_set_periodic(NULL, 0, NULL, 0, NULL));
   1490   BAD(scad_geometries_set_periodic(NULL, 0, NULL, 1, NULL));
   1491   BAD(scad_geometries_set_periodic(NULL, 0, &geom2, 0, NULL));
   1492   BAD(scad_geometries_set_periodic(NULL, 1, NULL, 0, NULL));
   1493   BAD(scad_geometries_set_periodic(&geom1, 0, NULL, 0, NULL));
   1494   BAD(scad_geometries_set_periodic(NULL, 0, &geom2, 1, NULL));
   1495   BAD(scad_geometries_set_periodic(NULL, 1, NULL, 1, NULL));
   1496   BAD(scad_geometries_set_periodic(&geom1, 0, NULL, 1, NULL));
   1497   BAD(scad_geometries_set_periodic(NULL, 1, &geom2, 0, NULL));
   1498   BAD(scad_geometries_set_periodic(&geom1, 0, &geom2, 0, NULL));
   1499   BAD(scad_geometries_set_periodic(&geom1, 1, NULL, 0, NULL));
   1500   BAD(scad_geometries_set_periodic(&geom1, 1, &geom2, 0, NULL));
   1501   BAD(scad_geometries_set_periodic(&geom1, 1, NULL, 1, NULL));
   1502   BAD(scad_geometries_set_periodic(&geom1, 0, &geom2, 1, NULL));
   1503   BAD(scad_geometries_set_periodic(NULL, 1, &geom2, 1, NULL));
   1504   BAD(scad_geometries_set_periodic(&geom1, 1, &geom2, 1, NULL));
   1505   BAD(scad_geometries_set_periodic(NULL, 0, NULL, 0, affine));
   1506   BAD(scad_geometries_set_periodic(NULL, 0, NULL, 1, affine));
   1507   BAD(scad_geometries_set_periodic(NULL, 0, &geom2, 0, affine));
   1508   BAD(scad_geometries_set_periodic(NULL, 1, NULL, 0, affine));
   1509   BAD(scad_geometries_set_periodic(&geom1, 0, NULL, 0, affine));
   1510   BAD(scad_geometries_set_periodic(NULL, 0, &geom2, 1, affine));
   1511   BAD(scad_geometries_set_periodic(NULL, 1, NULL, 1, affine));
   1512   BAD(scad_geometries_set_periodic(&geom1, 0, NULL, 1, affine));
   1513   BAD(scad_geometries_set_periodic(NULL, 1, &geom2, 0, affine));
   1514   BAD(scad_geometries_set_periodic(&geom1, 0, &geom2, 0, affine));
   1515   BAD(scad_geometries_set_periodic(&geom1, 1, NULL, 0, affine));
   1516   BAD(scad_geometries_set_periodic(&geom1, 1, &geom2, 0, affine));
   1517   BAD(scad_geometries_set_periodic(&geom1, 1, NULL, 1, affine));
   1518   BAD(scad_geometries_set_periodic(&geom1, 0, &geom2, 1, affine));
   1519   BAD(scad_geometries_set_periodic(NULL, 1, &geom2, 1, affine));
   1520   OK(scad_geometries_set_periodic(&geom1, 1, &geom2, 1, affine));
   1521   OK(scad_geometry_ref_put(geom2));
   1522   OK(scad_add_rectangle(p4, d2, &geom2));
   1523   ERR(scad_geometries_set_periodic(&geom1, 1, &geom2, 1, affine));
   1524   OK(scad_geometry_ref_put(geom1));
   1525   OK(scad_geometry_ref_put(geom2));
   1526 
   1527   OK(scad_scene_count(&c));
   1528   CHK(c == 0);
   1529 
   1530   OK(scad_add_sphere(p1, 0.1, &geom1));
   1531   BAD(scad_geometries_set_mesh_size_modifier(NULL, 0, 2, -1.5));
   1532   BAD(scad_geometries_set_mesh_size_modifier(NULL, 0, 2, 1.5));
   1533   BAD(scad_geometries_set_mesh_size_modifier(NULL, 0, SCAD_ABSOLUTE_SIZE, -1.5));
   1534   BAD(scad_geometries_set_mesh_size_modifier(NULL, 1, 2, -1.5));
   1535   BAD(scad_geometries_set_mesh_size_modifier(&geom1, 0, 2, -1.5));
   1536   BAD(scad_geometries_set_mesh_size_modifier(NULL, 0, SCAD_ABSOLUTE_SIZE, 1.5));
   1537   BAD(scad_geometries_set_mesh_size_modifier(NULL, 1, 2, 1.5));
   1538   BAD(scad_geometries_set_mesh_size_modifier(&geom1, 0, 2, 1.5));
   1539   BAD(scad_geometries_set_mesh_size_modifier(NULL, 1, SCAD_ABSOLUTE_SIZE, -1.5));
   1540   BAD(scad_geometries_set_mesh_size_modifier(&geom1, 0, SCAD_ABSOLUTE_SIZE, -1.5));
   1541   BAD(scad_geometries_set_mesh_size_modifier(&geom1, 1, 2, -1.5));
   1542   BAD(scad_geometries_set_mesh_size_modifier(&geom1, 1, SCAD_ABSOLUTE_SIZE, -1.5));
   1543   BAD(scad_geometries_set_mesh_size_modifier(&geom1, 1, 2, 1.5));
   1544   BAD(scad_geometries_set_mesh_size_modifier(&geom1, 0, SCAD_ABSOLUTE_SIZE, 1.5));
   1545   BAD(scad_geometries_set_mesh_size_modifier(NULL, 1, SCAD_ABSOLUTE_SIZE, 1.5));
   1546   OK(scad_geometries_set_mesh_size_modifier(&geom1, 1, SCAD_ABSOLUTE_SIZE, 1.5));
   1547   OK(scad_geometry_ref_put(geom1));
   1548 
   1549   OK(scad_scene_count(&c));
   1550   CHK(c == 0);
   1551 
   1552   OK(scad_add_sphere(p1, 0.1, &geom1));
   1553   BAD(scad_geometries_set_mesh_algorithm(NULL, 0, 0));
   1554   BAD(scad_geometries_set_mesh_algorithm(NULL, 0, SCAD_AUTOMATIC));
   1555   BAD(scad_geometries_set_mesh_algorithm(NULL, 1, 0));
   1556   BAD(scad_geometries_set_mesh_algorithm(&geom1, 0, 0));
   1557   BAD(scad_geometries_set_mesh_algorithm(NULL, 1, SCAD_AUTOMATIC));
   1558   BAD(scad_geometries_set_mesh_algorithm(&geom1, 0, SCAD_AUTOMATIC));
   1559   BAD(scad_geometries_set_mesh_algorithm(&geom1, 1, 0));
   1560   OK(scad_geometries_set_mesh_algorithm(&geom1, 1, SCAD_AUTOMATIC));
   1561   OK(scad_geometry_ref_put(geom1));
   1562 
   1563   OK(scad_scene_count(&c));
   1564   CHK(c == 0);
   1565 
   1566   options.Mesh.MeshSizeFromPoints = 1;
   1567   options.Mesh.MeshSizeExtendFromBoundary = 1;
   1568   OK(scad_set_options(&options));
   1569 
   1570   OK(scad_add_box(p1, d1, &geom));
   1571   OK(scad_scene_mesh());
   1572   darray_double_init(&allocator, &trg);
   1573   OK(scad_stl_get_data(geom, &trg));
   1574   c = darray_double_size_get(&trg);
   1575   darray_double_clear(&trg);
   1576   BAD(scad_geometries_clear_mesh(NULL, 0));
   1577   BAD(scad_geometries_clear_mesh(NULL, 1));
   1578   BAD(scad_geometries_clear_mesh(&geom, 0));
   1579   OK(scad_geometries_clear_mesh(&geom, 1));
   1580   OK(scad_stl_get_data(geom, &trg));
   1581   CHK(0 == darray_double_size_get(&trg));
   1582   OK(scad_geometries_set_mesh_size_modifier(&geom, 1, SCAD_SIZE_FACTOR, 0.5));
   1583   OK(scad_scene_mesh());
   1584   OK(scad_stl_get_data(geom, &trg));
   1585   CHK(c < darray_double_size_get(&trg));
   1586   darray_double_release(&trg);
   1587   OK(scad_geometry_ref_put(geom));
   1588 
   1589   options.Mesh.MeshSizeFromPoints = 0;
   1590   options.Mesh.MeshSizeExtendFromBoundary = 0;
   1591   OK(scad_set_options(&options));
   1592 
   1593   OK(scad_scene_count(&c));
   1594   CHK(c == 0);
   1595 
   1596   OK(scad_add_box(p1, d1, &geoms[0]));
   1597   OK(scad_add_box(p4, d1, &geoms[1]));
   1598   name = "/tmp/test"LINE_STRING".step";
   1599   OK(scad_scene_write(name));
   1600   BAD(scad_step_import(NULL, NULL, NULL));
   1601   BAD(scad_step_import(NULL, NULL, &c));
   1602   BAD(scad_step_import(NULL, &geom_array, NULL));
   1603   BAD(scad_step_import("/tmp/test.step", NULL, NULL));
   1604   BAD(scad_step_import(NULL, &geom_array, &c));
   1605   BAD(scad_step_import("/tmp/test.step", NULL, &c));
   1606   BAD(scad_step_import("/tmp/test.step", &geom_array, NULL));
   1607   ERR(scad_step_import("dont_exist.step", &geom_array, &c));
   1608   OK(scad_step_import(name, &geom_array, &c));
   1609   CHK(c == 2);
   1610   for(i = 0; i < 2; i++) {
   1611     OK(scad_geometries_cut(geoms+i, 1, geom_array+i, 1, &geom));
   1612     OK(scad_geometry_is_empty(geom, &e));
   1613     OK(scad_geometry_ref_put(geom));
   1614     CHK(e == 1);
   1615   }
   1616   for(i = 0; i < c; i++) {
   1617     OK(scad_geometry_ref_put(geom_array[i]));
   1618   }
   1619   MEM_RM(&allocator, geom_array);
   1620   OK(scad_geometry_ref_put(geoms[0]));
   1621   OK(scad_geometry_ref_put(geoms[1]));
   1622 
   1623   OK(scad_scene_count(&c));
   1624   CHK(c == 0);
   1625 
   1626   OK(scad_add_box(p1, d1, &geom));
   1627   BAD(scad_stl_export(NULL, NULL, 9, 0));
   1628   BAD(scad_stl_export(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1629   BAD(scad_stl_export(geom, NULL, 9, 0));
   1630   BAD(scad_stl_export(geom, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1631   OK(scad_stl_export(geom, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1));
   1632   OK(scad_geometry_set_name(geom, "name"));
   1633   BAD(scad_stl_export(NULL, NULL, 9, 0));
   1634   BAD(scad_stl_export(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1635   BAD(scad_stl_export(geom, NULL, 9, 0));
   1636   OK(scad_stl_export(geom, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1637   OK(scad_stl_export(geom, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1));
   1638   OK(scad_geometry_ref_put(geom));
   1639 
   1640   OK(scad_scene_count(&c));
   1641   CHK(c == 0);
   1642 
   1643   OK(scad_add_box(p1, d1, &geoms[0]));
   1644   OK(scad_add_box(p4, d1, &geoms[1]));
   1645   OK(scad_geometries_collect(geoms, 2, &geom));
   1646   BAD(scad_stl_export_partial(NULL, geoms, 1, NULL, 9, 0));
   1647   BAD(scad_stl_export_partial(NULL, geoms, 1, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1648   BAD(scad_stl_export_partial(geom, geoms, 1, NULL, 9, 0));
   1649   BAD(scad_stl_export_partial(geom, geoms, 1, NULL, SCAD_FORCE_NORMALS_INWARD, 0));
   1650   OK(scad_stl_export_partial(geom, geoms, 1, "/tmp/test"LINE_STRING,
   1651         SCAD_FORCE_NORMALS_OUTWARD, 1));
   1652   OK(scad_geometry_set_name(geom, "name"));
   1653   BAD(scad_stl_export_partial(NULL, geoms, 1, NULL, 9, 0));
   1654   BAD(scad_stl_export_partial(NULL, geoms, 1, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1655   BAD(scad_stl_export_partial(geom, geoms, 1, NULL, 9, 0));
   1656   OK(scad_stl_export_partial(geom, geoms, 1, NULL, SCAD_FORCE_NORMALS_INWARD, 0));
   1657   OK(scad_stl_export_partial(geom, geoms, 1, "/tmp/test"LINE_STRING,
   1658         SCAD_FORCE_NORMALS_OUTWARD, 1));
   1659   OK(scad_stl_export_partial(geom, NULL, 0, "/tmp/test"LINE_STRING,
   1660         SCAD_FORCE_NORMALS_OUTWARD, 1));
   1661   OK(scad_geometry_ref_put(geom));
   1662   OK(scad_geometry_ref_put(geoms[0]));
   1663   OK(scad_geometry_ref_put(geoms[1]));
   1664 
   1665   OK(scad_scene_count(&c));
   1666   CHK(c == 0);
   1667 
   1668   OK(scad_add_box(p1, d1, &geom));
   1669   BAD(scad_stl_export_split(NULL, NULL, 9, 0));
   1670   BAD(scad_stl_export_split(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1671   BAD(scad_stl_export_split(geom, NULL, 9, 0));
   1672   BAD(scad_stl_export_split(geom, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1673   OK(scad_stl_export_split(geom, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1));
   1674   OK(scad_geometry_set_name(geom, "name"));
   1675   BAD(scad_stl_export_split(NULL, NULL, 9, 0));
   1676   BAD(scad_stl_export_split(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1677   BAD(scad_stl_export_split(geom, NULL, 9, 0));
   1678   OK(scad_stl_export_split(geom, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1679   OK(scad_stl_export_split(geom, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1));
   1680   OK(scad_geometry_ref_put(geom));
   1681 
   1682   OK(scad_scene_count(&c));
   1683   CHK(c == 0);
   1684 
   1685   OK(scad_add_box(p1, d1, &geom));
   1686   darray_double_init(&allocator, &trg);
   1687   OK(scad_geometries_set_mesh_algorithm(&geom, 1, SCAD_INITIAL_MESH_ONLY));
   1688   OK(scad_scene_mesh());
   1689   BAD(scad_stl_get_data(NULL, NULL));
   1690   BAD(scad_stl_get_data(NULL, &trg));
   1691   BAD(scad_stl_get_data(geom, NULL));
   1692   OK(scad_stl_get_data(geom, &trg));
   1693   CHK(12 * 9 == darray_double_size_get(&trg));
   1694   darray_double_release(&trg);
   1695   OK(scad_geometry_ref_put(geom));
   1696 
   1697   OK(scad_scene_count(&c));
   1698   CHK(c == 0);
   1699 
   1700   OK(scad_add_box(p1, d1, &geoms[0]));
   1701   OK(scad_add_box(p4, d1, &geoms[1]));
   1702   OK(scad_geometries_collect(geoms, 2, &geom));
   1703   darray_double_init(&allocator, &trg);
   1704   OK(scad_geometries_set_mesh_algorithm(geoms, 2, SCAD_INITIAL_MESH_ONLY));
   1705   OK(scad_scene_mesh());
   1706   BAD(scad_stl_get_data_partial(NULL, NULL, 0, NULL));
   1707   BAD(scad_stl_get_data_partial(NULL, NULL, 0, &trg));
   1708   BAD(scad_stl_get_data_partial(geom, NULL, 0, NULL));
   1709   OK(scad_stl_get_data_partial(geom, NULL, 0, &trg));
   1710   CHK(2 * 12 * 9 == darray_double_size_get(&trg));
   1711   darray_double_clear(&trg);
   1712   OK(scad_stl_get_data_partial(geom, geoms, 1, &trg));
   1713   CHK(12 * 9 == darray_double_size_get(&trg));
   1714   darray_double_clear(&trg);
   1715   OK(scad_stl_get_data_partial(geom, geoms, 2, &trg));
   1716   CHK(0 == darray_double_size_get(&trg));
   1717   darray_double_release(&trg);
   1718   OK(scad_geometry_ref_put(geom));
   1719   OK(scad_geometry_ref_put(geoms[0]));
   1720   OK(scad_geometry_ref_put(geoms[1]));
   1721 
   1722   OK(scad_scene_count(&c));
   1723   CHK(c == 0);
   1724 
   1725   OK(scad_add_box(p1, d1, &geom));
   1726   darray_double_init(&allocator, &trg);
   1727   OK(scad_stl_get_data(geom, &trg));
   1728   CHK(0 == darray_double_size_get(&trg)); /* No call to mesh */
   1729   BAD(scad_stl_data_write(NULL, NULL, 9, 0));
   1730   BAD(scad_stl_data_write(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1731   BAD(scad_stl_data_write(&trg, NULL, 9, 0));
   1732   BAD(scad_stl_data_write(&trg, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0));
   1733   OK(scad_stl_data_write(&trg, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1));
   1734   OK(scad_geometry_ref_put(geom));
   1735 
   1736   OK(scad_scene_count(&c));
   1737   CHK(c == 0);
   1738 
   1739   options.Misc.LogRefCounting = SCAD_LOG_DIMTAGS_ONLY_UNDELETED;
   1740   OK(scad_set_options(&options));
   1741 
   1742   OK(scad_finalize());
   1743 
   1744   check_memory_allocator(&allocator);
   1745   mem_shutdown_proxy_allocator(&allocator);
   1746   CHK(mem_allocated_size() == 0);
   1747 
   1748   return (res == RES_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
   1749 }