[INFO] fetching crate oxihuman-mesh 0.1.1... [INFO] testing oxihuman-mesh-0.1.1 against try#dec9417b8611e34e787a3e4c37686b5131f9e5c5 for pr-154210-2 [INFO] extracting crate oxihuman-mesh 0.1.1 into /workspace/builds/worker-3-tc2/source [INFO] started tweaking crates.io crate oxihuman-mesh 0.1.1 [INFO] removed 0 missing tests [INFO] finished tweaking crates.io crate oxihuman-mesh 0.1.1 [INFO] tweaked toml for crates.io crate oxihuman-mesh 0.1.1 written to /workspace/builds/worker-3-tc2/source/Cargo.toml [INFO] validating manifest of crates.io crate oxihuman-mesh 0.1.1 on toolchain dec9417b8611e34e787a3e4c37686b5131f9e5c5 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate crates.io crate oxihuman-mesh 0.1.1 already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] efbc7d4e74917a9b5100208f46d176b9652abae294f4244c16ee089627b635b4 [INFO] running `Command { std: "docker" "start" "-a" "efbc7d4e74917a9b5100208f46d176b9652abae294f4244c16ee089627b635b4", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "efbc7d4e74917a9b5100208f46d176b9652abae294f4244c16ee089627b635b4", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "efbc7d4e74917a9b5100208f46d176b9652abae294f4244c16ee089627b635b4", kill_on_drop: false }` [INFO] [stdout] efbc7d4e74917a9b5100208f46d176b9652abae294f4244c16ee089627b635b4 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 4d0699ff452d616a444fd7f65f84c8975925aa8cfef8e17b0e7a943b828d6d54 [INFO] running `Command { std: "docker" "start" "-a" "4d0699ff452d616a444fd7f65f84c8975925aa8cfef8e17b0e7a943b828d6d54", kill_on_drop: false }` [INFO] [stderr] Compiling winnow v0.7.15 [INFO] [stderr] Compiling toml_writer v1.0.6+spec-1.1.0 [INFO] [stderr] Compiling syn v2.0.117 [INFO] [stderr] Compiling toml_datetime v1.0.0+spec-1.1.0 [INFO] [stderr] Compiling serde_spanned v1.0.4 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling toml_parser v1.0.9+spec-1.1.0 [INFO] [stderr] Compiling toml v1.0.6+spec-1.1.0 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling oxihuman-core v0.1.1 [INFO] [stderr] Compiling oxihuman-morph v0.1.1 [INFO] [stderr] Compiling oxihuman-mesh v0.1.1 (/opt/rustwide/workdir) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 07s [INFO] running `Command { std: "docker" "inspect" "4d0699ff452d616a444fd7f65f84c8975925aa8cfef8e17b0e7a943b828d6d54", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "4d0699ff452d616a444fd7f65f84c8975925aa8cfef8e17b0e7a943b828d6d54", kill_on_drop: false }` [INFO] [stdout] 4d0699ff452d616a444fd7f65f84c8975925aa8cfef8e17b0e7a943b828d6d54 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] adedded08ef35d1159df29207a93cb68d1023290fbb6b46da352d2599c148962 [INFO] running `Command { std: "docker" "start" "-a" "adedded08ef35d1159df29207a93cb68d1023290fbb6b46da352d2599c148962", kill_on_drop: false }` [INFO] [stderr] Compiling zerocopy v0.8.42 [INFO] [stderr] Compiling syn v2.0.117 [INFO] [stderr] Compiling cc v1.2.56 [INFO] [stderr] Compiling getrandom v0.4.2 [INFO] [stderr] Compiling regex-syntax v0.8.10 [INFO] [stderr] Compiling rustix v1.1.4 [INFO] [stderr] Compiling once_cell v1.21.4 [INFO] [stderr] Compiling clap_builder v4.6.0 [INFO] [stderr] Compiling wait-timeout v0.2.1 [INFO] [stderr] Compiling criterion-plot v0.8.2 [INFO] [stderr] Compiling rand v0.9.2 [INFO] [stderr] Compiling rand_xorshift v0.4.0 [INFO] [stderr] Compiling page_size v0.6.0 [INFO] [stderr] Compiling alloca v0.4.0 [INFO] [stderr] Compiling clap v4.6.0 [INFO] [stderr] Compiling tempfile v3.27.0 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling rusty-fork v0.3.1 [INFO] [stderr] Compiling zerocopy-derive v0.8.42 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling oxihuman-core v0.1.1 [INFO] [stderr] Compiling tinytemplate v1.2.1 [INFO] [stderr] Compiling half v2.7.1 [INFO] [stderr] Compiling ppv-lite86 v0.2.21 [INFO] [stderr] Compiling ciborium-ll v0.2.2 [INFO] [stderr] Compiling ciborium v0.2.2 [INFO] [stderr] Compiling rand_chacha v0.9.0 [INFO] [stderr] Compiling proptest v1.10.0 [INFO] [stderr] Compiling criterion v0.8.2 [INFO] [stderr] Compiling oxihuman-morph v0.1.1 [INFO] [stderr] Compiling oxihuman-mesh v0.1.1 (/opt/rustwide/workdir) [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 2m 02s [INFO] running `Command { std: "docker" "inspect" "adedded08ef35d1159df29207a93cb68d1023290fbb6b46da352d2599c148962", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "adedded08ef35d1159df29207a93cb68d1023290fbb6b46da352d2599c148962", kill_on_drop: false }` [INFO] [stdout] adedded08ef35d1159df29207a93cb68d1023290fbb6b46da352d2599c148962 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] a5845812ca13e4651783dc868671718e8a8bb8e7830c8173d780f7844f8ec181 [INFO] running `Command { std: "docker" "start" "-a" "a5845812ca13e4651783dc868671718e8a8bb8e7830c8173d780f7844f8ec181", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.22s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/oxihuman_mesh-6cfa3a6ba65aee50) [INFO] [stdout] running 5708 tests [INFO] [stdout] test adaptive_subdivide::tests::build_face_adjacency_single_triangle_vertex0 ... ok [INFO] [stdout] test adaptive_subdivide::tests::adaptive_subdivide_flat_grid_zero_refined_faces ... ok [INFO] [stdout] test adaptive_subdivide::tests::build_face_adjacency_two_triangles ... ok [INFO] [stdout] test adaptive_subdivide::tests::adaptive_subdivide_result_has_valid_indices ... ok [INFO] [stdout] test adaptive_subdivide::tests::dihedral_angle_perpendicular_is_half_pi ... ok [INFO] [stdout] test adaptive_subdivide::tests::loop_subdivide_marked_partial_refinement ... ok [INFO] [stdout] test ao_bake::tests::ao_bake_config_fast ... ok [INFO] [stdout] test adaptive_subdivide::tests::dihedral_angle_flat_is_zero ... ok [INFO] [stdout] test adaptive_subdivide::tests::face_normal_xy_plane_points_up ... ok [INFO] [stdout] test adaptive_subdivide::tests::face_normal_is_unit_length ... ok [INFO] [stdout] test ao_bake::tests::ao_to_vertex_colors_length_matches ... ok [INFO] [stdout] test adaptive_subdivide::tests::face_normal_xz_plane_points_in_y ... ok [INFO] [stdout] test adaptive_subdivide::tests::loop_subdivide_marked_increases_face_count ... ok [INFO] [stdout] test ao_bake::tests::ao_bake_config_default ... ok [INFO] [stdout] test ao_bake::tests::ao_to_vertex_colors_range_correct ... ok [INFO] [stdout] test ao_bake::tests::fast_vertex_ao_values_in_range ... ok [INFO] [stdout] test ao_bake::tests::bake_vertex_ao_empty_mesh ... ok [INFO] [stdout] test ao_bake::tests::fast_vertex_ao_length_matches ... ok [INFO] [stdout] test ao_bake::tests::fast_vertex_ao_single_triangle ... ok [INFO] [stdout] test adaptive_subdivide::tests::dihedral_angle_anti_parallel_is_pi ... ok [INFO] [stdout] test ao_bake::tests::ao_bake_config_quality ... ok [INFO] [stdout] test ao_bake::tests::ray_triangle_intersect_miss_behind ... ok [INFO] [stdout] test atlas::tests::island_width_height ... ok [INFO] [stdout] test atlas::tests::mesh_to_island_extracts_uvs ... ok [INFO] [stdout] test ao_bake::tests::ray_triangle_intersect_miss_parallel ... ok [INFO] [stdout] test atlas::tests::pack_single_island_fits ... ok [INFO] [stdout] test ao_bake::tests::tangent_to_world_identity_normal_preserves_y ... ok [INFO] [stdout] test ao_bake::tests::tangent_to_world_preserves_length ... ok [INFO] [stdout] test atlas::tests::island_bbox_computed ... ok [INFO] [stdout] test ao_bake::tests::ray_hits_mesh_returns_true_for_hit ... ok [INFO] [stdout] test ao_bake::tests::ray_triangle_intersect_hits ... ok [INFO] [stdout] test ao_bake::tests::ray_hits_mesh_returns_false_for_miss ... ok [INFO] [stdout] test atlas::tests::pack_two_islands_both_fit ... ok [INFO] [stdout] test adaptive_subdivide::tests::adaptive_subdivide_folded_mesh_refines_fold ... ok [INFO] [stdout] test atlas::tests::pack_utilization_positive ... ok [INFO] [stdout] test atlas::tests::remap_uvs_count_matches ... ok [INFO] [stdout] test atlas::tests::remap_uvs_in_range ... ok [INFO] [stdout] test bounds::tests::aabb_center_correct ... ok [INFO] [stdout] test bounds::tests::aabb_contains_point ... ok [INFO] [stdout] test bounds::tests::aabb_from_empty_returns_none ... ok [INFO] [stdout] test bounds::tests::aabb_overlaps ... ok [INFO] [stdout] test bounds::tests::aabb_volume_correct ... ok [INFO] [stdout] test bounds::tests::aabb_from_unit_cube ... ok [INFO] [stdout] test bounds::tests::bounding_sphere_contains_all_points ... ok [INFO] [stdout] test bounds::tests::bounding_sphere_contains_center ... ok [INFO] [stdout] test bounds::tests::compute_bounds_all_three ... ok [INFO] [stdout] test bounds::tests::obb_from_aabb_volume ... ok [INFO] [stdout] test bvh::tests::bvh_aabb_intersects_ray_hit ... ok [INFO] [stdout] test bvh::tests::bvh_aabb_intersects_ray_miss ... ok [INFO] [stdout] test bvh::tests::bvh_backface_hit_returns_some ... ok [INFO] [stdout] test bvh::tests::bvh_intersect_ray_miss ... ok [INFO] [stdout] test bvh::tests::bvh_intersects_ray_any_false_beyond_max_t ... ok [INFO] [stdout] test bvh::tests::bvh_ray_hit_position_on_triangle ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_config_default ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_n_iterations_grows_mesh ... ok [INFO] [stdout] test bvh::tests::bvh_vs_brute_force_same_result ... ok [INFO] [stdout] test bvh::tests::bvh_build_many_triangles ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_increases_face_count ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_normals_valid_after_subdivision ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_indices_valid ... ok [INFO] [stdout] test bvh::tests::bvh_intersect_ray_all_count ... ok [INFO] [stdout] test bvh::tests::bvh_depth_positive ... ok [INFO] [stdout] test bvh::tests::bvh_build_single_triangle ... ok [INFO] [stdout] test bvh::tests::bvh_intersect_ray_hits_triangle ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_no_nan_positions ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_positions_are_finite ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_zero_iterations_unchanged ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_vertex_count_increases ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_with_config_one_iter ... ok [INFO] [stdout] test cloth_panel::tests::test_panel_params_default ... ok [INFO] [stdout] test cloth_panel::tests::test_panel_seam_edges ... ok [INFO] [stdout] test cloth_panel::tests::test_layout_panels_flat ... ok [INFO] [stdout] test cloth_panel::tests::test_rectangular_panel_faces ... ok [INFO] [stdout] test cloth_panel::tests::test_rectangular_panel_vertices ... ok [INFO] [stdout] test cloth_panel::tests::test_panel_uv_bounds ... ok [INFO] [stdout] test cloth_panel::tests::test_sleeve_panel ... ok [INFO] [stdout] test cloth_panel::tests::test_trapezoid_panel ... ok [INFO] [stdout] test cloth_panel::tests::test_rectangular_panel_uvs ... ok [INFO] [stdout] test cloth_panel::tests::test_total_panel_area ... ok [INFO] [stdout] test bvh::tests::bvh_intersects_ray_any_true ... ok [INFO] [stdout] test bounds::tests::aabb_union ... ok [INFO] [stdout] test cloth_panel::tests::test_triangle_panel ... ok [INFO] [stdout] test cloth_sim::tests::test_add_particle_returns_index ... ok [INFO] [stdout] test cloth_sim::tests::test_build_cloth_grid_particle_count ... ok [INFO] [stdout] test cloth_panel::tests::test_tshirt_panels_count ... ok [INFO] [stdout] test cloth_sim::tests::test_build_cloth_grid_top_row_pinned ... ok [INFO] [stdout] test cloth_sim::tests::test_cloth_sim_params_default ... ok [INFO] [stdout] test cloth_sim::tests::test_gravity_pulls_free_particle_down ... ok [INFO] [stdout] test cloth_sim::tests::test_pin_particle_zeroes_inv_mass ... ok [INFO] [stdout] test cloth_sim::tests::test_positions_count_matches_particles ... ok [INFO] [stdout] test cloth_sim::tests::test_pinned_particle_does_not_move ... ok [INFO] [stdout] test cloth_sim::tests::test_apply_sim_to_mesh ... ok [INFO] [stdout] test cloth_sim::tests::test_constraint_keeps_particles_connected ... ok [INFO] [stdout] test cloth_sim::tests::test_add_constraint_sets_rest_length ... ok [INFO] [stdout] test ao_bake::tests::hemisphere_samples_all_unit_length ... ok [INFO] [stdout] test ao_bake::tests::bake_vertex_ao_values_in_range ... ok [INFO] [stdout] test ao_bake::tests::bake_vertex_ao_length_matches_vertices ... ok [INFO] [stdout] test ao_bake::tests::hemisphere_samples_count_correct ... ok [INFO] [stdout] test ao_bake::tests::hemisphere_samples_all_positive_y ... ok [INFO] [stdout] test cloth_panel::tests::test_circular_panel ... ok [INFO] [stdout] test catmull_clark::tests::catmull_clark_tetrahedron_gets_rounder ... ok [INFO] [stdout] test cloth_sim::tests::test_simulate_does_not_panic ... ok [INFO] [stdout] test clothing::tests::barycentric_at_vertex_0 ... ok [INFO] [stdout] test clothing::tests::barycentric_midpoint_with_offset ... ok [INFO] [stdout] test clothing::tests::vertex_count_matches_clothing_obj ... ok [INFO] [stdout] test cloth_sim::tests::test_simulate_n_steps_frame_count ... ok [INFO] [stdout] test color_utils::colors_tests::set_uniform_color_sets_all_verts ... ok [INFO] [stdout] test color_utils::colors_tests::color_rgba_values_correct ... ok [INFO] [stdout] test cloth_sim::tests::test_simulate_n_steps_kinetic_energy_nonneg ... ok [INFO] [stdout] test connectivity::tests::boundary_edges_of_triangle ... ok [INFO] [stdout] test connectivity::tests::closed_mesh_no_boundary ... ok [INFO] [stdout] test connectivity::tests::boundary_loop_forms_closed_chain ... ok [INFO] [stdout] test connectivity::tests::euler_characteristic_sphere_is_2 ... ok [INFO] [stdout] test connectivity::tests::non_manifold_edge_detection ... ok [INFO] [stdout] test connectivity::tests::is_manifold_true_for_clean_mesh ... ok [INFO] [stdout] test connectivity::tests::single_triangle_stats ... ok [INFO] [stdout] test connectivity::tests::split_components_count_matches ... ok [INFO] [stdout] test connectivity::tests::connected_component_id_consistent ... ok [INFO] [stdout] test connectivity::tests::connected_quad_one_component ... ok [INFO] [stdout] test connectivity::tests::two_separate_triangles_two_components ... ok [INFO] [stdout] test connectivity::tests::split_components_each_connected ... ok [INFO] [stdout] test connectivity::tests::vertex_valence_triangle ... ok [INFO] [stdout] test convex_hull::tests::convex_hull_all_input_inside_or_on_hull ... ok [INFO] [stdout] test convex_hull::tests::convex_hull_coplanar_returns_none ... ok [INFO] [stdout] test convex_hull::tests::convex_hull_face_count_positive ... ok [INFO] [stdout] test convex_hull::tests::convex_hull_of_cube_vertices ... ok [INFO] [stdout] test convex_hull::tests::convex_hull_returns_none_for_fewer_than_4_points ... ok [INFO] [stdout] test clothing::tests::clothing_tracks_morphed_base ... ok [INFO] [stdout] test clothing::tests::mismatched_binding_errors ... ok [INFO] [stdout] test convex_hull::tests::convex_hull_tetrahedron_has_4_faces ... ok [INFO] [stdout] test convex_hull::tests::point_in_hull_far_point_is_outside ... ok [INFO] [stdout] test convex_hull::tests::point_in_hull_center_is_inside ... ok [INFO] [stdout] test curvature::tests::curvature_stats_on_simple_mesh ... ok [INFO] [stdout] test convex_hull::tests::convex_hull_volume_positive ... ok [INFO] [stdout] test curvature::tests::compute_curvature_curvedness_nonneg ... ok [INFO] [stdout] test curvature::tests::gaussian_curvature_flat_mesh_near_zero ... ok [INFO] [stdout] test curvature::tests::find_curvature_peaks_valid_indices ... ok [INFO] [stdout] test color_utils::colors_tests::no_color_mesh_colors_none ... ok [INFO] [stdout] test convex_hull::tests::convex_hull_vertex_count_lte_input ... ok [INFO] [stdout] test convex_hull::tests::convex_hull_to_mesh_buffers_has_valid_indices ... ok [INFO] [stdout] test clothing::tests::out_of_bounds_base_index_errors ... ok [INFO] [stdout] test curvature::tests::find_feature_vertices_empty_for_flat ... ok [INFO] [stdout] test curvature::tests::find_saddle_points_valid_indices ... ok [INFO] [stdout] test curvature::tests::compute_curvature_no_nan ... ok [INFO] [stdout] test curvature::tests::compute_curvature_k1_gte_k2 ... ok [INFO] [stdout] test curvature::tests::gaussian_curvature_length_matches ... ok [INFO] [stdout] test convex_hull::tests::convex_hull_surface_area_positive ... ok [INFO] [stdout] test curvature::tests::gaussian_integral_rough_check ... ok [INFO] [stdout] test curvature::tests::vertex_curvature_shape_index_in_range ... ok [INFO] [stdout] test displacement_map::tests::test_apply_displacement_basic ... ok [INFO] [stdout] test displacement_map::tests::test_checkerboard ... ok [INFO] [stdout] test curvature::tests::mean_curvature_flat_mesh_near_zero ... ok [INFO] [stdout] test displacement_map::tests::test_displacement_map_get_set ... ok [INFO] [stdout] test displacement_map::tests::test_displacement_map_invert ... ok [INFO] [stdout] test displacement_map::tests::test_apply_displacement_masked ... ok [INFO] [stdout] test displacement_map::tests::test_displacement_map_normalize ... ok [INFO] [stdout] test curvature::tests::mean_curvature_length_matches_vertex_count ... ok [INFO] [stdout] test decimate::tests::decimate_reduces_faces ... ok [INFO] [stdout] test displacement_map::tests::test_displacement_map_new ... ok [INFO] [stdout] test decimate::tests::decimate_index_bounds_valid ... ok [INFO] [stdout] test decimate::tests::decimate_with_info_metadata ... ok [INFO] [stdout] test displacement_map::tests::test_displacement_map_sample_bilinear ... ok [INFO] [stdout] test displacement_map::tests::test_apply_displacement_zero_midlevel ... ok [INFO] [stdout] test decimate::tests::decimate_above_target_no_change ... ok [INFO] [stdout] test displacement_map::tests::test_displacement_params_default ... ok [INFO] [stdout] test decimate::tests::decimate_ratio_half ... ok [INFO] [stdout] test displacement_map::tests::test_displacement_map_from_fn ... ok [INFO] [stdout] test dqs::tests::apply_dqs_identity_unchanged ... ok [INFO] [stdout] test displacement_map::tests::test_displacement_map_sample_exact ... ok [INFO] [stdout] test dqs::tests::apply_dqs_rotation_applied ... ok [INFO] [stdout] test dqs::tests::apply_dqs_translation_applied ... ok [INFO] [stdout] test decimate::tests::decimate_result_has_vertices ... ok [INFO] [stdout] test dqs::tests::dual_quat_add_and_normalize ... ok [INFO] [stdout] test dqs::tests::dual_quat_identity_transform_identity ... ok [INFO] [stdout] test dqs::tests::dual_quat_normalize_real_unit_length ... ok [INFO] [stdout] test dqs::tests::dual_quat_transform_point_rotation ... ok [INFO] [stdout] test dqs::tests::dual_quat_transform_point_translation ... ok [INFO] [stdout] test dqs::tests::dual_quat_from_rot_trans_translation_correct ... ok [INFO] [stdout] test dqs::tests::quat_from_axis_angle_90_deg ... ok [INFO] [stdout] test dqs::tests::quat_identity_rotates_identity ... ok [INFO] [stdout] test dqs::tests::quat_mul_identity_unchanged ... ok [INFO] [stdout] test dqs::tests::quat_rotate_vec_x_axis ... ok [INFO] [stdout] test edge_loops::tests::edge_adjacency_triangle ... ok [INFO] [stdout] test edge_loops::tests::boundary_edges_open_mesh ... ok [INFO] [stdout] test edge_loops::tests::boundary_edges_closed_mesh ... ok [INFO] [stdout] test edge_loops::tests::edge_contains_vertex ... ok [INFO] [stdout] test edge_loops::tests::edge_new_already_ordered ... ok [INFO] [stdout] test edge_loops::tests::edge_new_normalizes_order ... ok [INFO] [stdout] test edge_loops::tests::edge_other_returns_opposite ... ok [INFO] [stdout] test edge_loops::tests::edges_to_loops_simple_triangle ... ok [INFO] [stdout] test edge_loops::tests::edges_to_chains_open_path ... ok [INFO] [stdout] test edge_loops::tests::sharp_edges_flat_mesh_none ... ok [INFO] [stdout] test edge_loops::tests::extract_edge_loop_min_length ... ok [INFO] [stdout] test feature_decimation::tests::feature_decimate_boundary_lock_keeps_edges ... ok [INFO] [stdout] test feature_decimation::tests::feature_decimate_flat_grid_reduces_faces ... ok [INFO] [stdout] test feature_decimation::tests::collapse_edge_removes_degenerate_triangles ... ok [INFO] [stdout] test edge_loops::tests::extract_edges_triangle_count ... ok [INFO] [stdout] test displacement_map::tests::test_displacement_map_tiled ... ok [INFO] [stdout] test feature_decimation::tests::count_valid_triangles_degenerate_excluded ... ok [INFO] [stdout] test edge_loops::tests::sharp_edges_cube_has_edges ... ok [INFO] [stdout] test feature_decimation::tests::count_valid_triangles_all_valid ... ok [INFO] [stdout] test feature_decimation::tests::collapse_edge_remaps_indices ... ok [INFO] [stdout] test feature_decimation::tests::count_valid_triangles_empty ... ok [INFO] [stdout] test feature_decimation::tests::edge_collapse_error_same_position_is_zero ... ok [INFO] [stdout] test feature_decimation::tests::edge_collapse_error_unit_distance ... ok [INFO] [stdout] test edge_loops::tests::extract_edges_no_duplicates ... ok [INFO] [stdout] test edge_loops::tests::uv_seam_edges_no_seam_mesh ... ok [INFO] [stdout] test feature_decimation::tests::feature_decimate_locked_edges_survive ... ok [INFO] [stdout] test feature_decimation::tests::feature_decimate_respects_target_ratio ... ok [INFO] [stdout] test feature_decimation::tests::mark_feature_edges_boundary_lock_disabled ... ok [INFO] [stdout] test feature_decimation::tests::mark_feature_edges_boundary_lock_enabled ... ok [INFO] [stdout] test feature_decimation::tests::mark_feature_edges_flat_mesh_no_sharp_edges ... ok [INFO] [stdout] test feature_decimation::tests::mark_feature_edges_folded_mesh_marks_shared_edge ... ok [INFO] [stdout] test ffd::tests::test_bernstein_degree1 ... ok [INFO] [stdout] test ffd::tests::test_bernstein_degree2 ... ok [INFO] [stdout] test ffd::tests::test_binomial_basic ... ok [INFO] [stdout] test ffd::tests::test_control_point_count ... ok [INFO] [stdout] test ffd::tests::test_ffd_apply_identity ... ok [INFO] [stdout] test ffd::tests::test_lattice_from_mesh ... ok [INFO] [stdout] test ffd::tests::test_lattice_get_set ... ok [INFO] [stdout] test ffd::tests::test_lattice_new ... ok [INFO] [stdout] test ffd::tests::test_lattice_to_local ... ok [INFO] [stdout] test ffd::tests::test_make_bend_lattice ... ok [INFO] [stdout] test ffd::tests::test_make_twist_lattice ... ok [INFO] [stdout] test geodesic::tests::geodesic_all_pairs_small_mesh ... ok [INFO] [stdout] test geodesic::tests::geodesic_from_vertices_multi_source_correct ... ok [INFO] [stdout] test geodesic::tests::geodesic_heat_map_length_matches_vertices ... ok [INFO] [stdout] test geodesic::tests::geodesic_max_distance_positive ... ok [INFO] [stdout] test geodesic::tests::geodesic_nearest_vertex_is_adjacent ... ok [INFO] [stdout] test geodesic::tests::geodesic_normalized_range_0_1 ... ok [INFO] [stdout] test geodesic::tests::geodesic_path_to_adjacent_vertex ... ok [INFO] [stdout] test geodesic::tests::geodesic_path_to_same_vertex_length_one ... ok [INFO] [stdout] test ffd::tests::test_ffd_apply_translation ... ok [INFO] [stdout] test ffd::tests::test_lattice_evaluate_identity ... ok [INFO] [stdout] test geodesic::tests::geodesic_single_triangle_distances_positive ... ok [INFO] [stdout] test geodesic::tests::geodesic_single_triangle_source_zero ... ok [INFO] [stdout] test geodesic::tests::geodesic_unreachable_vertex_is_infinity ... ok [INFO] [stdout] test geodesic::tests::geodesic_vertices_within_radius ... ok [INFO] [stdout] test geodesic::tests::mesh_diameter_returns_positive_distance ... ok [INFO] [stdout] test groups::tests::from_y_bands_creates_seven_groups ... ok [INFO] [stdout] test groups::tests::from_y_bands_head_at_top ... ok [INFO] [stdout] test groups::tests::group_contains_vertex ... ok [INFO] [stdout] test groups::tests::group_difference ... ok [INFO] [stdout] test groups::tests::group_intersect ... ok [INFO] [stdout] test groups::tests::group_union_deduplicates ... ok [INFO] [stdout] test groups::tests::map_get_case_insensitive ... ok [INFO] [stdout] test convex_hull::tests::mesh_convex_hull_works_on_sphere_mesh ... ok [INFO] [stdout] test groups::tests::to_json_has_keys ... ok [INFO] [stdout] test groups::tests::weight_of_returns_one_for_simple_group ... ok [INFO] [stdout] test hair_cards::tests::test_blended_surface_normal_mode ... ok [INFO] [stdout] test hair_cards::tests::test_card_normals_valid ... ok [INFO] [stdout] test hair_cards::tests::test_curled_hair_card ... ok [INFO] [stdout] test hair_cards::tests::test_hair_card_params_default ... ok [INFO] [stdout] test hair_cards::tests::test_hair_card_uv_coords ... ok [INFO] [stdout] test hair_cards::tests::test_hair_cards_from_guides_multiple ... ok [INFO] [stdout] test hair_cards::tests::test_hair_guide_length ... ok [INFO] [stdout] test hair_cards::tests::test_hair_guide_direction_at ... ok [INFO] [stdout] test hair_cards::tests::test_hair_guide_point_at ... ok [INFO] [stdout] test hair_cards::tests::test_hair_guide_segment_count ... ok [INFO] [stdout] test hair_cards::tests::test_hair_guide_new ... ok [INFO] [stdout] test hair_cards::tests::test_straight_hair_card_vertices ... ok [INFO] [stdout] test hair_cards::tests::test_hair_guide_with_root_normal ... ok [INFO] [stdout] test heat_map::tests::test_color3_to_u8 ... ok [INFO] [stdout] test heat_map::tests::test_apply_to_mesh ... ok [INFO] [stdout] test heat_map::tests::test_cool_ramp ... ok [INFO] [stdout] test heat_map::tests::test_grayscale_ramp ... ok [INFO] [stdout] test heat_map::tests::test_diverging_ramp_midpoint ... ok [INFO] [stdout] test heat_map::tests::test_hot_ramp ... ok [INFO] [stdout] test heat_map::tests::test_lerp_color ... ok [INFO] [stdout] test hair_cards::tests::test_straight_hair_card_segments ... ok [INFO] [stdout] test heat_map::tests::test_heat_map_color_at ... ok [INFO] [stdout] test heat_map::tests::test_heat_map_new_auto_range ... ok [INFO] [stdout] test heat_map::tests::test_scalars_to_colors ... ok [INFO] [stdout] test heat_map::tests::test_scalars_to_colors_range_explicit ... ok [INFO] [stdout] test heat_map::tests::test_custom_ramp ... ok [INFO] [stdout] test ik::tests::fabrik_solve_preserves_bone_lengths ... ok [INFO] [stdout] test heat_map::tests::test_viridis_ramp ... ok [INFO] [stdout] test heat_map::tests::test_heat_map_normalize ... ok [INFO] [stdout] test ik::tests::fabrik_solve_unreachable_target_returns_stretched ... ok [INFO] [stdout] test ik::tests::two_bone_ik_end_pos_near_target_when_reachable ... ok [INFO] [stdout] test ik::tests::fabrik_solve_result_length_matches_joints ... ok [INFO] [stdout] test ik::tests::two_bone_ik_equal_bones ... ok [INFO] [stdout] test ik::tests::two_bone_ik_mid_pos_correct_distance_from_root ... ok [INFO] [stdout] test ik::tests::fabrik_solve_three_joints_near_target ... ok [INFO] [stdout] test ik::tests::fabrik_solve_two_joints_reaches_target ... ok [INFO] [stdout] test ik::tests::two_bone_ik_unreachable_target ... ok [INFO] [stdout] test ik::tests::two_bone_ik_mid_pos_correct_distance_from_end ... ok [INFO] [stdout] test ik::tests::two_bone_ik_with_hint_bends_correctly ... ok [INFO] [stdout] test integrity::tests::finite_positions_check ... ok [INFO] [stdout] test lod::tests::empty_mesh_returns_empty ... ok [INFO] [stdout] test integrity::tests::index_bounds_fast_path ... ok [INFO] [stdout] test integrity::tests::valid_mesh_passes ... ok [INFO] [stdout] test integrity::tests::nan_position_detected ... ok [INFO] [stdout] test integrity::tests::non_manifold_edge_detected ... ok [INFO] [stdout] test integrity::tests::out_of_bounds_index_detected ... ok [INFO] [stdout] test lod::tests::half_lod_reduces_vertices ... ok [INFO] [stdout] test lod::tests::full_lod_unchanged ... ok [INFO] [stdout] test lod::tests::lod_centroids_within_bbox ... ok [INFO] [stdout] test lod::tests::lod_no_out_of_bounds_indices ... ok [INFO] [stdout] test marching_cubes::tests::fill_sphere_sdf_negative_outside ... ok [INFO] [stdout] test marching_cubes::tests::fill_sphere_sdf_positive_inside ... ok [INFO] [stdout] test hair_cards::tests::test_guides_from_mesh ... ok [INFO] [stdout] test hair_cards::tests::test_hair_cards_from_guides_empty ... ok [INFO] [stdout] test heat_map::tests::test_all_colors_rgba ... ok [INFO] [stdout] test heat_map::tests::test_rainbow_ramp_endpoints ... ok [INFO] [stdout] test ik::tests::two_bone_ik_reachable_target ... ok [INFO] [stdout] test ik::tests::two_bone_ik_straight_reach ... ok [INFO] [stdout] test lod::tests::quarter_lod_fewer_than_half ... ok [INFO] [stdout] test integrity::tests::degenerate_triangle_detected ... ok [INFO] [stdout] test marching_cubes::tests::scalar_field_set_get ... ok [INFO] [stdout] test measurements::tests::aabb_unit_cube ... ok [INFO] [stdout] test measurements::tests::empty_mesh_returns_none ... ok [INFO] [stdout] test mesh::tests::from_morph_preserves_data ... ok [INFO] [stdout] test mesh_adaptive_lod::tests::test_adaptive_lod_to_json ... ok [INFO] [stdout] test mesh_adaptive_lod::tests::test_empty_levels ... ok [INFO] [stdout] test marching_cubes::tests::marching_cubes_empty_field_no_faces ... ok [INFO] [stdout] test mesh_adaptive_lod::tests::test_lod_level_count ... ok [INFO] [stdout] test mesh_adaptive_lod::tests::test_lod_reduction_ratio_last ... ok [INFO] [stdout] test mesh_adaptive_lod::tests::test_lod_reduction_ratio_level0 ... ok [INFO] [stdout] test mesh_adaptive_lod::tests::test_select_lod_far ... ok [INFO] [stdout] test mesh_adaptive_lod::tests::test_select_lod_close ... ok [INFO] [stdout] test mesh_adaptive_lod::tests::test_select_lod_zero_distance ... ok [INFO] [stdout] test mesh_adaptive_lod::tests::test_triangle_count_at_oob ... ok [INFO] [stdout] test mesh_adaptive_subdivision::tests::adapt_subdiv_face_count_consistent ... ok [INFO] [stdout] test mesh_adaptive_lod::tests::test_triangle_count_at_zero ... ok [INFO] [stdout] test mesh_adaptive_subdivision::tests::adapt_subdiv_vertex_count_gte_input ... ok [INFO] [stdout] test mesh_adaptive_subdivision::tests::adaptive_subdivision_indices_valid ... ok [INFO] [stdout] test mesh_adaptive_subdivision::tests::adaptive_subdivision_zero_iterations ... ok [INFO] [stdout] test mesh_adaptive_subdivision::tests::adaptive_subdivision_single_tri_no_neighbor ... ok [INFO] [stdout] test mesh_adaptive_subdivision::tests::face_normal_z_axis ... ok [INFO] [stdout] test mesh_adaptive_subdivision::tests::subdivide_triangle_adds_three_vertices ... ok [INFO] [stdout] test mesh_align::tests::align_bounding_boxes_matches_target_extent ... ok [INFO] [stdout] test mesh_align::tests::align_to_axes_centroid_zero ... ok [INFO] [stdout] test mesh_align::tests::align_to_axes_max_dist_unit ... ok [INFO] [stdout] test mesh_align::tests::apply_rotation_identity_unchanged ... ok [INFO] [stdout] test mesh_align::tests::bounding_box_correct ... ok [INFO] [stdout] test mesh_align::tests::bounding_box_empty_returns_zeros ... ok [INFO] [stdout] test mesh_align::tests::centroid_of_symmetric_set_is_center ... ok [INFO] [stdout] test mesh_align::tests::covariance_matrix_symmetric ... ok [INFO] [stdout] test mesh_align::tests::empty_mesh_handled_gracefully ... ok [INFO] [stdout] test mesh_align::tests::find_nearest_returns_correct_index ... ok [INFO] [stdout] test mesh_align::tests::icp_identical_meshes_zero_residual ... ok [INFO] [stdout] test mesh_align::tests::icp_offset_source_converges ... ok [INFO] [stdout] test mesh_align::tests::normalize_to_unit_box_range ... ok [INFO] [stdout] test mesh_align::tests::scale_mesh_doubles_positions ... ok [INFO] [stdout] test mesh_align::tests::translate_then_centroid_is_zero ... ok [INFO] [stdout] test mesh_align_axes::tests::align_preserves_vertex_count ... ok [INFO] [stdout] test mesh_align_axes::tests::align_single_point ... ok [INFO] [stdout] test mesh_align_axes::tests::aligned_centroid_near_origin ... ok [INFO] [stdout] test mesh_align_axes::tests::compute_centroid_empty ... ok [INFO] [stdout] test mesh_align_axes::tests::compute_centroid_simple ... ok [INFO] [stdout] test mesh_align_axes::tests::covariance_empty_returns_zeros ... ok [INFO] [stdout] test marching_cubes::tests::marching_cubes_box_sdf_has_faces ... ok [INFO] [stdout] test mesh_align_axes::tests::power_iterate_produces_unit_vec ... ok [INFO] [stdout] test mesh_adaptive_subdivision::tests::config_default_sane ... ok [INFO] [stdout] test mesh_align_axes::tests::covariance_is_symmetric ... ok [INFO] [stdout] test mesh_align_axes::tests::principal_axes_near_orthogonal ... ok [INFO] [stdout] test mesh_align_axes::tests::variance_along_axis_nonneg ... ok [INFO] [stdout] test mesh_align_vertices::tests::align_to_average_result ... ok [INFO] [stdout] test mesh_align_vertices::tests::align_out_of_bounds_skipped ... ok [INFO] [stdout] test mesh_align_vertices::tests::align_to_max_result ... ok [INFO] [stdout] test mesh_align_vertices::tests::align_to_value_sets_all ... ok [INFO] [stdout] test mesh_align_vertices::tests::align_to_min_result ... ok [INFO] [stdout] test mesh_align_vertices::tests::average_along_x ... ok [INFO] [stdout] test mesh_align_vertices::tests::axis_index_correct ... ok [INFO] [stdout] test mesh_ambient_occ::tests::ao_values_in_range ... ok [INFO] [stdout] test mesh_align_vertices::tests::vertex_range_correct ... ok [INFO] [stdout] test mesh_align_vertices::tests::vertex_range_empty ... ok [INFO] [stdout] test mesh_ambient_occ::tests::ao_vector_size_correct ... ok [INFO] [stdout] test mesh_ambient_occ::tests::average_ao_in_range ... ok [INFO] [stdout] test mesh_ambient_occ::tests::apply_ao_scales_colors ... ok [INFO] [stdout] test mesh_ambient_occ::tests::average_ao_empty ... ok [INFO] [stdout] test mesh_ambient_occ::tests::bent_normal_unit_length ... ok [INFO] [stdout] test mesh_ambient_occ::tests::default_config_positive ... ok [INFO] [stdout] test mesh_ambient_occ::tests::hemisphere_samples_v2_count ... ok [INFO] [stdout] test mesh_ambient_occ::tests::hemisphere_samples_v2_unit ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::ao_bvh_ray_cast_hit ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::ao_bvh_ray_cast_miss ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::ao_is_one_for_isolated_vertex ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::ao_values_in_range ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::bake_ao_empty_mesh_returns_empty ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::lcg_produces_values_in_range ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::moller_trumbore_hit ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::moller_trumbore_miss ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::single_triangle_ao_all_in_range ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::test_ao_estimate_stub ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::test_ao_params_invalid ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::test_ao_sample_hemisphere_normalized ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::test_ao_to_color ... ok [INFO] [stdout] test mesh_ambient_occlusion::tests::test_new_ao_params ... ok [INFO] [stdout] test mesh_ambient_occlusion_mesh::tests::test_average_ao_empty ... ok [INFO] [stdout] test mesh_ambient_occlusion_mesh::tests::test_average_ao_uniform ... ok [INFO] [stdout] test mesh_ambient_occlusion_mesh::tests::test_boost_ao_contrast ... ok [INFO] [stdout] test mesh_ambient_occlusion_mesh::tests::test_default_config_ray_count ... ok [INFO] [stdout] test mesh_ambient_occlusion_mesh::tests::test_fill_ao_clamps ... ok [INFO] [stdout] test mesh_ambient_occlusion_mesh::tests::test_hemisphere_samples_count ... ok [INFO] [stdout] test mesh_ambient_occlusion_mesh::tests::test_new_ao_mesh_empty ... ok [INFO] [stdout] test mesh_ambient_occlusion_mesh::tests::test_smooth_ao_changes_values ... ok [INFO] [stdout] test mesh_ambient_occlusion_mesh::tests::test_smooth_ao_stays_in_range ... ok [INFO] [stdout] test mesh_ambient_occlusion_mesh::tests::test_validate_ao_valid ... ok [INFO] [stdout] test mesh_anchor_point::tests::add_anchor_increments_count ... ok [INFO] [stdout] test mesh_anchor_point::tests::add_anchor_weighted_clamps_strength ... ok [INFO] [stdout] test mesh_anchor_point::tests::average_strength_correct ... ok [INFO] [stdout] test mesh_anchor_point::tests::average_strength_empty_set_returns_zero ... ok [INFO] [stdout] test mesh_anchor_point::tests::find_anchor_missing_returns_none ... ok [INFO] [stdout] test mesh_anchor_point::tests::find_anchor_returns_correct_vertex ... ok [INFO] [stdout] test mesh_anchor_point::tests::json_output_contains_vertex_key ... ok [INFO] [stdout] test mesh_anchor_point::tests::json_output_empty_is_empty_array ... ok [INFO] [stdout] test mesh_anchor_point::tests::new_set_is_empty ... ok [INFO] [stdout] test mesh_anchor_point::tests::prune_removes_weak_anchors ... ok [INFO] [stdout] test mesh_angle_bisector::tests::test_angle_bisector_right_angle ... ok [INFO] [stdout] test mesh_angle_bisector::tests::test_bisector_result_to_json ... ok [INFO] [stdout] test mesh_angle_bisector::tests::test_compute_bisectors_empty ... ok [INFO] [stdout] test mesh_angle_bisector::tests::test_compute_bisectors_single ... ok [INFO] [stdout] test mesh_angle_bisector::tests::test_dot3 ... ok [INFO] [stdout] test mesh_angle_bisector::tests::test_is_valid_bisector ... ok [INFO] [stdout] test mesh_angle_bisector::tests::test_normalize3 ... ok [INFO] [stdout] test mesh_angle_bisector::tests::test_normalize3_zero ... ok [INFO] [stdout] test mesh_angle_bisector::tests::test_vec_length ... ok [INFO] [stdout] test mesh_angle_bisector::tests::test_vertex_angle_right ... ok [INFO] [stdout] test mesh_anisotropic_smooth::tests::aniso_avg_displacement_nonneg ... ok [INFO] [stdout] test mesh_anisotropic_smooth::tests::config_default_sane ... ok [INFO] [stdout] test mesh_anisotropic_smooth::tests::flat_mesh_stays_flat ... ok [INFO] [stdout] test mesh_anisotropic_smooth::tests::iterations_done_stored ... ok [INFO] [stdout] test mesh_anisotropic_smooth::tests::smooth_positions_finite ... ok [INFO] [stdout] test mesh_anisotropic_smooth::tests::smooth_preserves_count ... ok [INFO] [stdout] test mesh_anisotropic_smooth::tests::smooth_step_count_preserved ... ok [INFO] [stdout] test mesh_anisotropic_smooth::tests::smooth_zero_iterations_unchanged ... ok [INFO] [stdout] test mesh_annulus_gen::tests::test_annulus_area ... ok [INFO] [stdout] test mesh_annulus_gen::tests::test_annulus_area_positive ... ok [INFO] [stdout] test mesh_annulus_gen::tests::test_annulus_face_count ... ok [INFO] [stdout] test mesh_annulus_gen::tests::test_annulus_vertex_count ... ok [INFO] [stdout] test mesh_annulus_gen::tests::test_annulus_vertex_inner_outer ... ok [INFO] [stdout] test mesh_annulus_gen::tests::test_new_annulus ... ok [INFO] [stdout] test mesh_antiprism::tests::test_antiprism_empty_on_too_few_sides ... ok [INFO] [stdout] test mesh_antiprism::tests::test_antiprism_expected_tris ... ok [INFO] [stdout] test mesh_antiprism::tests::test_antiprism_sides_stored ... ok [INFO] [stdout] test mesh_antiprism::tests::test_antiprism_square ... ok [INFO] [stdout] test mesh_antiprism::tests::test_antiprism_tri_count ... ok [INFO] [stdout] test mesh_antiprism::tests::test_antiprism_triangular ... ok [INFO] [stdout] test mesh_antiprism::tests::test_antiprism_vertex_count ... ok [INFO] [stdout] test mesh_antiprism::tests::test_has_alternating_strip ... ok [INFO] [stdout] test mesh_antiprism::tests::test_validate_antiprism ... ok [INFO] [stdout] test mesh_apex_vertex::tests::test_apex_angle_equilateral ... ok [INFO] [stdout] test mesh_apex_vertex::tests::test_apex_count ... ok [INFO] [stdout] test mesh_apex_vertex::tests::test_apex_frequency ... ok [INFO] [stdout] test mesh_apex_vertex::tests::test_apex_result_to_json ... ok [INFO] [stdout] test mesh_apex_vertex::tests::test_dist_sq ... ok [INFO] [stdout] test mesh_apex_vertex::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_apex_vertex::tests::test_is_apex_vertex ... ok [INFO] [stdout] test mesh_apex_vertex::tests::test_find_apex_vertices ... ok [INFO] [stdout] test mesh_apex_vertex::tests::test_vertex_angle_right ... ok [INFO] [stdout] test mesh_arap::tests::test_arap_deform_no_handles_no_change ... ok [INFO] [stdout] test mesh_arap::tests::test_arap_deform_single_handle_snaps ... ok [INFO] [stdout] test mesh_arap::tests::test_arap_energy_decreases_with_iterations ... ok [INFO] [stdout] test mesh_arap::tests::test_arap_energy_identity_deformation_is_zero ... ok [INFO] [stdout] test mesh_arap::tests::test_arap_local_step_identity_rotation_for_undeformed ... ok [INFO] [stdout] test mesh_arap::tests::test_arap_multiple_handles ... ok [INFO] [stdout] test mesh_arap::tests::test_arap_no_nan_in_result ... ok [INFO] [stdout] test mesh_arap::tests::test_arap_result_has_correct_vertex_count ... ok [INFO] [stdout] test mesh_arap::tests::test_build_arap_laplacian_uniform_weights ... ok [INFO] [stdout] test mesh_arap::tests::test_mat3_mul_vec_identity ... ok [INFO] [stdout] test mesh_arap::tests::test_mat3_mul_vec_scale ... ok [INFO] [stdout] test mesh_arap::tests::test_nearest_rotation_columns_orthonormal ... ok [INFO] [stdout] test mesh_arap::tests::test_nearest_rotation_columns_orthonormal_90deg ... ok [INFO] [stdout] test mesh_arap::tests::test_nearest_rotation_identity_stays_identity ... ok [INFO] [stdout] test mesh_arc_length::tests::circle_polyline_length_approx ... ok [INFO] [stdout] test mesh_arc_length::tests::contains_check ... ok [INFO] [stdout] test mesh_arc_length::tests::empty_input_returns_zero ... ok [INFO] [stdout] test mesh_arc_length::tests::first_sample_t_is_zero ... ok [INFO] [stdout] test mesh_arc_length::tests::last_sample_t_is_one ... ok [INFO] [stdout] test mesh_arc_length::tests::sample_at_midpoint ... ok [INFO] [stdout] test mesh_arc_length::tests::sample_count_matches ... ok [INFO] [stdout] test mesh_arc_length::tests::segment_lengths_sum ... ok [INFO] [stdout] test mesh_apex_vertex::tests::test_triangle_apex_right_angle ... ok [INFO] [stdout] test mesh_arc_length::tests::total_length_straight_line ... ok [INFO] [stdout] test mesh_arc_length::tests::uniform_resample_count ... ok [INFO] [stdout] test mesh_archimedean_solid::tests::test_cuboctahedron_unit_sphere ... ok [INFO] [stdout] test mesh_archimedean_solid::tests::test_cuboctahedron_validate ... ok [INFO] [stdout] test mesh_archimedean_solid::tests::test_cuboctahedron_vertex_count ... ok [INFO] [stdout] test mesh_archimedean_solid::tests::test_icosidodecahedron_vertex_count ... ok [INFO] [stdout] test mesh_archimedean_solid::tests::test_tri_count_positive ... ok [INFO] [stdout] test mesh_archimedean_solid::tests::test_truncated_cube_vertex_count ... ok [INFO] [stdout] test mesh_archimedean_solid::tests::test_truncated_octahedron_vertex_count ... ok [INFO] [stdout] test mesh_archimedean_solid::tests::test_truncated_tetrahedron_vertex_count ... ok [INFO] [stdout] test mesh_archimedean_solid::tests::test_validate_all_kinds ... ok [INFO] [stdout] test mesh_area_gradient::tests::test_avg_face_area ... ok [INFO] [stdout] test mesh_area_gradient::tests::test_compute_area_gradients ... ok [INFO] [stdout] test mesh_area_gradient::tests::test_cross3 ... ok [INFO] [stdout] test mesh_area_gradient::tests::test_empty ... ok [INFO] [stdout] test mesh_area_gradient::tests::test_get_gradient ... ok [INFO] [stdout] test mesh_area_gradient::tests::test_max_min_area ... ok [INFO] [stdout] test mesh_area_gradient::tests::test_safe_normalize_zero ... ok [INFO] [stdout] test mesh_area_gradient::tests::test_to_json ... ok [INFO] [stdout] test mesh_area_gradient::tests::test_total_area ... ok [INFO] [stdout] test mesh_area_gradient::tests::test_triangle_area ... ok [INFO] [stdout] test mesh_array_modifier::tests::first_copy_at_origin ... ok [INFO] [stdout] test mesh_array_modifier::tests::single_copy_unchanged ... ok [INFO] [stdout] test mesh_array_modifier::tests::tri_count_formula ... ok [INFO] [stdout] test mesh_array_modifier::tests::two_copies_offset_applied ... ok [INFO] [stdout] test integrity::tests::random_triangles_no_false_oob ... ok [INFO] [stdout] test integrity::tests::finite_positions_always_pass_finite_check ... ok [INFO] [stdout] test mesh_array_modifier::tests::two_copies_tri_indices_offset ... ok [INFO] [stdout] test mesh_array_modifier::tests::two_copies_vert_count ... ok [INFO] [stdout] test mesh_array_modifier::tests::vert_count_formula ... ok [INFO] [stdout] test mesh_array_modifier::tests::y_offset_applied ... ok [INFO] [stdout] test mesh_array_modifier::tests::z_offset_applied ... ok [INFO] [stdout] test mesh_arrow_gen::tests::test_arrow_tip_along_x ... ok [INFO] [stdout] test mesh_array_modifier::tests::zero_count_empty ... ok [INFO] [stdout] test mesh_arrow_gen::tests::test_arrow_face_count ... ok [INFO] [stdout] test mesh_arrow_gen::tests::test_new_arrow ... ok [INFO] [stdout] test mesh_aspect_ratio::tests::test_aspect_ratio_equilateral ... ok [INFO] [stdout] test mesh_arrow_gen::tests::test_arrow_vertex_count ... ok [INFO] [stdout] test mesh_aspect_ratio::tests::test_count_poor_triangles ... ok [INFO] [stdout] test mesh_aspect_ratio::tests::test_compute_empty ... ok [INFO] [stdout] test mesh_aspect_ratio::tests::test_compute_aspect_ratios ... ok [INFO] [stdout] test mesh_aspect_ratio::tests::test_degenerate_triangle ... ok [INFO] [stdout] test mesh_aspect_ratio::tests::test_edge_length ... ok [INFO] [stdout] test mesh_aspect_ratio::tests::test_min_aspect_ratio ... ok [INFO] [stdout] test mesh_aspect_ratio::tests::test_ratio_at ... ok [INFO] [stdout] test mesh_aspect_ratio::tests::test_to_json ... ok [INFO] [stdout] test mesh_aspect_ratio::tests::test_triangle_area ... ok [INFO] [stdout] test mesh_attr_transfer::tests::avg_transfer_error_empty ... ok [INFO] [stdout] test mesh_attr_transfer::tests::max_error_positive ... ok [INFO] [stdout] test mesh_attr_transfer::tests::max_transfer_error_zero_same_mesh ... ok [INFO] [stdout] test mesh_attr_transfer::tests::nearest_vertex_exact_match ... ok [INFO] [stdout] test mesh_attr_transfer::tests::transfer_rgba_correct ... ok [INFO] [stdout] test mesh_attr_transfer::tests::transfer_empty_dst ... ok [INFO] [stdout] test mesh_attr_transfer::tests::transfer_scalar_count ... ok [INFO] [stdout] test mesh_attr_transfer::tests::transfer_scalar_empty_src ... ok [INFO] [stdout] test mesh_attr_transfer::tests::transfer_scalar_nearest ... ok [INFO] [stdout] test mesh_attr_transfer::tests::transfer_vec3_correct ... ok [INFO] [stdout] test mesh_attribute_layer::tests::add_layer_increments ... ok [INFO] [stdout] test marching_cubes::tests::marching_cubes_sphere_normals_valid ... ok [INFO] [stdout] test marching_cubes::tests::marching_cubes_sphere_has_faces ... ok [INFO] [stdout] test marching_cubes::tests::marching_cubes_sphere_positions_finite ... ok [INFO] [stdout] test mesh_arrow_gen::tests::test_arrow_total_length ... ok [INFO] [stdout] test marching_cubes::tests::scalar_field_fill_torus ... ok [INFO] [stdout] test marching_cubes::tests::scalar_field_world_pos ... ok [INFO] [stdout] test measurements::tests::aabb_center ... ok [INFO] [stdout] test measurements::tests::measurements_non_negative ... ok [INFO] [stdout] test mesh_arap::tests::test_build_arap_laplacian_neighbor_count ... ok [INFO] [stdout] test mesh_ambient_occ::tests::hemisphere_samples_upper_hemisphere ... ok [INFO] [stdout] test mesh_attribute_layer::tests::attribute_average_correct ... ok [INFO] [stdout] test mesh_attribute_layer::tests::remove_missing_false ... ok [INFO] [stdout] test mesh_auto_smooth::tests::test_count_sharp_vertices ... ok [INFO] [stdout] test mesh_auto_smooth::tests::test_default_config ... ok [INFO] [stdout] test mesh_auto_smooth::tests::test_dihedral_perpendicular ... ok [INFO] [stdout] test mesh_auto_smooth::tests::test_is_smooth_angle_false ... ok [INFO] [stdout] test mesh_auto_smooth::tests::test_auto_smooth_two_tris_sharp ... ok [INFO] [stdout] test mesh_auto_smooth::tests::test_config_from_degrees ... ok [INFO] [stdout] test mesh_auto_smooth::tests::test_is_smooth_angle_true ... ok [INFO] [stdout] test mesh_bary_coord::tests::test_distance_to_center ... ok [INFO] [stdout] test mesh_bary_coord::tests::test_bary_to_json ... ok [INFO] [stdout] test mesh_bary_coord::tests::test_bary_center ... ok [INFO] [stdout] test mesh_bary_coord::tests::test_dot3 ... ok [INFO] [stdout] test mesh_bary_coord::tests::test_interpolate ... ok [INFO] [stdout] test mesh_bary_coord::tests::test_clamp_bary ... ok [INFO] [stdout] test mesh_attribute_layer::tests::attribute_average_missing_none ... ok [INFO] [stdout] test mesh_bary_coord::tests::test_is_outside ... ok [INFO] [stdout] test mesh_batching::tests::test_batch_default_color_white ... ok [INFO] [stdout] test mesh_batching::tests::test_batch_color_applied ... ok [INFO] [stdout] test mesh_bary_coord::tests::test_interpolate3 ... ok [INFO] [stdout] test mesh_batching::tests::test_batch_empty ... ok [INFO] [stdout] test mesh_batching::tests::test_batch_index_offset ... ok [INFO] [stdout] test mesh_batching::tests::test_batch_submesh_starts ... ok [INFO] [stdout] test mesh_batching::tests::test_batch_indices_valid ... ok [INFO] [stdout] test mesh_bary_coord::tests::test_bary_at_vertex ... ok [INFO] [stdout] test mesh_batching::tests::test_batch_two_tris_triangle_count ... ok [INFO] [stdout] test mesh_attribute_layer::tests::new_set_empty ... ok [INFO] [stdout] test mesh_attribute_layer::tests::remove_layer_works ... ok [INFO] [stdout] test mesh_attribute_layer::tests::get_layer_by_name ... ok [INFO] [stdout] test mesh_attribute_layer::tests::validate_vertex_layer_correct_count ... ok [INFO] [stdout] test mesh_auto_smooth::tests::test_auto_smooth_single_tri ... ok [INFO] [stdout] test mesh_bbox_tree::tests::test_bbox_overlap ... ok [INFO] [stdout] test mesh_auto_smooth::tests::test_dihedral_same_normal ... ok [INFO] [stdout] test measurements::tests::real_base_mesh_measurements ... ok [INFO] [stdout] test integrity::tests::real_base_mesh_integrity ... ok [INFO] [stdout] test mesh_batching::tests::test_submesh_count ... ok [INFO] [stdout] test mesh_batching::tests::test_batch_to_json ... ok [INFO] [stdout] test mesh_bbox_tree::tests::test_build_empty ... ok [INFO] [stdout] test mesh_batching::tests::test_batch_two_tris_vertex_count ... ok [INFO] [stdout] test mesh_bary_coord::tests::test_is_inside ... ok [INFO] [stdout] test mesh_attribute_layer::tests::get_missing_none ... ok [INFO] [stdout] test mesh_bbox_tree::tests::test_triangle_bbox ... ok [INFO] [stdout] test mesh_bend_deform::tests::test_apply_bend_deform ... ok [INFO] [stdout] test mesh_bend_deform::tests::test_bend_param ... ok [INFO] [stdout] test mesh_bend_deform::tests::test_bend_param_clamped ... ok [INFO] [stdout] test mesh_bend_deform::tests::test_bend_within_tolerance ... ok [INFO] [stdout] test mesh_bend_deform::tests::test_bend_vertex_zero_angle ... ok [INFO] [stdout] test mesh_bend_deform::tests::test_default_config ... ok [INFO] [stdout] test mesh_bbox_tree::tests::test_bbox_volume ... ok [INFO] [stdout] test mesh_bbox_tree::tests::test_bbox_tree_to_json ... ok [INFO] [stdout] test mesh_bend_deform::tests::test_deg_to_rad ... ok [INFO] [stdout] test mesh_bend_deform::tests::test_rad_to_deg ... ok [INFO] [stdout] test mesh_bend_deform::tests::test_to_json ... ok [INFO] [stdout] test mesh_bend_deform::tests::test_empty ... ok [INFO] [stdout] test mesh_bbox_tree::tests::test_multi_triangle_tree ... ok [INFO] [stdout] test mesh_bbox_tree::tests::test_point_in_bbox ... ok [INFO] [stdout] test mesh_bend_modifier::tests::test_bend_curvature ... ok [INFO] [stdout] test mesh_bend_modifier::tests::test_bend_is_unlimited_false ... ok [INFO] [stdout] test mesh_bend_modifier::tests::test_bend_is_unlimited_true ... ok [INFO] [stdout] test mesh_bend_modifier::tests::test_bend_vertex_zero_angle ... ok [INFO] [stdout] test mesh_bent_normal::tests::test_ao_default ... ok [INFO] [stdout] test mesh_bbox_tree::tests::test_merge_bbox ... ok [INFO] [stdout] test mesh_bbox_tree::tests::test_build_tree ... ok [INFO] [stdout] test mesh_bent_normal::tests::test_count ... ok [INFO] [stdout] test mesh_bent_normal::tests::test_new_bent_normal_map ... ok [INFO] [stdout] test mesh_bbox_tree::tests::test_node_face_index ... ok [INFO] [stdout] test mesh_bent_normal::tests::test_set_get ... ok [INFO] [stdout] test mesh_bend_modifier::tests::test_bend_angle_at ... ok [INFO] [stdout] test mesh_bend_modifier::tests::test_new_bend_params ... ok [INFO] [stdout] test mesh_bent_normal::tests::test_to_color_up ... ok [INFO] [stdout] test mesh_bent_normal::tests::test_to_color_neg ... ok [INFO] [stdout] test mesh_bevel_modifier::tests::test_bevel_new_vertex_count ... ok [INFO] [stdout] test mesh_bevel_modifier::tests::test_bevel_params_min_segments ... ok [INFO] [stdout] test mesh_bevel_modifier::tests::test_bevel_segment_point_endpoints ... ok [INFO] [stdout] test mesh_bevel_modifier::tests::test_bevel_new_face_count ... ok [INFO] [stdout] test mesh_bevel_modifier::tests::test_bevel_edge_offset_midpoint ... ok [INFO] [stdout] test mesh_bevel_vertex::tests::test_bevel_centroid ... ok [INFO] [stdout] test mesh_bevel_modifier::tests::test_new_bevel_params ... ok [INFO] [stdout] test mesh_bevel_vertex::tests::test_bevel_polygon_area_2d ... ok [INFO] [stdout] test mesh_bevel_vertex::tests::test_bevel_vertex_estimate ... ok [INFO] [stdout] test mesh_bevel_vertex::tests::test_bevel_vertex_positions ... ok [INFO] [stdout] test mesh_bevel_vertex::tests::test_bevel_vertices_oob ... ok [INFO] [stdout] test mesh_bevel_vertex::tests::test_bevel_vertices_runs ... ok [INFO] [stdout] test mesh_bevel_vertex::tests::test_default_bevel_amount ... ok [INFO] [stdout] test mesh_bevel_vertex::tests::test_validate_bevel_amount ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_default_patch_config ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_evaluate_patch_corners ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_evaluate_patch_far_corner ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_new_bezier_patch_corners ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_patch_bounding_box ... ok [INFO] [stdout] test mesh_bevel_vertex::tests::test_bevel_at_factor ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_patch_midpoint ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_patch_triangle_count ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_patch_normal_approximately_up ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_subdivide_midpoint_continuity ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_patch_normal_flip ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_patch_tangent_u_not_zero ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_subdivide_preserves_corners ... ok [INFO] [stdout] test mesh_bezier_surface::tests::test_tessellate_empty_on_zero ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_tessellate_patch_resolution_1 ... ok [INFO] [stdout] test mesh_bezier_surface::tests::test_tessellate_tri_count ... ok [INFO] [stdout] test mesh_bezier_surface::tests::test_bernstein3_endpoints ... ok [INFO] [stdout] test mesh_bezier_surface::tests::test_validate_bezier_surface ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_patch_tangent_v_not_zero ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_bilaplacian_energy_finite ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_bilaplacian_energy_positive ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_patch_vertex_count ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_subdivide_patch_produces_four ... ok [INFO] [stdout] test mesh_bezier_surface::tests::test_eval_bezier_corner ... ok [INFO] [stdout] test mesh_bezier_surface::tests::test_eval_bezier_midpoint_z_zero ... ok [INFO] [stdout] test mesh_bezier_surface::tests::test_tessellate_vertex_count ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_bilaplacian_fairing_differs_from_smooth ... ok [INFO] [stdout] test mesh_bezier_patch::tests::test_tessellate_patch_counts ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_build_laplacian_weights_nonzero ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_cotangent_weight_equilateral ... ok [INFO] [stdout] test mesh_bezier_surface::tests::test_bernstein3_sum_to_one ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_cotangent_weight_right_angle ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_laplacian_operator_no_nan ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_mesh_laplacian_energy_positive_bumpy ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_mesh_laplacian_energy_flat_less_than_bumpy ... ok [INFO] [stdout] test mesh_bilinear_patch::tests::test_area_approx ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_bilaplacian_smooth_no_nan ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_bilaplacian_fairing_no_nan ... ok [INFO] [stdout] test mesh_bilinear_patch::tests::test_du ... ok [INFO] [stdout] test mesh_bilinear_patch::tests::test_dv ... ok [INFO] [stdout] test marching_cubes::tests::marching_cubes_welded_fewer_vertices ... ok [INFO] [stdout] test mesh_bilinear_patch::tests::test_evaluate_corner ... ok [INFO] [stdout] test mesh_bilinear_patch::tests::test_evaluate_opposite_corner ... ok [INFO] [stdout] test mesh_bilinear_patch::tests::test_nonplanar_patch ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_laplacian_operator_flat_mesh ... ok [INFO] [stdout] test mesh_bilinear_patch::tests::test_patch_to_json ... ok [INFO] [stdout] test mesh_bilinear_patch::tests::test_center ... ok [INFO] [stdout] test mesh_bilinear_patch::tests::test_tessellate ... ok [INFO] [stdout] test mesh_bilinear_patch::tests::test_tessellate_min ... ok [INFO] [stdout] test mesh_bipyramid::tests::test_bipyramid_empty_on_too_few_sides ... ok [INFO] [stdout] test mesh_bezier_surface::tests::test_surface_u_v_divs_stored ... ok [INFO] [stdout] test mesh_bilaplacian::tests::test_bilaplacian_smooth_reduces_energy ... ok [INFO] [stdout] test mesh_bisect::tests::test_count_below ... ok [INFO] [stdout] test mesh_bisect::tests::test_edge_intersection_crossing ... ok [INFO] [stdout] test mesh_blend_animation::tests::test_clear ... ok [INFO] [stdout] test mesh_blend_animation::tests::test_dominant_contribution_found ... ok [INFO] [stdout] test mesh_bipyramid::tests::test_bipyramid_tri_count ... ok [INFO] [stdout] test mesh_bisect::tests::test_classify_above ... ok [INFO] [stdout] test mesh_bipyramid::tests::test_bipyramid_sides_stored ... ok [INFO] [stdout] test mesh_bipyramid::tests::test_bipyramid_surface_area_positive ... ok [INFO] [stdout] test mesh_bipyramid::tests::test_bipyramid_vertex_count ... ok [INFO] [stdout] test mesh_bipyramid::tests::test_bipyramid_apex_height_stored ... ok [INFO] [stdout] test mesh_bipyramid::tests::test_validate_bipyramid ... ok [INFO] [stdout] test mesh_bipyramid::tests::test_triangular_bipyramid ... ok [INFO] [stdout] test mesh_bisect::tests::test_edge_no_intersection_same_side ... ok [INFO] [stdout] test mesh_bisect::tests::test_classify_below ... ok [INFO] [stdout] test mesh_blend_animation::tests::test_add_contribution ... ok [INFO] [stdout] test mesh_bipyramid::tests::test_bipyramid_expected_tris ... ok [INFO] [stdout] test mesh_blend_animation::tests::test_dominant_contribution_none_empty ... ok [INFO] [stdout] test mesh_blend_animation::tests::test_evaluate_blend_single ... ok [INFO] [stdout] test mesh_blend_animation::tests::test_total_weight_empty ... ok [INFO] [stdout] test mesh_blend_animation::tests::test_new_blend_buffer_empty ... ok [INFO] [stdout] test mesh_boolean::tests::boolean_difference_flips_b_normals ... ok [INFO] [stdout] test mesh_blend_animation::tests::test_total_weight_accumulates ... ok [INFO] [stdout] test mesh_boolean::tests::boolean_difference_non_overlapping_keeps_a ... ok [INFO] [stdout] test mesh_boolean::tests::boolean_symmetric_difference_non_overlapping_same_as_union ... ok [INFO] [stdout] test mesh_boolean::tests::boolean_union_non_overlapping_has_all_faces ... ok [INFO] [stdout] test mesh_boolean::tests::boolean_result_face_counts_match_mesh ... ok [INFO] [stdout] test mesh_boolean::tests::classify_vertices_inside_self ... ok [INFO] [stdout] test mesh_boolean::tests::boolean_union_result_has_valid_indices ... ok [INFO] [stdout] test mesh_boolean::tests::classify_vertices_all_outside ... ok [INFO] [stdout] test mesh_boolean::tests::classify_vertices_outside_remote ... ok [INFO] [stdout] test mesh_bisect::tests::test_count_above ... ok [INFO] [stdout] test mesh_boolean::tests::combine_meshes_face_count ... ok [INFO] [stdout] test mesh_boolean::tests::filter_keep_inside_all_false_returns_none ... ok [INFO] [stdout] test mesh_boolean::tests::boolean_intersection_non_overlapping_is_empty ... ok [INFO] [stdout] test mesh_boolean::tests::filter_keep_outside_all_false_returns_all ... ok [INFO] [stdout] test mesh_boolean::tests::combine_meshes_index_offset ... ok [INFO] [stdout] test mesh_boolean::tests::filter_reindexes_compactly ... ok [INFO] [stdout] test mesh_boolean::tests::flip_winding_negates_normals ... ok [INFO] [stdout] test mesh_boolean::tests::flip_winding_double_flip_is_identity ... ok [INFO] [stdout] test mesh_boolean::tests::flip_winding_reverses_indices ... ok [INFO] [stdout] test mesh_boolean::tests::filter_partial_match_excludes_mixed_faces ... ok [INFO] [stdout] test mesh_boolean::tests::flip_winding_preserves_vertex_count ... ok [INFO] [stdout] test mesh_boolean::tests::combine_meshes_vertex_count ... ok [INFO] [stdout] test mesh_boolean::tests::combine_meshes_all_indices_valid ... ok [INFO] [stdout] test mesh_boolean_difference::tests::test_default_config_flip ... ok [INFO] [stdout] test mesh_boolean_csg::tests::box_inside ... ok [INFO] [stdout] test mesh_boolean_csg::tests::box_outside ... ok [INFO] [stdout] test mesh_boolean_csg::tests::csg_combine_intersect ... ok [INFO] [stdout] test mesh_blend_animation::tests::test_prune_zero_weights ... ok [INFO] [stdout] test mesh_blend_animation::tests::test_normalize_weights ... ok [INFO] [stdout] test mesh_boolean_csg::tests::csg_combine_subtract ... ok [INFO] [stdout] test mesh_boolean_csg::tests::csg_combine_union ... ok [INFO] [stdout] test mesh_boolean_csg::tests::inside_count_matches ... ok [INFO] [stdout] test mesh_boolean_csg::tests::sphere_outside ... ok [INFO] [stdout] test mesh_boolean_csg::tests::subtract_less_than_a ... ok [INFO] [stdout] test mesh_boolean_csg::tests::sphere_inside ... ok [INFO] [stdout] test mesh_boolean_csg::tests::union_superset ... ok [INFO] [stdout] test mesh_boolean_difference::tests::test_apply_keep_mask_all_true ... ok [INFO] [stdout] test mesh_boolean_difference::tests::test_apply_keep_mask_mixed ... ok [INFO] [stdout] test mesh_boolean_difference::tests::test_keep_mask_empty_b ... ok [INFO] [stdout] test mesh_boolean_intersection::tests::test_aabbs_empty_input ... ok [INFO] [stdout] test mesh_boolean_intersection::tests::test_aabbs_overlap_true ... ok [INFO] [stdout] test mesh_boolean_difference::tests::test_flip_winding ... ok [INFO] [stdout] test mesh_boolean_intersection::tests::test_intersection_empty_returns_empty ... ok [INFO] [stdout] test mesh_boolean_difference::tests::test_flip_winding_multiple ... ok [INFO] [stdout] test mesh_boolean_intersection::tests::test_aabbs_no_overlap ... ok [INFO] [stdout] test mesh_boolean_union::tests::test_aabb_overlap_true ... ok [INFO] [stdout] test mesh_boolean_intersection::tests::test_default_config ... ok [INFO] [stdout] test mesh_boolean_union::tests::test_default_config ... ok [INFO] [stdout] test mesh_boolean_union::tests::test_estimate_vertex_count ... ok [INFO] [stdout] test mesh_boolean_union::tests::test_union_concatenates_vertices ... ok [INFO] [stdout] test mesh_boolean_difference::tests::test_difference_empty_b_returns_a ... ok [INFO] [stdout] test mesh_boolean_union::tests::test_union_empty_meshes ... ok [INFO] [stdout] test mesh_boolean_difference::tests::test_difference_result_removed_count ... ok [INFO] [stdout] test mesh_boolean_difference::tests::test_estimate_removed_empty_b ... ok [INFO] [stdout] test mesh_boolean_intersection::tests::test_intersection_aabb_volume_no_overlap ... ok [INFO] [stdout] test mesh_boolean_intersection::tests::test_triangles_inside_aabb ... ok [INFO] [stdout] test mesh_boolean_intersection::tests::test_triangles_outside_aabb ... ok [INFO] [stdout] test mesh_boolean_intersection::tests::test_intersection_aabb_volume ... ok [INFO] [stdout] test mesh_boolean_intersection::tests::test_count_shared_edge_candidates ... ok [INFO] [stdout] test mesh_boolean_union::tests::test_aabb_no_overlap ... ok [INFO] [stdout] test mesh_boolean_union::tests::test_weld_removes_duplicates ... ok [INFO] [stdout] test mesh_border_edge::tests::test_border_result_to_json ... ok [INFO] [stdout] test mesh_border_edge::tests::test_build_edge_count_map ... ok [INFO] [stdout] test mesh_border_edge::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_border_edge::tests::test_is_border_vertex ... ok [INFO] [stdout] test mesh_border_edge::tests::test_border_total_length ... ok [INFO] [stdout] test mesh_border_edge::tests::test_border_vertex_count ... ok [INFO] [stdout] test mesh_border_edge::tests::test_two_tris_border_vertices ... ok [INFO] [stdout] test mesh_border_edge::tests::test_two_tris_shared_edge ... ok [INFO] [stdout] test mesh_boundary_vertex::tests::test_closed_mesh_no_boundary ... ok [INFO] [stdout] test mesh_boundary_vertex::tests::test_empty ... ok [INFO] [stdout] test mesh_boundary_vertex::tests::test_build_edge_map ... ok [INFO] [stdout] test mesh_boundary_vertex::tests::test_is_boundary ... ok [INFO] [stdout] test mesh_boundary_vertex::tests::test_boundary_fraction ... ok [INFO] [stdout] test mesh_boundary_vertex::tests::test_find_boundary_edges_single_tri ... ok [INFO] [stdout] test mesh_boundary_vertex::tests::test_to_json ... ok [INFO] [stdout] test mesh_bounding_box_query::tests::test_aabb_contains_point ... ok [INFO] [stdout] test mesh_boundary_vertex::tests::test_detect_boundary_vertices ... ok [INFO] [stdout] test mesh_boolean_union::tests::test_union_index_offset ... ok [INFO] [stdout] test mesh_bounding_box_query::tests::test_aabb_center ... ok [INFO] [stdout] test mesh_boolean_union::tests::test_validate_mesh_invalid_index ... ok [INFO] [stdout] test mesh_bounding_box_query::tests::test_aabb_no_overlap ... ok [INFO] [stdout] test mesh_boolean_union::tests::test_validate_mesh_valid ... ok [INFO] [stdout] test mesh_border_edge::tests::test_directed_edge_eq ... ok [INFO] [stdout] test mesh_border_edge::tests::test_single_tri_all_border ... ok [INFO] [stdout] test mesh_bounding_box_query::tests::test_aabb_longest_axis ... ok [INFO] [stdout] test mesh_bounding_box_query::tests::test_aabb_overlaps ... ok [INFO] [stdout] test mesh_box_gen::tests::test_box_diagonal ... ok [INFO] [stdout] test mesh_box_gen::tests::test_box_face_count ... ok [INFO] [stdout] test mesh_box_gen::tests::test_box_vertex_count ... ok [INFO] [stdout] test mesh_box_gen::tests::test_new_box ... ok [INFO] [stdout] test mesh_bridge::tests::align_loops_selects_nearest ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_basic_quad_count ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_bezier_interp_same_topology ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_error_mismatched_loops ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_normals_unit_length ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_flip_loop_b ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_error_too_few_vertices ... ok [INFO] [stdout] test mesh_boundary_vertex::tests::test_boundary_fraction_empty ... ok [INFO] [stdout] test mesh_bounding_box_query::tests::test_aabb_volume ... ok [INFO] [stdout] test mesh_box_gen::tests::test_box_surface_area ... ok [INFO] [stdout] test mesh_box_gen::tests::test_box_volume ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_segments_3 ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_smooth_interp_differs_from_linear ... ok [INFO] [stdout] test mesh_bridge::tests::loop_centroid_basic ... ok [INFO] [stdout] test mesh_boundary_vertex::tests::test_sorted_output ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_twist_changes_positions ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_two_vertex_loops ... ok [INFO] [stdout] test mesh_bounding_box_query::tests::test_compute_tight_aabb_empty ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_valid_indices ... ok [INFO] [stdout] test mesh_bounding_box_query::tests::test_compute_tight_aabb_values ... ok [INFO] [stdout] test mesh_bounding_box_query::tests::test_aabb_diagonal_nonzero ... ok [INFO] [stdout] test mesh_bridge::tests::loop_centroid_empty ... ok [INFO] [stdout] test mesh_bridge::tests::bridge_vertex_count_segments1 ... ok [INFO] [stdout] test mesh_bridge_tool::tests::test_bridge_loops_basic ... ok [INFO] [stdout] test mesh_bridge_tool::tests::test_bridge_new_vertex_count ... ok [INFO] [stdout] test mesh_bridge_tool::tests::test_bridge_total_length ... ok [INFO] [stdout] test mesh_bridge_tool::tests::test_bridge_with_segments ... ok [INFO] [stdout] test mesh_bridge_edge_loops::tests::test_bridge_loops_empty ... ok [INFO] [stdout] test mesh_bridge_tool::tests::test_loop_centroid ... ok [INFO] [stdout] test mesh_bridge_edge_loops::tests::test_bridge_loops_quads_count ... ok [INFO] [stdout] test mesh_bridge_edge_loops::tests::test_bridge_vertex_count ... ok [INFO] [stdout] test mesh_bridge_edge_loops::tests::test_loop_centroid_bl ... ok [INFO] [stdout] test mesh_bridge_edge_loops::tests::test_loop_perimeter_bl ... ok [INFO] [stdout] test mesh_bridge_edge_loops::tests::test_new_bridge_edge_loop ... ok [INFO] [stdout] test mesh_bridge_tool::tests::test_bridge_incompatible ... ok [INFO] [stdout] test mesh_bridge_tool::tests::test_bridge_quad_estimate ... ok [INFO] [stdout] test mesh_bridge_tool::tests::test_loops_compatible ... ok [INFO] [stdout] test mesh_bvh::tests::test_aabb_centroid ... ok [INFO] [stdout] test mesh_bridge::tests::loop_from_boundary_open_cylinder ... ok [INFO] [stdout] test mesh_bridge::tests::open_cylinder_radius ... ok [INFO] [stdout] test mesh_bridge::tests::open_cylinder_structure ... ok [INFO] [stdout] test mesh_bridge_edge_loops::tests::test_bridge_face_count ... ok [INFO] [stdout] test mesh_bvh_leaf::tests::face_index_correct ... ok [INFO] [stdout] test mesh_bvh::tests::test_bvh_to_json ... ok [INFO] [stdout] test mesh_bvh::tests::test_aabb_contains_point ... ok [INFO] [stdout] test mesh_bvh::tests::test_leaf_count_ge_one ... ok [INFO] [stdout] test mesh_bvh::tests::test_aabb_surface_area_positive ... ok [INFO] [stdout] test mesh_bvh::tests::test_node_count_at_least_one ... ok [INFO] [stdout] test mesh_bvh_leaf::tests::leaf_min_max_sane ... ok [INFO] [stdout] test mesh_bvh::tests::test_ray_hit_aabb ... ok [INFO] [stdout] test mesh_bvh_leaf::tests::leaf_count_two_tris ... ok [INFO] [stdout] test mesh_bvh::tests::test_triangle_count_matches ... ok [INFO] [stdout] test mesh_bvh_leaf::tests::avg_surface_area_positive ... ok [INFO] [stdout] test mesh_bvh_leaf::tests::centroid_inside_aabb ... ok [INFO] [stdout] test mesh_bvh_leaf::tests::empty_leaves_avg_zero ... ok [INFO] [stdout] test mesh_bvh::tests::test_build_bvh_empty ... ok [INFO] [stdout] test mesh_bvh::tests::test_build_bvh_some ... ok [INFO] [stdout] test mesh_bvh_leaf::tests::query_all_hits_with_large_aabb ... ok [INFO] [stdout] test mesh_bvh_leaf::tests::query_no_hits_outside ... ok [INFO] [stdout] test mesh_bvh_leaf::tests::surface_area_nonneg ... ok [INFO] [stdout] test mesh_bvh_leaf::tests::volume_nonneg ... ok [INFO] [stdout] test mesh_bvh_node::tests::test_aabb_surface_area_positive ... ok [INFO] [stdout] test mesh_bvh_node::tests::test_aabb_surface_area_unit_cube ... ok [INFO] [stdout] test mesh_bvh_node::tests::test_build_bvh_node_count_positive ... ok [INFO] [stdout] test mesh_bvh_node::tests::test_bvh_leaf_count_positive ... ok [INFO] [stdout] test mesh_bvh_node::tests::test_ray_aabb_hit_miss ... ok [INFO] [stdout] test mesh_bvh_node::tests::test_merge_node_aabb ... ok [INFO] [stdout] test mesh_cable_gen::tests::expected_formula_matches_build ... ok [INFO] [stdout] test mesh_bvh_node::tests::test_ray_aabb_hit_true ... ok [INFO] [stdout] test mesh_cable_gen::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_cable_gen::tests::validate_bad_radius ... ok [INFO] [stdout] test mesh_cable_gen::tests::validate_ok ... ok [INFO] [stdout] test mesh_cage::tests::test_apply_cage_weights_zero_weights ... ok [INFO] [stdout] test mesh_cage::tests::test_apply_cage_weights_linear_combination ... ok [INFO] [stdout] test mesh_cage::tests::test_cage_deformer_deform_result_length ... ok [INFO] [stdout] test mesh_cage::tests::test_cage_encloses_point_outside ... ok [INFO] [stdout] test mesh_cage::tests::test_cage_deformer_identity_no_change ... ok [INFO] [stdout] test mesh_bvh_node::tests::test_build_bvh_empty ... ok [INFO] [stdout] test mesh_bvh_node::tests::test_triangle_aabb_valid ... ok [INFO] [stdout] test mesh_cable_gen::tests::mass_calculation ... ok [INFO] [stdout] test mesh_cable_gen::tests::lateral_area_positive ... ok [INFO] [stdout] test mesh_cable_gen::tests::normals_length_one ... ok [INFO] [stdout] test mesh_cage::tests::test_cage_weights_length ... ok [INFO] [stdout] test mesh_cage::tests::test_mean_value_coordinates_non_negative_inside ... ok [INFO] [stdout] test mesh_cable_gen::tests::triangle_count_correct ... ok [INFO] [stdout] test mesh_cage_lattice::tests::test_apply_deform_count ... ok [INFO] [stdout] test mesh_cage_lattice::tests::test_control_point_count ... ok [INFO] [stdout] test mesh_cage_lattice::tests::test_lattice_volume ... ok [INFO] [stdout] test mesh_cage_lattice::tests::test_validate_lattice ... ok [INFO] [stdout] test mesh_cage::tests::test_mean_value_coordinates_sum_to_one ... ok [INFO] [stdout] test mesh_cage_lattice::tests::test_world_to_lattice_params_center ... ok [INFO] [stdout] test mesh_cage::tests::test_mvc_angle_is_positive ... ok [INFO] [stdout] test mesh_cage::tests::test_apply_cage_weights_single_vertex ... ok [INFO] [stdout] test mesh_cage::tests::test_validate_cage_weights_imperfect ... ok [INFO] [stdout] test mesh_cage::tests::test_validate_cage_weights_perfect ... ok [INFO] [stdout] test mesh_cable_gen::tests::vertex_count_correct ... ok [INFO] [stdout] test mesh_cage_lattice::tests::test_move_control_point ... ok [INFO] [stdout] test mesh_cage::tests::test_cage_max_coord_error_near_zero ... ok [INFO] [stdout] test mesh_cage::tests::test_cage_deformer_translated_cage ... ok [INFO] [stdout] test mesh_cage_lattice::tests::test_evaluate_ffd_at_origin ... ok [INFO] [stdout] test mesh_cage_lattice::tests::test_reset_lattice ... ok [INFO] [stdout] test mesh_cage_lattice::tests::test_new_cage_point_count ... ok [INFO] [stdout] test mesh_cage_volume::tests::test_empty_mesh_zero_volume ... ok [INFO] [stdout] test mesh_cage_lattice::tests::test_bernstein_endpoints ... ok [INFO] [stdout] test mesh_cage_volume::tests::test_compute_cage_volume_nonempty ... ok [INFO] [stdout] test mesh_cage_volume::tests::test_equivalent_sphere_radius_positive ... ok [INFO] [stdout] test mesh_cage_volume::tests::test_cage_volume_to_json ... ok [INFO] [stdout] test mesh_cage_wrap::tests::json_contains_vertex_count ... ok [INFO] [stdout] test mesh_cage_volume::tests::test_is_inward_cage ... ok [INFO] [stdout] test mesh_cage_volume::tests::test_face_count ... ok [INFO] [stdout] test mesh_cage_volume::tests::test_is_outward_cage ... ok [INFO] [stdout] test mesh_cage_volume::tests::test_scaled_cage_volume ... ok [INFO] [stdout] test mesh_cage_volume::tests::test_signed_tet_volume_positive ... ok [INFO] [stdout] test mesh_cage_wrap::tests::centroid_reasonable ... ok [INFO] [stdout] test mesh_cage_wrap::tests::contains_check ... ok [INFO] [stdout] test mesh_cage_wrap::tests::max_displacement_nonneg ... ok [INFO] [stdout] test mesh_cage_wrap::tests::default_config_radius_positive ... ok [INFO] [stdout] test mesh_cage_wrap::tests::no_influence_outside_radius ... ok [INFO] [stdout] test mesh_cage_wrap::tests::displacement_applied ... ok [INFO] [stdout] test mesh_capsule_gen::tests::test_capsule_vertex_count ... ok [INFO] [stdout] test mesh_capsule_gen::tests::test_capsule_face_count ... ok [INFO] [stdout] test mesh_cage_wrap::tests::vertex_count_preserved ... ok [INFO] [stdout] test mesh_capsule_gen::tests::test_capsule_surface_area_sphere ... ok [INFO] [stdout] test mesh_cage_wrap::tests::no_displacement_when_cage_same ... ok [INFO] [stdout] test mesh_capsule_gen::tests::test_capsule_volume_increases_with_height ... ok [INFO] [stdout] test mesh_cage_wrap::tests::empty_target_returns_empty ... ok [INFO] [stdout] test mesh_capsule_gen::tests::test_capsule_volume_sphere_only ... ok [INFO] [stdout] test mesh_cast_modifier::tests::test_cast_blend_factor_one ... ok [INFO] [stdout] test mesh_cast_modifier::tests::test_cast_target_cylinder_preserves_z ... ok [INFO] [stdout] test mesh_cast_modifier::tests::test_cast_vertex_no_effect ... ok [INFO] [stdout] test mesh_cast_modifier::tests::test_new_cast_sphere ... ok [INFO] [stdout] test mesh_catenary::tests::test_catenary_arc_length_positive ... ok [INFO] [stdout] test mesh_catenary::tests::test_catenary_y_at_zero ... ok [INFO] [stdout] test mesh_catenary::tests::test_catenary_sag_positive ... ok [INFO] [stdout] test mesh_catenary::tests::test_catenary_y_symmetric ... ok [INFO] [stdout] test mesh_catenary::tests::test_catenary_to_polyline_count ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_compute_edge_points_boundary ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_face_sizes_are_quads ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_is_quad_mesh_empty ... ok [INFO] [stdout] test mesh_cast_modifier::tests::test_cast_blend_factor_zero ... ok [INFO] [stdout] test mesh_cast_modifier::tests::test_cast_target_sphere_on_sphere ... ok [INFO] [stdout] test mesh_capsule_gen::tests::test_new_capsule ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_default_config ... ok [INFO] [stdout] test mesh_cast_modifier::tests::test_cast_vertex_sphere ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_face_count_estimate ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_is_quad_mesh_true ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_compute_face_points_single_tri ... ok [INFO] [stdout] test mesh_catenary::tests::test_new_catenary ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_smooth_boundary_weight_zero ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_triangulate_mixed ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_vertex_count_estimate ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_boundary_edge_weight ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_subdivide_n_levels_two ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_is_quad_mesh_false_with_tris ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_face_point_weight ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_centroid ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_smooth_boundary_vertices ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_is_regular_valence ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_centroid_empty ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_subdivide_single_triangle ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_subdivision_level_accessor ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_lerp3 ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_loop_beta ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_to_json ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_triangulate_quads ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_warren_weight ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_subdivide_n_levels_zero ... ok [INFO] [stdout] test mesh_cavity_map::tests::test_mean ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_vertex_weight_regular ... ok [INFO] [stdout] test mesh_cavity_map::tests::test_new_cavity_map ... ok [INFO] [stdout] test mesh_cavity_map::tests::test_cavity_detection ... ok [INFO] [stdout] test mesh_catmull_clark_weight::tests::test_vertex_weight_low ... ok [INFO] [stdout] test mesh_cavity_map::tests::test_convex_detection ... ok [INFO] [stdout] test mesh_catmull_clark::tests::test_subdivide_quad_box ... ok [INFO] [stdout] test mesh_cavity_map::tests::test_to_color_cavity ... ok [INFO] [stdout] test mesh_cavity_map::tests::test_to_color_convex ... ok [INFO] [stdout] test mesh_cell_partition::tests::test_avg_occupancy ... ok [INFO] [stdout] test mesh_cell_partition::tests::test_build_empty ... ok [INFO] [stdout] test mesh_cell_partition::tests::test_build_single ... ok [INFO] [stdout] test mesh_cell_partition::tests::test_max_occupancy ... ok [INFO] [stdout] test mesh_cell_partition::tests::test_multiple_cells ... ok [INFO] [stdout] test mesh_cell_partition::tests::test_negative_cell_size ... ok [INFO] [stdout] test mesh_cell_partition::tests::test_position_to_cell_oob ... ok [INFO] [stdout] test mesh_cell_partition::tests::test_to_json ... ok [INFO] [stdout] test mesh_cell_partition::tests::test_vertices_in_cell ... ok [INFO] [stdout] test mesh_centroid_decompose::tests::test_decomp_result_to_json ... ok [INFO] [stdout] test mesh_centroid_decompose::tests::test_decomp_total_faces_multi ... ok [INFO] [stdout] test mesh_centroid_decompose::tests::test_decompose_two_regions ... ok [INFO] [stdout] test mesh_centroid_decompose::tests::test_default_config ... ok [INFO] [stdout] test mesh_cell_partition::tests::test_position_to_cell_valid ... ok [INFO] [stdout] test mesh_centroid_decompose::tests::test_all_face_centroids ... ok [INFO] [stdout] test mesh_centroid_decompose::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_centroid_decompose::tests::test_decompose_single_region ... ok [INFO] [stdout] test mesh_centroid_decompose::tests::test_face_centroid ... ok [INFO] [stdout] test mesh_centroid_decompose::tests::test_more_regions_than_faces ... ok [INFO] [stdout] test mesh_centroid_query::tests::test_centroid_deviation_nonneg ... ok [INFO] [stdout] test mesh_centroid_query::tests::test_surface_centroid_degenerate_triangle ... ok [INFO] [stdout] test mesh_centroid_query::tests::test_surface_centroid_single_triangle ... ok [INFO] [stdout] test mesh_centroid_query::tests::test_vertex_centroid_symmetric ... ok [INFO] [stdout] test mesh_centroid_query::tests::test_volume_centroid_empty ... ok [INFO] [stdout] test mesh_chain_link::tests::chain_total_triangles ... ok [INFO] [stdout] test mesh_chain_link::tests::link_triangle_count ... ok [INFO] [stdout] test mesh_chain_link::tests::link_vertex_count ... ok [INFO] [stdout] test mesh_chain_link::tests::triangles_per_link_formula ... ok [INFO] [stdout] test mesh_chain_link::tests::validate_bad_radii ... ok [INFO] [stdout] test mesh_centroid_query::tests::test_center_mesh_at_centroid ... ok [INFO] [stdout] test mesh_chain_link::tests::validate_params_ok ... ok [INFO] [stdout] test mesh_chain_link::tests::chain_link_count ... ok [INFO] [stdout] test mesh_centroid_query::tests::test_center_mesh_empty ... ok [INFO] [stdout] test mesh_centroid_query::tests::test_vertex_centroid_empty ... ok [INFO] [stdout] test mesh_centroid_query::tests::test_surface_centroid_empty ... ok [INFO] [stdout] test mesh_chain_link::tests::link_indices_in_bounds ... ok [INFO] [stdout] test mesh_centroid_query::tests::test_vertex_centroid_single ... ok [INFO] [stdout] test mesh_chamfer_edge::tests::test_chamfer_from_bevel_width ... ok [INFO] [stdout] test mesh_chamfer_edge::tests::test_chamfer_offset_points ... ok [INFO] [stdout] test mesh_chamfer_edge::tests::test_chamfer_edges ... ok [INFO] [stdout] test mesh_chamfer_edge::tests::test_chamfer_vertex_estimate ... ok [INFO] [stdout] test mesh_chamfer_edge::tests::test_default_config_segments ... ok [INFO] [stdout] test mesh_chamfer_edge::tests::test_scale_chamfer_result ... ok [INFO] [stdout] test mesh_chamfer_edge::tests::test_validate_chamfer_config ... ok [INFO] [stdout] test mesh_chart_pack::tests::test_pack_charts_atlas_size_positive ... ok [INFO] [stdout] test mesh_chart_pack::tests::test_pack_charts_count ... ok [INFO] [stdout] test mesh_chart_pack::tests::test_pack_charts_empty ... ok [INFO] [stdout] test mesh_chamfer_edge::tests::test_chamfer_strip_length ... ok [INFO] [stdout] test mesh_chamfer_edge::tests::test_chamfer_strip_profile ... ok [INFO] [stdout] test mesh_chart_pack::tests::test_chart_pack_to_json ... ok [INFO] [stdout] test mesh_chain_link::tests::normals_count_matches ... ok [INFO] [stdout] test mesh_chart_pack::tests::test_pack_charts_utilization_positive ... ok [INFO] [stdout] test mesh_chart_pack::tests::test_rects_no_overlap ... ok [INFO] [stdout] test mesh_chart_pack::tests::test_rects_overlap ... ok [INFO] [stdout] test mesh_chart_pack::tests::test_packed_indices_valid ... ok [INFO] [stdout] test mesh_chart_pack::tests::test_utilization_leq_one ... ok [INFO] [stdout] test mesh_chart_pack::tests::test_total_chart_area ... ok [INFO] [stdout] test mesh_checker_deselect::tests::checker_deselect_faces_alternates ... ok [INFO] [stdout] test mesh_checker_deselect::tests::checker_deselect_indices_split ... ok [INFO] [stdout] test mesh_checker_deselect::tests::checker_deselect_vertices_count ... ok [INFO] [stdout] test mesh_checker_deselect::tests::checker_select_count_even ... ok [INFO] [stdout] test mesh_checker_deselect::tests::checker_select_count_odd ... ok [INFO] [stdout] test mesh_checker_deselect::tests::checker_mask_alternating ... ok [INFO] [stdout] test mesh_circular_edge::tests::test_circumference ... ok [INFO] [stdout] test mesh_circular_edge::tests::test_detect_empty ... ok [INFO] [stdout] test mesh_circular_edge::tests::test_detect_single_tri ... ok [INFO] [stdout] test mesh_checker_deselect::tests::checker_mask_correct_length ... ok [INFO] [stdout] test mesh_checker_deselect::tests::selected_from_mask_correct ... ok [INFO] [stdout] test mesh_circular_edge::tests::test_loop_count ... ok [INFO] [stdout] test mesh_circular_edge::tests::test_make_edge ... ok [INFO] [stdout] test mesh_circular_edge::tests::test_open_chain_count ... ok [INFO] [stdout] test mesh_circular_edge::tests::test_to_json ... ok [INFO] [stdout] test mesh_circumcenter::tests::test_avg_circumradius ... ok [INFO] [stdout] test mesh_circumcenter::tests::test_compute_circumcenters ... ok [INFO] [stdout] test mesh_checker_deselect::tests::checker_deselect_offset_inverts ... ok [INFO] [stdout] test mesh_circumcenter::tests::test_is_acute ... ok [INFO] [stdout] test mesh_circular_edge::tests::test_two_tris_shared_edge ... ok [INFO] [stdout] test mesh_circular_edge::tests::test_build_adjacency ... ok [INFO] [stdout] test mesh_circumcenter::tests::test_max_circumradius ... ok [INFO] [stdout] test mesh_circumcenter::tests::test_multiple_circumcenters ... ok [INFO] [stdout] test mesh_circumcenter::tests::test_to_json ... ok [INFO] [stdout] test mesh_circumcenter::tests::test_empty ... ok [INFO] [stdout] test mesh_circumcenter::tests::test_right_triangle_circumcenter ... ok [INFO] [stdout] test mesh_clip::tests::all_below_discards_all_geometry ... ok [INFO] [stdout] test mesh_circular_edge::tests::test_largest_loop ... ok [INFO] [stdout] test mesh_circumcenter::tests::test_equilateral_circumcenter ... ok [INFO] [stdout] test mesh_clip::tests::clip_below_y_has_faces ... ok [INFO] [stdout] test mesh_circumcenter::tests::test_degenerate ... ok [INFO] [stdout] test mesh_clip::tests::clip_below_y_keeps_lower_half ... ok [INFO] [stdout] test mesh_clip::tests::clip_plane_diagonal_normal ... ok [INFO] [stdout] test mesh_clip::tests::clip_plane_above_positive_side ... ok [INFO] [stdout] test mesh_clip::tests::clip_above_y_half_box_all_verts_above ... ok [INFO] [stdout] test mesh_clip::tests::all_above_keeps_all_faces ... ok [INFO] [stdout] test mesh_clip::tests::clip_above_y_cap_vertices_exist ... ok [INFO] [stdout] test mesh_clip_region::tests::test_clip_accepts_inside_tri ... ok [INFO] [stdout] test mesh_clip::tests::clip_plane_signed_distance_offset_origin ... ok [INFO] [stdout] test mesh_clip_region::tests::test_clip_indices_valid ... ok [INFO] [stdout] test mesh_clip_region::tests::test_clip_region_on_boundary ... ok [INFO] [stdout] test mesh_clip::tests::clip_above_y_sphere_has_cap_faces ... ok [INFO] [stdout] test mesh_clip_region::tests::test_clip_empty_mesh ... ok [INFO] [stdout] test mesh_clip::tests::clip_plane_signed_distance_origin ... ok [INFO] [stdout] test mesh_clip::tests::clip_single_triangle_entirely_above ... ok [INFO] [stdout] test mesh_clip::tests::clip_single_triangle_entirely_below ... ok [INFO] [stdout] test mesh_checker_deselect::tests::invert_selection_flips ... ok [INFO] [stdout] test mesh_clip::tests::clip_plane_above_on_plane ... ok [INFO] [stdout] test mesh_clip::tests::clip_to_box_produces_valid_indices ... ok [INFO] [stdout] test mesh_clip::tests::cut_face_count_nonzero_for_intersecting_plane ... ok [INFO] [stdout] test mesh_clip::tests::clip_config_default_fill_cap_true ... ok [INFO] [stdout] test mesh_clip::tests::fill_cap_false_no_cap_vertices ... ok [INFO] [stdout] test mesh_closest_point::tests::closest_distance_correct ... ok [INFO] [stdout] test mesh_clip_region::tests::test_position_in_region_outside ... ok [INFO] [stdout] test mesh_closest_point::tests::barycentric_sum_one ... ok [INFO] [stdout] test mesh_clip_region::tests::test_clip_region_to_json ... ok [INFO] [stdout] test mesh_clip_region::tests::test_position_in_region_inside ... ok [INFO] [stdout] test mesh_clip::tests::clip_above_y_sphere_no_negative_y ... ok [INFO] [stdout] test mesh_clip_region::tests::test_clip_rejects_outside_tri ... ok [INFO] [stdout] test mesh_closest_point::tests::closest_empty_mesh_returns_none ... ok [INFO] [stdout] test mesh_clip_region::tests::test_partial_clip ... ok [INFO] [stdout] test mesh_clip::tests::clip_to_box_restricts_positions ... ok [INFO] [stdout] test mesh_closest_point::tests::closest_point_on_surface ... ok [INFO] [stdout] test mesh_closest_point::tests::closest_point_on_triangle_centroid ... ok [INFO] [stdout] test mesh_closest_point::tests::closest_to_corner ... ok [INFO] [stdout] test mesh_closest_point::tests::closest_point_corner_a ... ok [INFO] [stdout] test mesh_closest_point::tests::dist3_unit ... ok [INFO] [stdout] test mesh_closest_point::tests::dist3_zero_same_point ... ok [INFO] [stdout] test mesh_closest_point::tests::face_index_valid ... ok [INFO] [stdout] test mesh_closest_point_query::tests::test_closest_point_on_triangle_interior ... ok [INFO] [stdout] test mesh_closest_point_query::tests::test_closest_point_on_triangle_vertex ... ok [INFO] [stdout] test mesh_closest_point_query::tests::test_is_near_surface_false ... ok [INFO] [stdout] test mesh_closest_point_query::tests::test_is_near_surface_true ... ok [INFO] [stdout] test mesh_closest_point_query::tests::test_query_closest_distance_positive ... ok [INFO] [stdout] test mesh_closest_point_query::tests::test_query_closest_point_none_empty ... ok [INFO] [stdout] test mesh_closest_point_query::tests::test_query_closest_point_some ... ok [INFO] [stdout] test mesh_closest_point_query::tests::test_query_within_radius_finds_hit ... ok [INFO] [stdout] test mesh_cloth_collider::tests::aabb_computed ... ok [INFO] [stdout] test mesh_closest_point_query::tests::test_query_within_radius_misses ... ok [INFO] [stdout] test mesh_cloth_collider::tests::closest_point_on_tri_vertex ... ok [INFO] [stdout] test mesh_cloth_collider::tests::point_in_aabb_true ... ok [INFO] [stdout] test mesh_cloth_collider::tests::new_defaults ... ok [INFO] [stdout] test mesh_cloth_collider::tests::inflate_aabb_grows ... ok [INFO] [stdout] test mesh_cloth_collider::tests::validate_collider_ok ... ok [INFO] [stdout] test mesh_cloth_collider::tests::point_in_aabb_false ... ok [INFO] [stdout] test mesh_cloth_collision::tests::add_proxy_increments_count ... ok [INFO] [stdout] test mesh_cloth_collider::tests::triangle_count_correct ... ok [INFO] [stdout] test mesh_cloth_collider::tests::validate_collider_bad_index ... ok [INFO] [stdout] test mesh_cloth_collider::tests::validate_friction_range ... ok [INFO] [stdout] test mesh_cloth_collision::tests::average_radius_correct ... ok [INFO] [stdout] test mesh_cloth_collision::tests::average_radius_empty_is_zero ... ok [INFO] [stdout] test mesh_cloth_collision::tests::json_contains_margin ... ok [INFO] [stdout] test mesh_cloth_collision::tests::negative_radius_clamped_to_zero ... ok [INFO] [stdout] test mesh_cloth_collision::tests::proxies_no_overlap_far_spheres ... ok [INFO] [stdout] test mesh_cloth_collision::tests::new_set_has_no_proxies ... ok [INFO] [stdout] test mesh_cloth_collision::tests::total_covered_vertices_sums ... ok [INFO] [stdout] test mesh_cloth_pins::tests::test_average_strength ... ok [INFO] [stdout] test mesh_cloth_pins::tests::test_fully_pinned_count ... ok [INFO] [stdout] test mesh_cloth_pins::tests::test_is_pinned ... ok [INFO] [stdout] test mesh_cloth_collision::tests::proxies_overlap_close_spheres ... ok [INFO] [stdout] test mesh_cloth_pins::tests::test_pin_count ... ok [INFO] [stdout] test mesh_cloth_pins::tests::test_pinned_vertex_indices_sorted ... ok [INFO] [stdout] test mesh_cloth_pins::tests::test_scale_strengths ... ok [INFO] [stdout] test mesh_cloth_pins::tests::test_unpin ... ok [INFO] [stdout] test mesh_cloth_pins::tests::test_update_existing_pin ... ok [INFO] [stdout] test mesh_coarse_grid::tests::test_build_coarse_grid_occupied ... ok [INFO] [stdout] test mesh_coarse_grid::tests::test_coarse_grid_to_json ... ok [INFO] [stdout] test mesh_coarse_grid::tests::test_empty_grid ... ok [INFO] [stdout] test mesh_coarse_grid::tests::test_find_nearby_empty ... ok [INFO] [stdout] test mesh_coarse_grid::tests::test_find_nearby_excludes_distant ... ok [INFO] [stdout] test mesh_coarse_grid::tests::test_find_nearby_vertices ... ok [INFO] [stdout] test mesh_coarse_grid::tests::test_negative_coords ... ok [INFO] [stdout] test mesh_coarse_grid::tests::test_position_to_cell ... ok [INFO] [stdout] test mesh_coarse_grid::tests::test_vertices_in_cell_empty ... ok [INFO] [stdout] test mesh_coarse_grid::tests::test_total_indexed_vertices ... ok [INFO] [stdout] test mesh_collapse_edge::tests::test_collapse_edge_struct ... ok [INFO] [stdout] test mesh_collapse_edge::tests::test_collapse_n_edges ... ok [INFO] [stdout] test mesh_collapse_edge::tests::test_collapse_result_to_json ... ok [INFO] [stdout] test mesh_collapse_edge::tests::test_collapse_same_vertex ... ok [INFO] [stdout] test mesh_collapse_edge::tests::test_collapse_single ... ok [INFO] [stdout] test mesh_collapse_edge::tests::test_find_shortest_edge ... ok [INFO] [stdout] test mesh_collapse_edge::tests::test_edge_midpoint ... ok [INFO] [stdout] test mesh_collapse_edge::tests::test_find_shortest_empty ... ok [INFO] [stdout] test mesh_collapse_edge::tests::test_unique_edge_count ... ok [INFO] [stdout] test mesh_collapse_group::tests::contains_range_check ... ok [INFO] [stdout] test mesh_collapse_edge::tests::test_edge_length ... ok [INFO] [stdout] test mesh_collapse_group::tests::remap_length_preserved ... ok [INFO] [stdout] test mesh_collapse_group::tests::single_group_collapse ... ok [INFO] [stdout] test mesh_collapse_group::tests::remap_values_in_range ... ok [INFO] [stdout] test mesh_collapse_group::tests::groups_sorted_by_id ... ok [INFO] [stdout] test mesh_collapse_group::tests::json_contains_group_count ... ok [INFO] [stdout] test mesh_collapse_group::tests::max_group_size_correct ... ok [INFO] [stdout] test mesh_collapse_group::tests::target_is_centroid ... ok [INFO] [stdout] test mesh_collision_bounds::tests::bounds_type_name_box ... ok [INFO] [stdout] test mesh_collision_bounds::tests::bounds_type_name_hull ... ok [INFO] [stdout] test mesh_collision_bounds::tests::box_volume_correct ... ok [INFO] [stdout] test mesh_collision_bounds::tests::bounds_type_name_sphere ... ok [INFO] [stdout] test mesh_collision_bounds::tests::default_margin_is_nonzero ... ok [INFO] [stdout] test mesh_collision_bounds::tests::json_contains_label ... ok [INFO] [stdout] test mesh_collision_bounds::tests::hull_is_convex_hull_type ... ok [INFO] [stdout] test mesh_collision_bounds::tests::sphere_radius_stored_in_extents_x ... ok [INFO] [stdout] test mesh_collapse_group::tests::two_groups_no_collapse ... ok [INFO] [stdout] test mesh_collision_bounds::tests::sphere_volume_correct ... ok [INFO] [stdout] test mesh_collapse_group::tests::empty_input ... ok [INFO] [stdout] test mesh_color_attr::tests::test_apply_gamma ... ok [INFO] [stdout] test mesh_color_attr::tests::test_average_color ... ok [INFO] [stdout] test mesh_color_attr::tests::test_get_oob ... ok [INFO] [stdout] test mesh_color_attr::tests::test_lerp_color ... ok [INFO] [stdout] test mesh_color_attr::tests::test_set_get_color ... ok [INFO] [stdout] test mesh_color_attr::tests::test_set_oob_no_panic ... ok [INFO] [stdout] test mesh_color_attr::tests::test_average_empty ... ok [INFO] [stdout] test mesh_compress_index::tests::test_compress_index_to_json ... ok [INFO] [stdout] test mesh_color_attr::tests::test_clamp_colors ... ok [INFO] [stdout] test mesh_compress_index::tests::test_delta_count_matches ... ok [INFO] [stdout] test mesh_compress_index::tests::test_empty_indices ... ok [INFO] [stdout] test mesh_compress_index::tests::test_estimate_delta_size_bytes_positive ... ok [INFO] [stdout] test mesh_compress_index::tests::test_fits_u16_false ... ok [INFO] [stdout] test mesh_compress_index::tests::test_max_index_ci ... ok [INFO] [stdout] test mesh_color_attr::tests::test_new_color_attr ... ok [INFO] [stdout] test mesh_compress_index::tests::test_fits_u16_true ... ok [INFO] [stdout] test mesh_compress_index::tests::test_encode_decode_roundtrip ... ok [INFO] [stdout] test mesh_color_attr::tests::test_to_json ... ok [INFO] [stdout] test mesh_cone_gen::tests::test_default_config ... ok [INFO] [stdout] test mesh_compress_index::tests::test_pack_u16_basic ... ok [INFO] [stdout] test mesh_cone_gen::tests::test_generate_cone ... ok [INFO] [stdout] test mesh_cone_gen::tests::test_index_count_capped ... ok [INFO] [stdout] test mesh_cone_gen::tests::test_slant_height ... ok [INFO] [stdout] test mesh_compress_index::tests::test_unpack_u16_roundtrip ... ok [INFO] [stdout] test mesh_cone_gen::tests::test_indices_valid ... ok [INFO] [stdout] test mesh_cone_gen::tests::test_vertex_count_capped ... ok [INFO] [stdout] test mesh_cone_gen::tests::test_normals_count ... ok [INFO] [stdout] test mesh_cone_gen::tests::test_open_cone ... ok [INFO] [stdout] test mesh_cone_gen::tests::test_volume ... ok [INFO] [stdout] test mesh_cone_gen::tests::test_to_json ... ok [INFO] [stdout] test mesh_conformal_map::tests::test_average_distortion_empty ... ok [INFO] [stdout] test mesh_conformal_map::tests::test_conformal_energy_degenerate ... ok [INFO] [stdout] test mesh_conformal_map::tests::test_conformal_energy ... ok [INFO] [stdout] test mesh_conformal_map::tests::test_average_distortion ... ok [INFO] [stdout] test mesh_conformal_map::tests::test_is_in_unit_square ... ok [INFO] [stdout] test mesh_conformal_map::tests::test_cotangent_weight ... ok [INFO] [stdout] test mesh_conformal_map::tests::test_map_boundary_to_circle ... ok [INFO] [stdout] test mesh_conformal_map::tests::test_map_boundary_empty ... ok [INFO] [stdout] test mesh_conformal_map::tests::test_to_json ... ok [INFO] [stdout] test mesh_convex_face::tests::test_convex_count ... ok [INFO] [stdout] test mesh_convex_face::tests::test_analyze_convexity ... ok [INFO] [stdout] test mesh_convex_face::tests::test_cross3 ... ok [INFO] [stdout] test mesh_convex_face::tests::test_quad_concave ... ok [INFO] [stdout] test mesh_conformal_map::tests::test_normalize_uvs ... ok [INFO] [stdout] test mesh_convex_face::tests::test_face_area ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_compute_hull_cube ... ok [INFO] [stdout] test mesh_convex_face::tests::test_dot3 ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_compute_hull_tetrahedron ... ok [INFO] [stdout] test mesh_convex_face::tests::test_quad_convex ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_hull_centroid_cube ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_coplanar_points_fail ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_default_hull_config ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_hull_edge_count_cube ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_hull_edge_count_tetrahedron ... ok [INFO] [stdout] test mesh_convex_face::tests::test_to_json ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_hull_surface_area_cube ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_hull_volume_cube ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_hull_bounding_box_cube ... ok [INFO] [stdout] test mesh_convex_face::tests::test_face_normal ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_point_outside_hull ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_project_to_hull_surface ... ok [INFO] [stdout] test mesh_convex_face::tests::test_is_triangle_convex ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_too_few_points ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_support_point_cube ... ok [INFO] [stdout] test mesh_convex_hull_2d::tests::hull_area_square ... ok [INFO] [stdout] test mesh_convex_hull_2d::tests::cross_2d_ccw_positive ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_hull_volume_tetrahedron ... ok [INFO] [stdout] test mesh_convex_hull_2d::tests::hull_empty ... ok [INFO] [stdout] test mesh_convex_hull_2d::tests::hull_of_square_has_4_points ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_interior_points_ignored ... ok [INFO] [stdout] test mesh_convex_hull_2d::tests::hull_with_interior_point_excluded ... ok [INFO] [stdout] test mesh_convex_hull::tests::test_point_inside_hull ... ok [INFO] [stdout] test mesh_convex_hull_v2::tests::hull_v2_has_triangles ... ok [INFO] [stdout] test mesh_convex_hull_v2::tests::hull_v2_face_count_nonzero ... ok [INFO] [stdout] test mesh_convex_hull_v2::tests::hull_v2_has_positions ... ok [INFO] [stdout] test mesh_convex_hull_v2::tests::hull_v2_indices_in_bounds ... ok [INFO] [stdout] test mesh_convex_hull_v2::tests::hull_v2_volume_positive ... ok [INFO] [stdout] test mesh_convex_hull_v2::tests::hull_v2_tetrahedron_volume ... ok [INFO] [stdout] test mesh_convex_hull_v2::tests::signed_vol_nonzero ... ok [INFO] [stdout] test mesh_coons_patch::tests::test_coons_grid_dims ... ok [INFO] [stdout] test mesh_convex_hull_v2::tests::hull_v2_too_few_points ... ok [INFO] [stdout] test mesh_convex_hull_2d::tests::hull_perimeter_square ... ok [INFO] [stdout] test mesh_coons_patch::tests::test_add3_sub3 ... ok [INFO] [stdout] test mesh_convex_hull_2d::tests::point_inside_hull ... ok [INFO] [stdout] test mesh_coons_patch::tests::test_coons_single_cell ... ok [INFO] [stdout] test mesh_coons_patch::tests::test_coons_empty_on_mismatch ... ok [INFO] [stdout] test mesh_coons_patch::tests::test_coons_tri_count ... ok [INFO] [stdout] test mesh_coons_patch::tests::test_coons_empty_on_too_short ... ok [INFO] [stdout] test mesh_coons_patch::tests::test_coons_validate ... ok [INFO] [stdout] test mesh_convex_hull_2d::tests::point_outside_hull ... ok [INFO] [stdout] test mesh_coplanar_face::tests::test_are_coplanar ... ok [INFO] [stdout] test mesh_coplanar_face::tests::test_default_threshold ... ok [INFO] [stdout] test mesh_coplanar_face::tests::test_detect_flat_quad ... ok [INFO] [stdout] test mesh_coplanar_face::tests::test_dot3 ... ok [INFO] [stdout] test mesh_coons_patch::tests::test_coons_vertex_count ... ok [INFO] [stdout] test mesh_coplanar_face::tests::test_empty ... ok [INFO] [stdout] test mesh_coons_patch::tests::test_lerp3_identity ... ok [INFO] [stdout] test mesh_coplanar_face::tests::test_face_normal_raw ... ok [INFO] [stdout] test mesh_convex_hull_v2::tests::hull_v2_centroid_near_center ... ok [INFO] [stdout] test mesh_coplanar_face::tests::test_normalize3 ... ok [INFO] [stdout] test mesh_coplanar_face::tests::test_to_json ... ok [INFO] [stdout] test mesh_coplanar_face::tests::test_largest_group ... ok [INFO] [stdout] test mesh_copy_location::tests::apply_full_influence_returns_target ... ok [INFO] [stdout] test mesh_copy_location::tests::half_influence_interpolates ... ok [INFO] [stdout] test mesh_copy_location::tests::disabled_x_axis_leaves_x_unchanged ... ok [INFO] [stdout] test mesh_copy_location::tests::active_axis_count_when_one_disabled ... ok [INFO] [stdout] test mesh_copy_rotation::tests::apply_zero_influence_leaves_source ... ok [INFO] [stdout] test mesh_copy_rotation::tests::default_influence_is_one ... ok [INFO] [stdout] test mesh_copy_location::tests::apply_zero_influence_returns_source ... ok [INFO] [stdout] test mesh_copy_location::tests::new_constraint_all_axes_enabled ... ok [INFO] [stdout] test mesh_coplanar_face::tests::test_total_grouped_faces ... ok [INFO] [stdout] test mesh_copy_location::tests::offset_shifts_result ... ok [INFO] [stdout] test mesh_copy_rotation::tests::active_axis_count_when_y_disabled ... ok [INFO] [stdout] test mesh_copy_rotation::tests::apply_full_influence_copies_target ... ok [INFO] [stdout] test mesh_copy_location::tests::default_influence_is_one ... ok [INFO] [stdout] test mesh_copy_rotation::tests::deg_to_rad_90_is_pi_over_2 ... ok [INFO] [stdout] test mesh_copy_location::tests::json_contains_label ... ok [INFO] [stdout] test mesh_copy_rotation::tests::json_contains_label ... ok [INFO] [stdout] test mesh_copy_rotation::tests::new_constraint_all_axes_active ... ok [INFO] [stdout] test mesh_convex_hull_v2::tests::hull_v2_empty_centroid ... ok [INFO] [stdout] test mesh_copy_scale::tests::new_all_axes_active ... ok [INFO] [stdout] test mesh_corner_angle::tests::test_avg_min_angle ... ok [INFO] [stdout] test mesh_copy_scale::tests::disabled_z_leaves_z ... ok [INFO] [stdout] test mesh_corner_angle::tests::test_empty ... ok [INFO] [stdout] test mesh_copy_rotation::tests::disabled_z_leaves_z_unchanged ... ok [INFO] [stdout] test mesh_copy_scale::tests::json_contains_label ... ok [INFO] [stdout] test mesh_corner_angle::tests::test_face_count ... ok [INFO] [stdout] test mesh_copy_rotation::tests::half_influence_interpolates_x ... ok [INFO] [stdout] test mesh_corner_angle::tests::test_equilateral_angles ... ok [INFO] [stdout] test mesh_copy_scale::tests::apply_zero_influence_leaves_source ... ok [INFO] [stdout] test mesh_copy_scale::tests::default_influence_is_one ... ok [INFO] [stdout] test mesh_corner_angle::tests::test_corner_angle_right ... ok [INFO] [stdout] test mesh_corrective_shape::tests::test_peak_weight ... ok [INFO] [stdout] test mesh_corner_angle::tests::test_min_max ... ok [INFO] [stdout] test mesh_corrective_shape::tests::test_weight_at_peak ... ok [INFO] [stdout] test mesh_corrective_shape::tests::test_weight_below_trigger ... ok [INFO] [stdout] test mesh_corner_angle::tests::test_to_json ... ok [INFO] [stdout] test mesh_corner_angle::tests::test_triangle_angles_sum ... ok [INFO] [stdout] test mesh_corner_angle::tests::test_validate_angle_sums ... ok [INFO] [stdout] test mesh_corrective_shape::tests::test_apply_at_trigger ... ok [INFO] [stdout] test mesh_corrective_shape::tests::test_is_active ... ok [INFO] [stdout] test mesh_cotan_laplace::tests::contains_range ... ok [INFO] [stdout] test mesh_cotan_laplace::tests::vertex_count_stored ... ok [INFO] [stdout] test mesh_cotangent_weights::tests::cot_angle_right_angle ... ok [INFO] [stdout] test mesh_cotan_laplace::tests::cotan_degenerate_returns_zero ... ok [INFO] [stdout] test mesh_cotangent_weights::tests::cot_avg_vertex_area_positive ... ok [INFO] [stdout] test mesh_cotan_laplace::tests::empty_mesh ... ok [INFO] [stdout] test mesh_cotan_laplace::tests::entry_count_single_tri ... ok [INFO] [stdout] test mesh_cotangent_weights::tests::cot_total_weight_positive ... ok [INFO] [stdout] test mesh_cotan_laplace::tests::smooth_preserves_vertex_count ... ok [INFO] [stdout] test mesh_cotangent_weights::tests::cot_weights_nonneg_check ... ok [INFO] [stdout] test mesh_cotan_laplace::tests::total_weight_finite ... ok [INFO] [stdout] test mesh_copy_scale::tests::active_axis_count_one_disabled ... ok [INFO] [stdout] test mesh_cotangent_weights::tests::build_cot_weights_triangle_count ... ok [INFO] [stdout] test mesh_cotan_laplace::tests::zero_lambda_no_change ... ok [INFO] [stdout] test mesh_cotangent_weights::tests::empty_mesh_empty_result ... ok [INFO] [stdout] test mesh_cotan_laplace::tests::cotan_weight_right_angle ... ok [INFO] [stdout] test mesh_cotangent_weights::tests::vertex_areas_positive ... ok [INFO] [stdout] test mesh_crease::tests::all_creases_round_trip ... ok [INFO] [stdout] test mesh_crease::tests::apply_crease_partial_weight_not_in_sharp_flags ... ok [INFO] [stdout] test mesh_crease::tests::apply_crease_weights_vec_populated ... ok [INFO] [stdout] test mesh_crease::tests::auto_crease_coplanar_below_threshold ... ok [INFO] [stdout] test mesh_crease::tests::auto_crease_90deg_above_threshold ... ok [INFO] [stdout] test mesh_crease::tests::crease_map_set_and_get ... ok [INFO] [stdout] test mesh_crease::tests::auto_crease_single_triangle_no_creases ... ok [INFO] [stdout] test mesh_crease::tests::crease_map_weight_clamped_to_one ... ok [INFO] [stdout] test mesh_crease::tests::crease_map_get_missing_returns_zero ... ok [INFO] [stdout] test mesh_crease::tests::crease_map_remove ... ok [INFO] [stdout] test mesh_crease::tests::crease_stats_empty_map ... ok [INFO] [stdout] test mesh_crease::tests::crease_map_len_and_is_empty ... ok [INFO] [stdout] test mesh_crease::tests::crease_map_remove_nonexistent_is_noop ... ok [INFO] [stdout] test mesh_crease::tests::crease_stats_mixed ... ok [INFO] [stdout] test mesh_copy_scale::tests::apply_full_influence_copies_target ... ok [INFO] [stdout] test mesh_corner_angle::tests::test_degenerate_angle ... ok [INFO] [stdout] test mesh_crease::tests::mark_boundary_all_three_edges_of_single_triangle ... ok [INFO] [stdout] test mesh_crease::tests::mark_boundary_shared_edge_not_boundary ... ok [INFO] [stdout] test mesh_crease::tests::merge_includes_edges_unique_to_each_map ... ok [INFO] [stdout] test mesh_crease::tests::smooth_edges_filter ... ok [INFO] [stdout] test mesh_crease_set::tests::add_edge_to_existing_set ... ok [INFO] [stdout] test mesh_crease_set::tests::add_edge_to_missing_set_returns_false ... ok [INFO] [stdout] test mesh_crease_set::tests::find_returns_correct_set ... ok [INFO] [stdout] test mesh_crease_set::tests::merge_combines_sets ... ok [INFO] [stdout] test mesh_crease_set::tests::new_collection_is_empty ... ok [INFO] [stdout] test mesh_crease_set::tests::total_crease_edges_sums_all_sets ... ok [INFO] [stdout] test mesh_crease_set::tests::validate_passes_valid_sharpness ... ok [INFO] [stdout] test mesh_crease_tool::tests::test_auto_crease_by_dihedral ... ok [INFO] [stdout] test mesh_crease_tool::tests::test_avg_sharpness ... ok [INFO] [stdout] test mesh_crease_tool::tests::test_clear_creases ... ok [INFO] [stdout] test mesh_crease::tests::apply_crease_sharp_vertex_flags ... ok [INFO] [stdout] test mesh_crease::tests::merge_takes_max_weight_for_shared_edge ... ok [INFO] [stdout] test mesh_crease::tests::sharp_edges_filter ... ok [INFO] [stdout] test mesh_crease_set::tests::add_crease_set_increments_count ... ok [INFO] [stdout] test mesh_crease_set::tests::edge_pair_normalised_order ... ok [INFO] [stdout] test mesh_crease_tool::tests::test_max_sharpness ... ok [INFO] [stdout] test mesh_crease_tool::tests::test_edge_key_symmetric ... ok [INFO] [stdout] test mesh_crease_set::tests::find_missing_returns_none ... ok [INFO] [stdout] test mesh_crease::tests::crease_map_weight_clamped_to_zero ... ok [INFO] [stdout] test mesh_crease_tool::tests::test_remove_crease ... ok [INFO] [stdout] test mesh_crease_tool::tests::test_scale_creases ... ok [INFO] [stdout] test mesh_corrective_shape::tests::test_new_corrective_shape ... ok [INFO] [stdout] test mesh_curvature_discrete::tests::test_avg_curvature_empty ... ok [INFO] [stdout] test mesh_curvature_discrete::tests::test_gaussian_curvature_flat ... ok [INFO] [stdout] test mesh_curvature_discrete::tests::test_avg_curvature ... ok [INFO] [stdout] test mesh_curvature_discrete::tests::test_max_abs ... ok [INFO] [stdout] test mesh_curvature_discrete::tests::test_mean_curvature_flat ... ok [INFO] [stdout] test mesh_curvature_discrete::tests::test_single_triangle ... ok [INFO] [stdout] test mesh_crease_tool::tests::test_set_get_crease ... ok [INFO] [stdout] test mesh_curvature_discrete::tests::test_vertex_angle_right ... ok [INFO] [stdout] test mesh_curvature_discrete::tests::test_compute_discrete ... ok [INFO] [stdout] test mesh_curvature_lines::tests::test_anisotropy ... ok [INFO] [stdout] test mesh_curvature_discrete::tests::test_to_json ... ok [INFO] [stdout] test mesh_curvature_lines::tests::test_color_min ... ok [INFO] [stdout] test mesh_curvature_discrete::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_curvature_lines::tests::test_color_max ... ok [INFO] [stdout] test mesh_curvature_map::tests::test_gaussian_to_color_negative ... ok [INFO] [stdout] test mesh_curvature_map::tests::test_mean_to_color_concave ... ok [INFO] [stdout] test mesh_curvature_map::tests::test_set_get_gaussian ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::compute_all_curvature_tensors_length ... ok [INFO] [stdout] test mesh_curvature_lines::tests::test_push_and_count ... ok [INFO] [stdout] test mesh_curvature_map::tests::test_new_curvature_map ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::curvedness_formula ... ok [INFO] [stdout] test mesh_curvature_map::tests::test_set_get_mean ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::curvedness_non_negative ... ok [INFO] [stdout] test mesh_curvature_map::tests::test_mean_to_color_convex ... ok [INFO] [stdout] test mesh_curvature_lines::tests::test_length ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::classify_flat_near_zero ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::flat_vertex_near_zero_curvature ... ok [INFO] [stdout] test mesh_curvature_lines::tests::test_new_curvature_line ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::classify_saddle_opposite_signs ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::classify_sphere_positive_both ... ok [INFO] [stdout] test mesh_curvature_map::tests::test_gaussian_to_color ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::gaussian_curvature_negative_for_saddle_tensor ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::gaussian_curvature_formula ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::smooth_curvature_tensors_no_panic ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::tensor_similarity_zero_for_equal ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::mean_curvature_formula ... ok [INFO] [stdout] test mesh_curve_deform::tests::bezier_arc_length_positive ... ok [INFO] [stdout] test mesh_curve_deform::tests::bezier_at_t0_is_first_control_point ... ok [INFO] [stdout] test mesh_curve_deform::tests::bezier_at_t05_is_midpoint_for_linear_curve ... ok [INFO] [stdout] test mesh_curve_deform::tests::bezier_arc_length_linear_curve_approx_correct ... ok [INFO] [stdout] test mesh_curve_deform::tests::deform_empty_mesh_returns_empty ... ok [INFO] [stdout] test mesh_curve_deform::tests::bezier_tangent_linear_curve_points_forward ... ok [INFO] [stdout] test mesh_curve_deform::tests::bezier_at_t1_is_last_control_point ... ok [INFO] [stdout] test mesh_curve_deform::tests::deform_mesh_changes_positions_with_nonzero_strength ... ok [INFO] [stdout] test mesh_curve_deform::tests::deform_strength_zero_no_change ... ok [INFO] [stdout] test mesh_curve_deform::tests::project_to_curve_param_t0_near_start ... ok [INFO] [stdout] test mesh_curve_deform::tests::cross3_standard_basis ... ok [INFO] [stdout] test mesh_curve_deform::tests::normalize3_unit_output ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::shape_index_range ... ok [INFO] [stdout] test mesh_curvature_tensor::tests::sphere_vertex_positive_curvatures ... ok [INFO] [stdout] test mesh_curve_deform::tests::project_to_curve_param_t1_near_end ... ok [INFO] [stdout] test mesh_curve_deform::tests::sample_curve_points_empty ... ok [INFO] [stdout] test mesh_curve_deform::tests::sample_curve_points_count_correct ... ok [INFO] [stdout] test mesh_curve_sample::tests::chord_line_approx_one ... ok [INFO] [stdout] test mesh_curve_sample::tests::empty_n_returns_empty ... ok [INFO] [stdout] test mesh_curve_sample::tests::circle_chord_approx_circumference ... ok [INFO] [stdout] test mesh_curve_sample::tests::contains_range ... ok [INFO] [stdout] test mesh_curve_sample::tests::first_sample_t_zero ... ok [INFO] [stdout] test mesh_curve_sample::tests::last_sample_t_one ... ok [INFO] [stdout] test mesh_curve_sample::tests::resample_at_specific ... ok [INFO] [stdout] test mesh_curve_to_mesh::tests::test_curve_length ... ok [INFO] [stdout] test mesh_curve_sample::tests::positions_count_matches ... ok [INFO] [stdout] test mesh_curve_to_mesh::tests::test_curve_segment_ring_count ... ok [INFO] [stdout] test mesh_curve_to_mesh::tests::test_curve_to_mesh_vertex_count ... ok [INFO] [stdout] test mesh_curve_to_mesh::tests::test_new_curve_mesh_params ... ok [INFO] [stdout] test mesh_curve_sample::tests::tangents_normalised ... ok [INFO] [stdout] test mesh_cusp_detect::tests::test_angle_between_perpendicular ... ok [INFO] [stdout] test mesh_cusp_detect::tests::test_cusp_result_to_json ... ok [INFO] [stdout] test mesh_cusp_detect::tests::test_detect_cusps_flat ... ok [INFO] [stdout] test mesh_curve_sample::tests::uniform_count ... ok [INFO] [stdout] test mesh_cusp_detect::tests::test_detect_cusps_sharp ... ok [INFO] [stdout] test mesh_curve_to_mesh::tests::test_curve_to_mesh_min_sides ... ok [INFO] [stdout] test mesh_cusp_detect::tests::test_angle_between_same ... ok [INFO] [stdout] test mesh_cusp_detect::tests::test_face_normal_raw ... ok [INFO] [stdout] test mesh_curve_to_mesh::tests::test_curve_to_mesh_zero_points ... ok [INFO] [stdout] test mesh_cusp_detect::tests::test_normalize3 ... ok [INFO] [stdout] test mesh_cusp_detect::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_cusp_detect::tests::test_normalize3_zero ... ok [INFO] [stdout] test mesh_custom_data::tests::clear_empties_block ... ok [INFO] [stdout] test mesh_custom_data::tests::new_block_empty ... ok [INFO] [stdout] test mesh_custom_data::tests::list_keys_correct ... ok [INFO] [stdout] test mesh_custom_data::tests::overwrite_updates_value ... ok [INFO] [stdout] test mesh_custom_data::tests::remove_entry_works ... ok [INFO] [stdout] test mesh_cusp_detect::tests::test_is_cusp ... ok [INFO] [stdout] test mesh_curve_to_mesh::tests::test_curve_to_mesh_face_count ... ok [INFO] [stdout] test mesh_custom_data::tests::set_and_get_float ... ok [INFO] [stdout] test mesh_custom_split_normals::tests::clear_removes_all ... ok [INFO] [stdout] test mesh_custom_split_normals::tests::get_missing_returns_none ... ok [INFO] [stdout] test mesh_custom_split_normals::tests::multiple_face_corners_independent ... ok [INFO] [stdout] test mesh_custom_split_normals::tests::new_layer_is_empty ... ok [INFO] [stdout] test mesh_custom_split_normals::tests::safe_normalize_zero_vector ... ok [INFO] [stdout] test mesh_custom_split_normals::tests::overwrite_updates_existing ... ok [INFO] [stdout] test mesh_custom_data::tests::remove_missing_false ... ok [INFO] [stdout] test mesh_custom_data::tests::vec3_entry_stored ... ok [INFO] [stdout] test mesh_custom_split_normals::tests::set_and_get_split_normal ... ok [INFO] [stdout] test mesh_custom_split_normals::tests::set_normalises_input ... ok [INFO] [stdout] test mesh_cylinder_cap::tests::dome_cap_has_vertices ... ok [INFO] [stdout] test mesh_cylinder_cap::tests::flat_cap_flipped_has_same_count ... ok [INFO] [stdout] test mesh_cylinder_cap::tests::dome_cap_not_flat ... ok [INFO] [stdout] test mesh_cylinder_cap::tests::flat_cap_is_flat ... ok [INFO] [stdout] test mesh_custom_split_normals::tests::validate_passes_unit_normals ... ok [INFO] [stdout] test mesh_cylinder_cap::tests::flat_cap_triangle_count ... ok [INFO] [stdout] test mesh_cylinder_gen::tests::test_cylinder_face_count ... ok [INFO] [stdout] test mesh_cylinder_gen::tests::test_cylinder_is_cone_false ... ok [INFO] [stdout] test mesh_custom_data::tests::get_missing_none ... ok [INFO] [stdout] test mesh_cylinder_cap::tests::flat_cap_vertex_count ... ok [INFO] [stdout] test mesh_cylinder_cap::tests::flat_cap_center_at_y ... ok [INFO] [stdout] test mesh_cylinder_cap::tests::contains_range ... ok [INFO] [stdout] test mesh_dart_graph::tests::test_build_single_triangle ... ok [INFO] [stdout] test mesh_cylinder_cap::tests::pi_from_consts ... ok [INFO] [stdout] test mesh_cylinder_gen::tests::test_cylinder_is_cone_true ... ok [INFO] [stdout] test mesh_cylinder_gen::tests::test_new_cylinder ... ok [INFO] [stdout] test mesh_dart_graph::tests::test_boundary_darts_single ... ok [INFO] [stdout] test mesh_cylinder_cap::tests::json_contains_vertices ... ok [INFO] [stdout] test mesh_cylinder_gen::tests::test_cylinder_volume_uniform ... ok [INFO] [stdout] test mesh_cylinder_gen::tests::test_cylinder_vertex ... ok [INFO] [stdout] test mesh_cylinder_gen::tests::test_cylinder_vertex_count ... ok [INFO] [stdout] test mesh_dart_graph::tests::test_empty ... ok [INFO] [stdout] test mesh_dart_graph::tests::test_face_count ... ok [INFO] [stdout] test mesh_dart_graph::tests::test_has_twin ... ok [INFO] [stdout] test mesh_dart_graph::tests::test_next_cycling ... ok [INFO] [stdout] test mesh_dart_graph::tests::test_twin_pairing ... ok [INFO] [stdout] test mesh_dart_graph::tests::test_to_json ... ok [INFO] [stdout] test mesh_data_transfer::tests::test_transfer_normals_beyond_max_distance ... ok [INFO] [stdout] test mesh_data_transfer::tests::test_transfer_normals_count ... ok [INFO] [stdout] test mesh_data_transfer::tests::test_nearest_vertex_single ... ok [INFO] [stdout] test mesh_data_transfer::tests::test_validate_config_valid ... ok [INFO] [stdout] test mesh_dart_graph::tests::test_get_dart ... ok [INFO] [stdout] test mesh_data_transfer::tests::test_transfer_uvs_count ... ok [INFO] [stdout] test mesh_data_transfer::tests::test_data_layer_debug ... ok [INFO] [stdout] test mesh_data_transfer::tests::test_data_transfer_config_default ... ok [INFO] [stdout] test mesh_data_transfer::tests::test_nearest_vertex_closest ... ok [INFO] [stdout] test mesh_data_transfer::tests::test_nearest_vertex_empty ... ok [INFO] [stdout] test mesh_debug_vis::tests::bitangent_lines_count ... ok [INFO] [stdout] test mesh_data_transfer::tests::test_validate_config_invalid_factor ... ok [INFO] [stdout] test mesh_debug_vis::tests::empty_positions ... ok [INFO] [stdout] test mesh_debug_vis::tests::line_length_zero_scale ... ok [INFO] [stdout] test mesh_debug_vis::tests::normal_lines_count ... ok [INFO] [stdout] test mesh_debug_vis::tests::line_start_matches_position ... ok [INFO] [stdout] test mesh_debug_vis::tests::position_buffer_doubles_count ... ok [INFO] [stdout] test mesh_debug_vis::tests::tangent_lines_same_as_normals ... ok [INFO] [stdout] test mesh_decal::tests::affected_faces_returns_full_triangles_only ... ok [INFO] [stdout] test mesh_decal::tests::apply_decal_colors_creates_colors_when_none ... ok [INFO] [stdout] test mesh_decal::tests::falloff_all_modes_monotone_from_center ... ok [INFO] [stdout] test mesh_decal::tests::apply_decal_colors_full_weight_replaces_base ... ok [INFO] [stdout] test mesh_debug_vis::tests::color_buffer_doubles_count ... ok [INFO] [stdout] test mesh_decal::tests::falloff_cosine_center_is_one ... ok [INFO] [stdout] test mesh_debug_vis::tests::cross3_orthogonal ... ok [INFO] [stdout] test mesh_decal::tests::falloff_none_always_one ... ok [INFO] [stdout] test mesh_debug_vis::tests::normal_line_length_approx_scale ... ok [INFO] [stdout] test mesh_decal::tests::falloff_linear_center_is_one ... ok [INFO] [stdout] test mesh_dart_graph::tests::test_dart_vertex ... ok [INFO] [stdout] test mesh_decal::tests::decal_stats_correct_counts ... ok [INFO] [stdout] test mesh_decal::tests::decal_stats_empty_result ... ok [INFO] [stdout] test mesh_decal::tests::empty_mesh_returns_empty_result ... ok [INFO] [stdout] test mesh_decal::tests::falloff_linear_edge_is_zero ... ok [INFO] [stdout] test mesh_decal::tests::falloff_smooth_center_is_one ... ok [INFO] [stdout] test mesh_decal::tests::project_decal_uv_range_valid ... ok [INFO] [stdout] test mesh_decal::tests::standard_decal_size_maps_to_width_height ... ok [INFO] [stdout] test mesh_decal_mesh::tests::test_clear ... ok [INFO] [stdout] test mesh_decal_mesh::tests::test_decal_depth_center ... ok [INFO] [stdout] test mesh_decal_mesh::tests::test_point_in_projector_center ... ok [INFO] [stdout] test mesh_decal_mesh::tests::test_point_outside_projector ... ok [INFO] [stdout] test mesh_decal_mesh::tests::test_project_uv_center ... ok [INFO] [stdout] test mesh_decal::tests::project_decal_all_verts_inside ... ok [INFO] [stdout] test mesh_decal::tests::project_decal_depth_filter ... ok [INFO] [stdout] test mesh_decal::tests::project_decal_faces_populated ... ok [INFO] [stdout] test mesh_decal::tests::project_decal_no_verts_outside_box ... ok [INFO] [stdout] test mesh_decal::tests::standard_decal_depth_is_point_one ... ok [INFO] [stdout] test mesh_decal::tests::standard_decal_up_is_world_up ... ok [INFO] [stdout] test mesh_decal::tests::zero_size_decal_no_verts ... ok [INFO] [stdout] test mesh_decal_mesh::tests::test_depth_clamps ... ok [INFO] [stdout] test mesh_decal_mesh::tests::test_new_decal_mesh_empty ... ok [INFO] [stdout] test mesh_decal_mesh::tests::test_project_decal_filters_outside ... ok [INFO] [stdout] test mesh_decal_mesh::tests::test_project_uv_clamps ... ok [INFO] [stdout] test mesh_decal_mesh::tests::test_triangle_count_empty ... ok [INFO] [stdout] test mesh_decimate::tests::test_compute_quadric_exists ... ok [INFO] [stdout] test mesh_decimate::tests::test_decimate_mesh_basic ... ok [INFO] [stdout] test mesh_decimate::tests::test_decimate_preserves_validity ... ok [INFO] [stdout] test mesh_decimate::tests::test_validate_degenerate_face ... ok [INFO] [stdout] test mesh_decimate::tests::test_decimate_to_target_faces ... ok [INFO] [stdout] test mesh_decimate::tests::test_find_cheapest_edge ... ok [INFO] [stdout] test mesh_decimate::tests::test_decimate_step ... ok [INFO] [stdout] test mesh_decimate::tests::test_decimation_ratio ... ok [INFO] [stdout] test mesh_decimate::tests::test_default_config ... ok [INFO] [stdout] test mesh_decimate::tests::test_mesh_complexity_score ... ok [INFO] [stdout] test mesh_decimate::tests::test_edge_collapse_cost_zero_for_coplanar ... ok [INFO] [stdout] test mesh_decimate::tests::test_validate_decimated_mesh_invalid_index ... ok [INFO] [stdout] test mesh_decimate::tests::test_validate_decimated_mesh_valid ... ok [INFO] [stdout] test mesh_decimate::tests::test_collapse_edge_reduces_faces ... ok [INFO] [stdout] test mesh_decimate::tests::test_zero_quadric ... ok [INFO] [stdout] test mesh_decimate_error::tests::test_add_quadrics ... ok [INFO] [stdout] test mesh_decimate_error::tests::test_compute_edge_errors ... ok [INFO] [stdout] test mesh_decimate_error::tests::test_evaluate_quadric_on_plane ... ok [INFO] [stdout] test mesh_decimate_error::tests::test_min_max_error ... ok [INFO] [stdout] test mesh_decimate_error::tests::test_sqrt2 ... ok [INFO] [stdout] test mesh_decimate_error::tests::test_empty ... ok [INFO] [stdout] test mesh_decimate_error::tests::test_evaluate_off_plane ... ok [INFO] [stdout] test mesh_decimate_error::tests::test_quadric_from_plane ... ok [INFO] [stdout] test mesh_decimate_error::tests::test_to_json ... ok [INFO] [stdout] test mesh_decimate_error::tests::test_zero_quadric ... ok [INFO] [stdout] test mesh_decimate_modifier::tests::test_decimate_target_minimum_one ... ok [INFO] [stdout] test mesh_decimate_modifier::tests::test_decimate_priority_short_edge ... ok [INFO] [stdout] test mesh_decimate_modifier::tests::test_decimate_ratio_clamp_negative ... ok [INFO] [stdout] test mesh_decimate_v2::tests::add_quadrics_linear ... ok [INFO] [stdout] test mesh_decimate_modifier::tests::test_new_decimate_params_clamped ... ok [INFO] [stdout] test mesh_decimate::tests::test_count_boundary_edges_quad ... ok [INFO] [stdout] test mesh_decimate_v2::tests::decimate_faces_removed_nonzero ... ok [INFO] [stdout] test mesh_decimate_v2::tests::quadric_error_above_plane_nonzero ... ok [INFO] [stdout] test mesh_deform_axis::tests::default_config_axis_is_y ... ok [INFO] [stdout] test mesh_deform_axis::tests::pi_from_consts ... ok [INFO] [stdout] test mesh_deform_axis::tests::stretch_elongates_axis ... ok [INFO] [stdout] test mesh_decimate_v2::tests::decimate_reduces_faces ... ok [INFO] [stdout] test mesh_decimate_v2::tests::decimation_ratio_v2_at_least_one ... ok [INFO] [stdout] test mesh_decimate_v2::tests::empty_mesh_returns_empty ... ok [INFO] [stdout] test mesh_decimate_v2::tests::face_plane_unit_normal ... ok [INFO] [stdout] test mesh_deform_axis::tests::contains_range ... ok [INFO] [stdout] test mesh_deform_axis::tests::deform_vertex_count_correct ... ok [INFO] [stdout] test mesh_deform_axis::tests::taper_no_scale_at_zero_amount ... ok [INFO] [stdout] test mesh_deform_axis::tests::twist_no_rotation_at_zero_amount ... ok [INFO] [stdout] test mesh_decimate_v2::tests::decimate_target_at_least_result ... ok [INFO] [stdout] test mesh_deform_axis::tests::stretch_preserves_count ... ok [INFO] [stdout] test mesh_deform_axis::tests::taper_preserves_count ... ok [INFO] [stdout] test mesh_decimate_v2::tests::quadric_from_plane_correct ... ok [INFO] [stdout] test mesh_deform_axis::tests::twist_preserves_count ... ok [INFO] [stdout] test mesh_decimate_modifier::tests::test_decimate_target_face_count ... ok [INFO] [stdout] test mesh_diff::tests::test_blend_meshes_half ... ok [INFO] [stdout] test mesh_diff::tests::test_blend_meshes_one ... ok [INFO] [stdout] test mesh_diff::tests::test_displacement_field_zero ... ok [INFO] [stdout] test mesh_diff::tests::test_displacement_field_nonzero ... ok [INFO] [stdout] test mesh_decimate_v2::tests::edge_midpoint_correct ... ok [INFO] [stdout] test mesh_diff::tests::test_blend_meshes_zero ... ok [INFO] [stdout] test mesh_diff::tests::test_displacement_magnitudes ... ok [INFO] [stdout] test mesh_decimate_modifier::tests::test_decimate_collapse_count ... ok [INFO] [stdout] test mesh_diff::tests::test_displacement_threshold ... ok [INFO] [stdout] test mesh_diff::tests::test_displacement_top_displaced ... ok [INFO] [stdout] test mesh_diff::tests::test_displacement_scale ... ok [INFO] [stdout] test mesh_diff::tests::test_interpolate_sequence ... ok [INFO] [stdout] test mesh_copy_scale::tests::is_uniform_target_for_uniform_scale ... ok [INFO] [stdout] test mesh_cotangent_weights::tests::cot_weight_count_two_tris ... ok [INFO] [stdout] test mesh_diff::tests::test_mesh_diff_stats ... ok [INFO] [stdout] test mesh_copy_scale::tests::is_uniform_target_false_for_non_uniform ... ok [INFO] [stdout] test mesh_diff::tests::test_displacement_apply_to ... ok [INFO] [stdout] test mesh_dihedral_angle::tests::test_dihedral_same_normal ... ok [INFO] [stdout] test mesh_dihedral_angle::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_dihedral_angle::tests::test_face_normal ... ok [INFO] [stdout] test mesh_dihedral_angle::tests::test_dihedral_result_to_json ... ok [INFO] [stdout] test mesh_diff::tests::test_meshes_approx_equal_false ... ok [INFO] [stdout] test mesh_diff::tests::test_meshes_approx_equal_true ... ok [INFO] [stdout] test mesh_dihedral_angle::tests::test_dihedral_coplanar ... ok [INFO] [stdout] test mesh_dihedral_angle::tests::test_dihedral_opposite ... ok [INFO] [stdout] test mesh_dihedral_angle::tests::test_dihedral_perpendicular ... ok [INFO] [stdout] test mesh_dihedral_angle::tests::test_single_tri_no_internal ... ok [INFO] [stdout] test mesh_directed_edge::tests::test_boundary_single_tri ... ok [INFO] [stdout] test mesh_directed_edge::tests::test_find_twin ... ok [INFO] [stdout] test mesh_directed_edge::tests::test_build_single_tri ... ok [INFO] [stdout] test mesh_directed_edge::tests::test_edges_for_face ... ok [INFO] [stdout] test mesh_directed_edge::tests::test_empty ... ok [INFO] [stdout] test mesh_dihedral_angle::tests::test_edge_count ... ok [INFO] [stdout] test mesh_directed_edge::tests::test_half_pi ... ok [INFO] [stdout] test mesh_dihedral_angle::tests::test_sharp_edges_by_angle ... ok [INFO] [stdout] test mesh_directed_edge::tests::test_two_tris_shared ... ok [INFO] [stdout] test mesh_disk_map::tests::test_default_config ... ok [INFO] [stdout] test mesh_disk_map::tests::test_empty_boundary ... ok [INFO] [stdout] test mesh_disk_map::tests::test_disk_map_boundary_on_circle ... ok [INFO] [stdout] test mesh_disk_map::tests::test_is_in_unit_disk ... ok [INFO] [stdout] test mesh_disk_map::tests::test_map_boundary_to_circle ... ok [INFO] [stdout] test mesh_disk_map::tests::test_disk_map_simple ... ok [INFO] [stdout] test mesh_disk_map::tests::test_uv_triangle_area ... ok [INFO] [stdout] test mesh_disk_map::tests::test_pi_tau ... ok [INFO] [stdout] test mesh_displace_modifier::tests::apply_displace_preserves_count ... ok [INFO] [stdout] test mesh_displace_modifier::tests::apply_displace_uses_default_normal_when_missing ... ok [INFO] [stdout] test mesh_displace_modifier::tests::apply_displace_zero_strength_no_change ... ok [INFO] [stdout] test mesh_displace_modifier::tests::bilinear_sample_empty_returns_zero ... ok [INFO] [stdout] test mesh_displace_modifier::tests::bilinear_sample_top_left_zero ... ok [INFO] [stdout] test mesh_displace_modifier::tests::bilinear_sample_zero_width_returns_zero ... ok [INFO] [stdout] test mesh_displace_modifier::tests::displace_vertex_along_y ... ok [INFO] [stdout] test mesh_displace_modifier::tests::displace_vertex_zero_amount ... ok [INFO] [stdout] test mesh_displacement_map::tests::test_apply_to_vertex_direction ... ok [INFO] [stdout] test mesh_displacement_map::tests::test_apply_to_vertex_zero_when_zero_map ... ok [INFO] [stdout] test mesh_displacement_map::tests::test_get_default_zero ... ok [INFO] [stdout] test mesh_displacement_map::tests::test_scale_applied ... ok [INFO] [stdout] test mesh_displacement_map::tests::test_max_displacement ... ok [INFO] [stdout] test mesh_displacement_map::tests::test_new_all_zero ... ok [INFO] [stdout] test mesh_displacement_map::tests::test_set_get ... ok [INFO] [stdout] test mesh_displacement_map::tests::test_avg_displacement ... ok [INFO] [stdout] test mesh_disk_map::tests::test_uv_triangle_area_degenerate ... ok [INFO] [stdout] test mesh_directed_edge::tests::test_has_twin ... ok [INFO] [stdout] test mesh_directed_edge::tests::test_no_twin ... ok [INFO] [stdout] test mesh_directed_edge::tests::test_to_json ... ok [INFO] [stdout] test mesh_disk_map::tests::test_disk_map_to_json ... ok [INFO] [stdout] test mesh_displace_modifier::tests::apply_displace_strength_scales ... ok [INFO] [stdout] test mesh_displace_modifier::tests::bilinear_sample_center ... ok [INFO] [stdout] test mesh_dissolve_edge::tests::dissolve_edge_reduces_face_count ... ok [INFO] [stdout] test mesh_dissolve_edge::tests::dissolve_edges_batch ... ok [INFO] [stdout] test mesh_dissolve_edge::tests::dissolve_eligible_includes_shared ... ok [INFO] [stdout] test mesh_dissolve_edge::tests::edge_key_canonical ... ok [INFO] [stdout] test mesh_dissolve_edge::tests::dissolve_eligible_count_positive ... ok [INFO] [stdout] test mesh_dissolve_edge::tests::dissolve_edges_empty_input ... ok [INFO] [stdout] test mesh_dissolve_edge::tests::merge_two_triangles_returns_quad ... ok [INFO] [stdout] test mesh_dissolve_face::tests::dissolve_removes_selected ... ok [INFO] [stdout] test mesh_dissolve_face::tests::edges_to_vertex_loop_length ... ok [INFO] [stdout] test mesh_dissolve_face::tests::fan_triangulate_empty ... ok [INFO] [stdout] test mesh_dissolve_face::tests::selection_valid_out_of_bounds ... ok [INFO] [stdout] test mesh_dissolve_face::tests::selection_valid_in_bounds ... ok [INFO] [stdout] test mesh_dissolve_vertex::tests::test_adjacent_face_count_isolated ... ok [INFO] [stdout] test mesh_dissolve_edge::tests::dissolve_nonexistent_edge_returns_none ... ok [INFO] [stdout] test mesh_dissolve_vertex::tests::test_adjacent_face_count ... ok [INFO] [stdout] test mesh_dissolve_edge::tests::edge_to_faces_shared_edge_count ... ok [INFO] [stdout] test mesh_dissolve_face::tests::boundary_of_single_face ... ok [INFO] [stdout] test mesh_dissolve_face::tests::fan_triangulate_quad ... ok [INFO] [stdout] test mesh_dissolve_face::tests::dissolve_all_faces_empty_output_except_fill ... ok [INFO] [stdout] test mesh_dissolve_face::tests::dissolve_count_matches ... ok [INFO] [stdout] test mesh_dissolve_vertex::tests::test_can_dissolve ... ok [INFO] [stdout] test mesh_dissolve_vertex::tests::test_cannot_dissolve_leaf ... ok [INFO] [stdout] test mesh_dissolve_vertex::tests::test_dissolve_center ... ok [INFO] [stdout] test mesh_dissolve_vertex::tests::test_dissolve_non_center ... ok [INFO] [stdout] test mesh_dissolve_vertex::tests::test_dissolve_preserves_positions ... ok [INFO] [stdout] test mesh_dissolve_vertex::tests::test_dissolve_to_json ... ok [INFO] [stdout] test mesh_dissolve_vertex::tests::test_dissolve_reduces_faces ... ok [INFO] [stdout] test mesh_distribute_even::tests::chain_length_correct ... ok [INFO] [stdout] test mesh_distribute_even::tests::dist3_correct ... ok [INFO] [stdout] test mesh_distribute_even::tests::distribute_even_moves_all ... ok [INFO] [stdout] test mesh_distribute_even::tests::distribute_too_few_verts_returns_default ... ok [INFO] [stdout] test mesh_distribute_even::tests::max_spacing_deviation_zero_for_even ... ok [INFO] [stdout] test mesh_distribute_even::tests::even_spacing_one_vert_zero ... ok [INFO] [stdout] test mesh_dual::tests::test_average_dual_edge_length ... ok [INFO] [stdout] test mesh_dual::tests::test_dual_edge_lengths_positive ... ok [INFO] [stdout] test mesh_distribute_even::tests::sample_polyline_midpoint ... ok [INFO] [stdout] test mesh_dual::tests::test_build_face_adjacency_tetrahedron ... ok [INFO] [stdout] test mesh_dual::tests::test_dual_to_positions_slice ... ok [INFO] [stdout] test mesh_dual::tests::test_dual_edge_count_tetrahedron ... ok [INFO] [stdout] test mesh_dual::tests::test_face_centroid_unit_triangle ... ok [INFO] [stdout] test mesh_dual::tests::test_face_to_dual_vertex_mapping ... ok [INFO] [stdout] test mesh_dissolve_vertex::tests::test_empty ... ok [INFO] [stdout] test mesh_distribute_even::tests::arc_lengths_monotone ... ok [INFO] [stdout] test mesh_dual_contour::tests::cell_count_matches_vertex_count ... ok [INFO] [stdout] test mesh_distribute_even::tests::even_spacing_two_verts ... ok [INFO] [stdout] test mesh_dual::tests::test_is_dual_connected ... ok [INFO] [stdout] test mesh_dual::tests::test_dual_original_vertex_count ... ok [INFO] [stdout] test mesh_dual::tests::test_dual_mesh_bounds ... ok [INFO] [stdout] test mesh_dual::tests::test_dual_of_tetrahedron_has_4_vertices ... ok [INFO] [stdout] test mesh_dual::tests::test_dual_vertex_count_function ... ok [INFO] [stdout] test mesh_dual::tests::test_dual_vertex_degree ... ok [INFO] [stdout] test mesh_dual_contour::tests::qef_add_plane_increments_count ... ok [INFO] [stdout] test mesh_dual_contour::tests::contains_range ... ok [INFO] [stdout] test mesh_dual::tests::test_dual_original_face_count ... ok [INFO] [stdout] test mesh_dual::tests::test_dual_to_graph_adjacency_degree ... ok [INFO] [stdout] test mesh_dual_contour::tests::qef_error_at_solution_near_zero ... ok [INFO] [stdout] test mesh_dual_contouring::tests::dc_triangle_count_dc_consistent ... ok [INFO] [stdout] test mesh_dual_contour::tests::qef_solve_zero_count_returns_origin ... ok [INFO] [stdout] test mesh_dual_contouring::tests::qef_dc_add_plane_increments_count ... ok [INFO] [stdout] test mesh_dual_contouring::tests::dual_contour_dc_indices_valid ... ok [INFO] [stdout] test mesh_dual_contouring::tests::dual_contour_dc_returns_vertices ... ok [INFO] [stdout] test mesh_dual_contour::tests::dc_small_grid_no_panic ... ok [INFO] [stdout] test mesh_dual_contour::tests::dual_contour_sphere_has_vertices ... ok [INFO] [stdout] test mesh_dual_contour::tests::qef_solve_centroid ... ok [INFO] [stdout] test mesh_dual_contouring::tests::qef_dc_error_nonnegative_at_centre ... ok [INFO] [stdout] test mesh_dual_contouring::tests::qef_dc_solve_returns_some_point ... ok [INFO] [stdout] test mesh_dual_contour::tests::dual_contour_all_same_sign_no_vertices ... ok [INFO] [stdout] test mesh_dual_contouring::tests::dc_vertex_count_dc_consistent ... ok [INFO] [stdout] test mesh_dual_contouring::tests::dual_contour_dc_low_res_noop ... ok [INFO] [stdout] test mesh_dual_contouring::tests::qef_dc_starts_zero ... ok [INFO] [stdout] test mesh_dupin_cyclide::tests::cyclide_point_finite ... ok [INFO] [stdout] test mesh_dual_laplacian::tests::cotangent_weight_acute_positive ... ok [INFO] [stdout] test mesh_dual_laplacian::tests::cotangent_weight_right_angle ... ok [INFO] [stdout] test mesh_dual_laplacian::tests::default_config_reasonable ... ok [INFO] [stdout] test mesh_dual_laplacian::tests::laplacian_at_interior_vertex ... ok [INFO] [stdout] test mesh_dual_laplacian::tests::laplacian_energy_nonneg ... ok [INFO] [stdout] test mesh_dual_laplacian::tests::laplacian_flat_mesh_near_zero ... ok [INFO] [stdout] test mesh_dual_laplacian::tests::smooth_does_not_panic ... ok [INFO] [stdout] test mesh_dual_laplacian::tests::smooth_preserves_vertex_count ... ok [INFO] [stdout] test mesh_dual_laplacian::tests::smooth_zero_iterations_unchanged ... ok [INFO] [stdout] test mesh_dupin_cyclide::tests::all_positions_finite ... ok [INFO] [stdout] test mesh_dupin_cyclide::tests::b_computed_correctly ... ok [INFO] [stdout] test mesh_dupin_cyclide::tests::index_max_within_bounds ... ok [INFO] [stdout] test mesh_dupin_cyclide::tests::indices_multiple_of_three ... ok [INFO] [stdout] test mesh_dupin_cyclide::tests::min_segs_enforced ... ok [INFO] [stdout] test mesh_dupin_cyclide::tests::more_segs_more_vertices ... ok [INFO] [stdout] test mesh_duplicate_face::tests::empty_indices_no_dupes ... ok [INFO] [stdout] test mesh_duplicate_face::tests::histogram_counts_correct ... ok [INFO] [stdout] test mesh_duplicate_face::tests::result_stats_sum ... ok [INFO] [stdout] test mesh_duplicate_face::tests::has_duplicate_faces_false ... ok [INFO] [stdout] test mesh_dupin_cyclide::tests::vertex_count_helper ... ok [INFO] [stdout] test mesh_duplicate_face::tests::remove_duplicates_correct_count ... ok [INFO] [stdout] test mesh_ear_clip::tests::test_convex_vertex ... ok [INFO] [stdout] test mesh_duplicate_face::tests::has_duplicate_faces_true ... ok [INFO] [stdout] test mesh_ear_clip::tests::test_ear_clip_square ... ok [INFO] [stdout] test mesh_ear_clip::tests::test_triangle_area_ccw ... ok [INFO] [stdout] test mesh_duplicate_face::tests::unique_face_count_no_dupes ... ok [INFO] [stdout] test mesh_ear_clip::tests::test_legacy_ear_clip_square ... ok [INFO] [stdout] test mesh_ear_clip::tests::test_ear_clip_count ... ok [INFO] [stdout] test mesh_ear_clip::tests::test_ear_is_ear_triangle ... ok [INFO] [stdout] test mesh_duplicate_face::tests::canonical_key_sorted ... ok [INFO] [stdout] test mesh_duplicate_face::tests::find_duplicates_detects_one ... ok [INFO] [stdout] test mesh_dupin_cyclide::tests::triangle_count_correct ... ok [INFO] [stdout] test mesh_dupin_cyclide::tests::vertex_count_correct ... ok [INFO] [stdout] test mesh_ear_clip::tests::test_triangle_area_cw ... ok [INFO] [stdout] test mesh_edge_bisect::tests::test_bisect_empty ... ok [INFO] [stdout] test mesh_edge_bisect::tests::test_bisect_single_triangle ... ok [INFO] [stdout] test mesh_edge_bisect::tests::test_indices_valid ... ok [INFO] [stdout] test mesh_edge_bisect::tests::test_midpoint ... ok [INFO] [stdout] test mesh_edge_bisect::tests::test_midpoint_position ... ok [INFO] [stdout] test mesh_edge_bisect::tests::test_new_vertex_count ... ok [INFO] [stdout] test mesh_edge_bisect::tests::test_original_preserved ... ok [INFO] [stdout] test mesh_edge_bisect::tests::test_shared_edge_reuse ... ok [INFO] [stdout] test mesh_edge_bisect::tests::test_to_json ... ok [INFO] [stdout] test mesh_edge_bisect::tests::test_two_separate_triangles ... ok [INFO] [stdout] test mesh_edge_collapse_v2::tests::collapse_reduces_faces ... ok [INFO] [stdout] test mesh_edge_collapse_v2::tests::collapsed_count_one ... ok [INFO] [stdout] test mesh_edge_collapse_v2::tests::collect_edges_count ... ok [INFO] [stdout] test mesh_edge_collapse_v2::tests::contains_range ... ok [INFO] [stdout] test mesh_edge_collapse_v2::tests::edge_length_positive ... ok [INFO] [stdout] test mesh_edge_collapse_v2::tests::empty_edges_no_cheapest ... ok [INFO] [stdout] test mesh_edge_collapse_v2::tests::edges_sorted ... ok [INFO] [stdout] test mesh_edge_collapse_v2::tests::find_cheapest_some ... ok [INFO] [stdout] test mesh_edge_collapse_v2::tests::midpoint_between ... ok [INFO] [stdout] test mesh_edge_collapse_v2::tests::vertex_count_preserved ... ok [INFO] [stdout] test mesh_edge_contract::tests::test_contract_edge ... ok [INFO] [stdout] test mesh_edge_contract::tests::test_contract_n ... ok [INFO] [stdout] test mesh_edge_contract::tests::test_contract_n_zero ... ok [INFO] [stdout] test mesh_edge_contract::tests::test_contract_removes_degenerate ... ok [INFO] [stdout] test mesh_edge_contract::tests::test_edge_length ... ok [INFO] [stdout] test mesh_edge_contract::tests::test_find_shortest ... ok [INFO] [stdout] test mesh_edge_contract::tests::test_find_shortest_empty ... ok [INFO] [stdout] test mesh_edge_contract::tests::test_midpoint_placement ... ok [INFO] [stdout] test mesh_edge_contract::tests::test_to_json ... ok [INFO] [stdout] test mesh_edge_contract::tests::test_triangle_count ... ok [INFO] [stdout] test mesh_edge_flow::tests::test_compute_edge_flow ... ok [INFO] [stdout] test mesh_edge_flow::tests::test_compute_edge_flow_zero_length ... ok [INFO] [stdout] test mesh_edge_flow::tests::test_flow_curl ... ok [INFO] [stdout] test mesh_edge_flow::tests::test_flow_direction ... ok [INFO] [stdout] test mesh_edge_flow::tests::test_flow_divergence ... ok [INFO] [stdout] test mesh_edge_flow::tests::test_flow_magnitude ... ok [INFO] [stdout] test mesh_edge_flow::tests::test_flow_magnitude_out_of_bounds ... ok [INFO] [stdout] test mesh_edge_flow::tests::test_flow_to_json ... ok [INFO] [stdout] test mesh_edge_flow::tests::test_flow_vertex_field ... ok [INFO] [stdout] test mesh_edge_flow::tests::test_smooth_edge_flow ... ok [INFO] [stdout] test mesh_edge_flow_field::tests::test_curl_stub ... ok [INFO] [stdout] test mesh_edge_flow_field::tests::test_divergence_no_neighbors ... ok [INFO] [stdout] test mesh_edge_flow_field::tests::test_mean_speed_empty ... ok [INFO] [stdout] test mesh_edge_flow_field::tests::test_mean_speed_uniform ... ok [INFO] [stdout] test mesh_edge_flow_field::tests::test_set_get ... ok [INFO] [stdout] test mesh_edge_flow_field::tests::test_new_edge_flow_field ... ok [INFO] [stdout] test mesh_edge_hash::tests::test_boundary_edges_single_tri ... ok [INFO] [stdout] test mesh_edge_hash::tests::test_boundary_edges_two_tris ... ok [INFO] [stdout] test mesh_edge_hash::tests::test_build_single_tri ... ok [INFO] [stdout] test mesh_edge_hash::tests::test_edge_exists ... ok [INFO] [stdout] test mesh_edge_hash::tests::test_edge_hash_to_json ... ok [INFO] [stdout] test mesh_edge_hash::tests::test_faces_for_edge ... ok [INFO] [stdout] test mesh_edge_hash::tests::test_make_edge_key_canonical ... ok [INFO] [stdout] test mesh_edge_hash::tests::test_non_manifold_empty ... ok [INFO] [stdout] test mesh_edge_hash::tests::test_two_tris_edge_count ... ok [INFO] [stdout] test mesh_edge_hash::tests::test_unique_vertices ... ok [INFO] [stdout] test mesh_edge_loop_select::tests::test_closed_flag ... ok [INFO] [stdout] test mesh_edge_loop_select::tests::test_clear ... ok [INFO] [stdout] test mesh_edge_loop_select::tests::test_edge_count ... ok [INFO] [stdout] test mesh_edge_loop_select::tests::test_empty_select ... ok [INFO] [stdout] test mesh_edge_loop_select::tests::test_grow ... ok [INFO] [stdout] test mesh_edge_loop_select::tests::test_select ... ok [INFO] [stdout] test mesh_edge_loop_select::tests::test_shrink ... ok [INFO] [stdout] test mesh_edge_loop_select::tests::test_shrink_min ... ok [INFO] [stdout] test mesh_edge_loop_select::tests::test_to_json ... ok [INFO] [stdout] test mesh_edge_loop_select::tests::test_vertices ... ok [INFO] [stdout] test mesh_edge_slide::tests::test_edge_direction ... ok [INFO] [stdout] test mesh_edge_slide::tests::test_edge_length ... ok [INFO] [stdout] test mesh_edge_slide::tests::test_edge_slide_edge ... ok [INFO] [stdout] test mesh_edge_slide::tests::test_edge_slide_vert_full ... ok [INFO] [stdout] test mesh_edge_slide::tests::test_edge_slide_vert_half ... ok [INFO] [stdout] test mesh_edge_split::tests::test_split_all_long_edges ... ok [INFO] [stdout] test mesh_edge_split::tests::test_edge_split_count ... ok [INFO] [stdout] test mesh_edge_split::tests::test_split_creates_triangles ... ok [INFO] [stdout] test mesh_edge_split::tests::test_split_edge_endpoints ... ok [INFO] [stdout] test mesh_edge_split::tests::test_split_edge_at_t ... ok [INFO] [stdout] test mesh_edge_split::tests::test_split_edge_midpoint ... ok [INFO] [stdout] test mesh_edge_split::tests::test_split_edge_result_indices ... ok [INFO] [stdout] test mesh_edge_split::tests::test_split_threshold ... ok [INFO] [stdout] test mesh_edge_split::tests::test_split_threshold_empty ... ok [INFO] [stdout] test mesh_edge_split::tests::test_validate_split ... ok [INFO] [stdout] test mesh_edge_valence::tests::test_avg_valence ... ok [INFO] [stdout] test mesh_edge_valence::tests::test_edge_valence_nonexistent ... ok [INFO] [stdout] test mesh_edge_valence::tests::test_edge_valence_to_json ... ok [INFO] [stdout] test mesh_edge_valence::tests::test_empty ... ok [INFO] [stdout] test mesh_edge_valence::tests::test_manifold_count ... ok [INFO] [stdout] test mesh_edge_valence::tests::test_max_valence ... ok [INFO] [stdout] test mesh_edge_valence::tests::test_non_manifold_empty ... ok [INFO] [stdout] test mesh_edge_valence::tests::test_single_tri_all_boundary ... ok [INFO] [stdout] test mesh_edge_valence::tests::test_single_tri_edges ... ok [INFO] [stdout] test mesh_edge_valence::tests::test_two_tris_shared_edge ... ok [INFO] [stdout] test mesh_end_cap::tests::cylinder_has_triangles ... ok [INFO] [stdout] test mesh_end_cap::tests::cylinder_has_vertices ... ok [INFO] [stdout] test mesh_end_cap::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_end_cap::tests::lateral_area_positive ... ok [INFO] [stdout] test mesh_end_cap::tests::no_caps_fewer_triangles ... ok [INFO] [stdout] test mesh_end_cap::tests::normals_match ... ok [INFO] [stdout] test mesh_end_cap::tests::total_area_larger_than_lateral ... ok [INFO] [stdout] test mesh_end_cap::tests::validate_bad_radius ... ok [INFO] [stdout] test mesh_end_cap::tests::validate_ok ... ok [INFO] [stdout] test mesh_erode::tests::all_moved_inward_empty ... ok [INFO] [stdout] test mesh_erode::tests::erode_always_positive_amount ... ok [INFO] [stdout] test mesh_erode::tests::erode_empty_mesh ... ok [INFO] [stdout] test mesh_erode::tests::erode_iterative_accumulates ... ok [INFO] [stdout] test mesh_erode::tests::erode_iterative_zero_steps_unchanged ... ok [INFO] [stdout] test mesh_erode::tests::all_moved_inward_check ... ok [INFO] [stdout] test mesh_erode::tests::erode_normals_computed ... ok [INFO] [stdout] test mesh_erode::tests::erode_preserves_count ... ok [INFO] [stdout] test mesh_erode::tests::erode_stats_positive ... ok [INFO] [stdout] test mesh_erode::tests::erode_zero_amount_unchanged ... ok [INFO] [stdout] test mesh_extrude::tests::test_compute_face_normal_empty ... ok [INFO] [stdout] test mesh_extrude::tests::test_compute_face_normal_z ... ok [INFO] [stdout] test mesh_extrude::tests::test_default_extrude_config ... ok [INFO] [stdout] test mesh_extrude::tests::test_extrude_along_curve ... ok [INFO] [stdout] test mesh_extrude::tests::test_extrude_along_curve_empty_curve ... ok [INFO] [stdout] test mesh_extrude::tests::test_extrude_distance_moves_verts ... ok [INFO] [stdout] test mesh_extrude::tests::test_extrude_distance_zero ... ok [INFO] [stdout] test mesh_extrude::tests::test_extrude_edges_produces_quads ... ok [INFO] [stdout] test mesh_extrude::tests::test_extrude_faces_more_vertices ... ok [INFO] [stdout] test mesh_extrude::tests::test_extrude_faces_new_face_start ... ok [INFO] [stdout] test mesh_extrude::tests::test_extrude_vertex_count ... ok [INFO] [stdout] test mesh_extrude::tests::test_extrude_vertices_along_direction ... ok [INFO] [stdout] test mesh_extrude::tests::test_inset_shrinks_face ... ok [INFO] [stdout] test mesh_extrude::tests::test_solidify_doubles_vertex_count ... ok [INFO] [stdout] test mesh_extrude::tests::test_solidify_has_both_sides ... ok [INFO] [stdout] test mesh_extruded_polygon::tests::test_base_n_stored ... ok [INFO] [stdout] test mesh_extruded_polygon::tests::test_empty_on_too_few_verts ... ok [INFO] [stdout] test mesh_extruded_polygon::tests::test_extruded_tri_count_square ... ok [INFO] [stdout] test mesh_extruded_polygon::tests::test_extruded_tri_count_triangle ... ok [INFO] [stdout] test mesh_extruded_polygon::tests::test_extruded_vertex_count_square ... ok [INFO] [stdout] test mesh_extruded_polygon::tests::test_height_stored ... ok [INFO] [stdout] test mesh_extruded_polygon::tests::test_lateral_area_square_unit ... ok [INFO] [stdout] test mesh_extruded_polygon::tests::test_validate_extruded_polygon ... ok [INFO] [stdout] test mesh_face_centroid::tests::test_centroid_bounds ... ok [INFO] [stdout] test mesh_face_centroid::tests::test_centroid_distance ... ok [INFO] [stdout] test mesh_face_centroid::tests::test_compute_all ... ok [INFO] [stdout] test mesh_face_centroid::tests::test_face_centroid_to_json ... ok [INFO] [stdout] test mesh_face_centroid::tests::test_get_face_centroid ... ok [INFO] [stdout] test mesh_face_centroid::tests::test_get_face_centroid_oob ... ok [INFO] [stdout] test mesh_face_centroid::tests::test_mean_centroid ... ok [INFO] [stdout] test mesh_face_centroid::tests::test_mean_centroid_empty ... ok [INFO] [stdout] test mesh_face_centroid::tests::test_nearest_face_centroid ... ok [INFO] [stdout] test mesh_face_centroid::tests::test_triangle_centroid ... ok [INFO] [stdout] test mesh_face_centroid_v2::tests::area_correct ... ok [INFO] [stdout] test mesh_face_centroid_v2::tests::area_weighted_centroid_equals_single_centroid ... ok [INFO] [stdout] test mesh_face_centroid_v2::tests::centroid_correct ... ok [INFO] [stdout] test mesh_face_centroid_v2::tests::contains_range ... ok [INFO] [stdout] test mesh_face_centroid_v2::tests::empty_set ... ok [INFO] [stdout] test mesh_face_centroid_v2::tests::max_area_face_returns_some ... ok [INFO] [stdout] test mesh_face_centroid_v2::tests::nearest_centroid_returns_zero ... ok [INFO] [stdout] test mesh_face_centroid_v2::tests::nearest_empty_returns_none ... ok [INFO] [stdout] test mesh_face_centroid_v2::tests::face_count_one ... ok [INFO] [stdout] test mesh_face_centroid_v2::tests::total_area_matches ... ok [INFO] [stdout] test mesh_face_dual::tests::test_avg_edge_empty ... ok [INFO] [stdout] test mesh_face_dual::tests::test_avg_edge_length ... ok [INFO] [stdout] test mesh_face_dual::tests::test_build_dual_empty ... ok [INFO] [stdout] test mesh_face_dual::tests::test_build_dual_single ... ok [INFO] [stdout] test mesh_face_dual::tests::test_build_dual_two_tri ... ok [INFO] [stdout] test mesh_face_dual::tests::test_centroid_positions ... ok [INFO] [stdout] test mesh_face_dual::tests::test_dual_degree ... ok [INFO] [stdout] test mesh_face_dual::tests::test_edges_sorted ... ok [INFO] [stdout] test mesh_face_dual::tests::test_to_json ... ok [INFO] [stdout] test mesh_face_dual::tests::test_triangle_centroid ... ok [INFO] [stdout] test mesh_face_flip::tests::test_consistent_winding ... ok [INFO] [stdout] test mesh_face_flip::tests::test_detect_flipped ... ok [INFO] [stdout] test mesh_face_flip::tests::test_detect_flipped_multiple ... ok [INFO] [stdout] test mesh_face_flip::tests::test_flip_all ... ok [INFO] [stdout] test mesh_face_flip::tests::test_flip_count ... ok [INFO] [stdout] test mesh_face_flip::tests::test_flip_face ... ok [INFO] [stdout] test mesh_face_flip::tests::test_flip_face_identity ... ok [INFO] [stdout] test mesh_face_flip::tests::test_flip_normals_with_faces_empty ... ok [INFO] [stdout] test mesh_face_flip::tests::test_flip_selected ... ok [INFO] [stdout] test mesh_face_flip::tests::test_needs_flip ... ok [INFO] [stdout] test mesh_face_label::tests::contains_range ... ok [INFO] [stdout] test mesh_face_label::tests::default_label_all_same ... ok [INFO] [stdout] test mesh_face_label::tests::distinct_label_count_after_set ... ok [INFO] [stdout] test mesh_face_label::tests::distinct_label_count_initial ... ok [INFO] [stdout] test mesh_face_label::tests::faces_with_label_query ... ok [INFO] [stdout] test mesh_face_label::tests::flood_fill_spreads_label ... ok [INFO] [stdout] test mesh_face_label::tests::get_out_of_range_none ... ok [INFO] [stdout] test mesh_face_label::tests::json_contains_face_count ... ok [INFO] [stdout] test mesh_face_label::tests::largest_group_all_same ... ok [INFO] [stdout] test mesh_face_label::tests::set_and_get ... ok [INFO] [stdout] test mesh_face_map::tests::test_face_in_any_group ... ok [INFO] [stdout] test mesh_face_map::tests::test_get_group ... ok [INFO] [stdout] test mesh_face_map::tests::test_group_count ... ok [INFO] [stdout] test mesh_face_map::tests::test_group_names_sorted ... ok [INFO] [stdout] test mesh_face_map::tests::test_merge_face_maps ... ok [INFO] [stdout] test mesh_face_map::tests::test_rename_group ... ok [INFO] [stdout] test mesh_face_map::tests::test_remove_group ... ok [INFO] [stdout] test mesh_face_map::tests::test_rename_nonexistent_returns_false ... ok [INFO] [stdout] test mesh_face_map::tests::test_total_face_count ... ok [INFO] [stdout] test mesh_face_material::tests::add_slot_increments ... ok [INFO] [stdout] test mesh_face_material::tests::assign_and_get ... ok [INFO] [stdout] test mesh_face_material::tests::base_color_alpha_one ... ok [INFO] [stdout] test mesh_face_material::tests::default_all_zero ... ok [INFO] [stdout] test mesh_face_material::tests::distinct_material_count_initial ... ok [INFO] [stdout] test mesh_face_material::tests::faces_for_material_query ... ok [INFO] [stdout] test mesh_face_material::tests::find_slot_by_id_some ... ok [INFO] [stdout] test mesh_face_material::tests::get_oob_none ... ok [INFO] [stdout] test mesh_face_material::tests::json_contains_face_count ... ok [INFO] [stdout] test mesh_face_material::tests::roughness_in_range ... ok [INFO] [stdout] test mesh_face_orient::tests::test_consistent ... ok [INFO] [stdout] test mesh_face_orient::tests::test_degenerate ... ok [INFO] [stdout] test mesh_face_orient::tests::test_errors_zero ... ok [INFO] [stdout] test mesh_face_orient::tests::test_face_orientation_ccw ... ok [INFO] [stdout] test mesh_face_orient::tests::test_face_orientation_cw ... ok [INFO] [stdout] test mesh_face_orient::tests::test_flip ... ok [INFO] [stdout] test mesh_face_orient::tests::test_orient_consistently ... ok [INFO] [stdout] test mesh_face_orient::tests::test_orient_count ... ok [INFO] [stdout] test mesh_face_orient::tests::test_orient_to_json ... ok [INFO] [stdout] test mesh_face_orient::tests::test_orient_from_normals ... ok [INFO] [stdout] test mesh_face_pair::tests::test_detect_face_pairs_empty ... ok [INFO] [stdout] test mesh_face_pair::tests::test_detect_face_pairs_two_tris ... ok [INFO] [stdout] test mesh_face_pair::tests::test_edge_key_canonical ... ok [INFO] [stdout] test mesh_face_pair::tests::test_face_pair_to_json ... ok [INFO] [stdout] test mesh_face_pair::tests::test_faces_are_paired ... ok [INFO] [stdout] test mesh_face_pair::tests::test_four_tris_two_pairs ... ok [INFO] [stdout] test mesh_face_pair::tests::test_isolated_triangle_unpaired ... ok [INFO] [stdout] test mesh_face_pair::tests::test_max_paired_face ... ok [INFO] [stdout] test mesh_face_pair::tests::test_pairing_ratio_full ... ok [INFO] [stdout] test mesh_face_pair::tests::test_pairing_ratio_zero_faces ... ok [INFO] [stdout] test mesh_face_peel::tests::test_boundary_faces_non_empty ... ok [INFO] [stdout] test mesh_face_peel::tests::test_boundary_single_triangle ... ok [INFO] [stdout] test mesh_face_peel::tests::test_build_adjacency_non_empty ... ok [INFO] [stdout] test mesh_face_peel::tests::test_empty_active_faces ... ok [INFO] [stdout] test mesh_face_peel::tests::test_peel_layers_multiple ... ok [INFO] [stdout] test mesh_face_peel::tests::test_peel_one_layer_returns_result ... ok [INFO] [stdout] test mesh_face_peel::tests::test_peel_peeled_plus_retained ... ok [INFO] [stdout] test mesh_face_peel::tests::test_peel_result_to_json ... ok [INFO] [stdout] test mesh_face_peel::tests::test_peel_reduces_faces ... ok [INFO] [stdout] test mesh_face_peel::tests::test_remaining_after_peels ... ok [INFO] [stdout] test mesh_face_ring::tests::test_all_face_rings ... ok [INFO] [stdout] test mesh_face_ring::tests::test_avg_ring_size ... ok [INFO] [stdout] test mesh_face_ring::tests::test_face_ring_shared_vertex ... ok [INFO] [stdout] test mesh_face_ring::tests::test_face_ring_single_tri ... ok [INFO] [stdout] test mesh_face_ring::tests::test_face_ring_to_json ... ok [INFO] [stdout] test mesh_face_ring::tests::test_max_ring_size ... ok [INFO] [stdout] test mesh_face_ring::tests::test_ring_contains_face ... ok [INFO] [stdout] test mesh_face_ring::tests::test_vertex_not_in_mesh ... ok [INFO] [stdout] test mesh_face_ring::tests::test_vertices_with_ring_size ... ok [INFO] [stdout] test mesh_face_split_edge::tests::edge_exists_false ... ok [INFO] [stdout] test mesh_face_split_edge::tests::edge_exists_true ... ok [INFO] [stdout] test mesh_face_split_edge::tests::faces_sharing_edge_one ... ok [INFO] [stdout] test mesh_face_split_edge::tests::find_face_with_edge_found ... ok [INFO] [stdout] test mesh_face_split_edge::tests::find_face_with_edge_missing ... ok [INFO] [stdout] test mesh_face_split_edge::tests::lerp_midpoint ... ok [INFO] [stdout] test mesh_face_split_edge::tests::midpoint_inserted_index ... ok [INFO] [stdout] test mesh_face_strip::tests::test_build_strip ... ok [INFO] [stdout] test mesh_face_split_edge::tests::split_increases_face_count ... ok [INFO] [stdout] test mesh_face_strip::tests::test_empty_strip ... ok [INFO] [stdout] test mesh_face_strip::tests::test_longest_strip ... ok [INFO] [stdout] test mesh_face_strip::tests::test_strip_efficiency ... ok [INFO] [stdout] test mesh_face_split_edge::tests::split_adds_one_vertex ... ok [INFO] [stdout] test mesh_face_strip::tests::test_strip_restart_count_single ... ok [INFO] [stdout] test mesh_face_strip::tests::test_strip_length ... ok [INFO] [stdout] test mesh_face_strip::tests::test_strip_to_indices_roundtrip ... ok [INFO] [stdout] test mesh_face_strip::tests::test_strip_to_json ... ok [INFO] [stdout] test mesh_face_strip::tests::test_strip_restart_count_two ... ok [INFO] [stdout] test mesh_fan_mesh::tests::test_fan_area_positive ... ok [INFO] [stdout] test mesh_face_strip::tests::test_strips_from_mesh ... ok [INFO] [stdout] test mesh_fan_mesh::tests::test_fan_from_boundary_too_few ... ok [INFO] [stdout] test mesh_fan_mesh::tests::test_fan_vertex_count_6 ... ok [INFO] [stdout] test mesh_fan_mesh::tests::test_generate_fan_3 ... ok [INFO] [stdout] test mesh_fan_mesh::tests::test_fan_from_boundary ... ok [INFO] [stdout] test mesh_fan_mesh::tests::test_center_is_first ... ok [INFO] [stdout] test mesh_fan_mesh::tests::test_fan_mesh_to_json ... ok [INFO] [stdout] test mesh_fan_mesh::tests::test_generate_fan_large ... ok [INFO] [stdout] test mesh_fan_mesh::tests::test_generate_fan_min_segments ... ok [INFO] [stdout] test mesh_fan_mesh::tests::test_fan_area_circle ... ok [INFO] [stdout] test mesh_fan_triangulate::tests::fan_triangulate_all_two_polygons ... ok [INFO] [stdout] test mesh_fan_triangulate::tests::fan_triangulate_quad ... ok [INFO] [stdout] test mesh_fan_triangulate::tests::fan_triangulate_degenerate ... ok [INFO] [stdout] test mesh_fan_triangulate::tests::fan_triangulate_triangle ... ok [INFO] [stdout] test mesh_fan_triangulate::tests::polygon_area_2d_unit_square ... ok [INFO] [stdout] test mesh_fan_triangulate::tests::test_fan_centroid_square ... ok [INFO] [stdout] test mesh_fan_triangulate::tests::test_fan_area_unit_square ... ok [INFO] [stdout] test mesh_fan_triangulate::tests::fan_triangulate_pentagon ... ok [INFO] [stdout] test mesh_fan_triangulate::tests::test_fan_triangle_count ... ok [INFO] [stdout] test mesh_fan_triangulate::tests::test_fan_triangulate_3d_quad ... ok [INFO] [stdout] test mesh_feather::tests::test_average_barb_length_positive ... ok [INFO] [stdout] test mesh_feather::tests::test_barb_length_positive ... ok [INFO] [stdout] test mesh_feather::tests::test_barbs_symmetric ... ok [INFO] [stdout] test mesh_feather::tests::test_custom_origin ... ok [INFO] [stdout] test mesh_feather::tests::test_shaft_length ... ok [INFO] [stdout] test mesh_feather::tests::test_total_barb_count ... ok [INFO] [stdout] test mesh_feather::tests::test_total_segment_count ... ok [INFO] [stdout] test mesh_feather::tests::test_zero_barb_count ... ok [INFO] [stdout] test mesh_feature::tests::test_build_edge_face_map ... ok [INFO] [stdout] test mesh_feature::tests::test_by_type_and_count_by_type ... ok [INFO] [stdout] test mesh_feature::tests::test_chain_edges_simple_path ... ok [INFO] [stdout] test mesh_feature::tests::test_dihedral_angle_90 ... ok [INFO] [stdout] test mesh_feature::tests::test_dihedral_angle_flat ... ok [INFO] [stdout] test mesh_feature::tests::test_extract_all_features ... ok [INFO] [stdout] test mesh_feature::tests::test_extract_boundary_quad ... ok [INFO] [stdout] test mesh_feature::tests::test_extract_boundary_single_triangle ... ok [INFO] [stdout] test mesh_feature::tests::test_extract_sharp_bent_mesh ... ok [INFO] [stdout] test mesh_feature::tests::test_extract_sharp_flat_quad_none ... ok [INFO] [stdout] test mesh_feature::tests::test_extract_silhouette_bent_mesh ... ok [INFO] [stdout] test mesh_feature::tests::test_face_normal_z ... ok [INFO] [stdout] test mesh_feature::tests::test_feature_lines_add ... ok [INFO] [stdout] test mesh_feature::tests::test_feature_lines_default ... ok [INFO] [stdout] test mesh_feature::tests::test_feature_lines_new_and_count ... ok [INFO] [stdout] test mesh_feature::tests::test_sharp_strength_range ... ok [INFO] [stdout] test mesh_feature::tests::test_to_polylines ... ok [INFO] [stdout] test mesh_feature::tests::test_total_length ... ok [INFO] [stdout] test mesh_featureline::tests::test_compute_all_gaussian_curvatures_length ... ok [INFO] [stdout] test mesh_featureline::tests::test_extract_feature_lines_empty_mesh ... ok [INFO] [stdout] test mesh_featureline::tests::test_extract_ridges_returns_vec ... ok [INFO] [stdout] test mesh_featureline::tests::test_extract_valleys_returns_vec ... ok [INFO] [stdout] test mesh_featureline::tests::test_extract_feature_lines_no_panic ... ok [INFO] [stdout] test mesh_featureline::tests::test_feature_line_density_empty_mesh ... ok [INFO] [stdout] test mesh_featureline::tests::test_compute_all_mean_curvatures_length ... ok [INFO] [stdout] test mesh_featureline::tests::test_feature_line_density_in_range ... ok [INFO] [stdout] test mesh_featureline::tests::test_shape_index_range ... ok [INFO] [stdout] test mesh_featureline::tests::test_shape_index_sphere_like ... ok [INFO] [stdout] test mesh_featureline::tests::test_vertex_gaussian_curvature_flat_near_zero ... ok [INFO] [stdout] test mesh_featureline::tests::test_vertex_gaussian_curvature_sphere_positive ... ok [INFO] [stdout] test mesh_featureline::tests::test_vertex_mean_curvature_flat_is_finite ... ok [INFO] [stdout] test mesh_featureline::tests::test_vertex_mean_curvature_sphere_positive ... ok [INFO] [stdout] test mesh_fiber_orientation::tests::test_fiber_anisotropy_zero ... ok [INFO] [stdout] test mesh_fiber_orientation::tests::test_fiber_anisotropy_nonzero ... ok [INFO] [stdout] test mesh_fiber_orientation::tests::test_fiber_count_empty ... ok [INFO] [stdout] test mesh_fiber_orientation::tests::test_fiber_mean_coherence ... ok [INFO] [stdout] test mesh_fiber_orientation::tests::test_fiber_set_get ... ok [INFO] [stdout] test mesh_fiber_orientation::tests::test_new_fiber_field ... ok [INFO] [stdout] test mesh_fibonacci_sphere::tests::test_fibonacci_coverage_clamped ... ok [INFO] [stdout] test mesh_fibonacci_sphere::tests::test_fibonacci_point_normalized ... ok [INFO] [stdout] test mesh_fibonacci_sphere::tests::test_fibonacci_sphere_count ... ok [INFO] [stdout] test mesh_fibonacci_sphere::tests::test_fibonacci_sphere_on_unit_sphere ... ok [INFO] [stdout] test mesh_fill_holes::tests::test_detect_holes_open_box ... ok [INFO] [stdout] test mesh_fill_holes::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_fibonacci_sphere::tests::test_fibonacci_min_angle_decreases ... ok [INFO] [stdout] test mesh_fill_holes::tests::test_fill_holes_hole_count ... ok [INFO] [stdout] test mesh_fill_holes::tests::test_fill_holes_produces_tris ... ok [INFO] [stdout] test mesh_fill_holes::tests::test_fill_triangle_count_zero_for_closed ... ok [INFO] [stdout] test mesh_fill_holes::tests::test_has_holes_closed ... ok [INFO] [stdout] test mesh_fill_holes::tests::test_has_holes_true ... ok [INFO] [stdout] test mesh_feature::tests::test_to_svg_paths ... ok [INFO] [stdout] test mesh_fill_holes::tests::test_max_hole_edges_filter ... ok [INFO] [stdout] test mesh_fillet::tests::test_arc_points_count ... ok [INFO] [stdout] test mesh_fill_holes::tests::test_merge_filled ... ok [INFO] [stdout] test mesh_fillet::tests::test_arc_points_zero_segments ... ok [INFO] [stdout] test mesh_fillet::tests::test_bevel_vertices_more_verts ... ok [INFO] [stdout] test mesh_fillet::tests::test_blend_edge_points_distance ... ok [INFO] [stdout] test mesh_fillet::tests::test_blend_edge_points_symmetric ... ok [INFO] [stdout] test mesh_fillet::tests::test_chamfer_amount_from_radius ... ok [INFO] [stdout] test mesh_fillet::tests::test_chamfer_edge_more_verts ... ok [INFO] [stdout] test mesh_fillet::tests::test_chamfer_edges_multiple ... ok [INFO] [stdout] test mesh_fillet::tests::test_default_fillet_config ... ok [INFO] [stdout] test mesh_fillet::tests::test_edge_dihedral_no_adjacent ... ok [INFO] [stdout] test mesh_fillet::tests::test_fillet_config_segments_default ... ok [INFO] [stdout] test mesh_fillet::tests::test_fillet_edge_more_verts ... ok [INFO] [stdout] test mesh_fillet::tests::test_find_sharp_edges_flat_mesh ... ok [INFO] [stdout] test mesh_fillet_edge::tests::test_arc_points_count ... ok [INFO] [stdout] test mesh_fillet_edge::tests::test_arc_points_first ... ok [INFO] [stdout] test mesh_fillet_edge::tests::test_fillet_arc_length ... ok [INFO] [stdout] test mesh_fillet_edge::tests::test_fillet_edge_simple ... ok [INFO] [stdout] test mesh_fillet_edge::tests::test_fillet_radius_from_chamfer ... ok [INFO] [stdout] test mesh_fillet_edge::tests::test_fillet_vertex_estimate ... ok [INFO] [stdout] test mesh_fillet_edge::tests::test_apply_edge_fillet ... ok [INFO] [stdout] test mesh_fillet_edge::tests::test_validate_fillet_config ... ok [INFO] [stdout] test mesh_flag_layer::tests::add_layer_increments ... ok [INFO] [stdout] test mesh_flag_layer::tests::clear_flags_resets_all ... ok [INFO] [stdout] test mesh_flag_layer::tests::flag_set_count_correct ... ok [INFO] [stdout] test mesh_flag_layer::tests::flags_default_false ... ok [INFO] [stdout] test mesh_flag_layer::tests::get_flag_missing_layer_none ... ok [INFO] [stdout] test mesh_flag_layer::tests::invert_flags_toggles ... ok [INFO] [stdout] test mesh_flag_layer::tests::new_set_empty ... ok [INFO] [stdout] test mesh_flag_layer::tests::set_and_get_flag ... ok [INFO] [stdout] test mesh_flag_layer::tests::set_out_of_bounds_returns_false ... ok [INFO] [stdout] test mesh_flatten_face::tests::best_fit_plane_z_axis ... ok [INFO] [stdout] test mesh_flatten_face::tests::flatten_empty_selection_no_crash ... ok [INFO] [stdout] test mesh_flatten_face::tests::flatten_selected_faces_projects ... ok [INFO] [stdout] test mesh_flatten_face::tests::planarity_error_zero_for_flat ... ok [INFO] [stdout] test mesh_flatten_face::tests::project_to_plane_already_on_plane ... ok [INFO] [stdout] test mesh_flatten_face::tests::safe_normalize_unit ... ok [INFO] [stdout] test mesh_flatten_face::tests::safe_normalize_zero_gives_up ... ok [INFO] [stdout] test mesh_flatten_face::tests::vertex_centroid_empty ... ok [INFO] [stdout] test mesh_flatten_face::tests::vertex_centroid_triangle ... ok [INFO] [stdout] test mesh_flip_normals::tests::test_flip_all_windings ... ok [INFO] [stdout] test mesh_flip_normals::tests::test_flip_all_windings_multiple ... ok [INFO] [stdout] test mesh_flip_normals::tests::test_flip_normals ... ok [INFO] [stdout] test mesh_flip_normals::tests::test_flip_selected ... ok [INFO] [stdout] test mesh_flip_normals::tests::test_negate_normals ... ok [INFO] [stdout] test mesh_flip_normals::tests::test_negate_selected_normals ... ok [INFO] [stdout] test mesh_flip_normals::tests::test_tri_normal_z ... ok [INFO] [stdout] test mesh_flip_normals::tests::test_windings_consistent ... ok [INFO] [stdout] test mesh_floor_constraint::tests::ceiling_clamps_above ... ok [INFO] [stdout] test mesh_floor_constraint::tests::distance_to_plane_correct ... ok [INFO] [stdout] test mesh_floor_constraint::tests::floor_above_plane_unchanged ... ok [INFO] [stdout] test mesh_floor_constraint::tests::floor_at_zero_clamps_below ... ok [INFO] [stdout] test mesh_floor_constraint::tests::is_satisfied_floor_above_plane ... ok [INFO] [stdout] test mesh_floor_constraint::tests::is_satisfied_floor_below_plane_false ... ok [INFO] [stdout] test mesh_floor_constraint::tests::json_contains_label ... ok [INFO] [stdout] test mesh_floor_constraint::tests::json_side_field_is_floor ... ok [INFO] [stdout] test mesh_floor_constraint::tests::zero_influence_does_not_move_vertex ... ok [INFO] [stdout] test mesh_flow::tests::test_build_adjacency_list_count ... ok [INFO] [stdout] test mesh_flow::tests::test_build_adjacency_list_no_duplicates ... ok [INFO] [stdout] test mesh_flow::tests::test_flow_mesh_initial_volume_matches ... ok [INFO] [stdout] test mesh_flow::tests::test_flow_mesh_no_nan ... ok [INFO] [stdout] test mesh_flow::tests::test_flow_mesh_steps_run ... ok [INFO] [stdout] test mesh_flow::tests::test_laplacian_step_reduces_roughness ... ok [INFO] [stdout] test mesh_flow::tests::test_mean_curvature_step_no_nan ... ok [INFO] [stdout] test mesh_flow::tests::test_mesh_volume_tetrahedron ... ok [INFO] [stdout] test mesh_flow::tests::test_rescale_to_volume_scales_correctly ... ok [INFO] [stdout] test mesh_flow::tests::test_taubin_preserves_better_than_plain_laplacian ... ok [INFO] [stdout] test mesh_flow::tests::test_laplacian_step_result_length ... ok [INFO] [stdout] test mesh_flow::tests::test_vertex_laplacian_at_centroid_is_zero ... ok [INFO] [stdout] test mesh_flow::tests::test_volume_preserved_with_preserve_volume_flag ... ok [INFO] [stdout] test mesh_flow_map::tests::test_mean_speed_zero_weights ... ok [INFO] [stdout] test mesh_flow_map::tests::test_new_flow_map ... ok [INFO] [stdout] test mesh_flow_map::tests::test_normalize_dir ... ok [INFO] [stdout] test mesh_flow_map::tests::test_normalize_zero ... ok [INFO] [stdout] test mesh_flow_map::tests::test_to_color ... ok [INFO] [stdout] test mesh_fluid_surface::tests::clamp_iso_above_one ... ok [INFO] [stdout] test mesh_fluid_surface::tests::clamp_iso_below_zero ... ok [INFO] [stdout] test mesh_flow_map::tests::test_set_get ... ok [INFO] [stdout] test mesh_fluid_surface::tests::default_params_iso_level ... ok [INFO] [stdout] test mesh_fluid_surface::tests::estimate_triangles ... ok [INFO] [stdout] test mesh_fluid_surface::tests::extract_stub_empty ... ok [INFO] [stdout] test mesh_fluid_surface::tests::fluid_surface_vertex_count ... ok [INFO] [stdout] test mesh_fluid_surface::tests::grid_extent_correct ... ok [INFO] [stdout] test mesh_fluid_surface::tests::grid_memory_nonzero ... ok [INFO] [stdout] test mesh_fluid_surface::tests::validate_dims_ok ... ok [INFO] [stdout] test mesh_fluid_surface::tests::validate_dims_zero ... ok [INFO] [stdout] test mesh_follow_path::tests::arc_length_empty_is_zero ... ok [INFO] [stdout] test mesh_follow_path::tests::arc_length_two_points_correct ... ok [INFO] [stdout] test mesh_follow_path::tests::arc_length_zero_for_single_point ... ok [INFO] [stdout] test mesh_follow_path::tests::default_follow_curve_is_true ... ok [INFO] [stdout] test mesh_follow_path::tests::evaluate_empty_path_returns_none ... ok [INFO] [stdout] test mesh_follow_path::tests::evaluate_path_at_one_returns_last_point ... ok [INFO] [stdout] test mesh_follow_path::tests::add_point_increases_count ... ok [INFO] [stdout] test mesh_follow_path::tests::evaluate_path_at_zero_returns_first_point ... ok [INFO] [stdout] test mesh_follow_path::tests::json_contains_label ... ok [INFO] [stdout] test mesh_follow_path::tests::new_constraint_has_no_points ... ok [INFO] [stdout] test mesh_force_field_mesh::tests::default_falloff_power_is_two ... ok [INFO] [stdout] test mesh_force_field_mesh::tests::field_kind_name_turbulence ... ok [INFO] [stdout] test mesh_force_field_mesh::tests::field_kind_name_wind ... ok [INFO] [stdout] test mesh_force_field_mesh::tests::field_strength_at_emitter_equals_strength ... ok [INFO] [stdout] test mesh_force_field_mesh::tests::field_strength_beyond_max_dist_is_zero ... ok [INFO] [stdout] test mesh_force_field_mesh::tests::field_strength_decreases_with_distance ... ok [INFO] [stdout] test mesh_force_field_mesh::tests::json_contains_label ... ok [INFO] [stdout] test mesh_force_field_mesh::tests::turbulence_field_kind_is_turbulence ... ok [INFO] [stdout] test mesh_force_field_mesh::tests::wind_field_kind_is_wind ... ok [INFO] [stdout] test mesh_fractal_displace::tests::default_params_sensible ... ok [INFO] [stdout] test mesh_fractal_displace::tests::displacement_varies_across_vertices ... ok [INFO] [stdout] test mesh_fractal_displace::tests::fbm_deterministic ... ok [INFO] [stdout] test mesh_fractal_displace::tests::empty_mesh ... ok [INFO] [stdout] test mesh_fractal_displace::tests::max_displacement_bounded ... ok [INFO] [stdout] test mesh_fractal_displace::tests::lcg_hash_nonzero ... ok [INFO] [stdout] test mesh_fractal_displace::tests::octave_one_matches_single_noise ... ok [INFO] [stdout] test mesh_fractal_displace::tests::zero_amplitude_unchanged ... ok [INFO] [stdout] test mesh_fractal_gen::tests::test_koch_points_iteration_0 ... ok [INFO] [stdout] test mesh_fractal_gen::tests::test_sierpinski_count ... ok [INFO] [stdout] test mesh_fur_cards::tests::test_add_card ... ok [INFO] [stdout] test mesh_fur_cards::tests::test_average_card_length ... ok [INFO] [stdout] test mesh_fur_cards::tests::test_average_card_length_empty ... ok [INFO] [stdout] test mesh_fractal_displace::tests::value_noise_in_range ... ok [INFO] [stdout] test mesh_fur_cards::tests::test_card_length ... ok [INFO] [stdout] test mesh_fractal_gen::tests::test_mandelbrot_interior_point ... ok [INFO] [stdout] test mesh_fractal_gen::tests::test_koch_points_iteration_1 ... ok [INFO] [stdout] test mesh_fused_deposition::tests::empty_job_no_layers ... ok [INFO] [stdout] test mesh_fur_cards::tests::test_index_count ... ok [INFO] [stdout] test mesh_fused_deposition::tests::layer_thickness_stored ... ok [INFO] [stdout] test mesh_fused_deposition::tests::layer_z_increases ... ok [INFO] [stdout] test mesh_fused_deposition::tests::layer_count_correct ... ok [INFO] [stdout] test mesh_fused_deposition::tests::rect_path_length_positive ... ok [INFO] [stdout] test mesh_fused_deposition::tests::layer_height_stored ... ok [INFO] [stdout] test mesh_fused_deposition::tests::total_path_points_zero_initially ... ok [INFO] [stdout] test mesh_fused_deposition::tests::rect_path_adds_5_points ... ok [INFO] [stdout] test mesh_fur_cards::tests::test_vertex_count ... ok [INFO] [stdout] test mesh_fur_cards::tests::test_generate_mismatched_lengths ... ok [INFO] [stdout] test mesh_fused_deposition::tests::zigzag_adds_path ... ok [INFO] [stdout] test mesh_fused_deposition::tests::zigzag_path_length_positive ... ok [INFO] [stdout] test mesh_gear_tooth::tests::addendum_larger_than_pitch ... ok [INFO] [stdout] test mesh_gear_tooth::tests::base_radius_positive ... ok [INFO] [stdout] test mesh_gear_tooth::tests::build_gear_has_triangles ... ok [INFO] [stdout] test mesh_gear_tooth::tests::build_gear_has_vertices ... ok [INFO] [stdout] test mesh_gear_tooth::tests::dedendum_smaller_than_pitch ... ok [INFO] [stdout] test mesh_gear_tooth::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_gear_tooth::tests::involute_origin ... ok [INFO] [stdout] test mesh_gear_tooth::tests::pitch_radius_correct ... ok [INFO] [stdout] test mesh_gear_tooth::tests::validate_bad_teeth ... ok [INFO] [stdout] test mesh_gear_tooth::tests::validate_ok ... ok [INFO] [stdout] test mesh_genus_compute::tests::count_boundary_loops_closed_is_zero ... ok [INFO] [stdout] test mesh_genus_compute::tests::count_unique_edges_quad ... ok [INFO] [stdout] test mesh_genus_compute::tests::empty_mesh_zeros ... ok [INFO] [stdout] test mesh_genus_compute::tests::genus_result_nonneg ... ok [INFO] [stdout] test mesh_genus_compute::tests::open_mesh_has_boundary_loops ... ok [INFO] [stdout] test mesh_genus_compute::tests::tetrahedron_euler_chi_2 ... ok [INFO] [stdout] test mesh_genus_compute::tests::tetrahedron_genus_0 ... ok [INFO] [stdout] test mesh_genus_compute::tests::vertex_edge_face_counts_match ... ok [INFO] [stdout] test mesh_geodesic::tests::test_build_edge_graph_single_tri ... ok [INFO] [stdout] test mesh_geodesic::tests::test_farthest_point_nonzero_distance ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_diameter_positive ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_distances_correct_lengths ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_distances_multi_all_sources_zero ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_distances_source_zero ... ok [INFO] [stdout] test mesh_geodesic::tests::test_default_config ... ok [INFO] [stdout] test mesh_geodesic::tests::test_multi_source_middle_vertices_finite ... ok [INFO] [stdout] test mesh_geodesic_path::tests::adjacent_vertex_has_edge_length ... ok [INFO] [stdout] test mesh_geodesic_path::tests::compute_eccentricity_non_negative ... ok [INFO] [stdout] test mesh_geodesic_path::tests::dijkstra_between_same_vertex ... ok [INFO] [stdout] test mesh_geodesic_path::tests::farthest_point_sampling_k_larger_than_n ... ok [INFO] [stdout] test mesh_geodesic_path::tests::farthest_point_sampling_k_results ... ok [INFO] [stdout] test mesh_geodesic::tests::test_normalize_geodesic_range ... ok [INFO] [stdout] test mesh_geodesic_path::tests::geodesic_distance_matches_dijkstra ... ok [INFO] [stdout] test mesh_geodesic_path::tests::geodesic_voronoi_covers_all_vertices ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_vertex_count_disconnected ... ok [INFO] [stdout] test mesh_face_ring::tests::test_empty ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_path_adjacent ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_path_self ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_voronoi_two_sources ... ok [INFO] [stdout] test mesh_geodesic::tests::test_level_set_isolines ... ok [INFO] [stdout] test mesh_geodesic_path::tests::farthest_point_sampling_zero_returns_empty ... ok [INFO] [stdout] test mesh_geodesic_path::tests::geodesic_voronoi_source_in_own_region ... ok [INFO] [stdout] test mesh_geodesic_path::tests::reconstruct_path_no_predecessor ... ok [INFO] [stdout] test mesh_geodesic_voronoi::tests::test_build_adjacency ... ok [INFO] [stdout] test mesh_geodesic_path::tests::source_has_zero_distance ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_heat_length_preserved ... ok [INFO] [stdout] test mesh_geodesic_voronoi::tests::test_all_vertices_labeled ... ok [INFO] [stdout] test mesh_geodesic_voronoi::tests::test_single_seed ... ok [INFO] [stdout] test mesh_geodesic_voronoi::tests::test_largest_cell ... ok [INFO] [stdout] test mesh_geodesic_voronoi::tests::test_two_seeds ... ok [INFO] [stdout] test mesh_geodesic_voronoi::tests::test_vertex_label ... ok [INFO] [stdout] test mesh_geodesic_voronoi::tests::test_voronoi_result_to_json ... ok [INFO] [stdout] test mesh_geomorph::tests::test_buffer_push_and_len ... ok [INFO] [stdout] test mesh_geomorph::tests::test_evaluate_all_length ... ok [INFO] [stdout] test mesh_geomorph::tests::test_evaluate_out_of_bounds ... ok [INFO] [stdout] test mesh_geomorph::tests::test_is_empty_on_new ... ok [INFO] [stdout] test mesh_geomorph::tests::test_lerp_at_one ... ok [INFO] [stdout] test mesh_geomorph::tests::test_lerp_at_zero ... ok [INFO] [stdout] test mesh_geomorph::tests::test_lerp_midpoint ... ok [INFO] [stdout] test mesh_geomorph::tests::test_max_geomorph_error_same ... ok [INFO] [stdout] test mesh_geomorph::tests::test_set_blend_clamps ... ok [INFO] [stdout] test mesh_geosphere::tests::all_vertices_on_sphere ... ok [INFO] [stdout] test mesh_geosphere::tests::expected_triangle_count_formula ... ok [INFO] [stdout] test mesh_geosphere::tests::icosahedron_at_level0 ... ok [INFO] [stdout] test mesh_geosphere::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_geosphere::tests::level1_triangle_count ... ok [INFO] [stdout] test mesh_geosphere::tests::level2_triangle_count ... ok [INFO] [stdout] test mesh_geosphere::tests::normals_unit_length ... ok [INFO] [stdout] test mesh_geosphere::tests::surface_area_sphere ... ok [INFO] [stdout] test mesh_gordon_surface::tests::test_gordon_total_u_points ... ok [INFO] [stdout] test mesh_geosphere::tests::validate_bad_subdivisions ... ok [INFO] [stdout] test mesh_geosphere::tests::validate_ok ... ok [INFO] [stdout] test mesh_gordon_surface::tests::test_gordon_u_curve_count ... ok [INFO] [stdout] test mesh_gordon_surface::tests::test_gordon_v_curve_count ... ok [INFO] [stdout] test mesh_gordon_surface::tests::test_tessellate_gordon_tri_count ... ok [INFO] [stdout] test mesh_gordon_surface::tests::test_tessellate_empty_on_zero_samples ... ok [INFO] [stdout] test mesh_gordon_surface::tests::test_tessellate_gordon_empty_on_too_few ... ok [INFO] [stdout] test mesh_gordon_surface::tests::test_tessellate_gordon_vertex_count ... ok [INFO] [stdout] test mesh_gordon_surface::tests::test_validate_gordon ... ok [INFO] [stdout] test mesh_gordon_surface::tests::test_validate_gordon_empty ... ok [INFO] [stdout] test mesh_grid_deform::tests::test_apply_grid_deform_empty ... ok [INFO] [stdout] test mesh_grid_deform::tests::test_apply_grid_deform_with_delta ... ok [INFO] [stdout] test mesh_grid_deform::tests::test_deform_vertex_identity ... ok [INFO] [stdout] test mesh_grid_deform::tests::test_deform_vertex_out_of_bounds ... ok [INFO] [stdout] test mesh_grid_deform::tests::test_grid_deform_to_json ... ok [INFO] [stdout] test mesh_grid_deform::tests::test_grid_index ... ok [INFO] [stdout] test mesh_grid_deform::tests::test_new_grid_deform ... ok [INFO] [stdout] test mesh_grid_deform::tests::test_set_grid_delta ... ok [INFO] [stdout] test mesh_grid_deform::tests::test_trilinear_zero_deltas ... ok [INFO] [stdout] test mesh_grid_fill::tests::test_default_config ... ok [INFO] [stdout] test mesh_grid_fill::tests::test_dimensions_match ... ok [INFO] [stdout] test mesh_grid_fill::tests::test_grid_fill_face_count_spec ... ok [INFO] [stdout] test mesh_grid_fill::tests::test_grid_fill_params_valid ... ok [INFO] [stdout] test mesh_grid_fill::tests::test_grid_fill_vertex_count_spec ... ok [INFO] [stdout] test mesh_grid_fill::tests::test_grid_fill_vertex_midpoint ... ok [INFO] [stdout] test mesh_grid_fill::tests::test_quad_count ... ok [INFO] [stdout] test mesh_grid_fill::tests::test_vertex_count ... ok [INFO] [stdout] test mesh_grid_gen::tests::test_grid_bounds ... ok [INFO] [stdout] test mesh_grid_gen::tests::test_grid_cell_count ... ok [INFO] [stdout] test mesh_grid_gen::tests::test_grid_edge_count_positive ... ok [INFO] [stdout] test mesh_grid_gen::tests::test_grid_vertex_count ... ok [INFO] [stdout] test mesh_grid_gen::tests::test_grid_vertex_position ... ok [INFO] [stdout] test mesh_grid_gen::tests::test_new_grid ... ok [INFO] [stdout] test mesh_hair_guide_gen::tests::arc_length_correct ... ok [INFO] [stdout] test mesh_hair_guide_gen::tests::average_length_empty_mesh ... ok [INFO] [stdout] test mesh_hair_guide_gen::tests::average_length_nonzero ... ok [INFO] [stdout] test mesh_hair_guide_gen::tests::default_width ... ok [INFO] [stdout] test mesh_hair_guide_gen::tests::segment_count ... ok [INFO] [stdout] test mesh_hair_guide_gen::tests::straight_guide_point_count ... ok [INFO] [stdout] test mesh_hair_guide_gen::tests::total_points_count ... ok [INFO] [stdout] test mesh_hair_guide_gen::tests::uniform_grid_guide_count ... ok [INFO] [stdout] test mesh_hair_guide_gen::tests::validate_guides_fails_empty ... ok [INFO] [stdout] test mesh_hair_guide_gen::tests::validate_guides_ok ... ok [INFO] [stdout] test mesh_half_face::tests::test_boundary_count_non_negative ... ok [INFO] [stdout] test mesh_half_face::tests::test_boundary_half_face_count_open_mesh ... ok [INFO] [stdout] test mesh_half_face::tests::test_build_half_face_mesh_empty ... ok [INFO] [stdout] test mesh_half_face::tests::test_build_half_face_mesh_single ... ok [INFO] [stdout] test mesh_half_face::tests::test_half_face_mesh_to_json ... ok [INFO] [stdout] test mesh_half_face::tests::test_half_face_vertices ... ok [INFO] [stdout] test mesh_half_face::tests::test_half_face_vertices_oob ... ok [INFO] [stdout] test mesh_half_face::tests::test_is_closed_single_tri ... ok [INFO] [stdout] test mesh_half_face::tests::test_paired_half_faces ... ok [INFO] [stdout] test mesh_harmonic_map::tests::test_boundary_on_unit_circle ... ok [INFO] [stdout] test mesh_harmonic_map::tests::test_build_adjacency ... ok [INFO] [stdout] test mesh_harmonic_map::tests::test_empty_boundary ... ok [INFO] [stdout] test mesh_harmonic_map::tests::test_harmonic_converges ... ok [INFO] [stdout] test mesh_harmonic_map::tests::test_harmonic_map_basic ... ok [INFO] [stdout] test mesh_harmonic_map::tests::test_map_boundary_circle ... ok [INFO] [stdout] test mesh_harmonic_map::tests::test_residual_decreases ... ok [INFO] [stdout] test mesh_harmonic_map::tests::test_single_interior_vertex ... ok [INFO] [stdout] test mesh_harmonic_map::tests::test_uv_area_ratio ... ok [INFO] [stdout] test mesh_harmonic_map::tests::test_vertex_count ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_build_adjacency_basic ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_build_adjacency_empty ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_build_adjacency_symmetry ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_default_heat_config ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_heat_gradient_uniform ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_diffuse_heat_propagates ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_geodesic_heat_distance_source_small ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_heat_field_min_max ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_new_heat_field_count ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_heat_to_color_blue_at_zero ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_heat_to_color_red_at_one ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_new_heat_field_initial_value ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_normalize_field ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_normalize_field_uniform ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_set_heat_source ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_set_heat_source_out_of_bounds ... ok [INFO] [stdout] test mesh_heat_diffuse::tests::test_threshold_field ... ok [INFO] [stdout] test mesh_heat_diffuse_v2::tests::build_adjacency_returns_correct_size ... ok [INFO] [stdout] test mesh_heat_diffuse_v2::tests::default_config_positive ... ok [INFO] [stdout] test mesh_heat_diffuse_v2::tests::diffuse_changes_field ... ok [INFO] [stdout] test mesh_heat_diffuse_v2::tests::heat_edge_map_nonempty ... ok [INFO] [stdout] test mesh_heat_diffuse_v2::tests::heat_field_v2_max_min_ordered ... ok [INFO] [stdout] test mesh_heat_diffuse_v2::tests::heat_gradient_v2_center_hotter ... ok [INFO] [stdout] test mesh_heat_diffuse_v2::tests::new_field_size_correct ... ok [INFO] [stdout] test mesh_heat_diffuse_v2::tests::normalize_maps_to_unit_range ... ok [INFO] [stdout] test mesh_heat_diffuse_v2::tests::set_source_changes_value ... ok [INFO] [stdout] test mesh_heat_diffuse_v2::tests::time_advances_during_diffusion ... ok [INFO] [stdout] test mesh_helix::tests::test_helix_length_positive ... ok [INFO] [stdout] test mesh_helix::tests::test_helix_point_at_one ... ok [INFO] [stdout] test mesh_helix::tests::test_helix_point_at_zero ... ok [INFO] [stdout] test mesh_helix::tests::test_helix_radius_in_xy ... ok [INFO] [stdout] test mesh_helix::tests::test_helix_to_polyline_count ... ok [INFO] [stdout] test mesh_helix::tests::test_new_helix_defaults ... ok [INFO] [stdout] test mesh_hex_mesh::tests::test_area_scales_with_cell_size ... ok [INFO] [stdout] test mesh_hex_mesh::tests::test_center_at_origin ... ok [INFO] [stdout] test mesh_hex_mesh::tests::test_generate_1x1 ... ok [INFO] [stdout] test mesh_hex_mesh::tests::test_generate_2x2 ... ok [INFO] [stdout] test mesh_hex_mesh::tests::test_generate_empty ... ok [INFO] [stdout] test mesh_hex_mesh::tests::test_hex_cell_count ... ok [INFO] [stdout] test mesh_hex_mesh::tests::test_hex_diagonal_factor ... ok [INFO] [stdout] test mesh_hex_mesh::tests::test_hex_mesh_area_positive ... ok [INFO] [stdout] test mesh_hex_mesh::tests::test_hex_mesh_to_json ... ok [INFO] [stdout] test mesh_hex_mesh::tests::test_large_grid ... ok [INFO] [stdout] test mesh_hole_detect::tests::test_boundary_add_loop ... ok [INFO] [stdout] test mesh_hole_detect::tests::test_boundary_total_vertices ... ok [INFO] [stdout] test mesh_hole_detect::tests::test_detect_boundary_edges_open_mesh ... ok [INFO] [stdout] test mesh_hole_detect::tests::test_is_closed_mesh_open ... ok [INFO] [stdout] test mesh_hole_detect::tests::test_new_mesh_boundary ... ok [INFO] [stdout] test mesh_hollow::tests::area_weighted_normals_no_nan ... ok [INFO] [stdout] test mesh_hollow::tests::boundary_loops_empty_for_closed ... ok [INFO] [stdout] test mesh_hollow::tests::find_boundary_edges_closed_tetra ... ok [INFO] [stdout] test mesh_fractal_displace::tests::fractal_displace_preserves_count ... ok [INFO] [stdout] test mesh_fractal_gen::tests::test_fractal_dimension_estimate ... ok [INFO] [stdout] test mesh_fur_cards::tests::test_generate_fur_cards ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_path_unreachable_empty ... ok [INFO] [stdout] test mesh_geodesic::tests::test_geodesic_vertex_count_connected ... ok [INFO] [stdout] test mesh_geodesic_path::tests::line_mesh_all_distances_finite ... ok [INFO] [stdout] test mesh_geodesic_path::tests::mesh_diameter_geodesic_non_negative ... ok [INFO] [stdout] test mesh_geodesic_path::tests::path_is_connected ... ok [INFO] [stdout] test mesh_geodesic_voronoi::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_geodesic_voronoi::tests::test_empty_seeds ... ok [INFO] [stdout] test mesh_geodesic_voronoi::tests::test_seed_distance_zero ... ok [INFO] [stdout] test mesh_geomorph::tests::test_build_geomorph_buffer_count ... ok [INFO] [stdout] test mesh_hole_detect::tests::test_detect_boundary_edges_shared_edge ... ok [INFO] [stdout] test mesh_hollow::tests::hollow_empty_mesh_ok ... ok [INFO] [stdout] test mesh_hollow::tests::hollow_mesh_no_cap_when_disabled ... ok [INFO] [stdout] test mesh_hollow::tests::hollow_mesh_index_count_plausible ... ok [INFO] [stdout] test mesh_hollow::tests::offset_mesh_inward ... ok [INFO] [stdout] test mesh_hollow::tests::stitch_boundary_loops_with_offsets ... ok [INFO] [stdout] test mesh_icosphere::tests::test_icosahedron_verts_count ... ok [INFO] [stdout] test mesh_icosphere::tests::test_icosahedron_faces_count ... ok [INFO] [stdout] test mesh_icosphere::tests::test_icosphere_radius ... ok [INFO] [stdout] test mesh_icosphere::tests::test_icosphere_vert_count_formula ... ok [INFO] [stdout] test mesh_icosphere::tests::test_make_icosphere_one_subdivision ... ok [INFO] [stdout] test mesh_icosphere::tests::test_icosphere_indices_in_range ... ok [INFO] [stdout] test mesh_icosphere::tests::test_unit_sphere_vert_distance ... ok [INFO] [stdout] test mesh_icosphere::tests::test_make_icosphere_zero_subdivisions ... ok [INFO] [stdout] test mesh_icosphere_gen::tests::test_icosahedron_face_count ... ok [INFO] [stdout] test mesh_icosphere_gen::tests::test_icosahedron_vertex_count ... ok [INFO] [stdout] test mesh_icosphere::tests::test_icosphere_two_subdivisions ... ok [INFO] [stdout] test mesh_icosphere_gen::tests::test_icosphere_build_subdivision_0 ... ok [INFO] [stdout] test mesh_icosphere_gen::tests::test_icosahedron_vertices_unit ... ok [INFO] [stdout] test mesh_implicit_blob::tests::add_cylinder_increments_count ... ok [INFO] [stdout] test mesh_implicit_blob::tests::add_ellipsoid_increments_count ... ok [INFO] [stdout] test mesh_implicit_blob::tests::average_blend_weight_correct ... ok [INFO] [stdout] test mesh_implicit_blob::tests::average_blend_weight_empty_is_zero ... ok [INFO] [stdout] test mesh_implicit_blob::tests::is_inside_at_center_with_low_iso ... ok [INFO] [stdout] test mesh_icosphere_gen::tests::test_icosphere_build_subdivision_1 ... ok [INFO] [stdout] test mesh_implicit_blob::tests::new_set_has_no_blobs ... ok [INFO] [stdout] test mesh_icosphere_gen::tests::test_icosphere_vertex_count_formula ... ok [INFO] [stdout] test mesh_impostor::tests::test_angle_for_index_half ... ok [INFO] [stdout] test mesh_implicit_blob::tests::weight_clamped_to_one ... ok [INFO] [stdout] test mesh_implicit_blob::tests::field_potential_at_center_is_positive ... ok [INFO] [stdout] test mesh_implicit_blob::tests::json_contains_blob_count ... ok [INFO] [stdout] test mesh_impostor::tests::test_angle_for_index_zero ... ok [INFO] [stdout] test mesh_impostor::tests::test_billboard_center ... ok [INFO] [stdout] test mesh_impostor::tests::test_billboard_quad_uvs_count ... ok [INFO] [stdout] test mesh_impostor::tests::test_default_config ... ok [INFO] [stdout] test mesh_impostor::tests::test_empty_atlas_is_empty ... ok [INFO] [stdout] test mesh_impostor::tests::test_generate_quad_count ... ok [INFO] [stdout] test mesh_impostor::tests::test_nearest_angle_wraps ... ok [INFO] [stdout] test mesh_incircle::tests::test_compute_incircles_empty ... ok [INFO] [stdout] test mesh_incircle::tests::test_compute_incircles_single ... ok [INFO] [stdout] test mesh_incircle::tests::test_count_large_incircles ... ok [INFO] [stdout] test mesh_incircle::tests::test_incircle_result_to_json ... ok [INFO] [stdout] test mesh_impostor::tests::test_nearest_angle_index_zero ... ok [INFO] [stdout] test mesh_incircle::tests::test_edge_length_ic ... ok [INFO] [stdout] test mesh_incircle::tests::test_get_incircle ... ok [INFO] [stdout] test mesh_impostor::tests::test_billboard_quad_vertices_count ... ok [INFO] [stdout] test mesh_incircle::tests::test_min_max_radius_single ... ok [INFO] [stdout] test mesh_incircle::tests::test_radius_in_range ... ok [INFO] [stdout] test mesh_incircle::tests::test_triangle_incircle_degenerate ... ok [INFO] [stdout] test mesh_incircle::tests::test_triangle_incircle_right_tri ... ok [INFO] [stdout] test mesh_index_remap::tests::test_apply_remap ... ok [INFO] [stdout] test mesh_index_remap::tests::test_compact_remap_all_used ... ok [INFO] [stdout] test mesh_index_remap::tests::test_compact_remap_gap ... ok [INFO] [stdout] test mesh_index_remap::tests::test_empty_indices ... ok [INFO] [stdout] test mesh_index_remap::tests::test_max_index ... ok [INFO] [stdout] test mesh_index_remap::tests::test_indices_in_bounds ... ok [INFO] [stdout] test mesh_index_remap::tests::test_reverse_winding ... ok [INFO] [stdout] test mesh_index_remap::tests::test_used_index_count ... ok [INFO] [stdout] test mesh_index_remap::tests::test_unused_index_count ... ok [INFO] [stdout] test mesh_inflate::tests::avg_displacement_empty ... ok [INFO] [stdout] test mesh_inflate::tests::avg_displacement_nonzero ... ok [INFO] [stdout] test mesh_index_remap::tests::test_remap_result_to_json ... ok [INFO] [stdout] test mesh_inflate::tests::deflate_inward ... ok [INFO] [stdout] test mesh_inflate::tests::inflate_empty_mesh ... ok [INFO] [stdout] test mesh_inflate::tests::inflate_preserves_count ... ok [INFO] [stdout] test mesh_inflate::tests::inflate_outward ... ok [INFO] [stdout] test mesh_inflate::tests::inflate_zero_amount_unchanged ... ok [INFO] [stdout] test mesh_inflate::tests::normals_unit_length ... ok [INFO] [stdout] test mesh_inflate::tests::max_displacement_zero ... ok [INFO] [stdout] test mesh_inflate_tool::tests::test_average_normal ... ok [INFO] [stdout] test mesh_inflate_tool::tests::test_inflate_affected_count ... ok [INFO] [stdout] test mesh_inflate::tests::max_displacement_approx_amount ... ok [INFO] [stdout] test mesh_inflate_tool::tests::test_inflate_mesh_falloff ... ok [INFO] [stdout] test mesh_inflate_tool::tests::test_clamp_inflate_amount ... ok [INFO] [stdout] test mesh_inflate_tool::tests::test_inflate_uniform_z ... ok [INFO] [stdout] test mesh_inflate_tool::tests::test_compute_vertex_normals ... ok [INFO] [stdout] test mesh_inflate_tool::tests::test_deflate ... ok [INFO] [stdout] test mesh_inflate_tool::tests::test_inflate_with_weight_map ... ok [INFO] [stdout] test mesh_inset_face::tests::test_inset_amount_from_depth ... ok [INFO] [stdout] test mesh_inset_face::tests::test_inset_area_ratio_zero ... ok [INFO] [stdout] test mesh_inset_face::tests::test_inset_area_ratio_half ... ok [INFO] [stdout] test mesh_inset_face::tests::test_inset_polygon_inner ... ok [INFO] [stdout] test mesh_inset_face::tests::test_validate_inset_amount ... ok [INFO] [stdout] test mesh_inset_face::tests::test_inset_triangle_inner ... ok [INFO] [stdout] test mesh_inset_faces::tests::test_inset_centroid ... ok [INFO] [stdout] test mesh_inset_faces::tests::test_inset_creates_valid_face_false ... ok [INFO] [stdout] test mesh_inset_faces::tests::test_inset_creates_valid_face_true ... ok [INFO] [stdout] test mesh_inset_faces::tests::test_inset_face_moves_toward_center ... ok [INFO] [stdout] test mesh_inset_face::tests::test_inset_vertex_estimate ... ok [INFO] [stdout] test mesh_inset_face::tests::test_inset_faces_runs ... ok [INFO] [stdout] test mesh_inset_faces::tests::test_inset_face_thickness_zero ... ok [INFO] [stdout] test mesh_inset_faces::tests::test_inset_individual_faces ... ok [INFO] [stdout] test mesh_intersect_line::tests::test_ray_mesh_intersect_count ... ok [INFO] [stdout] test mesh_intersect_line::tests::test_ray_hits_triangle ... ok [INFO] [stdout] test mesh_intersect_line::tests::test_ray_point_at ... ok [INFO] [stdout] test mesh_intersect_line::tests::test_segment_no_intersect_too_short ... ok [INFO] [stdout] test mesh_intersect_line::tests::test_ray_misses_triangle ... ok [INFO] [stdout] test mesh_intersect_ray::tests::test_empty_mesh_no_hit ... ok [INFO] [stdout] test mesh_intersect_ray::tests::test_hit_point_on_triangle_plane ... ok [INFO] [stdout] test mesh_intersect_ray::tests::test_intersect_all_count ... ok [INFO] [stdout] test mesh_intersect_ray::tests::test_intersect_mesh_no_hit ... ok [INFO] [stdout] test mesh_intersect_ray::tests::test_intersect_mesh_finds_hit ... ok [INFO] [stdout] test mesh_intersect_ray::tests::test_intersect_all_sorted ... ok [INFO] [stdout] test mesh_intersect_ray::tests::test_ray_at ... ok [INFO] [stdout] test mesh_intersect_ray::tests::test_ray_triangle_hit ... ok [INFO] [stdout] test mesh_intersect_ray::tests::test_ray_triangle_miss ... ok [INFO] [stdout] test mesh_isolated_vertex_remove::tests::count_isolated_one ... ok [INFO] [stdout] test mesh_isolated_vertex_remove::tests::empty_mesh_no_isolated ... ok [INFO] [stdout] test mesh_isolated_vertex_remove::tests::no_isolated_when_all_used ... ok [INFO] [stdout] test mesh_isolated_vertex_remove::tests::indices_remapped_correctly ... ok [INFO] [stdout] test mesh_isolated_vertex_remove::tests::isolated_vertex_list_contains_orphan ... ok [INFO] [stdout] test mesh_isolated_vertex_remove::tests::remove_isolated_reduces_vertex_count ... ok [INFO] [stdout] test mesh_isolated_vertex_remove::tests::result_stats_consistent ... ok [INFO] [stdout] test mesh_isolated_vertex_remove::tests::used_vertex_set_correct ... ok [INFO] [stdout] test mesh_isosurface::tests::grid_get_set ... ok [INFO] [stdout] test mesh_isosurface::tests::grid_size_correct ... ok [INFO] [stdout] test mesh_isosurface::tests::isosurface_has_triangles ... ok [INFO] [stdout] test mesh_isosurface::tests::indices_multiple_of_three ... ok [INFO] [stdout] test mesh_isolated_vertex_remove::tests::build_compact_remap_max_for_isolated ... ok [INFO] [stdout] test mesh_isosurface::tests::out_of_bounds_get_returns_zero ... ok [INFO] [stdout] test mesh_isosurface::tests::sphere_sdf_negative_outside ... ok [INFO] [stdout] test mesh_isosurface::tests::sphere_sdf_positive_inside ... ok [INFO] [stdout] test mesh_isosurface::tests::triangle_count_helper ... ok [INFO] [stdout] test mesh_isosurface::tests::vertex_count_helper ... ok [INFO] [stdout] test mesh_isosurface::tests::world_pos_origin ... ok [INFO] [stdout] test mesh_jiggle::tests::test_jiggle_impulse ... ok [INFO] [stdout] test mesh_jiggle::tests::test_jiggle_converges ... ok [INFO] [stdout] test mesh_jiggle::tests::test_jiggle_offset_settled ... ok [INFO] [stdout] test mesh_jiggle::tests::test_jiggle_step_moves_toward_target ... ok [INFO] [stdout] test mesh_jiggle::tests::test_jiggle_not_settled_after_impulse ... ok [INFO] [stdout] test mesh_jiggle::tests::test_new_jiggle_vertex ... ok [INFO] [stdout] test mesh_jiggle::tests::test_jiggle_set_target ... ok [INFO] [stdout] test mesh_k_ring::tests::test_build_adjacency_empty ... ok [INFO] [stdout] test mesh_k_ring::tests::test_avg_ring_size_all ... ok [INFO] [stdout] test mesh_k_ring::tests::test_build_adjacency_triangle ... ok [INFO] [stdout] test mesh_k_ring::tests::test_k_ring_to_json ... ok [INFO] [stdout] test mesh_k_ring::tests::test_k_ring_invalid_center ... ok [INFO] [stdout] test mesh_intersect_line::tests::test_segment_intersects ... ok [INFO] [stdout] test mesh_k_ring::tests::test_k_ring_zero ... ok [INFO] [stdout] test mesh_k_ring::tests::test_empty_adj_avg_ring ... ok [INFO] [stdout] test mesh_k_ring::tests::test_two_ring_larger_than_one_ring ... ok [INFO] [stdout] test mesh_k_ring::tests::test_ring_contains ... ok [INFO] [stdout] test mesh_k_ring::tests::test_one_ring ... ok [INFO] [stdout] test mesh_klein_bottle::tests::indices_multiple_of_three ... ok [INFO] [stdout] test mesh_klein_bottle::tests::klein_point_finite ... ok [INFO] [stdout] test mesh_klein_bottle::tests::index_max_within_bounds ... ok [INFO] [stdout] test mesh_klein_bottle::tests::min_segs_enforced ... ok [INFO] [stdout] test mesh_klein_bottle::tests::triangle_count_correct ... ok [INFO] [stdout] test mesh_klein_bottle::tests::more_segs_more_vertices ... ok [INFO] [stdout] test mesh_klein_bottle::tests::u0_v0_point_defined ... ok [INFO] [stdout] test mesh_klein_bottle::tests::vertex_count_helper ... ok [INFO] [stdout] test mesh_klein_bottle::tests::vertex_count_correct ... ok [INFO] [stdout] test mesh_knife_cut::tests::test_knife_add_point ... ok [INFO] [stdout] test mesh_knife_cut::tests::test_knife_is_closed_false ... ok [INFO] [stdout] test mesh_knife_cut::tests::test_knife_cut_crosses_edge ... ok [INFO] [stdout] test mesh_knife_cut::tests::test_knife_cut_no_line ... ok [INFO] [stdout] test mesh_klein_bottle::tests::all_positions_finite ... ok [INFO] [stdout] test mesh_knife_cut::tests::test_knife_cut_length ... ok [INFO] [stdout] test mesh_label::tests::test_all_returns_16_variants ... ok [INFO] [stdout] test mesh_label::tests::test_body_seed_empty_mesh ... ok [INFO] [stdout] test mesh_label::tests::test_body_seed_vertices_returns_15 ... ok [INFO] [stdout] test mesh_label::tests::test_boundary_edges_deduplicated ... ok [INFO] [stdout] test mesh_label::tests::test_boundary_edges_same_label_no_boundary ... ok [INFO] [stdout] test mesh_label::tests::test_body_seed_vertices_valid_indices ... ok [INFO] [stdout] test mesh_label::tests::test_boundary_edges_two_regions ... ok [INFO] [stdout] test mesh_label::tests::test_flood_fill_out_of_range_seed ... ok [INFO] [stdout] test mesh_label::tests::test_count_region ... ok [INFO] [stdout] test mesh_label::tests::test_from_u8_out_of_range_is_unknown ... ok [INFO] [stdout] test mesh_label::tests::test_flood_fill_labels_entire_flat_mesh ... ok [INFO] [stdout] test mesh_label::tests::test_from_u8_roundtrip ... ok [INFO] [stdout] test mesh_label::tests::test_label_by_height_basic ... ok [INFO] [stdout] test mesh_label::tests::test_is_left_right ... ok [INFO] [stdout] test mesh_label::tests::test_label_by_height_bottom_is_foot ... ok [INFO] [stdout] test mesh_label::tests::test_labeled_fraction ... ok [INFO] [stdout] test mesh_label::tests::test_label_by_height_flat_mesh_all_torso ... ok [INFO] [stdout] test mesh_label::tests::test_mesh_labels_new_all_unknown ... ok [INFO] [stdout] test mesh_label::tests::test_label_by_height_top_is_head ... ok [INFO] [stdout] test mesh_label::tests::test_mirror_left_right ... ok [INFO] [stdout] test mesh_label::tests::test_propagate_labels_fills_unknown ... ok [INFO] [stdout] test mesh_label::tests::test_name_non_empty ... ok [INFO] [stdout] test mesh_label::tests::test_region_bbox_and_centroid ... ok [INFO] [stdout] test mesh_label::tests::test_region_bbox_none_when_empty ... ok [INFO] [stdout] test mesh_label::tests::test_smooth_labels ... ok [INFO] [stdout] test mesh_label::tests::test_set_get_label ... ok [INFO] [stdout] test mesh_label::tests::test_to_bytes_from_bytes_roundtrip ... ok [INFO] [stdout] test mesh_label::tests::test_to_vertex_colors_length ... ok [INFO] [stdout] test mesh_lattice_deform::tests::test_apply_lattice_deform_identity ... ok [INFO] [stdout] test mesh_label::tests::test_vertices_in ... ok [INFO] [stdout] test mesh_lattice_deform::tests::test_apply_lattice_deform_preserves_count ... ok [INFO] [stdout] test mesh_lattice_deform::tests::test_lattice_cp_count ... ok [INFO] [stdout] test mesh_lattice_deform::tests::test_lattice_new_dimensions ... ok [INFO] [stdout] test mesh_lattice_deform::tests::test_lattice_trilinear_far_corner ... ok [INFO] [stdout] test mesh_lattice_deform::tests::test_lattice_trilinear_origin ... ok [INFO] [stdout] test mesh_lattice_deform::tests::test_world_to_lattice_uvw_clamp ... ok [INFO] [stdout] test mesh_lattice_deform::tests::test_validate_lattice_valid ... ok [INFO] [stdout] test mesh_lattice_deform::tests::test_world_to_lattice_uvw_corners ... ok [INFO] [stdout] test mesh_label::tests::test_color_rgb_unique ... ok [INFO] [stdout] test mesh_lattice_frame::tests::beam_count_stored ... ok [INFO] [stdout] test mesh_lattice_frame::tests::cubic_node_count ... ok [INFO] [stdout] test mesh_lattice_frame::tests::cubic_beam_count_2x2x2 ... ok [INFO] [stdout] test mesh_lattice_frame::tests::empty_beams ... ok [INFO] [stdout] test mesh_lattice_frame::tests::lattice_mesh_nonempty ... ok [INFO] [stdout] test mesh_lattice_frame::tests::lattice_triangle_count_helper ... ok [INFO] [stdout] test mesh_lattice_frame::tests::out_of_bounds_beam_skipped ... ok [INFO] [stdout] test mesh_lattice_frame::tests::nodes_positioned_correctly ... ok [INFO] [stdout] test mesh_lattice_frame::tests::lattice_indices_multiple_of_three ... ok [INFO] [stdout] test mesh_lattice_frame::tests::vertex_count_per_beam ... ok [INFO] [stdout] test mesh_light_map_mesh::tests::test_default_config_atlas_size ... ok [INFO] [stdout] test mesh_light_map_mesh::tests::test_generate_planar_uvs_count ... ok [INFO] [stdout] test mesh_light_map_mesh::tests::test_has_uv1_overlap_true ... ok [INFO] [stdout] test mesh_light_map_mesh::tests::test_generate_planar_uvs_range ... ok [INFO] [stdout] test mesh_light_map_mesh::tests::test_has_uv1_overlap_false ... ok [INFO] [stdout] test mesh_light_map_mesh::tests::test_new_lightmap_mesh_empty ... ok [INFO] [stdout] test mesh_light_map_mesh::tests::test_scale_clamps ... ok [INFO] [stdout] test mesh_light_map_mesh::tests::test_scale_lightmap_uvs ... ok [INFO] [stdout] test mesh_light_map_mesh::tests::test_validate_uvs_invalid ... ok [INFO] [stdout] test mesh_limited_dissolve::tests::test_coplanar_dissolve ... ok [INFO] [stdout] test mesh_limited_dissolve::tests::test_default_config_angle ... ok [INFO] [stdout] test mesh_limited_dissolve::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_limited_dissolve::tests::test_perpendicular_no_dissolve ... ok [INFO] [stdout] test mesh_limited_dissolve::tests::test_config_from_degrees ... ok [INFO] [stdout] test mesh_limited_dissolve::tests::test_total_dissolved_coplanar ... ok [INFO] [stdout] test mesh_limited_dissolve::tests::test_within_dissolve_perpendicular ... ok [INFO] [stdout] test mesh_limited_dissolve::tests::test_multi_face_groups ... ok [INFO] [stdout] test mesh_limited_dissolve::tests::test_within_dissolve_same ... ok [INFO] [stdout] test mesh_lod_chain::tests::test_active_level_updated ... ok [INFO] [stdout] test mesh_lod_chain::tests::test_add_level ... ok [INFO] [stdout] test mesh_lod_chain::tests::test_build_default_levels_count ... ok [INFO] [stdout] test mesh_light_map_mesh::tests::test_validate_uvs_valid ... ok [INFO] [stdout] test mesh_lod_chain::tests::test_level_sort_on_add ... ok [INFO] [stdout] test mesh_lod_chain::tests::test_clear ... ok [INFO] [stdout] test mesh_lod_chain::tests::test_new_chain_is_empty ... ok [INFO] [stdout] test mesh_lod_chain::tests::test_select_level_high_screen_size ... ok [INFO] [stdout] test mesh_lod_chain::tests::test_select_level_zero_screen_size ... ok [INFO] [stdout] test mesh_lod_chain::tests::test_total_triangle_budget ... ok [INFO] [stdout] test mesh_lod_chain::tests::test_validate_ordered ... ok [INFO] [stdout] test mesh_loft::tests::test_loft_single_profile ... ok [INFO] [stdout] test mesh_loft::tests::test_loft_empty ... ok [INFO] [stdout] test mesh_loft::tests::test_loft_tri_indices_in_range ... ok [INFO] [stdout] test mesh_loft::tests::test_loft_triangle_count_formula ... ok [INFO] [stdout] test mesh_loft::tests::test_loft_three_profiles ... ok [INFO] [stdout] test mesh_loft::tests::test_profile_centroid_single ... ok [INFO] [stdout] test mesh_loft::tests::test_loft_two_profiles ... ok [INFO] [stdout] test mesh_loft::tests::test_profile_centroid_empty ... ok [INFO] [stdout] test mesh_lofted_surface::tests::test_circle_profile_at_count ... ok [INFO] [stdout] test mesh_lofted_surface::tests::test_interpolate_profiles ... ok [INFO] [stdout] test mesh_lofted_surface::tests::test_loft_bounds_y ... ok [INFO] [stdout] test mesh_lofted_surface::tests::test_loft_centroid_height ... ok [INFO] [stdout] test mesh_lofted_surface::tests::test_loft_empty_profiles ... ok [INFO] [stdout] test mesh_loft::tests::test_profile_centroid_square ... ok [INFO] [stdout] test mesh_lofted_surface::tests::test_loft_face_count ... ok [INFO] [stdout] test mesh_lofted_surface::tests::test_loft_single_profile_no_faces ... ok [INFO] [stdout] test mesh_lofted_surface::tests::test_loft_vertex_count ... ok [INFO] [stdout] test mesh_lofted_surface::tests::test_loft_to_json ... ok [INFO] [stdout] test mesh_loop_detection::tests::classify_outer_positive_area ... ok [INFO] [stdout] test mesh_loop_detection::tests::classify_short_loop_unknown ... ok [INFO] [stdout] test mesh_lofted_surface::tests::test_loft_vertex_count_fn ... ok [INFO] [stdout] test mesh_loop_detection::tests::detect_finds_boundary ... ok [INFO] [stdout] test mesh_loop_detection::tests::loop_count_consistent ... ok [INFO] [stdout] test mesh_loop_detection::tests::perimeter_finite ... ok [INFO] [stdout] test mesh_loop_detection::tests::empty_mesh_no_loops ... ok [INFO] [stdout] test mesh_loop_slide::tests::loop_centroid_empty ... ok [INFO] [stdout] test mesh_loop_slide::tests::loop_edge_count_closed ... ok [INFO] [stdout] test mesh_loop_slide::tests::loop_centroid_single ... ok [INFO] [stdout] test mesh_loop_slide::tests::slide_loop_moves_vertices ... ok [INFO] [stdout] test mesh_loop_slide::tests::slide_loop_out_of_bounds_skipped ... ok [INFO] [stdout] test mesh_loop_slide::tests::slide_param_valid_bounds ... ok [INFO] [stdout] test mesh_loop_detection::tests::closed_count_lte_total ... ok [INFO] [stdout] test mesh_loop_slide::tests::loop_edge_count_open ... ok [INFO] [stdout] test mesh_loop_slide::tests::slide_vertex_halfway ... ok [INFO] [stdout] test mesh_loop_detection::tests::total_perimeter_positive ... ok [INFO] [stdout] test mesh_loop_to_region::tests::face_touches_loop_false_empty ... ok [INFO] [stdout] test mesh_loop_to_region::tests::face_adjacency_has_entries ... ok [INFO] [stdout] test mesh_loop_to_region::tests::face_touches_loop_true ... ok [INFO] [stdout] test mesh_loop_to_region::tests::loop_to_region_empty_loop_selects_all ... ok [INFO] [stdout] test mesh_loop_to_region::tests::flood_fill_reaches_adjacent ... ok [INFO] [stdout] test mesh_loop_to_region::tests::loop_to_region_returns_faces ... ok [INFO] [stdout] test mesh_loop_to_region::tests::vertices_from_faces_non_empty ... ok [INFO] [stdout] test mesh_lscm::tests::compute_local_frame_orthogonal ... ok [INFO] [stdout] test mesh_lscm::tests::compute_local_frame_unit_length ... ok [INFO] [stdout] test mesh_loop_to_region::tests::result_region_count_matches_selected ... ok [INFO] [stdout] test mesh_lscm::tests::conformal_energy_non_negative ... ok [INFO] [stdout] test mesh_lscm::tests::lscm_pinned_vertices_match_config ... ok [INFO] [stdout] test mesh_lscm::tests::lscm_produces_n_vertex_uvs ... ok [INFO] [stdout] test mesh_lscm::tests::normalize_uvs_in_range ... ok [INFO] [stdout] test mesh_lscm::tests::normalize_uvs_min_max ... ok [INFO] [stdout] test mesh_lscm::tests::project_to_uv_vertex0_is_origin ... ok [INFO] [stdout] test mesh_lscm::tests::project_to_uv_vertex1 ... ok [INFO] [stdout] test mesh_hollow::tests::area_weighted_normals_length ... ok [INFO] [stdout] test mesh_lscm::tests::lscm_uvs_are_finite ... ok [INFO] [stdout] test mesh_lscm::tests::triangle_conformal_energy_zero_degenerate ... ok [INFO] [stdout] test mesh_lscm::tests::uv_area_degenerate_zero ... ok [INFO] [stdout] test mesh_lscm::tests::uv_area_negative_for_flipped ... ok [INFO] [stdout] test mesh_lscm::tests::uv_area_triangle ... ok [INFO] [stdout] test mesh_magnet_point::tests::apply_magnets_moves_vertex_toward_magnet ... ok [INFO] [stdout] test mesh_lscm::tests::uv_stretch_metric_positive ... ok [INFO] [stdout] test mesh_magnet_point::tests::average_radius_empty_is_zero ... ok [INFO] [stdout] test mesh_magnet_point::tests::add_magnet_increments_count ... ok [INFO] [stdout] test mesh_magnet_point::tests::empty_magnet_set_count_is_zero ... ok [INFO] [stdout] test mesh_magnet_point::tests::json_empty_is_empty_array ... ok [INFO] [stdout] test mesh_magnet_point::tests::average_radius_correct ... ok [INFO] [stdout] test mesh_magnet_point::tests::magnet_weight_at_center_equals_strength ... ok [INFO] [stdout] test mesh_magnet_point::tests::json_contains_label_key ... ok [INFO] [stdout] test mesh_hollow::tests::boundary_loops_quad ... ok [INFO] [stdout] test mesh_hollow::tests::find_boundary_edges_quad ... ok [INFO] [stdout] test mesh_hollow::tests::hollow_mesh_has_cap_triangles ... ok [INFO] [stdout] test mesh_hollow::tests::offset_mesh_outward ... ok [INFO] [stdout] test mesh_hollow::tests::hollow_mesh_vertex_count ... ok [INFO] [stdout] test mesh_hollow::tests::hollow_mesh_inner_offset ... ok [INFO] [stdout] test mesh_hollow::tests::stitch_boundary_loops_count ... ok [INFO] [stdout] test mesh_hollow::tests::hollow_smooth_offset_flag ... ok [INFO] [stdout] test mesh_magnet_point::tests::magnet_weight_outside_radius_is_zero ... ok [INFO] [stdout] test mesh_hollow::tests::shell_thickness_matches_param ... ok [INFO] [stdout] test mesh_hollow::tests::hollow_mesh_closed_tetra_no_caps ... ok [INFO] [stdout] test mesh_label::tests::test_write_label_bytes_to_file ... ok [INFO] [stdout] test mesh_magnet_point::tests::strength_is_clamped_to_one ... ok [INFO] [stdout] test mesh_manifold_check::tests::test_boundary_edge_count_fn ... ok [INFO] [stdout] test mesh_manifold_check::tests::test_closed_tet_is_manifold ... ok [INFO] [stdout] test mesh_manifold_check::tests::test_to_json ... ok [INFO] [stdout] test mesh_manifold_check::tests::test_open_mesh_has_boundary ... ok [INFO] [stdout] test mesh_manifold_check::tests::test_count_boundary_loops_open ... ok [INFO] [stdout] test mesh_manifold_check::tests::test_isolated_vertex ... ok [INFO] [stdout] test mesh_manifold_check::tests::test_closed_tet_no_boundary ... ok [INFO] [stdout] test mesh_manifold_check::tests::test_is_closed_manifold_false_for_open ... ok [INFO] [stdout] test mesh_manifold_check::tests::test_non_manifold_edge_count ... ok [INFO] [stdout] test mesh_manifold_check::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_mask_modifier::tests::test_mask_apply_counts ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_compute_mean_curvature_flat_near_zero ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_compute_mean_curvature_with_smoothing ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_compute_mean_curvature_length ... ok [INFO] [stdout] test mesh_mask_modifier::tests::test_mask_keep_vertex_below_threshold ... ok [INFO] [stdout] test mesh_mask_modifier::tests::test_mask_count_visible ... ok [INFO] [stdout] test mesh_mask_modifier::tests::test_mask_invert ... ok [INFO] [stdout] test mesh_mask_modifier::tests::test_mask_keep_vertex_above_threshold ... ok [INFO] [stdout] test mesh_mask_modifier::tests::test_new_mask_params ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_compute_gaussian_curvature_empty ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_compute_gaussian_curvature_flat_boundary ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_compute_gaussian_curvature_length ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_curvature_min_max ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_principal_curvatures_flat ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_principal_curvatures_sphere ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_vertex_area_mixed_positive ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_curvature_color_map_zero ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_curvature_mean_value ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_default_curvature_config ... ok [INFO] [stdout] test mesh_mean_curvature_flow::tests::cotangent_right_angle ... ok [INFO] [stdout] test mesh_mean_curvature_flow::tests::mcf_config_default_reasonable ... ok [INFO] [stdout] test mesh_mean_curvature_flow::tests::mcf_step_positions_finite ... ok [INFO] [stdout] test mesh_mean_curvature_flow::tests::mcf_step_preserves_vertex_count ... ok [INFO] [stdout] test mesh_mean_value::tests::test_center_weights_count ... ok [INFO] [stdout] test mesh_mean_value::tests::test_center_weights_sum_to_one ... ok [INFO] [stdout] test mesh_mean_curvature_flow::tests::mean_curvature_flow_avg_displacement_nonneg ... ok [INFO] [stdout] test mesh_mean_curvature_flow::tests::mean_curvature_flow_result_count ... ok [INFO] [stdout] test mesh_mean_value::tests::test_coincident_vertex ... ok [INFO] [stdout] test mesh_mean_value::tests::test_max_weight_positive ... ok [INFO] [stdout] test mesh_mean_value::tests::test_dominant_vertex_some ... ok [INFO] [stdout] test mesh_mean_value::tests::test_empty_polygon ... ok [INFO] [stdout] test mesh_mean_value::tests::test_interpolate_constant ... ok [INFO] [stdout] test mesh_mean_value::tests::test_regular_polygon_count ... ok [INFO] [stdout] test mesh_mean_curvature_flow::tests::mcf_vertex_count_matches ... ok [INFO] [stdout] test mesh_mean_curvature_flow::tests::mcf_zero_iterations ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_cotangent_weight_positive_for_acute ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_mean_curvature_vector_single_tri ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_cotangent_weight_degenerate ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_cotangent_weight_right_angle ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_curvature_color_map_negative ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_compute_mean_curvature_empty ... ok [INFO] [stdout] test mesh_mean_value::tests::test_to_json ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_approximate_medial_axis_empty ... ok [INFO] [stdout] test mesh_mean_value::tests::test_weights_all_finite ... ok [INFO] [stdout] test mesh_mean_curvature::tests::test_curvature_color_map_positive ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_default_config ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_medial_axis_bounds_empty ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_medial_axis_connectivity ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_nearest_surface_distance_on_vertex ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_thickest_point_empty ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_prune_short_branches ... ok [INFO] [stdout] test mesh_merge::tests::test_filter_faces ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_thickest_point ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_medial_to_spheres ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_medial_axis_bounds ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_medial_edge_count ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_medial_point_count ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_approximate_medial_axis_produces_points ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_medial_axis_length_empty ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_medial_axis_to_json ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_medial_axis_length_nonneg ... ok [INFO] [stdout] test mesh_merge::tests::test_merge_many_empty ... ok [INFO] [stdout] test mesh_merge::tests::test_merge_many_single ... ok [INFO] [stdout] test mesh_medial_axis::tests::test_nearest_surface_distance ... ok [INFO] [stdout] test mesh_merge::tests::test_append_mesh ... ok [INFO] [stdout] test mesh_merge::tests::test_extract_face_range ... ok [INFO] [stdout] test mesh_merge::tests::test_merge_two_index_offset ... ok [INFO] [stdout] test mesh_merge::tests::test_scale_mesh ... ok [INFO] [stdout] test mesh_merge::tests::test_rotate_mesh_zero ... ok [INFO] [stdout] test mesh_merge::tests::test_split_by_connectivity_single ... ok [INFO] [stdout] test mesh_merge::tests::unified_merge_face_count ... ok [INFO] [stdout] test mesh_merge::tests::test_split_by_connectivity_two ... ok [INFO] [stdout] test mesh_merge::tests::unified_merge_bounding_box ... ok [INFO] [stdout] test mesh_merge::tests::test_merge_two_basic ... ok [INFO] [stdout] test mesh_merge::tests::unified_merge_index_offset ... ok [INFO] [stdout] test mesh_merge::tests::unified_merge_input_totals ... ok [INFO] [stdout] test mesh_merge_by_distance::tests::test_merge_weld_threshold_positive ... ok [INFO] [stdout] test mesh_merge_by_distance::tests::test_merge_no_merge_far ... ok [INFO] [stdout] test mesh_merge_by_distance::tests::test_merge_apply_to_faces ... ok [INFO] [stdout] test mesh_merge_by_distance::tests::test_merge_by_distance_merges_close ... ok [INFO] [stdout] test mesh_meta_ball::tests::average_radius_correct ... ok [INFO] [stdout] test mesh_merge::tests::unified_merge_result_to_json ... ok [INFO] [stdout] test mesh_merge::tests::unified_merge_validate ... ok [INFO] [stdout] test mesh_merge::tests::test_merge_result_offsets ... ok [INFO] [stdout] test mesh_merge_by_distance::tests::test_merge_count_unique ... ok [INFO] [stdout] test mesh_merge_by_distance::tests::test_merge_remove_degenerate ... ok [INFO] [stdout] test mesh_meta_ball::tests::field_potential_outside_radius_is_zero ... ok [INFO] [stdout] test mesh_meta_ball::tests::add_ball_increments_count ... ok [INFO] [stdout] test mesh_meta_ball::tests::is_inside_surface_at_center ... ok [INFO] [stdout] test mesh_merge::tests::test_translate_mesh ... ok [INFO] [stdout] test mesh_minimal_surface::tests::enneper_vertex_count ... ok [INFO] [stdout] test mesh_meta_ball::tests::average_radius_empty_is_zero ... ok [INFO] [stdout] test mesh_merge::tests::unified_merge_two_inputs ... ok [INFO] [stdout] test mesh_merge::tests::test_merge_with_params_default ... ok [INFO] [stdout] test mesh_meta_ball::tests::is_inside_surface_far_point_false ... ok [INFO] [stdout] test mesh_meta_ball::tests::new_field_has_no_balls ... ok [INFO] [stdout] test mesh_minimal_surface::tests::enneper_all_finite ... ok [INFO] [stdout] test mesh_minimal_surface::tests::enneper_at_origin ... ok [INFO] [stdout] test mesh_minimal_surface::tests::enneper_indices_multiple_of_three ... ok [INFO] [stdout] test mesh_meta_ball::tests::field_potential_at_center_is_max ... ok [INFO] [stdout] test mesh_minimal_surface::tests::scherk_all_finite ... ok [INFO] [stdout] test mesh_minimal_surface::tests::index_max_within_bounds ... ok [INFO] [stdout] test mesh_minimal_surface::tests::scherk_vertex_count ... ok [INFO] [stdout] test mesh_minimal_surface::tests::kind_stored ... ok [INFO] [stdout] test mesh_minimal_surface::tests::vertex_count_helper ... ok [INFO] [stdout] test mesh_mirror::tests::test_extract_positive_half ... ok [INFO] [stdout] test mesh_mirror::tests::test_find_symmetry_pairs_symmetric_quad ... ok [INFO] [stdout] test mesh_mirror::tests::test_extract_half_empty_mesh ... ok [INFO] [stdout] test mesh_mirror::tests::test_extract_negative_half ... ok [INFO] [stdout] test mesh_mirror::tests::test_mirror_axis_coord ... ok [INFO] [stdout] test mesh_mirror::tests::test_flip_normals_axis_y ... ok [INFO] [stdout] test mesh_minimal_surface::tests::triangle_count_helper ... ok [INFO] [stdout] test mesh_mirror::tests::test_mirror_axis_flip_x ... ok [INFO] [stdout] test mesh_mirror::tests::test_mirror_copy_x_flips_positions ... ok [INFO] [stdout] test mesh_mirror::tests::test_symmetrize_preserves_vertex_count ... ok [INFO] [stdout] test mesh_mirror::tests::test_symmetrize_reduces_error ... ok [INFO] [stdout] test mesh_mirror::tests::test_symmetry_error_asymmetric ... ok [INFO] [stdout] test mesh_mirror::tests::test_mirror_mesh_doubles_faces ... ok [INFO] [stdout] test mesh_mirror::tests::test_mirror_copy_preserves_face_count ... ok [INFO] [stdout] test mesh_mirror::tests::test_symmetry_error_perfect ... ok [INFO] [stdout] test mesh_mirror::tests::test_reverse_winding_basic ... ok [INFO] [stdout] test mesh_mirror::tests::test_mirror_mesh_result_fields ... ok [INFO] [stdout] test mesh_mirror::tests::test_mirror_axis_flip_y ... ok [INFO] [stdout] test mesh_mirror::tests::test_mirror_mesh_welds_on_axis ... ok [INFO] [stdout] test mesh_mirror::tests::test_flip_positions_x ... ok [INFO] [stdout] test mesh_mirror_cut::tests::test_axis_extent ... ok [INFO] [stdout] test mesh_mirror::tests::test_mirror_axis_flip_z ... ok [INFO] [stdout] test mesh_mirror_cut::tests::test_cut_positive_side ... ok [INFO] [stdout] test mesh_mirror::tests::test_mirror_config_default ... ok [INFO] [stdout] test mesh_loop_slide::tests::slide_vertex_t0_unchanged ... ok [INFO] [stdout] test mesh_mirror_cut::tests::test_count_positive ... ok [INFO] [stdout] test mesh_mirror_cut::tests::test_mirror_doubles_triangles ... ok [INFO] [stdout] test mesh_mirror_cut::tests::test_cut_negative_side ... ok [INFO] [stdout] test mesh_mirror_modifier::tests::mirror_x_mirrored_vert_x_negated ... ok [INFO] [stdout] test mesh_mirror_modifier::tests::mirror_winding_flipped ... ok [INFO] [stdout] test mesh_mirror_modifier::tests::mirror_y_doubles_vert_count ... ok [INFO] [stdout] test mesh_mirror_stitch::tests::test_all_seam_vertices ... ok [INFO] [stdout] test mesh_mirror_modifier::tests::mirror_z_doubles_vert_count ... ok [INFO] [stdout] test mesh_mirror_stitch::tests::test_mirror_y_axis ... ok [INFO] [stdout] test mesh_mirror_stitch::tests::test_mirror_z_axis ... ok [INFO] [stdout] test mesh_mirror_stitch::tests::test_mirrored_face_count_doubled ... ok [INFO] [stdout] test mesh_mirror_stitch::tests::test_original_faces_preserved ... ok [INFO] [stdout] test mesh_mirror_stitch::tests::test_seam_vertices_detected ... ok [INFO] [stdout] test mesh_mirror_stitch::tests::test_validate_stitch ... ok [INFO] [stdout] test mesh_mirror_stitch::tests::test_to_json ... ok [INFO] [stdout] test mesh_mirror_cut::tests::test_cut_discards_negative ... ok [INFO] [stdout] test mesh_mirror_stitch::tests::test_bounds_symmetric_x ... ok [INFO] [stdout] test mesh_mirror_cut::tests::test_mirror_axis_index ... ok [INFO] [stdout] test mesh_mirror_cut::tests::test_mirror_axis_name ... ok [INFO] [stdout] test mesh_mirror_stitch::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_loop_to_region::tests::flood_fill_empty_mesh ... ok [INFO] [stdout] test mesh_mirror_modifier::tests::mirror_vert_y_negates_y ... ok [INFO] [stdout] test mesh_meta_ball::tests::json_contains_ball_count ... ok [INFO] [stdout] test mesh_mirror_cut::tests::test_to_json ... ok [INFO] [stdout] test mesh_mirror_modifier::tests::mirror_vert_z_negates_z ... ok [INFO] [stdout] test mesh_mirror_modifier::tests::mirror_x_doubles_tri_count ... ok [INFO] [stdout] test mesh_mirror_cut::tests::test_cut_keeps_positive ... ok [INFO] [stdout] test mesh_mirror_modifier::tests::mirror_vert_x_negates_x ... ok [INFO] [stdout] test mesh_mirror_modifier::tests::mirror_x_doubles_vert_count ... ok [INFO] [stdout] test mesh_mls_deform::tests::test_avg_displacement_zero_no_handles ... ok [INFO] [stdout] test mesh_mls_deform::tests::test_default_config ... ok [INFO] [stdout] test mesh_mls_deform::tests::test_deform_moves_nearby_verts ... ok [INFO] [stdout] test mesh_mls_deform::tests::test_deformed_positions_finite ... ok [INFO] [stdout] test mesh_mls_deform::tests::test_empty_positions ... ok [INFO] [stdout] test mesh_mls_deform::tests::test_handles_valid_false ... ok [INFO] [stdout] test mesh_mls_deform::tests::test_deform_vertex_count ... ok [INFO] [stdout] test mesh_mls_deform::tests::test_handles_valid_true ... ok [INFO] [stdout] test mesh_mls_deform::tests::test_result_to_json ... ok [INFO] [stdout] test mesh_mobius::tests::indices_multiple_of_three ... ok [INFO] [stdout] test mesh_mobius::tests::mobius_point_u0_v0_on_circle ... ok [INFO] [stdout] test mesh_mobius::tests::more_segs_more_tris ... ok [INFO] [stdout] test mesh_mobius::tests::normals_count_matches_vertices ... ok [INFO] [stdout] test mesh_mobius::tests::normals_unit_length ... ok [INFO] [stdout] test mesh_mls_deform::tests::test_no_handles_no_change ... ok [INFO] [stdout] test mesh_mobius::tests::triangle_count_helper ... ok [INFO] [stdout] test mesh_mobius::tests::u_full_circle_connects ... ok [INFO] [stdout] test mesh_mobius::tests::positions_finite ... ok [INFO] [stdout] test mesh_mobius::tests::vertex_count_correct ... ok [INFO] [stdout] test mesh_moment_inertia::tests::center_of_mass_inside_cube ... ok [INFO] [stdout] test mesh_moment_inertia::tests::density_scales_mass ... ok [INFO] [stdout] test mesh_mobius::tests::vertex_count_helper ... ok [INFO] [stdout] test mesh_moment_inertia::tests::empty_mesh_mass_zero ... ok [INFO] [stdout] test mesh_moment_inertia::tests::frobenius_norm_positive ... ok [INFO] [stdout] test mesh_moment_inertia::tests::mass_positive ... ok [INFO] [stdout] test mesh_moment_inertia::tests::principal_moments_3 ... ok [INFO] [stdout] test mesh_moment_inertia::tests::tensor_frobenius_scales ... ok [INFO] [stdout] test mesh_moment_inertia::tests::mat_size_nine ... ok [INFO] [stdout] test mesh_moment_inertia::tests::tensor_is_symmetric_check ... ok [INFO] [stdout] test mesh_moment_inertia::tests::tensor_trace_nonneg ... ok [INFO] [stdout] test mesh_moment_of_inertia::tests::test_add_inertia_tensors ... ok [INFO] [stdout] test mesh_moment_of_inertia::tests::test_inertia_tensor_density_scaling ... ok [INFO] [stdout] test mesh_moment_of_inertia::tests::test_inertia_tensor_diag_symmetry ... ok [INFO] [stdout] test mesh_moment_of_inertia::tests::test_inertia_tensor_empty_mesh ... ok [INFO] [stdout] test mesh_moment_of_inertia::tests::test_inertia_tensor_single_tet_nonzero ... ok [INFO] [stdout] test mesh_moment_of_inertia::tests::test_inertia_tensor_zero ... ok [INFO] [stdout] test mesh_moment_of_inertia::tests::test_parallel_axis_shift_increases_trace ... ok [INFO] [stdout] test mesh_moment_of_inertia::tests::test_parallel_axis_zero_shift ... ok [INFO] [stdout] test mesh_moment_of_inertia::tests::test_scale_inertia_tensor ... ok [INFO] [stdout] test mesh_morph_animation::tests::test_add_keyframe_sorts ... ok [INFO] [stdout] test mesh_morph_animation::tests::test_add_target ... ok [INFO] [stdout] test mesh_morph_animation::tests::test_apply_morph_weights_no_targets ... ok [INFO] [stdout] test mesh_morph_animation::tests::test_apply_morph_weights_with_target ... ok [INFO] [stdout] test mesh_morph_animation::tests::test_duration_empty ... ok [INFO] [stdout] test mesh_morph_animation::tests::test_evaluate_weights_empty_returns_empty ... ok [INFO] [stdout] test mesh_morph_animation::tests::test_find_target_by_name_found ... ok [INFO] [stdout] test mesh_morph_animation::tests::test_find_target_by_name_not_found ... ok [INFO] [stdout] test mesh_morph_animation::tests::test_new_sequence_empty ... ok [INFO] [stdout] test mesh_morph_animation::tests::test_validate_morph_keyframes_valid ... ok [INFO] [stdout] test mesh_morse_theory::tests::test_critical_point_count_fn ... ok [INFO] [stdout] test mesh_morse_theory::tests::test_empty_field ... ok [INFO] [stdout] test mesh_morse_theory::tests::test_empty_global_min ... ok [INFO] [stdout] test mesh_morse_theory::tests::test_field_range ... ok [INFO] [stdout] test mesh_morse_theory::tests::test_field_range_empty ... ok [INFO] [stdout] test mesh_morse_theory::tests::test_global_maximum ... ok [INFO] [stdout] test mesh_morse_theory::tests::test_global_minimum ... ok [INFO] [stdout] test mesh_morse_theory::tests::test_monotone_field_has_extrema ... ok [INFO] [stdout] test mesh_morse_theory::tests::test_morse_euler_characteristic ... ok [INFO] [stdout] test mesh_morse_theory::tests::test_to_json ... ok [INFO] [stdout] test mesh_multi_res::tests::test_build_multi_res_levels ... ok [INFO] [stdout] test mesh_multi_res::tests::test_coarsest_level_fewer_faces ... ok [INFO] [stdout] test mesh_multi_res::tests::test_default_config ... ok [INFO] [stdout] test mesh_multi_res::tests::test_empty_mesh_one_level ... ok [INFO] [stdout] test mesh_multi_res::tests::test_finest_level_face_count ... ok [INFO] [stdout] test mesh_multi_res::tests::test_get_level_out_of_bounds ... ok [INFO] [stdout] test mesh_multi_res::tests::test_get_level_some ... ok [INFO] [stdout] test mesh_multi_res::tests::test_level_face_counts ... ok [INFO] [stdout] test mesh_multi_res::tests::test_midpoint_upsample_increases_faces ... ok [INFO] [stdout] test mesh_multi_res::tests::test_to_json ... ok [INFO] [stdout] test mesh_multiresolution::tests::test_apply_displacement_accumulates ... ok [INFO] [stdout] test mesh_multiresolution::tests::test_invalid_level_ignored ... ok [INFO] [stdout] test mesh_multiresolution::tests::test_pop_level_base_returns_false ... ok [INFO] [stdout] test mesh_multiresolution::tests::test_new_has_one_level ... ok [INFO] [stdout] test mesh_multiresolution::tests::test_pop_level_decrements_count ... ok [INFO] [stdout] test mesh_multiresolution::tests::test_reset_displacements ... ok [INFO] [stdout] test mesh_multiresolution::tests::test_total_displacement_magnitude_nonzero_after_apply ... ok [INFO] [stdout] test mesh_multiresolution::tests::test_total_displacement_magnitude_zero_initially ... ok [INFO] [stdout] test mesh_multiresolution::tests::test_push_level_increments_count ... ok [INFO] [stdout] test mesh_needle_triangle::tests::test_avg_aspect_ratio_positive ... ok [INFO] [stdout] test mesh_needle_triangle::tests::test_detect_needle_found ... ok [INFO] [stdout] test mesh_needle_triangle::tests::test_detect_no_needles_equilateral ... ok [INFO] [stdout] test mesh_needle_triangle::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_needle_triangle::tests::test_equilateral_low_aspect_ratio ... ok [INFO] [stdout] test mesh_needle_triangle::tests::test_is_needle_free_true ... ok [INFO] [stdout] test mesh_needle_triangle::tests::test_max_aspect_ratio ... ok [INFO] [stdout] test mesh_needle_triangle::tests::test_needle_high_aspect_ratio ... ok [INFO] [stdout] test mesh_needle_triangle::tests::test_needle_ratio ... ok [INFO] [stdout] test mesh_needle_triangle::tests::test_to_json ... ok [INFO] [stdout] test mesh_ngon_fill::tests::test_ear_clip_triangle ... ok [INFO] [stdout] test mesh_ngon_fill::tests::test_expected_tri_count ... ok [INFO] [stdout] test mesh_ngon_fill::tests::test_fan_fill_less_than_3 ... ok [INFO] [stdout] test mesh_ngon_fill::tests::test_fan_fill_pentagon ... ok [INFO] [stdout] test mesh_ngon_fill::tests::test_fan_fill_quad ... ok [INFO] [stdout] test mesh_ngon_fill::tests::test_fan_fill_triangle ... ok [INFO] [stdout] test mesh_ngon_fill::tests::test_ngon_fill_ear_clip ... ok [INFO] [stdout] test mesh_ngon_fill::tests::test_ngon_fill_fan ... ok [INFO] [stdout] test mesh_ngon_fill::tests::test_triangle_count ... ok [INFO] [stdout] test mesh_noise_gen::tests::amplitude_zero_no_displacement ... ok [INFO] [stdout] test mesh_noise_gen::tests::apply_noise_texture_in_range ... ok [INFO] [stdout] test mesh_noise_gen::tests::apply_noise_texture_length_equals_n_verts ... ok [INFO] [stdout] test mesh_noise_gen::tests::different_seeds_differ ... ok [INFO] [stdout] test mesh_noise_gen::tests::displace_mesh_noise_changes_positions ... ok [INFO] [stdout] test mesh_noise_gen::tests::fbm_noise_deterministic ... ok [INFO] [stdout] test mesh_noise_gen::tests::fbm_noise_in_range ... ok [INFO] [stdout] test mesh_noise_gen::tests::generate_organic_surface_correct_length ... ok [INFO] [stdout] test mesh_noise_gen::tests::lcg_value_noise_deterministic ... ok [INFO] [stdout] test mesh_noise_gen::tests::lcg_value_noise_in_range ... ok [INFO] [stdout] test mesh_noise_gen::tests::min_le_max_displacement ... ok [INFO] [stdout] test mesh_noise_gen::tests::generate_sphere_bumps_indices_in_range ... ok [INFO] [stdout] test mesh_noise_gen::tests::noise_magnitude_stats_non_empty ... ok [INFO] [stdout] test mesh_noise_gen::tests::rms_displacement_positive_for_nonzero_amplitude ... ok [INFO] [stdout] test mesh_non_manifold_fix::tests::edge_key_canonical ... ok [INFO] [stdout] test mesh_non_manifold_fix::tests::empty_mesh_is_manifold ... ok [INFO] [stdout] test mesh_noise_gen::tests::generate_sphere_bumps_nonzero_vertices ... ok [INFO] [stdout] test mesh_non_manifold_fix::tests::face_indices_sorted ... ok [INFO] [stdout] test mesh_non_manifold_fix::tests::find_nm_edges_counts_correct ... ok [INFO] [stdout] test mesh_non_manifold_fix::tests::fix_removes_correct_faces ... ok [INFO] [stdout] test mesh_non_manifold_fix::tests::manifold_mesh_has_no_nm_edges ... ok [INFO] [stdout] test mesh_non_manifold_fix::tests::manifold_stats_nm_one ... ok [INFO] [stdout] test mesh_non_manifold_fix::tests::manifold_stats_nm_zero ... ok [INFO] [stdout] test mesh_non_manifold_fix::tests::non_manifold_mesh_detected ... ok [INFO] [stdout] test mesh_nonorientable::tests::expected_vertex_count_formula ... ok [INFO] [stdout] test mesh_nonorientable::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_nonorientable::tests::mobius_point_not_origin ... ok [INFO] [stdout] test mesh_nonorientable::tests::normals_match ... ok [INFO] [stdout] test mesh_nonorientable::tests::strip_has_triangles ... ok [INFO] [stdout] test mesh_nonorientable::tests::strip_has_vertices ... ok [INFO] [stdout] test mesh_nonorientable::tests::uvs_match ... ok [INFO] [stdout] test mesh_nonorientable::tests::validate_bad_width ... ok [INFO] [stdout] test mesh_nonorientable::tests::validate_ok ... ok [INFO] [stdout] test mesh_normal_delta::tests::apply_morph_normals_no_deltas_unchanged ... ok [INFO] [stdout] test mesh_normal_delta::tests::apply_morph_normals_two_deltas_blended ... ok [INFO] [stdout] test mesh_normal_delta::tests::apply_weight_one_adds_delta ... ok [INFO] [stdout] test mesh_normal_delta::tests::apply_weight_zero_leaves_normals_unchanged ... ok [INFO] [stdout] test mesh_normal_delta::tests::batch_same_as_individual ... ok [INFO] [stdout] test mesh_normal_delta::tests::compute_normal_deltas_detects_change ... ok [INFO] [stdout] test mesh_normal_delta::tests::compute_normal_deltas_identical_meshes_yields_zero ... ok [INFO] [stdout] test mesh_normal_delta::tests::compute_vertex_normals_flat_triangle_points_z ... ok [INFO] [stdout] test mesh_normal_delta::tests::compute_vertex_normals_output_len_equals_vertex_count ... ok [INFO] [stdout] test mesh_normal_delta::tests::flat_roundtrip_preserves_deltas ... ok [INFO] [stdout] test mesh_normal_delta::tests::morph_normal_deltas_add_and_count ... ok [INFO] [stdout] test mesh_normal_delta::tests::morph_normal_deltas_new_empty ... ok [INFO] [stdout] test mesh_normal_delta::tests::morph_normal_deltas_prune ... ok [INFO] [stdout] test mesh_normal_delta::tests::normals_approx_equal_exact_match ... ok [INFO] [stdout] test mesh_normal_delta::tests::normals_approx_equal_length_mismatch_false ... ok [INFO] [stdout] test mesh_normal_delta::tests::safe_normalize_zero_returns_up ... ok [INFO] [stdout] test mesh_normal_edit::tests::set_overrides_existing ... ok [INFO] [stdout] test mesh_normal_delta::tests::tangent_space_delta_identity_basis ... ok [INFO] [stdout] test mesh_normal_delta::tests::to_flat_size_is_three_times_vertex_count ... ok [INFO] [stdout] test mesh_normal_map_bake::tests::average_pixel_normal_flat_map ... ok [INFO] [stdout] test mesh_normal_edit::tests::apply_edits_out_of_range_ignored ... ok [INFO] [stdout] test mesh_normal_edit::tests::apply_empty_layer_returns_base ... ok [INFO] [stdout] test mesh_normal_edit::tests::edit_count_increments ... ok [INFO] [stdout] test mesh_normal_edit::tests::get_missing_returns_none ... ok [INFO] [stdout] test mesh_normal_edit::tests::multiple_edits_on_different_verts ... ok [INFO] [stdout] test mesh_normal_edit::tests::new_layer_is_empty ... ok [INFO] [stdout] test mesh_normal_delta::tests::safe_normalize_unit_vector_unchanged ... ok [INFO] [stdout] test mesh_normal_edit::tests::set_and_get_normal ... ok [INFO] [stdout] test mesh_normal_map_bake::tests::bake_produces_map ... ok [INFO] [stdout] test mesh_normal_edit::tests::apply_edits_replaces_base ... ok [INFO] [stdout] test mesh_normal_map_bake::tests::bake_writes_some_pixels ... ok [INFO] [stdout] test mesh_normal_map_bake::tests::default_config_reasonable ... ok [INFO] [stdout] test mesh_normal_map_bake::tests::face_normal_unit_length ... ok [INFO] [stdout] test mesh_normal_map_bake::tests::normal_map_v2_created ... ok [INFO] [stdout] test mesh_normal_map_bake::tests::normal_map_v2_size_bytes_correct ... ok [INFO] [stdout] test mesh_normal_delta::tests::to_flat_written_to_tmp ... ok [INFO] [stdout] test mesh_normal_map_bake::tests::normal_to_rgb_roundtrip ... ok [INFO] [stdout] test mesh_normal_map_bake::tests::pixel_index_correct ... ok [INFO] [stdout] test mesh_normal_map_bake::tests::set_get_pixel_roundtrip ... ok [INFO] [stdout] test mesh_normal_override::tests::get_missing_none ... ok [INFO] [stdout] test mesh_normal_override::tests::new_layer_empty ... ok [INFO] [stdout] test mesh_normal_override::tests::normals_are_normalised ... ok [INFO] [stdout] test mesh_normal_override::tests::overwrite_does_not_duplicate ... ok [INFO] [stdout] test mesh_normal_override::tests::remove_present_returns_true ... ok [INFO] [stdout] test mesh_normal_override::tests::validate_all_valid ... ok [INFO] [stdout] test mesh_normal_override::tests::multiple_vertices_independent ... ok [INFO] [stdout] test mesh_normal_transfer_v2::tests::test_default_config ... ok [INFO] [stdout] test mesh_normal_transfer_v2::tests::test_miss_when_too_far ... ok [INFO] [stdout] test mesh_normal_transfer_v2::tests::test_normals_are_unit_true ... ok [INFO] [stdout] test mesh_normal_transfer_v2::tests::test_result_normals_unit ... ok [INFO] [stdout] test mesh_normal_override::tests::set_and_get ... ok [INFO] [stdout] test mesh_normal_override::tests::remove_missing_returns_false ... ok [INFO] [stdout] test mesh_normal_transfer_v2::tests::test_smooth_blend_range ... ok [INFO] [stdout] test mesh_normal_transfer_v2::tests::test_success_rate_full_transfer ... ok [INFO] [stdout] test mesh_normal_transfer_v2::tests::test_to_json ... ok [INFO] [stdout] test mesh_normal_transfer_v2::tests::test_transfer_empty_target ... ok [INFO] [stdout] test mesh_normal_transfer_v2::tests::test_transfer_no_source ... ok [INFO] [stdout] test mesh_normal_transfer_v2::tests::test_transfer_same_mesh ... ok [INFO] [stdout] test mesh_nurbs_surface::tests::test_new_nurbs_surface_valid ... ok [INFO] [stdout] test mesh_nurbs_surface::tests::test_nurbs_bbox_empty ... ok [INFO] [stdout] test mesh_nurbs_surface::tests::test_nurbs_bbox_flat ... ok [INFO] [stdout] test mesh_nurbs_surface::tests::test_nurbs_control_point_count ... ok [INFO] [stdout] test mesh_nurbs_surface::tests::test_tessellate_empty_on_zero_divs ... ok [INFO] [stdout] test mesh_nurbs_surface::tests::test_tessellate_nurbs_tri_count ... ok [INFO] [stdout] test mesh_nurbs_surface::tests::test_tessellate_nurbs_vertex_count ... ok [INFO] [stdout] test mesh_nurbs_surface::tests::test_uniform_knots_clamped ... ok [INFO] [stdout] test mesh_nurbs_surface::tests::test_uniform_knots_length ... ok [INFO] [stdout] test mesh_nurbs_surface::tests::test_weights_all_one ... ok [INFO] [stdout] test mesh_oct_encode::tests::test_batch_decode_count ... ok [INFO] [stdout] test mesh_oct_encode::tests::test_batch_encode_count ... ok [INFO] [stdout] test mesh_oct_encode::tests::test_compression_ratio ... ok [INFO] [stdout] test mesh_oct_encode::tests::test_decoded_normals_unit_length ... ok [INFO] [stdout] test mesh_oct_encode::tests::test_empty_encode ... ok [INFO] [stdout] test mesh_oct_encode::tests::test_empty_error ... ok [INFO] [stdout] test mesh_oct_encode::tests::test_encode_decode_error_small ... ok [INFO] [stdout] test mesh_oct_encode::tests::test_encode_decode_round_trip ... ok [INFO] [stdout] test mesh_octree::tests::test_default_octree_config ... ok [INFO] [stdout] test mesh_oct_encode::tests::test_encode_u8_decode_u8_round_trip ... ok [INFO] [stdout] test mesh_octree::tests::test_empty_positions_nearest_none ... ok [INFO] [stdout] test mesh_oct_encode::tests::test_encode_to_json ... ok [INFO] [stdout] test mesh_octree::tests::test_octree_depth_at_least_zero ... ok [INFO] [stdout] test mesh_octree::tests::test_octree_leaf_count_positive ... ok [INFO] [stdout] test mesh_octree::tests::test_octree_node_count_positive ... ok [INFO] [stdout] test mesh_octree::tests::test_octree_stats_fields ... ok [INFO] [stdout] test mesh_octree::tests::test_octree_bounds_contains_all ... ok [INFO] [stdout] test mesh_octree::tests::test_query_aabb_all ... ok [INFO] [stdout] test mesh_octree::tests::test_build_octree_non_empty ... ok [INFO] [stdout] test mesh_octree::tests::test_query_nearest_far_corner ... ok [INFO] [stdout] test mesh_octree::tests::test_query_nearest_origin ... ok [INFO] [stdout] test mesh_octree::tests::test_query_aabb_single ... ok [INFO] [stdout] test mesh_octree::tests::test_query_sphere_all ... ok [INFO] [stdout] test mesh_octree::tests::test_query_sphere_none ... ok [INFO] [stdout] test mesh_octree::tests::test_ray_intersect_hit ... ok [INFO] [stdout] test mesh_octree::tests::test_ray_intersect_miss ... ok [INFO] [stdout] test mesh_octree::tests::test_refit_octree ... ok [INFO] [stdout] test mesh_offset::tests::clamp_offset_distance_within_range ... ok [INFO] [stdout] test mesh_offset::tests::check_self_intersection_no_flips_on_small_offset ... ok [INFO] [stdout] test mesh_offset::tests::closest_point_on_triangle_above_projects_down ... ok [INFO] [stdout] test mesh_offset::tests::closest_point_on_triangle_inside ... ok [INFO] [stdout] test mesh_offset::tests::closest_point_on_triangle_near_vertex ... ok [INFO] [stdout] test mesh_offset::tests::default_offset_config_distance_positive ... ok [INFO] [stdout] test mesh_offset::tests::compute_offset_normals_returns_unit_vectors ... ok [INFO] [stdout] test mesh_offset::tests::default_offset_config_smooth_iterations_sensible ... ok [INFO] [stdout] test mesh_offset::tests::grow_mesh_increases_z_for_upward_normals ... ok [INFO] [stdout] test mesh_offset::tests::compute_offset_normals_returns_same_count ... ok [INFO] [stdout] test mesh_offset::tests::offset_bounding_box_empty_positions ... ok [INFO] [stdout] test mesh_offset::tests::offset_mesh_clamp_does_not_exceed_half_edge ... ok [INFO] [stdout] test mesh_offset::tests::offset_mesh_moves_vertices_along_normals ... ok [INFO] [stdout] test mesh_offset::tests::offset_mesh_statistics_correct ... ok [INFO] [stdout] test mesh_offset::tests::offset_bounding_box_correct ... ok [INFO] [stdout] test mesh_offset::tests::offset_mesh_zero_distance_is_identity ... ok [INFO] [stdout] test mesh_offset::tests::offset_quality_score_empty_is_one ... ok [INFO] [stdout] test mesh_offset::tests::offset_quality_score_near_one_for_clean_offset ... ok [INFO] [stdout] test mesh_offset::tests::offset_mesh_preserves_vertex_count ... ok [INFO] [stdout] test mesh_offset::tests::shell_offset_doubles_vertex_count ... ok [INFO] [stdout] test mesh_offset::tests::shell_offset_index_count_increases ... ok [INFO] [stdout] test mesh_offset::tests::offset_vertex_count_matches_positions ... ok [INFO] [stdout] test mesh_offset::tests::offset_vertex_count_empty ... ok [INFO] [stdout] test mesh_offset::tests::offset_mesh_negative_distance_goes_inward ... ok [INFO] [stdout] test mesh_offset::tests::shell_offset_normals_recomputed ... ok [INFO] [stdout] test mesh_offset::tests::shrink_mesh_decreases_z_for_upward_normals ... ok [INFO] [stdout] test mesh_offset::tests::shrink_wrap_factor_zero_is_identity ... ok [INFO] [stdout] test mesh_offset::tests::shrink_wrap_factor_one_snaps_to_target ... ok [INFO] [stdout] test mesh_orient::tests::test_consistent_winding_check_consistent ... ok [INFO] [stdout] test mesh_orient::tests::test_consistent_winding_check_inconsistent ... ok [INFO] [stdout] test mesh_orient::tests::test_default_orient_config ... ok [INFO] [stdout] test mesh_offset::tests::signed_offset_positive_moves_along_normal ... ok [INFO] [stdout] test mesh_orient::tests::test_flip_all_faces ... ok [INFO] [stdout] test mesh_offset::tests::smooth_offset_normals_returns_same_count ... ok [INFO] [stdout] test mesh_orient::tests::test_flip_face_swaps_vertices ... ok [INFO] [stdout] test mesh_offset::tests::smooth_offset_normals_zero_iterations_is_identity ... ok [INFO] [stdout] test mesh_offset::tests::sphere_grow_radius_increases ... ok [INFO] [stdout] test mesh_offset::tests::variable_offset_per_vertex_distances ... ok [INFO] [stdout] test mesh_offset::tests::variable_offset_short_distances_fallback_to_zero ... ok [INFO] [stdout] test mesh_offset::tests::variable_offset_statistics_reflect_per_vertex ... ok [INFO] [stdout] test mesh_orient::tests::test_all_normals_outward ... ok [INFO] [stdout] test mesh_orient::tests::test_compute_mesh_normals_size ... ok [INFO] [stdout] test mesh_orient::tests::test_compute_mesh_normals_z_direction ... ok [INFO] [stdout] test mesh_orient::tests::test_face_normal_correct ... ok [INFO] [stdout] test mesh_offset::tests::signed_offset_negative_moves_against_normal ... ok [INFO] [stdout] test mesh_orient::tests::test_mesh_centroid_empty ... ok [INFO] [stdout] test mesh_orient::tests::test_mesh_centroid_origin ... ok [INFO] [stdout] test mesh_orient::tests::test_orient_mesh_empty ... ok [INFO] [stdout] test mesh_orient::tests::test_orient_result_summary_contains_consistent ... ok [INFO] [stdout] test mesh_orient::tests::test_orient_mesh_already_consistent ... ok [INFO] [stdout] test mesh_orient::tests::test_triangle_normal_basic ... ok [INFO] [stdout] test mesh_orthographic_proj::tests::test_bounds_single_vertex ... ok [INFO] [stdout] test mesh_orthographic_proj::tests::test_normalize_bounds_0_to_1 ... ok [INFO] [stdout] test mesh_orthographic_proj::tests::test_projected_area_positive ... ok [INFO] [stdout] test mesh_orthographic_proj::tests::test_xy_projection_count ... ok [INFO] [stdout] test mesh_orthographic_proj::tests::test_empty_projection ... ok [INFO] [stdout] test mesh_orthographic_proj::tests::test_to_json ... ok [INFO] [stdout] test mesh_orthographic_proj::tests::test_yz_projection_x_maps_to_y ... ok [INFO] [stdout] test mesh_orthographic_proj::tests::test_xz_projection_z_coordinate ... ok [INFO] [stdout] test mesh_orthographic_proj::tests::test_projected_centroid ... ok [INFO] [stdout] test mesh_outline_mesh::tests::test_default_config ... ok [INFO] [stdout] test mesh_outline_mesh::tests::test_is_silhouette_edge_false ... ok [INFO] [stdout] test mesh_pack_islands::tests::test_atlas_utilization_range ... ok [INFO] [stdout] test mesh_pack_islands::tests::test_island_area ... ok [INFO] [stdout] test mesh_pack_islands::tests::test_island_width_height ... ok [INFO] [stdout] test mesh_pack_islands::tests::test_largest_island ... ok [INFO] [stdout] test mesh_outline_mesh::tests::test_edge_count_empty ... ok [INFO] [stdout] test mesh_pack_islands::tests::test_largest_island_empty ... ok [INFO] [stdout] test mesh_outline_mesh::tests::test_extrude_zero_distance ... ok [INFO] [stdout] test mesh_orient::tests::test_triangle_normal_direction ... ok [INFO] [stdout] test mesh_pack_islands::tests::test_pack_count ... ok [INFO] [stdout] test mesh_pack_islands::tests::test_pack_offsets_non_negative ... ok [INFO] [stdout] test mesh_outline_mesh::tests::test_generate_outline_mesh_vertex_count ... ok [INFO] [stdout] test mesh_orient::tests::test_triangle_normal_unit_length ... ok [INFO] [stdout] test mesh_outline_mesh::tests::test_normalize_unit_vector ... ok [INFO] [stdout] test mesh_orthographic_proj::tests::test_to_image_space_bounds ... ok [INFO] [stdout] test mesh_outline_mesh::tests::test_extrude_vertex_along_z ... ok [INFO] [stdout] test mesh_outline_mesh::tests::test_is_silhouette_edge_true ... ok [INFO] [stdout] test mesh_outline_mesh::tests::test_silhouette_edges_filter ... ok [INFO] [stdout] test mesh_outline_mesh::tests::test_normalize_zero_vector ... ok [INFO] [stdout] test mesh_paint::tests::apply_brush_inflate_via_dispatcher ... ok [INFO] [stdout] test mesh_paint::tests::apply_brush_smooth_via_dispatcher ... ok [INFO] [stdout] test mesh_paint::tests::brush_params_default_values ... ok [INFO] [stdout] test mesh_paint::tests::brush_stroke_undo_restores_positions ... ok [INFO] [stdout] test mesh_paint::tests::falloff_outside_radius_returns_zero ... ok [INFO] [stdout] test mesh_paint::tests::falloff_hard_inside_returns_one ... ok [INFO] [stdout] test mesh_paint::tests::falloff_smooth_at_radius_boundary ... ok [INFO] [stdout] test mesh_paint::tests::falloff_smooth_at_centre_returns_one ... ok [INFO] [stdout] test mesh_paint::tests::grab_brush_displaces_nearby_vertices ... ok [INFO] [stdout] test mesh_pack_islands::tests::test_total_island_area ... ok [INFO] [stdout] test mesh_paint::tests::inflate_brush_moves_along_normal ... ok [INFO] [stdout] test mesh_paint::tests::pinch_brush_pulls_toward_center ... ok [INFO] [stdout] test mesh_paint::tests::zero_radius_brush_affects_nobody ... ok [INFO] [stdout] test mesh_paint::tests::flatten_brush_reduces_z_spread ... ok [INFO] [stdout] test mesh_paint::tests::grab_brush_invert_reverses_direction ... ok [INFO] [stdout] test mesh_paint::tests::adjacency_single_triangle_all_connected ... ok [INFO] [stdout] test mesh_paint::tests::smooth_brush_reduces_position_variance ... ok [INFO] [stdout] test mesh_paint_mask::tests::test_average_weight ... ok [INFO] [stdout] test mesh_paint_mask::tests::test_count_above ... ok [INFO] [stdout] test mesh_paint_mask::tests::test_invert ... ok [INFO] [stdout] test mesh_paint_mask::tests::test_new_all_zero ... ok [INFO] [stdout] test mesh_paint_mask::tests::test_from_to_bytes_round_trip ... ok [INFO] [stdout] test mesh_paint_mask::tests::test_set_clamps ... ok [INFO] [stdout] test mesh_paint_mask::tests::test_set_and_get ... ok [INFO] [stdout] test mesh_paint_mask::tests::test_get_out_of_bounds ... ok [INFO] [stdout] test mesh_param_chart::tests::test_connected_gives_one_chart ... ok [INFO] [stdout] test mesh_param_chart::tests::test_empty_utilization_zero ... ok [INFO] [stdout] test mesh_param_chart::tests::test_disconnected_gives_two_charts ... ok [INFO] [stdout] test mesh_param_chart::tests::test_largest_chart_some ... ok [INFO] [stdout] test mesh_param_chart::tests::test_to_json ... ok [INFO] [stdout] test mesh_param_chart::tests::test_uv_count_per_chart ... ok [INFO] [stdout] test mesh_param_chart::tests::test_total_faces ... ok [INFO] [stdout] test mesh_param_chart::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_param_chart::tests::test_uv_utilization_positive ... ok [INFO] [stdout] test mesh_parametric::tests::cylinder_no_caps_vertex_count ... ok [INFO] [stdout] test mesh_parametric::tests::merge_combines_vertex_counts ... ok [INFO] [stdout] test mesh_parametric::tests::capsule_normals_normalized ... ok [INFO] [stdout] test mesh_parametric::tests::cylinder_with_caps_has_more_vertices ... ok [INFO] [stdout] test mesh_param_chart::tests::test_uvs_in_range ... ok [INFO] [stdout] test mesh_parametric::tests::cone_index_count ... ok [INFO] [stdout] test mesh_parametric::tests::merge_indices_valid ... ok [INFO] [stdout] test mesh_parametric::tests::plane_all_normals_up ... ok [INFO] [stdout] test mesh_parametric::tests::sphere_index_count ... ok [INFO] [stdout] test mesh_parametric::tests::plane_vertex_count ... ok [INFO] [stdout] test mesh_parametric::tests::sphere_normals_normalized ... ok [INFO] [stdout] test mesh_parametric::tests::sphere_radius_positions ... ok [INFO] [stdout] test mesh_parametric::tests::sphere_uvs_in_range ... ok [INFO] [stdout] test mesh_parametric::tests::sphere_vertex_count ... ok [INFO] [stdout] test mesh_parametric::tests::validate_empty_fails ... ok [INFO] [stdout] test mesh_parametric::tests::torus_index_count ... ok [INFO] [stdout] test mesh_parametric_surf::tests::pi_sin_near_zero ... ok [INFO] [stdout] test mesh_parametric_surf::tests::normals_unit_length ... ok [INFO] [stdout] test mesh_parametric::tests::torus_uvs_in_range ... ok [INFO] [stdout] test mesh_parametric_surf::tests::single_step_mesh ... ok [INFO] [stdout] test mesh_parametric_surf::tests::sphere_fn_radius_approx ... ok [INFO] [stdout] test mesh_parametric_surf::tests::tessellate_index_count ... ok [INFO] [stdout] test mesh_parametric_surf::tests::torus_fn_produces_points ... ok [INFO] [stdout] test mesh_parametric_surf::tests::tessellate_vertex_count ... ok [INFO] [stdout] test mesh_parametric_surf::tests::triangle_count_formula ... ok [INFO] [stdout] test mesh_parametric_surf::tests::uv_range_clamped ... ok [INFO] [stdout] test mesh_parametric_surf::tests::vertex_count_formula ... ok [INFO] [stdout] test mesh_particle_hair::tests::test_add_strand ... ok [INFO] [stdout] test mesh_particle_hair::tests::test_max_strand_length ... ok [INFO] [stdout] test mesh_particle_hair::tests::test_max_strand_length_empty ... ok [INFO] [stdout] test mesh_particle_hair::tests::test_segment_count ... ok [INFO] [stdout] test mesh_particle_hair::tests::test_average_strand_length ... ok [INFO] [stdout] test mesh_particle_hair::tests::test_strand_length ... ok [INFO] [stdout] test mesh_parametric::tests::validate_sphere_passes ... ok [INFO] [stdout] test mesh_particle_hair::tests::test_strand_point_count ... ok [INFO] [stdout] test mesh_particle_hair::tests::test_total_points ... ok [INFO] [stdout] test mesh_patch::tests::test_closed_mesh_is_watertight ... ok [INFO] [stdout] test mesh_patch::tests::test_ear_clip_triangle_count ... ok [INFO] [stdout] test mesh_patch::tests::test_fan_patch_triangle_count ... ok [INFO] [stdout] test mesh_patch::tests::test_fill_holes_earclip ... ok [INFO] [stdout] test mesh_patch::tests::test_fill_holes_min_area ... ok [INFO] [stdout] test mesh_patch::tests::test_is_ear_convex_quad ... ok [INFO] [stdout] test mesh_patch::tests::test_find_holes_closed_mesh_zero ... ok [INFO] [stdout] test mesh_patch::tests::test_find_holes_donut_count ... ok [INFO] [stdout] test mesh_patch::tests::test_hole_count_matches_find_holes ... ok [INFO] [stdout] test mesh_patch::tests::test_mesh_hole_perimeter ... ok [INFO] [stdout] test mesh_patch::tests::test_mesh_hole_vertex_count ... ok [INFO] [stdout] test mesh_patch::tests::test_normal_estimate_flat_loop ... ok [INFO] [stdout] test mesh_patch::tests::test_mesh_hole_centroid ... ok [INFO] [stdout] test mesh_patch::tests::test_open_mesh_not_watertight ... ok [INFO] [stdout] test mesh_patch::tests::test_polygon_signed_area_2d_square ... ok [INFO] [stdout] test mesh_patch_blend::tests::test_all_weights_valid ... ok [INFO] [stdout] test mesh_patch_blend::tests::test_blend_midpoint ... ok [INFO] [stdout] test mesh_patch_blend::tests::test_blend_uniform_one_gives_patch_b ... ok [INFO] [stdout] test mesh_patch_blend::tests::test_blend_uniform_zero_gives_patch_a ... ok [INFO] [stdout] test mesh_patch_blend::tests::test_patch_distance ... ok [INFO] [stdout] test mesh_patch_blend::tests::test_empty_blend ... ok [INFO] [stdout] test mesh_patch_blend::tests::test_smooth_weight_midpoint ... ok [INFO] [stdout] test mesh_patch_blend::tests::test_smooth_weight_zero_one ... ok [INFO] [stdout] test mesh_patch_blend::tests::test_to_json ... ok [INFO] [stdout] test mesh_patch_blend::tests::test_vertex_count ... ok [INFO] [stdout] test mesh_patch::tests::test_project_polygon_2d_unit_square ... ok [INFO] [stdout] test mesh_patch_sew::tests::config_default_positive_threshold ... ok [INFO] [stdout] test mesh_patch::tests::test_fill_holes_fan_increases_triangles ... ok [INFO] [stdout] test mesh_patch_sew::tests::sew_combines_vertices ... ok [INFO] [stdout] test mesh_patch_sew::tests::sew_empty_patches ... ok [INFO] [stdout] test mesh_patch_sew::tests::sew_indices_valid ... ok [INFO] [stdout] test mesh_patch_sew::tests::sew_no_weld_keeps_all_vertices ... ok [INFO] [stdout] test mesh_patch_sew::tests::sew_triangle_count_consistent ... ok [INFO] [stdout] test mesh_patch_sew::tests::sew_welds_shared_edge ... ok [INFO] [stdout] test mesh_patch_sew::tests::sew_positions_all_finite ... ok [INFO] [stdout] test mesh_path_cut::tests::test_path_cut_is_closed_false ... ok [INFO] [stdout] test mesh_path_cut::tests::test_path_cut_is_closed_true ... ok [INFO] [stdout] test mesh_path_cut::tests::test_path_cut_vertex_count ... ok [INFO] [stdout] test mesh_pca::tests::compute_shape_pca_empty_returns_empty ... ok [INFO] [stdout] test mesh_pca::tests::identity_shapes_zero_variance ... ok [INFO] [stdout] test mesh_pca::tests::mean_shape_empty ... ok [INFO] [stdout] test mesh_pca::tests::flat_to_shape_length ... ok [INFO] [stdout] test mesh_pca::tests::mean_shape_formula ... ok [INFO] [stdout] test mesh_patch::tests::test_write_results_to_tmp ... ok [INFO] [stdout] test mesh_pca::tests::explained_variance_ratio_fn_matches_pca_result ... ok [INFO] [stdout] test mesh_path_cut::tests::test_path_cut_edges ... ok [INFO] [stdout] test mesh_path_cut::tests::test_path_cut_length ... ok [INFO] [stdout] test mesh_pca::tests::compute_shape_pca_n_components_preserved ... ok [INFO] [stdout] test mesh_pca::tests::cumulative_variance_le_one ... ok [INFO] [stdout] test mesh_path_cut::tests::test_path_shortest ... ok [INFO] [stdout] test mesh_pinch_tool::tests::test_affected_centroid ... ok [INFO] [stdout] test mesh_pinch_tool::tests::test_apply_expand_moves_away ... ok [INFO] [stdout] test mesh_pca::tests::pca_reconstruction_error_nonneg ... ok [INFO] [stdout] test mesh_pca::tests::explained_variance_ratio_sums_le_one ... ok [INFO] [stdout] test mesh_pca::tests::project_shape_dimension ... ok [INFO] [stdout] test mesh_pca::tests::reconstruct_shape_length ... ok [INFO] [stdout] test mesh_pca::tests::shape_to_flat_length ... ok [INFO] [stdout] test mesh_pca::tests::shape_to_flat_round_trip ... ok [INFO] [stdout] test mesh_pinch_tool::tests::test_affected_count ... ok [INFO] [stdout] test mesh_pinch_tool::tests::test_apply_pinch_moves_toward_target ... ok [INFO] [stdout] test mesh_pinch_tool::tests::test_count_in_radius ... ok [INFO] [stdout] test mesh_pinch_tool::tests::test_default_pinch_strength ... ok [INFO] [stdout] test mesh_pinch_tool::tests::test_max_pinch_displacement ... ok [INFO] [stdout] test mesh_pinch_tool::tests::test_pinch_steps_count ... ok [INFO] [stdout] test mesh_pipe_network::tests::min_3_segments_enforced ... ok [INFO] [stdout] test mesh_pipe_network::tests::missing_node_skipped ... ok [INFO] [stdout] test mesh_pipe_network::tests::empty_network ... ok [INFO] [stdout] test mesh_pipe_network::tests::network_indices_multiple_of_three ... ok [INFO] [stdout] test mesh_pipe_network::tests::network_one_pipe ... ok [INFO] [stdout] test mesh_pipe_network::tests::pipe_triangle_count_helper ... ok [INFO] [stdout] test mesh_pipe_network::tests::network_vertex_count ... ok [INFO] [stdout] test mesh_pinch_tool::tests::test_pinch_to_line_count ... ok [INFO] [stdout] test mesh_planar_decimate::tests::test_are_coplanar_same ... ok [INFO] [stdout] test mesh_planar_decimate::tests::test_are_coplanar_different ... ok [INFO] [stdout] test mesh_planar_decimate::tests::test_config_degrees ... ok [INFO] [stdout] test mesh_planar_decimate::tests::test_decimate_ratio_full ... ok [INFO] [stdout] test mesh_pipe_network::tests::single_pipe_triangle_count ... ok [INFO] [stdout] test mesh_planar_decimate::tests::test_coplanar_collapse ... ok [INFO] [stdout] test mesh_planar_decimate::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_planar_decimate::tests::test_survivor_count ... ok [INFO] [stdout] test mesh_planar_decimate::tests::test_min_faces_respected ... ok [INFO] [stdout] test mesh_planar_proj::tests::test_default_config ... ok [INFO] [stdout] test mesh_planar_proj::tests::test_empty_positions ... ok [INFO] [stdout] test mesh_planar_proj::tests::test_normalize_uvs ... ok [INFO] [stdout] test mesh_planar_proj::tests::test_tilted_projection ... ok [INFO] [stdout] test mesh_planar_proj::tests::test_to_json ... ok [INFO] [stdout] test mesh_planar_proj::tests::test_uvs_finite ... ok [INFO] [stdout] test mesh_planar_proj::tests::test_scale_affects_uvs ... ok [INFO] [stdout] test mesh_planar_proj::tests::test_vertex_count_fn ... ok [INFO] [stdout] test mesh_planar_proj::tests::test_xz_plane_uv_count ... ok [INFO] [stdout] test mesh_plane::tests::test_default_config ... ok [INFO] [stdout] test mesh_plane::tests::test_area ... ok [INFO] [stdout] test mesh_planar_proj::tests::test_uv_bounds ... ok [INFO] [stdout] test mesh_plane::tests::test_generate_plane_vertices ... ok [INFO] [stdout] test mesh_plane::tests::test_indices_valid ... ok [INFO] [stdout] test mesh_pca::tests::reconstruct_zero_scores_gives_mean ... ok [INFO] [stdout] test mesh_plane::tests::test_index_count_matches ... ok [INFO] [stdout] test mesh_plane::tests::test_normals_all_up ... ok [INFO] [stdout] test mesh_plane::tests::test_to_json ... ok [INFO] [stdout] test mesh_plane::tests::test_uvs_in_range ... ok [INFO] [stdout] test mesh_plane::tests::test_vertex_count_matches ... ok [INFO] [stdout] test mesh_plane_gen::tests::test_new_plane ... ok [INFO] [stdout] test mesh_plane_gen::tests::test_plane_face_count ... ok [INFO] [stdout] test mesh_plane_gen::tests::test_plane_area ... ok [INFO] [stdout] test mesh_plane_gen::tests::test_plane_uv_corners ... ok [INFO] [stdout] test mesh_plane_gen::tests::test_plane_vertex_center ... ok [INFO] [stdout] test mesh_plane_gen::tests::test_plane_vertex_corner ... ok [INFO] [stdout] test mesh_plane_gen::tests::test_plane_vertex_count ... ok [INFO] [stdout] test mesh_platonic_solid::tests::test_cube_tri_count ... ok [INFO] [stdout] test mesh_platonic_solid::tests::test_cube_vertex_count ... ok [INFO] [stdout] test mesh_platonic_solid::tests::test_icosahedron_tri_count ... ok [INFO] [stdout] test mesh_platonic_solid::tests::test_icosahedron_unit_sphere ... ok [INFO] [stdout] test mesh_platonic_solid::tests::test_icosahedron_vertex_count ... ok [INFO] [stdout] test mesh_plane::tests::test_normals_count_matches ... ok [INFO] [stdout] test mesh_pipe_network::tests::single_pipe_vertex_count ... ok [INFO] [stdout] test mesh_pipe_network::tests::two_edges_double_vertices ... ok [INFO] [stdout] test mesh_point_sample::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_point_sample::tests::test_golden_angle_on_unit_sphere ... ok [INFO] [stdout] test mesh_point_sample::tests::test_default_config ... ok [INFO] [stdout] test mesh_point_sample::tests::test_centroid_on_triangle ... ok [INFO] [stdout] test mesh_platonic_solid::tests::test_octahedron_vertex_count ... ok [INFO] [stdout] test mesh_platonic_solid::tests::test_tetrahedron_tri_count ... ok [INFO] [stdout] test mesh_platonic_solid::tests::test_tetrahedron_vertex_count ... ok [INFO] [stdout] test mesh_planar_decimate::tests::test_default_config ... ok [INFO] [stdout] test mesh_point_sample::tests::test_bary_sum_one ... ok [INFO] [stdout] test mesh_point_sample::tests::test_sample_count ... ok [INFO] [stdout] test mesh_point_sample::tests::test_poisson_disk_thin ... ok [INFO] [stdout] test mesh_point_sample::tests::test_samples_to_json ... ok [INFO] [stdout] test mesh_poisson_recon::tests::bbox_empty_cloud ... ok [INFO] [stdout] test mesh_poisson_recon::tests::centroid_inside_bbox ... ok [INFO] [stdout] test mesh_poisson_recon::tests::bbox_correct ... ok [INFO] [stdout] test mesh_poisson_recon::tests::default_config ... ok [INFO] [stdout] test mesh_poisson_recon::tests::density_self ... ok [INFO] [stdout] test mesh_poisson_recon::tests::estimate_faces_depth_3 ... ok [INFO] [stdout] test mesh_platonic_solid::tests::test_validate_all ... ok [INFO] [stdout] test mesh_point_sample::tests::test_golden_angle_count ... ok [INFO] [stdout] test mesh_poisson_recon::tests::poisson_stub_returns_points ... ok [INFO] [stdout] test mesh_poisson_recon::tests::required_depth_nonzero ... ok [INFO] [stdout] test mesh_poisson_recon::tests::voxel_correct ... ok [INFO] [stdout] test mesh_poke_face::tests::test_poke_polygon ... ok [INFO] [stdout] test mesh_poke_face::tests::test_poke_faces_runs ... ok [INFO] [stdout] test mesh_poke_face::tests::test_poke_triangle_estimate ... ok [INFO] [stdout] test mesh_point_sample::tests::test_normals_unit ... ok [INFO] [stdout] test mesh_poke_face::tests::test_poke_triangle_index_count ... ok [INFO] [stdout] test mesh_poisson_recon::tests::poisson_requires_four_points ... ok [INFO] [stdout] test mesh_poke_face::tests::test_poke_with_offset ... ok [INFO] [stdout] test mesh_pca::tests::project_then_reconstruct_in_distribution_low_error ... ok [INFO] [stdout] test mesh_poke_face::tests::test_poke_triangle_vertex_count ... ok [INFO] [stdout] test mesh_poke_face::tests::test_validate_poke_input ... ok [INFO] [stdout] test mesh_poke_faces::tests::test_poke_center_is_centroid ... ok [INFO] [stdout] test mesh_poke_faces::tests::test_poke_face_area_triangle ... ok [INFO] [stdout] test mesh_poke_faces::tests::test_poke_face_triangle_count ... ok [INFO] [stdout] test mesh_poke_face::tests::test_poke_all_faces ... ok [INFO] [stdout] test mesh_poke_faces::tests::test_poke_vertex_count ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_compute_deformation_gradient_rigid ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_deformation_field_divergence_identity ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_mat3_det_zero ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_mat3_mul_identity ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_mat3_transpose ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_polar_decompose_identity ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_per_face_deformation_count ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_rotation_error_identity ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_stretch_ratio_identity ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_polar_decompose_scale_matrix ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_rigid_body_deformation_identity ... ok [INFO] [stdout] test mesh_poke_faces::tests::test_poke_triangle_count_fn ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_mat3_det_identity ... ok [INFO] [stdout] test mesh_polar_mesh::tests::index_count_formula ... ok [INFO] [stdout] test mesh_polar_mesh::tests::to_json_contains_rings ... ok [INFO] [stdout] test mesh_polar_mesh::tests::face_count_correct ... ok [INFO] [stdout] test mesh_polygon_fill::tests::test_polygon_area_3d_square ... ok [INFO] [stdout] test mesh_polar_mesh::tests::vertex_count_correct ... ok [INFO] [stdout] test mesh_polar_mesh::tests::zero_radius_origin ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_mat3_identity ... ok [INFO] [stdout] test mesh_polar_decomp::tests::test_mat3_scale ... ok [INFO] [stdout] test mesh_polar_mesh::tests::is_valid_nonempty ... ok [INFO] [stdout] test mesh_polar_mesh::tests::scale_doubles_radius ... ok [INFO] [stdout] test mesh_polar_mesh::tests::single_ring_sector ... ok [INFO] [stdout] test mesh_polar_mesh::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_polygon_fill::tests::test_polygon_is_planar_flat ... ok [INFO] [stdout] test mesh_polygon_fill::tests::test_polygon_vertex_count ... ok [INFO] [stdout] test mesh_polygon_fill::tests::test_triangulate_polygon_3d_square ... ok [INFO] [stdout] test mesh_pose_snapshot::tests::test_has_normals_false ... ok [INFO] [stdout] test mesh_pose_snapshot::tests::test_library_find_existing ... ok [INFO] [stdout] test mesh_pose_snapshot::tests::test_new_snapshot ... ok [INFO] [stdout] test mesh_pose_space::tests::test_pose_best_key ... ok [INFO] [stdout] test mesh_pose_snapshot::tests::test_scale_snapshot ... ok [INFO] [stdout] test mesh_pose_space::tests::test_pose_key_count ... ok [INFO] [stdout] test mesh_pose_snapshot::tests::test_snapshot_aabb_empty ... ok [INFO] [stdout] test mesh_polygon_fill::tests::test_polygon_perimeter_square ... ok [INFO] [stdout] test mesh_pose_snapshot::tests::test_has_normals_true ... ok [INFO] [stdout] test mesh_pose_snapshot::tests::test_library_add_and_count ... ok [INFO] [stdout] test mesh_pose_snapshot::tests::test_library_find_missing ... ok [INFO] [stdout] test mesh_polar_mesh::tests::bounding_radius_near_one ... ok [INFO] [stdout] test mesh_pose_space::tests::test_pose_weight_at_key ... ok [INFO] [stdout] test mesh_pose_snapshot::tests::test_snapshot_aabb_single ... ok [INFO] [stdout] test mesh_pose_snapshot::tests::test_snapshot_displacement_same ... ok [INFO] [stdout] test mesh_pose_space::tests::test_pose_weight_falloff ... ok [INFO] [stdout] test mesh_pose_space::tests::test_pose_apply_no_keys ... ok [INFO] [stdout] test mesh_power_crust::tests::generate_poles_count ... ok [INFO] [stdout] test mesh_power_crust::tests::classify_pole_inner ... ok [INFO] [stdout] test mesh_power_crust::tests::medial_ball_radius_positive ... ok [INFO] [stdout] test mesh_pose_space::tests::test_new_pose_key ... ok [INFO] [stdout] test mesh_power_crust::tests::power_crust_stub_has_geometry ... ok [INFO] [stdout] test mesh_power_crust::tests::power_distance_at_center_is_negative_weight ... ok [INFO] [stdout] test mesh_principal_axes::tests::test_diagonal_tensor_gives_aligned_axes ... ok [INFO] [stdout] test mesh_power_crust::tests::nearest_power_site_found ... ok [INFO] [stdout] test mesh_principal_axes::tests::test_jacobi_converges ... ok [INFO] [stdout] test mesh_power_crust::tests::outer_poles_above_inner ... ok [INFO] [stdout] test mesh_power_crust::tests::reconstruct_requires_four_points ... ok [INFO] [stdout] test mesh_power_crust::tests::triangle_count_nonzero ... ok [INFO] [stdout] test mesh_principal_axes::tests::test_axes_unit_length ... ok [INFO] [stdout] test mesh_power_crust::tests::reconstruct_small_tetrahedron ... ok [INFO] [stdout] test mesh_principal_axes::tests::test_axes_orthogonal ... ok [INFO] [stdout] test mesh_principal_axes::tests::test_min_max_axis_different ... ok [INFO] [stdout] test mesh_principal_axes::tests::test_sort_ascending ... ok [INFO] [stdout] test mesh_principal_curvature::tests::directions_finite ... ok [INFO] [stdout] test mesh_principal_curvature::tests::max_k1_is_finite ... ok [INFO] [stdout] test mesh_principal_curvature::tests::gaussian_curvature_flat_is_zero ... ok [INFO] [stdout] test mesh_principal_curvature::tests::mean_curvature_fn ... ok [INFO] [stdout] test mesh_prism_frustum::tests::test_frustum_cone_volume ... ok [INFO] [stdout] test mesh_prism_frustum::tests::test_frustum_sides_stored ... ok [INFO] [stdout] test mesh_prism_frustum::tests::test_frustum_tri_count ... ok [INFO] [stdout] test mesh_principal_axes::tests::test_zero_tensor_does_not_panic ... ok [INFO] [stdout] test mesh_prism_frustum::tests::test_frustum_volume_cylinder ... ok [INFO] [stdout] test mesh_prism_frustum::tests::test_frustum_vertex_count ... ok [INFO] [stdout] test mesh_principal_curvature::tests::empty_mesh_empty_result ... ok [INFO] [stdout] test mesh_principal_curvature::tests::flat_mesh_near_zero_curvature ... ok [INFO] [stdout] test mesh_prism_frustum::tests::test_frustum_empty_on_few_sides ... ok [INFO] [stdout] test mesh_prism_frustum::tests::test_validate_prism_frustum ... ok [INFO] [stdout] test mesh_profile_extrude::tests::centroid_at_half_depth ... ok [INFO] [stdout] test mesh_profile_extrude::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_profile_extrude::tests::depth_stored ... ok [INFO] [stdout] test mesh_principal_axes::tests::test_unit_tensor_moment_magnitudes ... ok [INFO] [stdout] test mesh_principal_curvature::tests::principal_curvature_k1_ge_k2 ... ok [INFO] [stdout] test mesh_prism_frustum::tests::test_frustum_lateral_area_cylinder ... ok [INFO] [stdout] test mesh_principal_curvature::tests::principal_curvature_count_matches ... ok [INFO] [stdout] test mesh_profile_extrude::tests::json_contains_depth ... ok [INFO] [stdout] test mesh_profile_extrude::tests::nonempty_indices ... ok [INFO] [stdout] test mesh_profile_extrude::tests::square_profile_four_points ... ok [INFO] [stdout] test mesh_progressive::tests::build_produces_collapses ... ok [INFO] [stdout] test mesh_progressive::tests::build_stores_base_mesh ... ok [INFO] [stdout] test mesh_progressive::tests::collapse_error_sequence_length_matches ... ok [INFO] [stdout] test mesh_profile_extrude::tests::side_face_count ... ok [INFO] [stdout] test mesh_progressive::tests::extract_lod_ratio_one_returns_full ... ok [INFO] [stdout] test mesh_profile_extrude::tests::triangle_count ... ok [INFO] [stdout] test mesh_progressive::tests::refine_lod_empty_when_same_level ... ok [INFO] [stdout] test mesh_profile_extrude::tests::square_extrude_vertex_count ... ok [INFO] [stdout] test mesh_profile_extrude::tests::two_point_profile ... ok [INFO] [stdout] test mesh_progressive::tests::max_error_stops_collapses ... ok [INFO] [stdout] test mesh_progressive::tests::extract_lod_level_returns_fewer_verts ... ok [INFO] [stdout] test mesh_progressive::tests::all_resulting_indices_in_range ... ok [INFO] [stdout] test mesh_progressive::tests::collapse_error_sequence_non_negative ... ok [INFO] [stdout] test mesh_progressive::tests::empty_input_returns_empty_pm ... ok [INFO] [stdout] test mesh_progressive_mesh::tests::test_coarsen_decreases_level ... ok [INFO] [stdout] test mesh_progressive::tests::extract_lod_ratio_half_returns_fewer ... ok [INFO] [stdout] test mesh_progressive_mesh::tests::test_current_vertex_count ... ok [INFO] [stdout] test mesh_progressive_mesh::tests::test_push_split ... ok [INFO] [stdout] test mesh_progressive_mesh::tests::test_quadric_error_same_point ... ok [INFO] [stdout] test mesh_progressive_mesh::tests::test_sort_splits_by_error ... ok [INFO] [stdout] test mesh_project_curve::tests::test_arc_length_straight_line ... ok [INFO] [stdout] test mesh_project_curve::tests::test_curve3d_is_empty ... ok [INFO] [stdout] test mesh_project_curve::tests::test_dist3 ... ok [INFO] [stdout] test mesh_progressive_mesh::tests::test_filter_splits_by_threshold ... ok [INFO] [stdout] test mesh_project_curve::tests::test_arc_length_zero_for_single_point ... ok [INFO] [stdout] test mesh_project_curve::tests::test_resample_count ... ok [INFO] [stdout] test mesh_project_curve::tests::test_project_curve_empty_mesh ... ok [INFO] [stdout] test mesh_projection::tests::barycentric_to_point_roundtrip ... ok [INFO] [stdout] test mesh_progressive_mesh::tests::test_refine_increases_level ... ok [INFO] [stdout] test mesh_projection::tests::compute_barycentric_at_vertex ... ok [INFO] [stdout] test mesh_projection::tests::interpolate_uv_center ... ok [INFO] [stdout] test mesh_project_curve::tests::test_resample_preserves_start ... ok [INFO] [stdout] test mesh_projection::tests::barycentric_coords_sum_to_one ... ok [INFO] [stdout] test mesh_projection::tests::project_point_on_triangle_surface ... ok [INFO] [stdout] test mesh_project_curve::tests::test_curve3d_len ... ok [INFO] [stdout] test mesh_projection::tests::project_point_to_mesh_finds_face ... ok [INFO] [stdout] test mesh_progressive_mesh::tests::test_new_progressive_mesh ... ok [INFO] [stdout] test mesh_projection::tests::project_along_axis_returns_same_count ... ok [INFO] [stdout] test mesh_projection::tests::project_mesh_onto_mesh_count ... ok [INFO] [stdout] test mesh_projection::tests::project_point_above_triangle ... ok [INFO] [stdout] test mesh_progressive::tests::refine_lod_slice_count_correct ... ok [INFO] [stdout] test mesh_progressive::tests::progressive_lod_levels_count_matches ... ok [INFO] [stdout] test mesh_progressive_mesh::tests::test_coarsen_clamps_at_zero ... ok [INFO] [stdout] test mesh_projection::tests::project_point_to_mesh_empty ... ok [INFO] [stdout] test mesh_projection::tests::shrink_wrap_blend_zero_is_identity ... ok [INFO] [stdout] test mesh_projection::tests::snap_to_surface_ignores_far_vertex ... ok [INFO] [stdout] test mesh_progressive_mesh::tests::test_min_error_split_empty ... ok [INFO] [stdout] test mesh_projection::tests::snap_to_surface_snaps_close_vertex ... ok [INFO] [stdout] test mesh_projection::tests::shrink_wrap_blend_one_projects_to_surface ... ok [INFO] [stdout] test mesh_projection::tests::transfer_attributes_returns_one_per_target_vert ... ok [INFO] [stdout] test mesh_projective_plane::tests::klein_has_vertices ... ok [INFO] [stdout] test mesh_projective_plane::tests::expected_counts_correct ... ok [INFO] [stdout] test mesh_progressive::tests::min_vertices_respected ... ok [INFO] [stdout] test mesh_projective_plane::tests::uvs_match ... ok [INFO] [stdout] test mesh_projective_plane::tests::klein_has_triangles ... ok [INFO] [stdout] test mesh_projective_plane::tests::normals_match ... ok [INFO] [stdout] test mesh_projective_plane::tests::validate_ok ... ok [INFO] [stdout] test mesh_projective_plane::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_projective_plane::tests::validate_bad_scale ... ok [INFO] [stdout] test mesh_property_layer::tests::get_property_missing_layer_none ... ok [INFO] [stdout] test mesh_projective_plane::tests::klein_point_not_origin ... ok [INFO] [stdout] test mesh_property_layer::tests::new_set_empty ... ok [INFO] [stdout] test mesh_project_curve::tests::test_project_returns_one_per_point ... ok [INFO] [stdout] test mesh_property_layer::tests::set_and_get_property ... ok [INFO] [stdout] test mesh_property_layer::tests::get_default_value ... ok [INFO] [stdout] test mesh_proximity_deform::tests::test_new_proximity_deformer ... ok [INFO] [stdout] test mesh_property_layer::tests::min_max_correct ... ok [INFO] [stdout] test mesh_property_layer::tests::reset_layer_to_default ... ok [INFO] [stdout] test mesh_proximity_deform::tests::test_proximity_count_influenced ... ok [INFO] [stdout] test mesh_property_layer::tests::add_layer_and_count ... ok [INFO] [stdout] test mesh_ptex::tests::test_empty_texture ... ok [INFO] [stdout] test mesh_property_layer::tests::remove_layer_works ... ok [INFO] [stdout] test mesh_proximity_deform::tests::test_proximity_deform_vertex ... ok [INFO] [stdout] test mesh_property_layer::tests::set_out_of_bounds_returns_false ... ok [INFO] [stdout] test mesh_proximity_deform::tests::test_proximity_influence_at_source ... ok [INFO] [stdout] test mesh_proximity_deform::tests::test_proximity_influence_beyond_radius ... ok [INFO] [stdout] test mesh_proximity_deform::tests::test_proximity_nearest_distance_zero ... ok [INFO] [stdout] test mesh_ptex::tests::test_res_u_v ... ok [INFO] [stdout] test mesh_ptex::tests::test_sample_clamped ... ok [INFO] [stdout] test mesh_push_pull::tests::test_clamp_positions ... ok [INFO] [stdout] test mesh_push_pull::tests::test_pull_along_normal ... ok [INFO] [stdout] test mesh_push_pull::tests::test_push_pull_magnitude ... ok [INFO] [stdout] test mesh_push_pull::tests::test_push_all ... ok [INFO] [stdout] test mesh_push_pull::tests::test_push_along_normal ... ok [INFO] [stdout] test mesh_push_pull::tests::test_zero_normal_skipped ... ok [INFO] [stdout] test mesh_ptex::tests::test_sample_in_bounds ... ok [INFO] [stdout] test mesh_push_pull::tests::test_unmasked_vertex_unchanged ... ok [INFO] [stdout] test mesh_ptex::tests::test_total_texels ... ok [INFO] [stdout] test mesh_qem_simplify::tests::qem_face_count_consistent ... ok [INFO] [stdout] test mesh_ptex::tests::test_face_data_fill ... ok [INFO] [stdout] test mesh_push_pull::tests::test_selected_vertex_count ... ok [INFO] [stdout] test mesh_ptex::tests::test_ptex_texture_face_count ... ok [INFO] [stdout] test mesh_qem_simplify::tests::build_vertex_quadrics_count ... ok [INFO] [stdout] test mesh_ptex::tests::test_ptex_texture_total_texels ... ok [INFO] [stdout] test mesh_qem_simplify::tests::qem_result_indices_valid ... ok [INFO] [stdout] test mesh_qem_simplify::tests::quadric_add_doubles ... ok [INFO] [stdout] test mesh_quad_dominant::tests::empty_faces_ratio ... ok [INFO] [stdout] test mesh_qem_simplify::tests::edge_collapse_cost_nonneg ... ok [INFO] [stdout] test mesh_quad_dominant::tests::grid_all_quads ... ok [INFO] [stdout] test mesh_quad_dominant::tests::grid_vertex_count ... ok [INFO] [stdout] test mesh_quad_dominant::tests::json_contains_quads ... ok [INFO] [stdout] test mesh_quad_dominant::tests::json_contains_tris_zero ... ok [INFO] [stdout] test mesh_qem_simplify::tests::qem_simplify_reduces_faces ... ok [INFO] [stdout] test mesh_qem_simplify::tests::qem_vertex_count_consistent ... ok [INFO] [stdout] test mesh_qem_simplify::tests::quadric_from_plane_evaluates_on_plane ... ok [INFO] [stdout] test mesh_quad_dominant::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_quad_dominant::tests::mixed_mesh ... ok [INFO] [stdout] test mesh_quad_dominant::tests::quad_ratio_full ... ok [INFO] [stdout] test mesh_quad_dominant::tests::triangulate_doubles_faces ... ok [INFO] [stdout] test mesh_quad_dominant::tests::triangulate_tri_passthrough ... ok [INFO] [stdout] test mesh_quad_mesh::tests::centroid_near_center ... ok [INFO] [stdout] test mesh_quad_mesh::tests::empty_centroid ... ok [INFO] [stdout] test mesh_quad_mesh::tests::face_count ... ok [INFO] [stdout] test mesh_quad_mesh::tests::flip_winding_reverses ... ok [INFO] [stdout] test mesh_quad_mesh::tests::indices_valid ... ok [INFO] [stdout] test mesh_quad_mesh::tests::tris_count ... ok [INFO] [stdout] test mesh_quad_mesh::tests::tris_divisible_by_three ... ok [INFO] [stdout] test mesh_quad_mesh::tests::vertex_count ... ok [INFO] [stdout] test mesh_quad_strip::tests::test_new_quad_strip ... ok [INFO] [stdout] test mesh_quad_strip::tests::test_quad_count ... ok [INFO] [stdout] test mesh_quad_strip::tests::test_quad_strip_from_path ... ok [INFO] [stdout] test mesh_quad_strip::tests::test_quad_strip_normals ... ok [INFO] [stdout] test mesh_quad_strip::tests::test_quad_strip_uvs ... ok [INFO] [stdout] test mesh_quad_strip::tests::test_quad_strip_vertex_count ... ok [INFO] [stdout] test mesh_quad_strip::tests::test_single_point_strip ... ok [INFO] [stdout] test mesh_quad_to_tri::tests::choose_diagonal_02_shorter ... ok [INFO] [stdout] test mesh_quad_to_tri::tests::positions_preserved ... ok [INFO] [stdout] test mesh_quad_mesh::tests::json_contains_quads ... ok [INFO] [stdout] test mesh_quad_to_tri::tests::total_area_unit_quad ... ok [INFO] [stdout] test mesh_quad_to_tri::tests::empty_quads_empty_result ... ok [INFO] [stdout] test mesh_quad_mesh::tests::scale_doubles ... ok [INFO] [stdout] test mesh_quad_strip::tests::test_empty_strip ... ok [INFO] [stdout] test mesh_quad_to_tri::tests::quad_buffer_to_triangles_two_tris ... ok [INFO] [stdout] test mesh_quad_strip::tests::test_quad_strip_area ... ok [INFO] [stdout] test mesh_quad_to_tri::tests::multiple_quads ... ok [INFO] [stdout] test mesh_quad_strip::tests::test_to_triangles ... ok [INFO] [stdout] test mesh_quad_to_tri::tests::original_quad_count_correct ... ok [INFO] [stdout] test mesh_quad_to_tri::tests::result_indices_valid_check ... ok [INFO] [stdout] test mesh_quad_to_tri::tests::single_quad_to_two_tris ... ok [INFO] [stdout] test mesh_quads_to_tris::tests::test_mixed_to_tris_quad ... ok [INFO] [stdout] test mesh_quads_to_tris::tests::test_mixed_to_tris_tri ... ok [INFO] [stdout] test mesh_quads_to_tris::tests::test_split_quad_diagonal01 ... ok [INFO] [stdout] test mesh_quads_to_tris::tests::test_tri_index_count ... ok [INFO] [stdout] test mesh_quads_to_tris::tests::test_triangle_count_from_quads ... ok [INFO] [stdout] test mesh_quads_to_tris::tests::test_validate_quad_input ... ok [INFO] [stdout] test mesh_ray_cast::tests::closest_face_returned ... ok [INFO] [stdout] test mesh_ray_cast::tests::behind_ray_no_hit ... ok [INFO] [stdout] test mesh_ray_cast::tests::hit_count_zero ... ok [INFO] [stdout] test mesh_ray_cast::tests::empty_mesh_no_hit ... ok [INFO] [stdout] test mesh_ray_cast::tests::hits_triangle_center ... ok [INFO] [stdout] test mesh_ray_cast::tests::normalize_unit_length ... ok [INFO] [stdout] test mesh_ray_cast::tests::misses_outside ... ok [INFO] [stdout] test mesh_ray_cast::tests::ray_at_correct ... ok [INFO] [stdout] test mesh_raycast::tests::test_hit_front_face ... ok [INFO] [stdout] test mesh_raycast::tests::test_behind_ray_miss ... ok [INFO] [stdout] test mesh_raycast::tests::test_hit_point ... ok [INFO] [stdout] test mesh_raycast::tests::test_hit_to_json ... ok [INFO] [stdout] test mesh_raycast::tests::test_miss_parallel ... ok [INFO] [stdout] test mesh_raycast::tests::test_ray_direction ... ok [INFO] [stdout] test mesh_raycast::tests::test_raycast_all_count ... ok [INFO] [stdout] test mesh_raycast::tests::test_t_value ... ok [INFO] [stdout] test mesh_recalc_normals::tests::test_angle_weighted_normals_count ... ok [INFO] [stdout] test mesh_recalc_normals::tests::test_compute_face_normals_z ... ok [INFO] [stdout] test mesh_recalc_normals::tests::test_average_face_normal ... ok [INFO] [stdout] test mesh_recalc_normals::tests::test_normal_deviation_perpendicular ... ok [INFO] [stdout] test mesh_recalc_normals::tests::test_compute_vertex_normals_count ... ok [INFO] [stdout] test mesh_recalc_normals::tests::test_recalc_normals ... ok [INFO] [stdout] test mesh_recalc_normals::tests::test_smooth_normals_recalc ... ok [INFO] [stdout] test mesh_recalc_normals::tests::test_normal_deviation_same ... ok [INFO] [stdout] test mesh_relax_tool::tests::test_displacement_magnitudes_len ... ok [INFO] [stdout] test mesh_relax_tool::tests::test_laplacian_step ... ok [INFO] [stdout] test mesh_relax_tool::tests::test_mean_displacement_zero ... ok [INFO] [stdout] test mesh_relax_tool::tests::test_no_pins ... ok [INFO] [stdout] test mesh_relax_tool::tests::test_pin_isolated ... ok [INFO] [stdout] test mesh_relax_tool::tests::test_relax_in_sphere_count ... ok [INFO] [stdout] test mesh_relax_tool::tests::test_relax_mesh_count ... ok [INFO] [stdout] test mesh_relax_tool::tests::test_taubin_relax_count ... ok [INFO] [stdout] test mesh_relax_uv::tests::test_boundary_vertex_unchanged ... ok [INFO] [stdout] test mesh_relax_uv::tests::test_build_uv_adjacency_size ... ok [INFO] [stdout] test mesh_relax_uv::tests::test_max_uv_displacement_identity ... ok [INFO] [stdout] test mesh_relax_uv::tests::test_relax_moves_interior ... ok [INFO] [stdout] test mesh_relax_uv::tests::test_relax_step_output_size ... ok [INFO] [stdout] test mesh_relax_uv::tests::test_uvs_in_range_false ... ok [INFO] [stdout] test mesh_quads_to_tris::tests::test_default_split_mode ... ok [INFO] [stdout] test mesh_quad_to_tri::tests::triangle_area_unit_right_triangle ... ok [INFO] [stdout] test mesh_relax_uv::tests::test_relax_zero_iterations ... ok [INFO] [stdout] test mesh_quads_to_tris::tests::test_quads_to_tris_count ... ok [INFO] [stdout] test mesh_relaxation::tests::adjacency_non_empty ... ok [INFO] [stdout] test mesh_ray_cast::tests::triangle_intersect_direct ... ok [INFO] [stdout] test mesh_relax_tool::tests::test_build_adjacency ... ok [INFO] [stdout] test mesh_relax_uv::tests::test_uvs_in_range_true ... ok [INFO] [stdout] test mesh_ray_cast::tests::hit_count_one ... ok [INFO] [stdout] test mesh_raycast::tests::test_raycast_finds_hit ... ok [INFO] [stdout] test mesh_raycast::tests::test_uv_valid ... ok [INFO] [stdout] test mesh_relaxation::tests::factor_zero_no_move ... ok [INFO] [stdout] test mesh_relaxation::tests::iterations_stored ... ok [INFO] [stdout] test mesh_relaxation::tests::zero_iterations_no_change ... ok [INFO] [stdout] test mesh_remesh::tests::test_adaptive_target_length ... ok [INFO] [stdout] test mesh_remesh::tests::test_compute_target_edge_length ... ok [INFO] [stdout] test mesh_remesh::tests::test_compute_target_edge_length_empty ... ok [INFO] [stdout] test mesh_remesh::tests::test_count_irregular_vertices ... ok [INFO] [stdout] test mesh_remesh::tests::test_default_config ... ok [INFO] [stdout] test mesh_remesh::tests::test_edge_lengths_stats_empty ... ok [INFO] [stdout] test mesh_remesh::tests::test_edge_lengths_stats_simple ... ok [INFO] [stdout] test mesh_relaxation::tests::avg_displacement_nonnegative ... ok [INFO] [stdout] test mesh_relaxation::tests::displacement_same_zero ... ok [INFO] [stdout] test mesh_relaxation::tests::empty_positions ... ok [INFO] [stdout] test mesh_remesh::tests::test_equalize_valence ... ok [INFO] [stdout] test mesh_relaxation::tests::relaxation_runs ... ok [INFO] [stdout] test mesh_remesh::tests::test_collapse_short_edges ... ok [INFO] [stdout] test mesh_relaxation::tests::json_has_vertices ... ok [INFO] [stdout] test mesh_relaxation::tests::step_produces_same_size ... ok [INFO] [stdout] test mesh_remesh::tests::test_split_long_edges ... ok [INFO] [stdout] test mesh_remesh::tests::test_split_long_edges_no_split ... ok [INFO] [stdout] test mesh_remesh::tests::test_remesh_quality_score ... ok [INFO] [stdout] test mesh_remesh_adaptive::tests::adaptive_target_curved ... ok [INFO] [stdout] test mesh_remesh::tests::test_tangential_smooth ... ok [INFO] [stdout] test mesh_remesh::tests::test_isotropic_remesh_runs ... ok [INFO] [stdout] test mesh_remesh::tests::test_collapse_short_edges_no_collapse ... ok [INFO] [stdout] test mesh_remesh_adaptive::tests::adaptive_target_flat ... ok [INFO] [stdout] test mesh_remesh_adaptive::tests::count_long_none ... ok [INFO] [stdout] test mesh_remesh_adaptive::tests::default_config_valid ... ok [INFO] [stdout] test mesh_remesh_adaptive::tests::remesh_returns_same ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_average_edge_length_unit_tri ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_collapse_does_not_collapse_all ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_compute_vertex_normals_remesh_unit_tri ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_edge_length_stats_empty ... ok [INFO] [stdout] test mesh_remesh_adaptive::tests::json_has_iterations ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_flip_edges_for_valence_no_panic ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_edge_length_stats_unit_tri ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_average_edge_length_empty ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_flip_edges_for_valence_returns_same_count ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_collapse_short_edges_reduces_vertices ... ok [INFO] [stdout] test mesh_remesh_adaptive::tests::avg_edge_length_unit ... ok [INFO] [stdout] test mesh_remesh_adaptive::tests::count_short_none ... ok [INFO] [stdout] test mesh_remesh_adaptive::tests::edge_count ... ok [INFO] [stdout] test mesh_poisson_recon::tests::poisson_sphere_produces_closed_mesh ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_tangential_relaxation_moves_interior ... ok [INFO] [stdout] test mesh_repair_advanced::tests::fill_hole_fan_produces_valid_indices ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_isotropic_remesh_no_panic ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_split_long_edges_increases_vertices ... ok [INFO] [stdout] test mesh_repair_advanced::tests::fill_hole_smooth_adds_centroid_vertex ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_tangential_relaxation_no_nan ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_split_long_edges_no_split_needed ... ok [INFO] [stdout] test mesh_remesh_isotropic::tests::test_isotropic_remesh_no_nan ... ok [INFO] [stdout] test mesh_remesh_adaptive::tests::edge_length_known ... ok [INFO] [stdout] test mesh_repair_advanced::tests::find_boundary_holes_closed_mesh_returns_empty ... ok [INFO] [stdout] test mesh_repair_advanced::tests::find_boundary_holes_open_mesh_finds_one_hole ... ok [INFO] [stdout] test mesh_repair_advanced::tests::find_t_junctions_detects_midpoint_junction ... ok [INFO] [stdout] test mesh_repair_advanced::tests::find_t_junctions_no_tjunctions_on_clean_mesh ... ok [INFO] [stdout] test mesh_repair_advanced::tests::is_manifold_open_mesh_returns_true_boundary_ok ... ok [INFO] [stdout] test mesh_repair_advanced::tests::is_manifold_closed_mesh_returns_true ... ok [INFO] [stdout] test mesh_repair_advanced::tests::find_boundary_holes_open_mesh_hole_has_correct_vertices ... ok [INFO] [stdout] test mesh_repair_advanced::tests::is_manifold_non_manifold_edge_returns_false ... ok [INFO] [stdout] test mesh_repair_advanced::tests::repair_mesh_advanced_no_fill_keeps_same_faces ... ok [INFO] [stdout] test mesh_repair_advanced::tests::fill_hole_fan_triangle_count ... ok [INFO] [stdout] test mesh_progressive::tests::extract_lod_ratio_zero_returns_minimum ... ok [INFO] [stdout] test mesh_repair_advanced::tests::fill_hole_smooth_triangles_form_fan ... ok [INFO] [stdout] test mesh_retopo_guide::tests::test_new_stroke ... ok [INFO] [stdout] test mesh_retopo_guide::tests::test_stroke_length ... ok [INFO] [stdout] test mesh_retopo_guide::tests::test_stroke_point_count ... ok [INFO] [stdout] test mesh_retopo_guide::tests::test_stroke_resample ... ok [INFO] [stdout] test mesh_retopo_guide::tests::test_snap_to_surface_above_plane ... ok [INFO] [stdout] test mesh_reverse_normal::tests::count_upward ... ok [INFO] [stdout] test mesh_reverse_normal::tests::flip_winding_reverses ... ok [INFO] [stdout] test mesh_reverse_normal::tests::reverse_all ... ok [INFO] [stdout] test mesh_reverse_normal::tests::reverse_selected ... ok [INFO] [stdout] test mesh_reverse_normal::tests::unit_check_fails_on_zero ... ok [INFO] [stdout] test mesh_revolution_surface::tests::test_revolution_empty_on_zero_steps ... ok [INFO] [stdout] test mesh_retopo_guide::tests::test_snap_to_surface_on_plane ... ok [INFO] [stdout] test mesh_reverse_normal::tests::double_reverse_identity ... ok [INFO] [stdout] test mesh_reverse_normal::tests::face_normals_unit ... ok [INFO] [stdout] test mesh_repair_advanced::tests::repair_mesh_advanced_open_mesh_fills_hole ... ok [INFO] [stdout] test mesh_revolution_surface::tests::test_revolution_surface_area_positive ... ok [INFO] [stdout] test mesh_reverse_normal::tests::face_normal_z ... ok [INFO] [stdout] test mesh_reverse_normal::tests::empty_normals ... ok [INFO] [stdout] test mesh_revolution_surface::tests::test_revolution_tri_count ... ok [INFO] [stdout] test mesh_reverse_normal::tests::json_has_count ... ok [INFO] [stdout] test mesh_revolution_surface::tests::test_revolution_profile_len_stored ... ok [INFO] [stdout] test mesh_revolution_surface::tests::test_revolution_half_turn ... ok [INFO] [stdout] test mesh_revolution_surface::tests::test_revolution_vertex_count ... ok [INFO] [stdout] test mesh_revolution_surface::tests::test_validate_revolution_surface ... ok [INFO] [stdout] test mesh_revolution_surface::tests::test_revolution_empty_on_too_short ... ok [INFO] [stdout] test mesh_revolve::tests::cone_profile_length ... ok [INFO] [stdout] test mesh_revolve::tests::cone_profile_tip_radius_zero ... ok [INFO] [stdout] test mesh_revolve::tests::normals_unit_length ... ok [INFO] [stdout] test mesh_revolve::tests::revolve_cylinder_vertex_count ... ok [INFO] [stdout] test mesh_revolve::tests::revolve_single_point_profile ... ok [INFO] [stdout] test mesh_revolve::tests::revolve_triangle_count_correct ... ok [INFO] [stdout] test mesh_revolve::tests::revolve_partial_angle ... ok [INFO] [stdout] test mesh_revolve::tests::revolve_empty_profile ... ok [INFO] [stdout] test mesh_revolve::tests::steps_stored ... ok [INFO] [stdout] test mesh_revolve::tests::tau_double_pi ... ok [INFO] [stdout] test mesh_rigid_body_shape::tests::approx_inertia_positive_for_nonzero_mass ... ok [INFO] [stdout] test mesh_rigid_body_shape::tests::box_shape_correct_kind ... ok [INFO] [stdout] test mesh_rigid_body_shape::tests::default_friction_is_half ... ok [INFO] [stdout] test mesh_rigid_body_shape::tests::is_static_nonzero_mass_false ... ok [INFO] [stdout] test mesh_rigid_body_shape::tests::is_static_zero_mass ... ok [INFO] [stdout] test mesh_rigid_body_shape::tests::json_contains_label ... ok [INFO] [stdout] test mesh_rigid_body_shape::tests::negative_mass_clamped_to_zero ... ok [INFO] [stdout] test mesh_rigid_body_shape::tests::shape_kind_name_convex_hull ... ok [INFO] [stdout] test mesh_rigid_body_shape::tests::sphere_shape_radius_stored ... ok [INFO] [stdout] test mesh_rip_fill::tests::boundary_valid_all_in_range ... ok [INFO] [stdout] test mesh_rip_fill::tests::boundary_valid_out_of_range ... ok [INFO] [stdout] test mesh_rip_fill::tests::duplicate_out_of_bounds_returns_same ... ok [INFO] [stdout] test mesh_rip_fill::tests::duplicate_vertex_adds_one ... ok [INFO] [stdout] test mesh_rip_fill::tests::faces_with_any_vertex_count ... ok [INFO] [stdout] test mesh_rip_fill::tests::fan_fill_three_boundary ... ok [INFO] [stdout] test mesh_rip_fill::tests::fan_fill_too_short ... ok [INFO] [stdout] test mesh_rip_fill::tests::fill_area_positive ... ok [INFO] [stdout] test mesh_rip_fill::tests::rip_fill_increases_vertices ... ok [INFO] [stdout] test mesh_rip_vertex::tests::faces_using_no_vertex_empty ... ok [INFO] [stdout] test mesh_rip_vertex::tests::faces_using_vertex_count ... ok [INFO] [stdout] test mesh_remesh::tests::test_remesh_iterations ... ok [INFO] [stdout] test mesh_rip_vertex::tests::is_boundary_vertex_out_of_bounds ... ok [INFO] [stdout] test mesh_rip_vertex::tests::rip_all_no_faces_returns_none ... ok [INFO] [stdout] test mesh_rip_vertex::tests::rip_out_of_bounds_returns_none ... ok [INFO] [stdout] test mesh_rip_vertex::tests::rip_all_faces_separates_vertex ... ok [INFO] [stdout] test mesh_rip_vertex::tests::rip_vertex_affected_faces ... ok [INFO] [stdout] test mesh_rip_vertex::tests::rip_vertex_creates_new_vertex ... ok [INFO] [stdout] test mesh_rip_vertex::tests::vertex_neighborhood_centroid_finite ... ok [INFO] [stdout] test mesh_rip_vertices::tests::test_rip_vertex_count_new ... ok [INFO] [stdout] test mesh_rip_vertices::tests::test_rip_creates_new_vertex ... ok [INFO] [stdout] test mesh_root_find::tests::bisect_linear ... ok [INFO] [stdout] test mesh_root_find::tests::bisect_quadratic ... ok [INFO] [stdout] test mesh_root_find::tests::bracket_check_false ... ok [INFO] [stdout] test mesh_rip_vertices::tests::test_rip_face_count_unchanged ... ok [INFO] [stdout] test mesh_root_find::tests::bracket_check_true ... ok [INFO] [stdout] test mesh_rip_vertices::tests::test_rip_is_valid_gap ... ok [INFO] [stdout] test mesh_root_find::tests::max_iter_reached ... ok [INFO] [stdout] test mesh_root_find::tests::newton_linear ... ok [INFO] [stdout] test mesh_root_find::tests::newton_sine_root ... ok [INFO] [stdout] test mesh_root_find::tests::regula_falsi_linear ... ok [INFO] [stdout] test mesh_root_find::tests::residual_at_zero ... ok [INFO] [stdout] test mesh_ruled_surface::tests::test_lerp3_endpoints ... ok [INFO] [stdout] test mesh_root_find::tests::json_has_root ... ok [INFO] [stdout] test mesh_ruled_surface::tests::test_lerp3_midpoint ... ok [INFO] [stdout] test mesh_ruled_surface::tests::test_ruled_empty_on_mismatch ... ok [INFO] [stdout] test mesh_rip_vertices::tests::test_rip_no_gap_isolated_vertex ... ok [INFO] [stdout] test mesh_ruled_surface::tests::test_ruled_empty_on_zero_divs ... ok [INFO] [stdout] test mesh_ruled_surface::tests::test_ruled_single_v_div ... ok [INFO] [stdout] test mesh_ruled_surface::tests::test_ruled_tri_count ... ok [INFO] [stdout] test mesh_ruled_surface::tests::test_ruled_u_v_counts ... ok [INFO] [stdout] test mesh_ruled_surface::tests::test_ruled_vertex_count ... ok [INFO] [stdout] test mesh_ruled_surface::tests::test_validate_ruled_surface ... ok [INFO] [stdout] test mesh_scalar_field::tests::avg_value ... ok [INFO] [stdout] test mesh_scalar_field::tests::build_field_length ... ok [INFO] [stdout] test mesh_scalar_field::tests::count_above_threshold ... ok [INFO] [stdout] test mesh_scalar_field::tests::count_below_threshold ... ok [INFO] [stdout] test mesh_scalar_field::tests::field_max_correct ... ok [INFO] [stdout] test mesh_scalar_field::tests::field_min_correct ... ok [INFO] [stdout] test mesh_scalar_field::tests::json_contains_count ... ok [INFO] [stdout] test mesh_scalar_field::tests::normalize_range ... ok [INFO] [stdout] test mesh_scalar_field::tests::sdf_sphere_center_negative ... ok [INFO] [stdout] test mesh_scale_elements::tests::test_face_centroid ... ok [INFO] [stdout] test mesh_scale_elements::tests::test_scale_edges_shrinks ... ok [INFO] [stdout] test mesh_scale_elements::tests::test_scale_edges_identity ... ok [INFO] [stdout] test mesh_scale_elements::tests::test_scale_faces_identity ... ok [INFO] [stdout] test mesh_scale_elements::tests::test_scale_faces_shrinks ... ok [INFO] [stdout] test mesh_scalar_field::tests::sine_field_range ... ok [INFO] [stdout] test mesh_scale_elements::tests::test_scale_unselected_face_unchanged ... ok [INFO] [stdout] test mesh_scatter::tests::lcg_rng_deterministic ... ok [INFO] [stdout] test mesh_scatter::tests::lcg_rng_in_range ... ok [INFO] [stdout] test mesh_scatter::tests::scatter_correct_count ... ok [INFO] [stdout] test mesh_scatter::tests::scatter_zero_count ... ok [INFO] [stdout] test mesh_scatter::tests::scatter_positions_near_mesh ... ok [INFO] [stdout] test mesh_scatter::tests::scatter_empty_mesh ... ok [INFO] [stdout] test mesh_scatter::tests::scattered_face_indices_valid ... ok [INFO] [stdout] test mesh_scatter::tests::scattered_normals_unit ... ok [INFO] [stdout] test mesh_scatter::tests::total_area_unit_square ... ok [INFO] [stdout] test mesh_scatter::tests::triangle_area_right_triangle ... ok [INFO] [stdout] test mesh_scale_elements::tests::test_selected_face_count ... ok [INFO] [stdout] test mesh_screw_helix::tests::arc_length_positive ... ok [INFO] [stdout] test mesh_screw_helix::tests::estimate_vertex_count_nonzero ... ok [INFO] [stdout] test mesh_screw_helix::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_screw_helix::tests::normals_match_positions ... ok [INFO] [stdout] test mesh_screw_helix::tests::thread_depth_positive ... ok [INFO] [stdout] test mesh_screw_helix::tests::screw_has_triangles ... ok [INFO] [stdout] test mesh_screw_helix::tests::validate_bad_radii ... ok [INFO] [stdout] test mesh_screw_helix::tests::validate_ok ... ok [INFO] [stdout] test mesh_screw_helix::tests::screw_has_vertices ... ok [INFO] [stdout] test mesh_screw_modifier::tests::axis_y_rotation ... ok [INFO] [stdout] test mesh_screw_modifier::tests::axis_z_rotation ... ok [INFO] [stdout] test mesh_screw_modifier::tests::full_rotation_uses_tau ... ok [INFO] [stdout] test mesh_screw_modifier::tests::screw_offset_applied ... ok [INFO] [stdout] test mesh_screw_modifier::tests::screw_generates_tris ... ok [INFO] [stdout] test mesh_screw_modifier::tests::screw_verts_count_matches ... ok [INFO] [stdout] test mesh_screw_modifier::tests::single_step_two_tris_per_segment ... ok [INFO] [stdout] test mesh_screw_modifier::tests::vert_count_formula ... ok [INFO] [stdout] test mesh_screw_modifier::tests::zero_angle_first_vert_unchanged ... ok [INFO] [stdout] test mesh_sdf::tests::box_sdf_centre_is_negative ... ok [INFO] [stdout] test mesh_sdf::tests::compute_sdf_unsigned_tetra ... ok [INFO] [stdout] test mesh_sdf::tests::box_sdf_surface_near_zero ... ok [INFO] [stdout] test mesh_sdf::tests::sample_sdf_constant_field ... ok [INFO] [stdout] test mesh_sdf::tests::box_sdf_outside_is_positive ... ok [INFO] [stdout] test mesh_sdf::tests::sdf_intersection_yields_max ... ok [INFO] [stdout] test mesh_sdf::tests::sdf_smooth_union_le_hard_union ... ok [INFO] [stdout] test mesh_sdf::tests::sdf_stats_negative_fraction ... ok [INFO] [stdout] test mesh_sdf::tests::sphere_sdf_centre_is_negative ... ok [INFO] [stdout] test mesh_sdf::tests::sphere_sdf_centre_value_approx_minus_radius ... ok [INFO] [stdout] test mesh_sdf::tests::sdf_union_yields_min ... ok [INFO] [stdout] test mesh_sdf::tests::smooth_min_equals_min_when_k_zero ... ok [INFO] [stdout] test mesh_sdf::tests::sdf_subtraction_sanity ... ok [INFO] [stdout] test mesh_sdf::tests::sdf_union_mismatch_returns_error ... ok [INFO] [stdout] test mesh_seam_flatten::tests::test_seam_add_pair ... ok [INFO] [stdout] test mesh_sdf::tests::sphere_sdf_outside_is_positive ... ok [INFO] [stdout] test mesh_sdf::tests::sphere_sdf_surface_near_zero ... ok [INFO] [stdout] test mesh_seam_flatten::tests::test_new_uv_seam ... ok [INFO] [stdout] test mesh_seam_flatten::tests::test_seam_boundary_length_empty ... ok [INFO] [stdout] test mesh_seam_flatten::tests::test_seam_boundary_length ... ok [INFO] [stdout] test mesh_seam_flatten::tests::test_seam_contains_vertex ... ok [INFO] [stdout] test mesh_seam_flatten::tests::test_seam_flatten_uv_returns_copy ... ok [INFO] [stdout] test mesh_sdf::tests::sdf_to_mesh_returns_valid_mesh ... ok [INFO] [stdout] test mesh_seam_mark::tests::boundary_seams_triangle ... ok [INFO] [stdout] test mesh_seam_mark::tests::clear_all ... ok [INFO] [stdout] test mesh_seam_mark::tests::count_correct ... ok [INFO] [stdout] test mesh_seam_mark::tests::duplicate_mark ... ok [INFO] [stdout] test mesh_seam_mark::tests::empty_set_not_seam ... ok [INFO] [stdout] test mesh_seam_mark::tests::interior_edge_not_seam ... ok [INFO] [stdout] test mesh_seam_mark::tests::json_has_count ... ok [INFO] [stdout] test mesh_seam_mark::tests::mark_and_check ... ok [INFO] [stdout] test mesh_seam_mark::tests::sorted_edges ... ok [INFO] [stdout] test mesh_seam_mark::tests::unmark ... ok [INFO] [stdout] test mesh_seam_mark_v2::tests::test_canonical_edge_order ... ok [INFO] [stdout] test mesh_seam_mark_v2::tests::test_clear ... ok [INFO] [stdout] test mesh_seam_mark_v2::tests::test_mark_and_check ... ok [INFO] [stdout] test mesh_seam_mark_v2::tests::test_mark_boundary_seams2 ... ok [INFO] [stdout] test mesh_seam_mark_v2::tests::test_seam_count ... ok [INFO] [stdout] test mesh_seam_mark_v2::tests::test_shared_edge_not_boundary ... ok [INFO] [stdout] test mesh_seam_mark_v2::tests::test_sorted_seams2 ... ok [INFO] [stdout] test mesh_seam_mark_v2::tests::test_unmark ... ok [INFO] [stdout] test mesh_seam_welder::tests::compute_average_normal_empty ... ok [INFO] [stdout] test mesh_seam_welder::tests::compute_average_normal_single ... ok [INFO] [stdout] test mesh_seam_welder::tests::compute_average_normal_two_cancel ... ok [INFO] [stdout] test mesh_seam_welder::tests::count_boundary_verts_empty ... ok [INFO] [stdout] test mesh_seam_welder::tests::count_boundary_verts_single_tri ... ok [INFO] [stdout] test mesh_seam_welder::tests::count_boundary_verts_two_tris_shared_edge ... ok [INFO] [stdout] test mesh_seam_welder::tests::detect_uv_islands_single_triangle ... ok [INFO] [stdout] test mesh_seam_welder::tests::find_duplicate_positions_exact ... ok [INFO] [stdout] test mesh_seam_welder::tests::find_duplicate_positions_no_dups ... ok [INFO] [stdout] test mesh_seam_welder::tests::find_seam_edges_empty ... ok [INFO] [stdout] test mesh_seam_welder::tests::project_uv_along_edge_endpoints ... ok [INFO] [stdout] test mesh_seam_welder::tests::merge_vertex_groups_single_group ... ok [INFO] [stdout] test mesh_seam_welder::tests::project_uv_along_edge_midpoint ... ok [INFO] [stdout] test mesh_seam_welder::tests::seam_boundary_length_single ... ok [INFO] [stdout] test mesh_seam_welder::tests::seam_weld_report_contains_keys ... ok [INFO] [stdout] test mesh_seam_welder::tests::weld_seams_no_duplicates ... ok [INFO] [stdout] test mesh_seam_welder::tests::weld_seams_with_duplicate_position ... ok [INFO] [stdout] test mesh_segment::tests::test_connectivity_two_components ... ok [INFO] [stdout] test mesh_segment::tests::test_assign_face_colors ... ok [INFO] [stdout] test mesh_segment::tests::test_largest_segment ... ok [INFO] [stdout] test mesh_segment::tests::test_connectivity_single_component ... ok [INFO] [stdout] test mesh_segment::tests::test_merge_small_segments ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_adjacency_empty ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_by_normal_deviation_zero_threshold ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_boundary_edges ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_by_normal_deviation_flat ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_adjacency_grid ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_by_planarity_flat ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_dispatch_connected ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_dispatch_normal_deviation ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_geodesic_dispatch ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_material_dispatch ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_stats_empty ... ok [INFO] [stdout] test mesh_segment::tests::test_segment_stats_nonempty ... ok [INFO] [stdout] test mesh_select_by_angle::tests::test_angle_between_perpendicular ... ok [INFO] [stdout] test mesh_select_by_angle::tests::test_angle_between_same ... ok [INFO] [stdout] test mesh_select_by_angle::tests::test_face_normal_up ... ok [INFO] [stdout] test mesh_select_by_angle::tests::test_select_faces_by_angle_all ... ok [INFO] [stdout] test mesh_select_by_angle::tests::test_select_faces_by_angle_none ... ok [INFO] [stdout] test mesh_select_by_angle::tests::test_select_flat_faces ... ok [INFO] [stdout] test mesh_select_linked::tests::test_count_islands_one ... ok [INFO] [stdout] test mesh_select_linked::tests::test_count_islands_two ... ok [INFO] [stdout] test mesh_select_linked::tests::test_face_shares_edge_false ... ok [INFO] [stdout] test mesh_select_linked::tests::test_face_shares_edge_true ... ok [INFO] [stdout] test mesh_select_linked::tests::test_select_linked_both_faces ... ok [INFO] [stdout] test mesh_select_linked::tests::test_select_linked_vertices ... ok [INFO] [stdout] test mesh_self_intersect::tests::test_aabbs_overlap_disjoint ... ok [INFO] [stdout] test mesh_self_intersect::tests::test_clean_mesh_no_intersections ... ok [INFO] [stdout] test mesh_self_intersect::tests::test_fraction_zero_faces ... ok [INFO] [stdout] test mesh_self_intersect::tests::test_intersecting_faces_dedup ... ok [INFO] [stdout] test mesh_self_intersect::tests::test_intersecting_faces_empty ... ok [INFO] [stdout] test mesh_self_intersect::tests::test_intersection_face_fraction_zero ... ok [INFO] [stdout] test mesh_self_intersect::tests::test_intersection_pair_count_zero ... ok [INFO] [stdout] test mesh_self_intersect::tests::test_result_is_clean_empty ... ok [INFO] [stdout] test mesh_self_intersect::tests::test_shares_vertex_detection ... ok [INFO] [stdout] test mesh_self_intersect::tests::test_manual_pair_insertion ... ok [INFO] [stdout] test mesh_shadow_mesh::tests::test_clear ... ok [INFO] [stdout] test mesh_shadow_mesh::tests::test_extrude_in_light_dir ... ok [INFO] [stdout] test mesh_shadow_mesh::tests::test_extrude_zero_length ... ok [INFO] [stdout] test mesh_shadow_mesh::tests::test_face_faces_light_false ... ok [INFO] [stdout] test mesh_shadow_mesh::tests::test_face_faces_light_true ... ok [INFO] [stdout] test mesh_shadow_mesh::tests::test_find_shadow_silhouette_edges_empty ... ok [INFO] [stdout] test mesh_shadow_mesh::tests::test_find_shadow_silhouette_edges_filter ... ok [INFO] [stdout] test mesh_shadow_mesh::tests::test_generate_shadow_volume_caps ... ok [INFO] [stdout] test mesh_shadow_mesh::tests::test_new_shadow_volume_empty ... ok [INFO] [stdout] test mesh_shadow_mesh::tests::test_total_vertex_count ... ok [INFO] [stdout] test mesh_shape_key_mix::tests::test_dominant_key ... ok [INFO] [stdout] test mesh_shape_key_mix::tests::test_mix_basis_only ... ok [INFO] [stdout] test mesh_shape_key_mix::tests::test_mix_full_weight ... ok [INFO] [stdout] test mesh_shape_key_mix::tests::test_mix_half_weight ... ok [INFO] [stdout] test mesh_shape_key_mix::tests::test_reset_all_weights ... ok [INFO] [stdout] test mesh_shape_key_mix::tests::test_set_key_weight ... ok [INFO] [stdout] test mesh_shape_key_mix::tests::test_set_key_weight_missing ... ok [INFO] [stdout] test mesh_shape_key_mix::tests::test_total_influence ... ok [INFO] [stdout] test mesh_sharp_edge::tests::empty_mesh_no_sharp ... ok [INFO] [stdout] test mesh_sharp_edge::tests::count_edges ... ok [INFO] [stdout] test mesh_sharp_edge::tests::flat_no_sharp_at_90 ... ok [INFO] [stdout] test mesh_sharp_edge::tests::json_has_threshold ... ok [INFO] [stdout] test mesh_sharp_edge::tests::max_dihedral ... ok [INFO] [stdout] test mesh_sharp_edge::tests::max_dihedral_empty ... ok [INFO] [stdout] test mesh_sharp_edge::tests::no_sharp_no_has ... ok [INFO] [stdout] test mesh_sharp_edge::tests::sharp_at_zero_threshold ... ok [INFO] [stdout] test mesh_sharp_edge::tests::sharp_vertices_unique ... ok [INFO] [stdout] test mesh_sharp_edge::tests::with_sharp_has ... ok [INFO] [stdout] test mesh_sharp_feature::tests::cube_sharp_at_90_deg ... ok [INFO] [stdout] test mesh_sharp_feature::tests::dihedral_angle_parallel_faces_zero ... ok [INFO] [stdout] test mesh_sharp_feature::tests::dihedral_angle_perpendicular_90 ... ok [INFO] [stdout] test mesh_sharp_feature::tests::face_normal_unit ... ok [INFO] [stdout] test mesh_sharp_feature::tests::is_sharp_vertex_finds_tagged ... ok [INFO] [stdout] test mesh_sharp_feature::tests::max_sharp_dihedral_above_threshold ... ok [INFO] [stdout] test mesh_sharp_feature::tests::no_sharp_at_high_threshold ... ok [INFO] [stdout] test mesh_sharp_feature::tests::sharp_feature_edge_count_consistent ... ok [INFO] [stdout] test mesh_sharp_feature::tests::sharp_feature_vertex_count_consistent ... ok [INFO] [stdout] test mesh_sharp_feature::tests::threshold_stored_in_result ... ok [INFO] [stdout] test mesh_sharp_feature_preserve::tests::dihedral_angles_finite ... ok [INFO] [stdout] test mesh_sharp_feature_preserve::tests::empty_mesh_returns_empty ... ok [INFO] [stdout] test mesh_sharp_feature_preserve::tests::fold_has_sharp_edge ... ok [INFO] [stdout] test mesh_sharp_feature_preserve::tests::is_sharp_corner_false_when_no_corners ... ok [INFO] [stdout] test mesh_sharp_feature_preserve::tests::planar_no_sharp_edges ... ok [INFO] [stdout] test mesh_sharp_feature_preserve::tests::sharp_feature_corner_count_consistent ... ok [INFO] [stdout] test mesh_sharp_feature_preserve::tests::sharp_feature_edge_count_consistent ... ok [INFO] [stdout] test mesh_sharp_feature_preserve::tests::sharp_feature_max_angle_nonneg ... ok [INFO] [stdout] test mesh_sharp_vertex::tests::duplicate_mark_not_added ... ok [INFO] [stdout] test mesh_sharp_vertex::tests::get_vertex_sharpness_returns_value ... ok [INFO] [stdout] test mesh_sharp_vertex::tests::is_sharp_returns_false_for_unmarked ... ok [INFO] [stdout] test mesh_sharp_vertex::tests::is_sharp_returns_true_for_marked ... ok [INFO] [stdout] test mesh_sharp_vertex::tests::mark_vertex_increases_count ... ok [INFO] [stdout] test mesh_sharp_vertex::tests::max_sharpness_finds_maximum ... ok [INFO] [stdout] test mesh_sharp_vertex::tests::max_sharpness_none_when_empty ... ok [INFO] [stdout] test mesh_sharp_vertex::tests::new_set_is_empty ... ok [INFO] [stdout] test mesh_sharp_vertex::tests::unmark_missing_returns_false ... ok [INFO] [stdout] test mesh_sharp_vertex::tests::unmark_returns_true_and_removes ... ok [INFO] [stdout] test mesh_shear_modifier::tests::test_new_shear_params ... ok [INFO] [stdout] test mesh_shear_modifier::tests::test_shear_area_ratio_one ... ok [INFO] [stdout] test mesh_shear_modifier::tests::test_shear_is_identity_true ... ok [INFO] [stdout] test mesh_shear_modifier::tests::test_shear_matrix_2x2_dir0 ... ok [INFO] [stdout] test mesh_shell_deform::tests::avg_displacement_symmetric ... ok [INFO] [stdout] test mesh_shell_deform::tests::default_params ... ok [INFO] [stdout] test mesh_shell_deform::tests::displacement_nonzero ... ok [INFO] [stdout] test mesh_shear_modifier::tests::test_shear_matrix_2x2_dir1 ... ok [INFO] [stdout] test mesh_shell_deform::tests::empty_shell ... ok [INFO] [stdout] test mesh_shell_deform::tests::normals_computed ... ok [INFO] [stdout] test mesh_shell_deform::tests::vertex_count_preserved ... ok [INFO] [stdout] test mesh_shell_deform::tests::max_displacement_positive ... ok [INFO] [stdout] test mesh_shell_deform::tests::json_has_vertices ... ok [INFO] [stdout] test mesh_shear_modifier::tests::test_shear_vertex_x_along_z ... ok [INFO] [stdout] test mesh_shell_deform::tests::zero_thickness_no_move ... ok [INFO] [stdout] test mesh_shell_deform::tests::large_thickness ... ok [INFO] [stdout] test mesh_signed_distance::tests::test_is_inside_returns_false_for_above ... ok [INFO] [stdout] test mesh_signed_distance::tests::test_sample_sdf_grid_size ... ok [INFO] [stdout] test mesh_signed_distance::tests::test_signed_distance_above_positive ... ok [INFO] [stdout] test mesh_signed_distance::tests::test_signed_distance_to_mesh_empty ... ok [INFO] [stdout] test mesh_signed_distance::tests::test_signed_distance_to_mesh_some ... ok [INFO] [stdout] test mesh_signed_distance::tests::test_triangle_normal_unit ... ok [INFO] [stdout] test mesh_silhouette::tests::count_matches_len ... ok [INFO] [stdout] test mesh_silhouette::tests::empty_mesh_no_silhouette ... ok [INFO] [stdout] test mesh_silhouette::tests::has_silhouette_empty ... ok [INFO] [stdout] test mesh_silhouette::tests::json_has_edges ... ok [INFO] [stdout] test mesh_silhouette::tests::silhouette_edges_positive ... ok [INFO] [stdout] test mesh_silhouette::tests::silhouette_vertices_nonempty ... ok [INFO] [stdout] test mesh_signed_distance::tests::test_sdf_gradient_nonzero ... ok [INFO] [stdout] test mesh_signed_distance::tests::test_signed_distance_below_negative ... ok [INFO] [stdout] test mesh_silhouette::tests::single_tri_has_boundary_silhouette ... ok [INFO] [stdout] test mesh_silhouette::tests::vertices_unique_sorted ... ok [INFO] [stdout] test mesh_simplicial::tests::test_add_simplex1_no_duplicate ... ok [INFO] [stdout] test mesh_simplicial::tests::test_add_simplex2_adds_edges ... ok [INFO] [stdout] test mesh_simplicial::tests::test_add_simplex2_no_duplicate_triangle ... ok [INFO] [stdout] test mesh_silhouette::tests::view_dir_zero_camera ... ok [INFO] [stdout] test mesh_silhouette::tests::view_dir_normalized ... ok [INFO] [stdout] test mesh_simplicial::tests::test_betti_0_connected ... ok [INFO] [stdout] test mesh_simplicial::tests::test_betti_0_two_components ... ok [INFO] [stdout] test mesh_simplicial::tests::test_boundary_of_edge ... ok [INFO] [stdout] test mesh_simplicial::tests::test_boundary_of_triangle_three_edges ... ok [INFO] [stdout] test mesh_simplicial::tests::test_euler_characteristic_single_triangle ... ok [INFO] [stdout] test mesh_simplicial::tests::test_dual_graph_simplex_adjacency ... ok [INFO] [stdout] test mesh_simplicial::tests::test_new_simplicial_complex ... ok [INFO] [stdout] test mesh_simplicial::tests::test_is_manifold_simplex_true ... ok [INFO] [stdout] test mesh_simplicial::tests::test_simplex1_count_and_simplex2_count ... ok [INFO] [stdout] test mesh_simplicial::tests::test_euler_characteristic_tetrahedron ... ok [INFO] [stdout] test mesh_skeleton_deform::tests::avg_displacement_nonzero ... ok [INFO] [stdout] test mesh_skeleton_deform::tests::avg_displacement_identity ... ok [INFO] [stdout] test mesh_skeleton_deform::tests::empty_positions ... ok [INFO] [stdout] test mesh_simplicial::tests::test_from_mesh_indices ... ok [INFO] [stdout] test mesh_skeleton_deform::tests::identity_transform ... ok [INFO] [stdout] test mesh_skeleton_deform::tests::no_weight_no_change ... ok [INFO] [stdout] test mesh_simplicial::tests::test_is_manifold_simplex_false ... ok [INFO] [stdout] test mesh_simplicial::tests::test_boundary_edges_simplex ... ok [INFO] [stdout] test mesh_skeleton_deform::tests::normalize_weights_sum_one ... ok [INFO] [stdout] test mesh_skeleton_deform::tests::skinned_count ... ok [INFO] [stdout] test mesh_skin_modifier::tests::test_apply_skin_returns_result ... ok [INFO] [stdout] test mesh_skin_modifier::tests::test_find_root_vertices_none ... ok [INFO] [stdout] test mesh_skin_modifier::tests::test_skin_vertex_area ... ok [INFO] [stdout] test mesh_skin_modifier::tests::test_skin_vertex_as_root ... ok [INFO] [stdout] test mesh_skin_modifier::tests::test_estimate_skin_vertex_count ... ok [INFO] [stdout] test mesh_skin_modifier::tests::test_validate_skin_input_oob_edge ... ok [INFO] [stdout] test mesh_skeleton_deform::tests::translate_bone ... ok [INFO] [stdout] test mesh_skin_weights::tests::bone_heat_at_center ... ok [INFO] [stdout] test mesh_skin_modifier::tests::test_validate_skin_input_valid ... ok [INFO] [stdout] test mesh_skin_weights::tests::bone_heat_at_radius_is_zero ... ok [INFO] [stdout] test mesh_skin_weights::tests::bone_heat_beyond_radius_is_zero ... ok [INFO] [stdout] test mesh_skin_weights::tests::bone_heat_gaussian_falloff_center ... ok [INFO] [stdout] test mesh_skin_weights::tests::bone_heat_quadratic_falloff ... ok [INFO] [stdout] test mesh_skin_weights::tests::bone_heat_linear_falloff ... ok [INFO] [stdout] test mesh_skin_modifier::tests::test_validate_skin_input_empty ... ok [INFO] [stdout] test mesh_skin_modifier::tests::test_find_root_vertices_one ... ok [INFO] [stdout] test mesh_skin_weights::tests::compute_auto_skin_weights_bone_count ... ok [INFO] [stdout] test mesh_skeleton_deform::tests::json_has_bones ... ok [INFO] [stdout] test mesh_skin_weights::tests::compute_auto_skin_weights_shape ... ok [INFO] [stdout] test mesh_skeleton_deform::tests::identity_no_displacement ... ok [INFO] [stdout] test mesh_skinned_animation::tests::test_keyframe_before_returns_correct ... ok [INFO] [stdout] test mesh_skin_weights::tests::compute_auto_skin_weights_vertex_count ... ok [INFO] [stdout] test mesh_skin_weights::tests::dominant_bone_argmax ... ok [INFO] [stdout] test mesh_skin_weights::tests::max_influences_per_vertex_counts ... ok [INFO] [stdout] test mesh_skin_weights::tests::normalize_skin_weights_all_zero_uniform ... ok [INFO] [stdout] test mesh_skinned_animation::tests::test_lerp_mat4_at_one ... ok [INFO] [stdout] test mesh_skin_weights::tests::normalize_skin_weights_sums_to_one ... ok [INFO] [stdout] test mesh_skin_weights::tests::prune_small_weights_removes_tiny ... ok [INFO] [stdout] test mesh_skinned_animation::tests::test_duration_empty ... ok [INFO] [stdout] test mesh_skinned_animation::tests::test_duration_last_frame ... ok [INFO] [stdout] test mesh_skinned_animation::tests::test_lerp_mat4_at_zero ... ok [INFO] [stdout] test mesh_skinned_animation::tests::test_mat4_translation_identity ... ok [INFO] [stdout] test mesh_skinned_animation::tests::test_identity_mat4_diagonal ... ok [INFO] [stdout] test mesh_skinned_animation::tests::test_new_sequence_empty ... ok [INFO] [stdout] test mesh_skinned_surface::tests::test_chord_length_params_empty ... ok [INFO] [stdout] test mesh_skinned_surface::tests::test_chord_length_params_length ... ok [INFO] [stdout] test mesh_skinned_surface::tests::test_skinned_empty_on_single_profile ... ok [INFO] [stdout] test mesh_skinned_surface::tests::test_skinned_tri_count ... ok [INFO] [stdout] test mesh_skinned_surface::tests::test_skinned_profile_count ... ok [INFO] [stdout] test mesh_skinned_surface::tests::test_skinned_vertex_count ... ok [INFO] [stdout] test mesh_skinned_surface::tests::test_validate_skinned_surface ... ok [INFO] [stdout] test mesh_slice::tests::circumference_outside_mesh_is_zero ... ok [INFO] [stdout] test mesh_skin_modifier::tests::test_skin_vertex_new ... ok [INFO] [stdout] test mesh_slice::tests::edge_plane_intersect_three_quarter ... ok [INFO] [stdout] test mesh_slice::tests::cross_section_bbox_3d ... ok [INFO] [stdout] test mesh_slice::tests::cross_section_centroid ... ok [INFO] [stdout] test mesh_slice::tests::slice_mesh_no_intersection ... ok [INFO] [stdout] test mesh_slice::tests::slice_mesh_straddling_triangle ... ok [INFO] [stdout] test mesh_slice::tests::slice_plane_at_height ... ok [INFO] [stdout] test mesh_slice::tests::slice_plane_presets ... ok [INFO] [stdout] test mesh_slice::tests::slice_plane_signed_distance_below ... ok [INFO] [stdout] test mesh_slice::tests::slice_plane_signed_distance_on_plane ... ok [INFO] [stdout] test mesh_slice::tests::to_2d_preserves_count ... ok [INFO] [stdout] test mesh_skinned_animation::tests::test_push_keyframe ... ok [INFO] [stdout] test mesh_skinned_animation::tests::test_validate_sequence_valid ... ok [INFO] [stdout] test mesh_skinned_surface::tests::test_chord_length_params_endpoints ... ok [INFO] [stdout] test mesh_skinned_surface::tests::test_skinned_empty_on_mismatch ... ok [INFO] [stdout] test mesh_slice::tests::width_profile_nonzero_at_valid_heights ... ok [INFO] [stdout] test mesh_slice_plane::tests::test_classify_vertices_signs ... ok [INFO] [stdout] test mesh_slice_plane::tests::test_normalize_zero_vec ... ok [INFO] [stdout] test mesh_slice_plane::tests::test_edge_intersect_midpoint ... ok [INFO] [stdout] test mesh_slice_plane::tests::test_count_per_side ... ok [INFO] [stdout] test mesh_slice_plane::tests::test_plane_distance_on ... ok [INFO] [stdout] test mesh_slice_plane::tests::test_plane_distance_below ... ok [INFO] [stdout] test mesh_slice_plane::tests::test_slice_empty_mesh ... ok [INFO] [stdout] test mesh_slice_plane::tests::test_slice_separates_triangles ... ok [INFO] [stdout] test mesh_slice_stack::tests::contour_bounds_nonempty ... ok [INFO] [stdout] test mesh_slice_stack::tests::edge_z_intersect_midpoint ... ok [INFO] [stdout] test mesh_slice_stack::tests::edge_z_intersect_none_outside ... ok [INFO] [stdout] test mesh_slice::tests::ray_plane_intersect_parallel_misses ... ok [INFO] [stdout] test mesh_slice_stack::tests::slice_above_has_no_points ... ok [INFO] [stdout] test mesh_slice_stack::tests::slice_middle_has_points ... ok [INFO] [stdout] test mesh_slice_plane::tests::test_plane_distance_above ... ok [INFO] [stdout] test mesh_slice_stack::tests::uniform_z_heights_count ... ok [INFO] [stdout] test mesh_slice_stack::tests::uniform_z_heights_single ... ok [INFO] [stdout] test mesh_slice_stack::tests::slice_stack_contour_count ... ok [INFO] [stdout] test mesh_slice_stack::tests::total_contour_points_sum ... ok [INFO] [stdout] test mesh_smooth_color::tests::adjacency_symmetric ... ok [INFO] [stdout] test mesh_smooth_color::tests::average_color_uniform ... ok [INFO] [stdout] test mesh_smooth_color::tests::colors_in_range_false ... ok [INFO] [stdout] test mesh_smooth_color::tests::clamp_colors_in_range ... ok [INFO] [stdout] test mesh_smooth_color::tests::colors_in_range_true ... ok [INFO] [stdout] test mesh_smooth_color::tests::smooth_empty_colors ... ok [INFO] [stdout] test mesh_smooth_color::tests::smooth_preserves_count ... ok [INFO] [stdout] test mesh_smooth_color::tests::smooth_reduces_variance ... ok [INFO] [stdout] test mesh_smooth_color::tests::smooth_zero_iterations_unchanged ... ok [INFO] [stdout] test mesh_smooth_color::tests::smooth_zero_factor_unchanged ... ok [INFO] [stdout] test mesh_smooth_modifier::tests::test_smooth_cotangent_weight ... ok [INFO] [stdout] test mesh_smooth_modifier::tests::test_smooth_laplacian_no_neighbors ... ok [INFO] [stdout] test mesh_smooth_modifier::tests::test_smooth_laplacian_factor_one ... ok [INFO] [stdout] test mesh_smooth_modifier::tests::test_smooth_mesh_pass_moves_toward_neighbors ... ok [INFO] [stdout] test mesh_smooth_modifier::tests::test_smooth_laplacian_factor_zero ... ok [INFO] [stdout] test mesh_smooth_modifier::tests::test_smooth_passes_idempotent ... ok [INFO] [stdout] test mesh_smooth_vertex::tests::test_max_displacement_empty ... ok [INFO] [stdout] test mesh_slice_stack::tests::non_empty_contour_count_cube ... ok [INFO] [stdout] test mesh_smooth_vertex::tests::test_max_displacement ... ok [INFO] [stdout] test mesh_smooth_vertex::tests::test_build_adjacency_size ... ok [INFO] [stdout] test mesh_smooth_vertex::tests::test_smooth_n_zero_iterations ... ok [INFO] [stdout] test mesh_smooth_vertex::tests::test_smooth_displacement_nonzero ... ok [INFO] [stdout] test mesh_smooth_vertex::tests::test_smooth_step_output_size ... ok [INFO] [stdout] test mesh_smooth_vertex::tests::test_smooth_displacement_zero_no_change ... ok [INFO] [stdout] test mesh_smooth_weight::tests::average_weight_basic ... ok [INFO] [stdout] test mesh_slice::tests::cross_section_area_unit_square ... ok [INFO] [stdout] test mesh_slice::tests::circumference_at_equator_is_positive ... ok [INFO] [stdout] test mesh_smooth_vertex::tests::test_smooth_n_reduces_extremes ... ok [INFO] [stdout] test mesh_smooth_weight::tests::average_weight_empty ... ok [INFO] [stdout] test mesh_smooth_weight::tests::build_adjacency_symmetry ... ok [INFO] [stdout] test mesh_smooth_weight::tests::clamp_weights_test ... ok [INFO] [stdout] test mesh_slice::tests::ray_plane_intersect_hits ... ok [INFO] [stdout] test mesh_slice::tests::slice_mesh_cube_at_midpoint ... ok [INFO] [stdout] test mesh_smooth_weight::tests::count_above_threshold_basic ... ok [INFO] [stdout] test mesh_slice::tests::edge_plane_intersect_midpoint ... ok [INFO] [stdout] test mesh_slice::tests::cross_section_perimeter_square ... ok [INFO] [stdout] test mesh_slice::tests::split_mesh_cube_at_zero ... ok [INFO] [stdout] test mesh_smooth_weight::tests::detect_boundary_finds_boundary ... ok [INFO] [stdout] test mesh_slice::tests::slice_plane_signed_distance_above ... ok [INFO] [stdout] test mesh_smooth_weight::tests::normalize_smoke ... ok [INFO] [stdout] test mesh_slice::tests::two_separate_tris_count ... ok [INFO] [stdout] test mesh_smooth_weight::tests::result_fields ... ok [INFO] [stdout] test mesh_smooth_weight::tests::smooth_keeps_uniform_unchanged ... ok [INFO] [stdout] test mesh_soft_body_goal::tests::average_empty_returns_default ... ok [INFO] [stdout] test mesh_smooth_weight::tests::smooth_reduces_peak ... ok [INFO] [stdout] test mesh_soft_body_goal::tests::average_strength_correct ... ok [INFO] [stdout] test mesh_soft_body_goal::tests::default_strength_clamped_to_one ... ok [INFO] [stdout] test mesh_soft_body_goal::tests::is_fully_pinned_partial_strength_false ... ok [INFO] [stdout] test mesh_soft_body_goal::tests::is_fully_pinned_strength_one ... ok [INFO] [stdout] test mesh_slice::tests::width_profile_length_matches_input ... ok [INFO] [stdout] test mesh_soft_body_goal::tests::new_goal_has_no_pins ... ok [INFO] [stdout] test mesh_soft_body_goal::tests::json_contains_label ... ok [INFO] [stdout] test mesh_soft_body_goal::tests::pin_vertex_increases_count ... ok [INFO] [stdout] test mesh_solidify::tests::test_default_config_positive_thickness ... ok [INFO] [stdout] test mesh_soft_body_goal::tests::pin_same_vertex_twice_does_not_duplicate ... ok [INFO] [stdout] test mesh_solidify::tests::test_find_boundary_edges_single_tri ... ok [INFO] [stdout] test mesh_solidify::tests::test_shell_thickness_accessor ... ok [INFO] [stdout] test mesh_solidify::tests::test_solidify_empty_indices ... ok [INFO] [stdout] test mesh_solidify::tests::test_solidify_doubles_vertices ... ok [INFO] [stdout] test mesh_solidify::tests::test_solidify_min_triangle_count ... ok [INFO] [stdout] test mesh_solidify::tests::test_solidify_with_rim ... ok [INFO] [stdout] test mesh_solidify::tests::test_top_shell_pos_above_original ... ok [INFO] [stdout] test mesh_sort_vertex::tests::centroid_basic ... ok [INFO] [stdout] test mesh_sort_vertex::tests::nearest_to_origin_test ... ok [INFO] [stdout] test mesh_sort_vertex::tests::sort_by_radius_is_permutation ... ok [INFO] [stdout] test mesh_sort_vertex::tests::old_to_new_permutation ... ok [INFO] [stdout] test mesh_sort_vertex::tests::sort_x_ascending ... ok [INFO] [stdout] test mesh_solidify::tests::test_solidify_rim_count_positive ... ok [INFO] [stdout] test mesh_sort_vertex::tests::sort_y_axis ... ok [INFO] [stdout] test mesh_sort_vertex::tests::sorted_axis_range_test ... ok [INFO] [stdout] test mesh_sort_vertex::tests::remap_indices_basic ... ok [INFO] [stdout] test mesh_sort_vertex::tests::empty_positions ... ok [INFO] [stdout] test mesh_span_tree::tests::empty_mesh ... ok [INFO] [stdout] test mesh_span_tree::tests::edges_from_mesh_no_duplicates ... ok [INFO] [stdout] test mesh_span_tree::tests::max_edge_not_negative ... ok [INFO] [stdout] test mesh_span_tree::tests::mst_edge_count ... ok [INFO] [stdout] test mesh_span_tree::tests::min_edge_lte_max_edge ... ok [INFO] [stdout] test mesh_span_tree::tests::mst_total_weight_positive ... ok [INFO] [stdout] test mesh_span_tree::tests::span_edge_struct ... ok [INFO] [stdout] test mesh_spectral::tests::test_build_laplacian_degree_nonzero ... ok [INFO] [stdout] test mesh_spectral::tests::test_build_laplacian_vertex_count ... ok [INFO] [stdout] test mesh_span_tree::tests::single_component ... ok [INFO] [stdout] test mesh_spectral::tests::test_default_config ... ok [INFO] [stdout] test mesh_spectral::tests::test_graph_laplacian_energy_nonneg ... ok [INFO] [stdout] test mesh_spectral::tests::test_degree_centrality_max_one ... ok [INFO] [stdout] test mesh_spectral::tests::test_laplacian_vertex_count_fn ... ok [INFO] [stdout] test mesh_spectral::tests::test_laplacian_operator_constant_null ... ok [INFO] [stdout] test mesh_spectral::tests::test_laplacian_operator_length ... ok [INFO] [stdout] test mesh_spectral::tests::test_mesh_diameter_spectral ... ok [INFO] [stdout] test mesh_spectral::tests::test_laplacian_smooth_signal_converges ... ok [INFO] [stdout] test mesh_span_tree::tests::isolated_vertices ... ok [INFO] [stdout] test mesh_spectral::tests::test_normalize_signal_empty ... ok [INFO] [stdout] test mesh_spectral::tests::test_normalize_signal_unit_variance ... ok [INFO] [stdout] test mesh_span_tree::tests::prune_removes_long ... ok [INFO] [stdout] test mesh_spectral::tests::test_normalize_signal_zero_mean ... ok [INFO] [stdout] test mesh_spectral::tests::test_power_iterate_length ... ok [INFO] [stdout] test mesh_spectral::tests::test_spectral_embedding_length ... ok [INFO] [stdout] test mesh_spectral::tests::test_spectral_partition_half_true ... ok [INFO] [stdout] test mesh_sphere::tests::test_default_config_radius ... ok [INFO] [stdout] test mesh_sphere::tests::test_indices_valid ... ok [INFO] [stdout] test mesh_spectral::tests::test_spectral_partition_length ... ok [INFO] [stdout] test mesh_sphere::tests::test_normals_are_unit ... ok [INFO] [stdout] test mesh_sphere::tests::test_surface_area_positive ... ok [INFO] [stdout] test mesh_sphere::tests::test_generate_produces_vertices ... ok [INFO] [stdout] test mesh_sphere::tests::test_normals_count_matches_positions ... ok [INFO] [stdout] test mesh_sphere::tests::test_to_json ... ok [INFO] [stdout] test mesh_sphere::tests::test_volume_positive ... ok [INFO] [stdout] test mesh_sphere_gen::tests::test_icosphere_vertex_count_1 ... ok [INFO] [stdout] test mesh_sphere_gen::tests::test_icosphere_vertex_count_0 ... ok [INFO] [stdout] test mesh_sphere_gen::tests::test_new_sphere_params ... ok [INFO] [stdout] test mesh_sphere_gen::tests::test_uv_sphere_face_count ... ok [INFO] [stdout] test mesh_sphere_gen::tests::test_uv_sphere_vertex_count ... ok [INFO] [stdout] test mesh_sphere_gen::tests::test_uv_sphere_vertex_on_surface ... ok [INFO] [stdout] test mesh_sphere_map::tests::project_equator_u_half ... ok [INFO] [stdout] test mesh_sphere_map::tests::project_zero_vector_safe ... ok [INFO] [stdout] test mesh_sphere_map::tests::project_pole_gives_finite_uv ... ok [INFO] [stdout] test mesh_sphere_map::tests::sphere_map_avg_u_in_range ... ok [INFO] [stdout] test mesh_sphere_proj::tests::mean_radius_empty ... ok [INFO] [stdout] test mesh_sphere_map::tests::sphere_map_projection_error_nonneg ... ok [INFO] [stdout] test mesh_sphere_proj::tests::pi_constant_used ... ok [INFO] [stdout] test mesh_sphere_proj::tests::mean_radius_unit_sphere ... ok [INFO] [stdout] test mesh_sphere::tests::test_uvs_in_range ... ok [INFO] [stdout] test mesh_sphere_map::tests::sphere_map_empty_default ... ok [INFO] [stdout] test mesh_sphere_proj::tests::project_mesh_smoke ... ok [INFO] [stdout] test mesh_sphere_map::tests::sphere_map_uv_count_matches ... ok [INFO] [stdout] test mesh_sphere::tests::test_vertex_count_matches ... ok [INFO] [stdout] test mesh_sphere_gen::tests::test_sphere_surface_area ... ok [INFO] [stdout] test mesh_sphere_proj::tests::cart_spherical_roundtrip ... ok [INFO] [stdout] test mesh_sphere_proj::tests::project_origin_fallback ... ok [INFO] [stdout] test mesh_sphere_proj::tests::project_to_unit_sphere ... ok [INFO] [stdout] test mesh_sphere_proj::tests::spherical_uv_in_range ... ok [INFO] [stdout] test mesh_sphere_map::tests::uvs_all_in_range ... ok [INFO] [stdout] test mesh_spin::tests::test_rotate_identity_zero_angle ... ok [INFO] [stdout] test mesh_sphere_proj::tests::angle_between_orthogonal ... ok [INFO] [stdout] test mesh_spin::tests::test_rotate_90_degrees_z ... ok [INFO] [stdout] test mesh_spin::tests::test_spin_merge_first_last ... ok [INFO] [stdout] test mesh_spin::tests::test_spin_profile_counts ... ok [INFO] [stdout] test mesh_spin::tests::test_validate_spin_config_valid ... ok [INFO] [stdout] test mesh_spring_helix::tests::arc_length_positive ... ok [INFO] [stdout] test mesh_spin::tests::test_spin_step_angle ... ok [INFO] [stdout] test mesh_spring_helix::tests::helix_spine_length ... ok [INFO] [stdout] test mesh_spin::tests::test_spin_config_default ... ok [INFO] [stdout] test mesh_spring_helix::tests::spring_has_triangles ... ok [INFO] [stdout] test mesh_spring_helix::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_spin::tests::test_spin_angle_radians ... ok [INFO] [stdout] test mesh_sphere_proj::tests::sphere_uvs_count ... ok [INFO] [stdout] test mesh_spring_helix::tests::spring_has_vertices ... ok [INFO] [stdout] test mesh_spin::tests::test_validate_spin_config_zero_steps ... ok [INFO] [stdout] test mesh_spring_helix::tests::normals_match_positions ... ok [INFO] [stdout] test mesh_spin::tests::test_spin_profile_single_vertex ... ok [INFO] [stdout] test mesh_spring_helix::tests::validate_bad_radii ... ok [INFO] [stdout] test mesh_spring_helix::tests::validate_ok ... ok [INFO] [stdout] test mesh_spring_mesh::tests::no_springs_energy_zero ... ok [INFO] [stdout] test mesh_spring_mesh::tests::pinned_vertex_unchanged ... ok [INFO] [stdout] test mesh_spring_mesh::tests::spring_energy_stretched ... ok [INFO] [stdout] test mesh_spring_mesh::tests::spring_step_moves_vertices ... ok [INFO] [stdout] test mesh_spring_mesh::tests::spring_struct_fields ... ok [INFO] [stdout] test mesh_spring_mesh::tests::springs_from_mesh_count ... ok [INFO] [stdout] test mesh_spring_net::tests::average_rest_length_reasonable ... ok [INFO] [stdout] test mesh_spring_net::tests::edge_count_helper ... ok [INFO] [stdout] test mesh_spring_net::tests::edge_indices_valid ... ok [INFO] [stdout] test mesh_spring_net::tests::edges_are_unique ... ok [INFO] [stdout] test mesh_spring_net::tests::empty_points ... ok [INFO] [stdout] test mesh_spring_net::tests::point_count_preserved ... ok [INFO] [stdout] test mesh_spring_net::tests::k_zero_no_edges ... ok [INFO] [stdout] test mesh_spring_net::tests::rest_lengths_positive ... ok [INFO] [stdout] test mesh_spring_mesh::tests::default_params ... ok [INFO] [stdout] test mesh_sprite_atlas::tests::test_default_config ... ok [INFO] [stdout] test mesh_spring_net::tests::stretch_zero_at_rest ... ok [INFO] [stdout] test mesh_sprite_atlas::tests::test_frame_ids_sequential ... ok [INFO] [stdout] test mesh_sprite_atlas::tests::test_frame_out_of_range ... ok [INFO] [stdout] test mesh_sprite_atlas::tests::test_frame_uv_center_first ... ok [INFO] [stdout] test mesh_sprite_atlas::tests::test_frame_zero_exists ... ok [INFO] [stdout] test mesh_spring_helix::tests::validate_zero_turns ... ok [INFO] [stdout] test mesh_spring_mesh::tests::max_velocity_zero_at_rest ... ok [INFO] [stdout] test mesh_spring_net::tests::single_point_no_edges ... ok [INFO] [stdout] test mesh_sprite_atlas::tests::test_single_cell_atlas ... ok [INFO] [stdout] test mesh_sprite_atlas::tests::test_cell_pixel_size ... ok [INFO] [stdout] test mesh_sprite_atlas::tests::test_uvs_in_range ... ok [INFO] [stdout] test mesh_stellated_solid::tests::test_dodecahedron_stub_validates ... ok [INFO] [stdout] test mesh_stellated_solid::tests::test_stellated_icosahedron_tri_count ... ok [INFO] [stdout] test mesh_stellated_solid::tests::test_stellated_icosahedron_vertex_count ... ok [INFO] [stdout] test mesh_spring_mesh::tests::simulate_does_not_panic ... ok [INFO] [stdout] test mesh_stellated_solid::tests::test_stellated_octahedron_base_verts ... ok [INFO] [stdout] test mesh_stellated_solid::tests::test_validate_stellated_octahedron ... ok [INFO] [stdout] test mesh_stellated_solid::tests::test_validate_stellated_icosahedron ... ok [INFO] [stdout] test mesh_stitch_seam::tests::closed_mesh_no_boundary ... ok [INFO] [stdout] test mesh_stellated_solid::tests::test_stellated_octahedron_tri_count ... ok [INFO] [stdout] test mesh_spring_mesh::tests::spring_energy_at_rest ... ok [INFO] [stdout] test mesh_sprite_atlas::tests::test_frame_count ... ok [INFO] [stdout] test mesh_sprite_atlas::tests::test_u_min_less_than_u_max ... ok [INFO] [stdout] test mesh_stellated_solid::tests::test_stellation_height_stored ... ok [INFO] [stdout] test mesh_stellated_solid::tests::test_stellations_protrude ... ok [INFO] [stdout] test mesh_stitch_seam::tests::is_closed_empty_true ... ok [INFO] [stdout] test mesh_stitch_seam::tests::find_boundary_triangle ... ok [INFO] [stdout] test mesh_stitch_seam::tests::loop_centroid_basic ... ok [INFO] [stdout] test mesh_stitch_seam::tests::loop_centroid_empty ... ok [INFO] [stdout] test mesh_stitch_seam::tests::stitch_indices_in_range ... ok [INFO] [stdout] test mesh_stitch_seam::tests::stitched_face_count_fn ... ok [INFO] [stdout] test mesh_strand_mesh::tests::default_ribbon_width ... ok [INFO] [stdout] test mesh_strand_mesh::tests::default_gen_uvs ... ok [INFO] [stdout] test mesh_strand_mesh::tests::estimate_triangle_count_formula ... ok [INFO] [stdout] test mesh_strand_mesh::tests::merge_ribbons_combines ... ok [INFO] [stdout] test mesh_strand_mesh::tests::merge_ribbons_index_offset ... ok [INFO] [stdout] test mesh_strand_mesh::tests::ribbon_triangle_count ... ok [INFO] [stdout] test mesh_stitch_seam::tests::stitch_two_quads ... ok [INFO] [stdout] test mesh_strand_mesh::tests::uv_count_matches_positions ... ok [INFO] [stdout] test mesh_stress_lines::tests::test_color_compressive ... ok [INFO] [stdout] test mesh_stress_lines::tests::test_color_tension ... ok [INFO] [stdout] test mesh_stress_lines::tests::test_is_critical ... ok [INFO] [stdout] test mesh_stitch_seam::tests::is_closed_triangle_false ... ok [INFO] [stdout] test mesh_stitch_seam::tests::loop_avg_edge_length_square ... ok [INFO] [stdout] test mesh_stroke_extrude::tests::test_stroke_area_positive ... ok [INFO] [stdout] test mesh_stroke_extrude::tests::test_new_stroke_point ... ok [INFO] [stdout] test mesh_stroke_extrude::tests::test_stroke_width_clamped ... ok [INFO] [stdout] test mesh_stress_lines::tests::test_length ... ok [INFO] [stdout] test mesh_stroke_extrude::tests::test_stroke_face_count ... ok [INFO] [stdout] test mesh_stroke_extrude::tests::test_stroke_total_length ... ok [INFO] [stdout] test mesh_stroke_path::tests::arc_length_positive ... ok [INFO] [stdout] test mesh_stroke_extrude::tests::test_stroke_vertex_count ... ok [INFO] [stdout] test mesh_stress_lines::tests::test_new_stress_line ... ok [INFO] [stdout] test mesh_strand_mesh::tests::short_spine_returns_empty ... ok [INFO] [stdout] test mesh_stroke_extrude::tests::test_stroke_extrude_quad_symmetric ... ok [INFO] [stdout] test mesh_strand_mesh::tests::ribbon_vertex_count ... ok [INFO] [stdout] test mesh_stroke_path::tests::build_smoke ... ok [INFO] [stdout] test mesh_stroke_path::tests::face_count_correct ... ok [INFO] [stdout] test mesh_stroke_path::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_stroke_path::tests::empty_stroke ... ok [INFO] [stdout] test mesh_stroke_path::tests::pi_used ... ok [INFO] [stdout] test mesh_stroke_path::tests::scale_widths ... ok [INFO] [stdout] test mesh_subdiv_loop::tests::avg_edge_length_positive ... ok [INFO] [stdout] test mesh_subdiv_loop::tests::empty_mesh ... ok [INFO] [stdout] test mesh_stroke_path::tests::single_sample_stroke ... ok [INFO] [stdout] test mesh_subdiv_loop::tests::bounding_box_grows_not ... ok [INFO] [stdout] test mesh_stroke_path::tests::uvs_in_range_test ... ok [INFO] [stdout] test mesh_subdiv_loop::tests::expected_face_count_test ... ok [INFO] [stdout] test mesh_stress_lines::tests::test_push_and_count ... ok [INFO] [stdout] test mesh_subdiv_loop::tests::one_level_face_count ... ok [INFO] [stdout] test mesh_superellipsoid::tests::spow_zero ... ok [INFO] [stdout] test mesh_subdiv_loop::tests::indices_valid_after_subdiv ... ok [INFO] [stdout] test mesh_superellipsoid::tests::triangle_count_helper ... ok [INFO] [stdout] test mesh_subdiv_loop::tests::result_levels_field ... ok [INFO] [stdout] test mesh_subdiv_loop::tests::two_level_face_count ... ok [INFO] [stdout] test mesh_superellipsoid::tests::cube_positions_finite ... ok [INFO] [stdout] test mesh_superellipsoid::tests::indices_multiple_of_three ... ok [INFO] [stdout] test mesh_superellipsoid::tests::sphere_vertex_count ... ok [INFO] [stdout] test mesh_superellipsoid::tests::spow_preserves_sign ... ok [INFO] [stdout] test mesh_subdiv_loop::tests::subdiv_step_direct ... ok [INFO] [stdout] test mesh_stroke_path::tests::midpoint_exists ... ok [INFO] [stdout] test mesh_superellipsoid::tests::all_positions_finite ... ok [INFO] [stdout] test mesh_subdiv_loop::tests::zero_levels_unchanged ... ok [INFO] [stdout] test mesh_superellipsoid::tests::index_max_within_bounds ... ok [INFO] [stdout] test mesh_superellipsoid::tests::scale_affects_positions ... ok [INFO] [stdout] test mesh_superellipsoid::tests::vertex_count_helper ... ok [INFO] [stdout] test mesh_surface_area_query::tests::test_mesh_surface_area_single_triangle ... ok [INFO] [stdout] test mesh_surface_area_query::tests::test_surface_compactness_positive ... ok [INFO] [stdout] test mesh_surface_flow::tests::test_advect_point_moves ... ok [INFO] [stdout] test mesh_surface_flow::tests::test_flow_magnitude_at ... ok [INFO] [stdout] test mesh_surface_area_query::tests::test_average_area_empty ... ok [INFO] [stdout] test mesh_surface_area_query::tests::test_largest_triangle_index ... ok [INFO] [stdout] test mesh_surface_area_query::tests::test_mesh_surface_area_empty ... ok [INFO] [stdout] test mesh_surface_area_query::tests::test_per_triangle_areas_length ... ok [INFO] [stdout] test mesh_surface_area_query::tests::test_surface_compactness_empty ... ok [INFO] [stdout] test mesh_surface_area_query::tests::test_triangle_area_degenerate ... ok [INFO] [stdout] test mesh_surface_area_query::tests::test_triangle_area_right_triangle ... ok [INFO] [stdout] test mesh_surface_flow::tests::test_flow_at_vertex_oob ... ok [INFO] [stdout] test mesh_surface_flow::tests::test_flow_direction_normalized ... ok [INFO] [stdout] test mesh_surface_flow::tests::test_set_and_get_flow_vector ... ok [INFO] [stdout] test mesh_surface_normal::tests::average_normal_unit ... ok [INFO] [stdout] test mesh_surface_normal::tests::empty_positions ... ok [INFO] [stdout] test mesh_surface_flow::tests::test_smooth_flow_field_count ... ok [INFO] [stdout] test mesh_surface_flow::tests::test_smooth_flow_preserves_direction_unit ... ok [INFO] [stdout] test mesh_surface_flow::tests::test_flow_vector_default_magnitude ... ok [INFO] [stdout] test mesh_surface_normal::tests::degenerate_count_zero_normal ... ok [INFO] [stdout] test mesh_surface_normal::tests::flat_and_smooth_agree_on_plane ... ok [INFO] [stdout] test mesh_surface_normal::tests::count_back_facing_test ... ok [INFO] [stdout] test mesh_surface_flow::tests::test_new_flow_field_size ... ok [INFO] [stdout] test mesh_sweep::tests::test_circle_profile_radius ... ok [INFO] [stdout] test mesh_sweep::tests::test_cross3_sweep_orthogonal ... ok [INFO] [stdout] test mesh_sweep::tests::test_frame_at_path_point_tangent_direction ... ok [INFO] [stdout] test mesh_sweep::tests::test_helix_path_first_last_y ... ok [INFO] [stdout] test mesh_sweep::tests::test_path_arc_lengths_monotone ... ok [INFO] [stdout] test mesh_sweep::tests::test_helix_path_point_count ... ok [INFO] [stdout] test mesh_sweep::tests::test_path_length_line ... ok [INFO] [stdout] test mesh_surface_normal::tests::flat_normal_points_up ... ok [INFO] [stdout] test mesh_sweep::tests::test_sweep_index_count_divisible_by_3 ... ok [INFO] [stdout] test mesh_surface_normal::tests::flip_reverses_direction ... ok [INFO] [stdout] test mesh_surface_normal::tests::normal_angle_orthogonal ... ok [INFO] [stdout] test mesh_sweep::tests::test_sweep_produces_vertices ... ok [INFO] [stdout] test mesh_sweep::tests::test_transform_profile_point_zero ... ok [INFO] [stdout] test mesh_sweep::tests::test_sweep_result_vertex_count ... ok [INFO] [stdout] test mesh_surface_normal::tests::pi_constant_used ... ok [INFO] [stdout] test mesh_surface_normal::tests::smooth_normals_unit_length ... ok [INFO] [stdout] test mesh_sweep::tests::test_circle_profile_point_count ... ok [INFO] [stdout] test mesh_sweep::tests::test_normalize3_sweep_unit ... ok [INFO] [stdout] test mesh_sweep::tests::test_profile_perimeter_circle ... ok [INFO] [stdout] test mesh_sweep::tests::test_rectangle_profile_four_corners ... ok [INFO] [stdout] test mesh_sweep::tests::test_sweep_result_face_count ... ok [INFO] [stdout] test mesh_sweep_solid::tests::polygon_profile_radius ... ok [INFO] [stdout] test mesh_sweep_solid::tests::bounding_box_extends_along_path ... ok [INFO] [stdout] test mesh_sweep_solid::tests::surface_area_positive ... ok [INFO] [stdout] test mesh_sweep_solid::tests::tau_constant_used ... ok [INFO] [stdout] test mesh_swept_solid::tests::empty_path_returns_empty ... ok [INFO] [stdout] test mesh_swept_solid::tests::indices_multiple_of_three ... ok [INFO] [stdout] test mesh_swept_solid::tests::normalize3_zero_safe ... ok [INFO] [stdout] test mesh_swept_solid::tests::segment_count ... ok [INFO] [stdout] test mesh_swept_solid::tests::single_path_returns_empty ... ok [INFO] [stdout] test mesh_swept_solid::tests::swept_vertex_count_helper ... ok [INFO] [stdout] test mesh_symmetry_map::tests::test_add_find_pair ... ok [INFO] [stdout] test mesh_symmetry_map::tests::test_find_mirror_not_found ... ok [INFO] [stdout] test mesh_symmetry_map::tests::test_new_symmetry_map ... ok [INFO] [stdout] test mesh_sweep_solid::tests::empty_path ... ok [INFO] [stdout] test mesh_symmetry_map::tests::test_is_symmetric_x_axis ... ok [INFO] [stdout] test mesh_sweep_solid::tests::polygon_profile_count ... ok [INFO] [stdout] test mesh_sweep_solid::tests::empty_profile ... ok [INFO] [stdout] test mesh_sweep_solid::tests::sweep_indices_valid_test ... ok [INFO] [stdout] test mesh_symmetry_map::tests::test_not_symmetric ... ok [INFO] [stdout] test mesh_sweep_solid::tests::sweep_triangle_count_test ... ok [INFO] [stdout] test mesh_sweep_solid::tests::sweep_vertex_count ... ok [INFO] [stdout] test mesh_swept_solid::tests::empty_profile_returns_empty ... ok [INFO] [stdout] test mesh_swept_solid::tests::normalize3_unit ... ok [INFO] [stdout] test mesh_swept_solid::tests::triangle_count_correct ... ok [INFO] [stdout] test mesh_swept_solid::tests::vertex_count_correct ... ok [INFO] [stdout] test mesh_symmetry_map::tests::test_mirror_position_x ... ok [INFO] [stdout] test mesh_symmetry_map::tests::test_pair_count ... ok [INFO] [stdout] test mesh_tangent_frame::tests::average_tangent_empty ... ok [INFO] [stdout] test mesh_tangent_frame::tests::average_tangent_unit ... ok [INFO] [stdout] test mesh_tangent_frame::tests::compute_returns_correct_count ... ok [INFO] [stdout] test mesh_tangent_frame::tests::frames_are_orthonormal ... ok [INFO] [stdout] test mesh_tangent_frame::tests::tangent_angle_zero_parallel ... ok [INFO] [stdout] test mesh_tangent_frame::tests::tangent_to_world_identity ... ok [INFO] [stdout] test mesh_tangent_frames::tests::average_tangent_unit_length ... ok [INFO] [stdout] test mesh_tangent_frames::tests::empty_frames_average_zero ... ok [INFO] [stdout] test mesh_tangent_frames::tests::degenerate_count_flat_mesh_zero ... ok [INFO] [stdout] test mesh_tangent_frames::tests::empty_mesh_no_frames ... ok [INFO] [stdout] test mesh_tangent_frames::tests::face_idx_sequential ... ok [INFO] [stdout] test mesh_tangent_frames::tests::normals_point_up ... ok [INFO] [stdout] test mesh_tangent_frames::tests::frame_count_matches_faces ... ok [INFO] [stdout] test mesh_taper_modifier::tests::test_taper_scale_at_one ... ok [INFO] [stdout] test mesh_taper_modifier::tests::test_taper_scale_at_zero ... ok [INFO] [stdout] test mesh_taper_modifier::tests::test_taper_vertex_at_base ... ok [INFO] [stdout] test mesh_taper_modifier::tests::test_taper_volume_ratio_no_factor ... ok [INFO] [stdout] test mesh_terrain_gen::tests::test_new_terrain ... ok [INFO] [stdout] test mesh_terrain_gen::tests::test_terrain_vertex_count ... ok [INFO] [stdout] test mesh_terrain_gen::tests::test_terrain_face_count ... ok [INFO] [stdout] test mesh_tet::tests::tet_centroid_formula ... ok [INFO] [stdout] test mesh_tangent_frame::tests::empty_frames ... ok [INFO] [stdout] test mesh_tangent_frame::tests::is_orthonormal_basic ... ok [INFO] [stdout] test mesh_terrain_gen::tests::test_terrain_vertex_height_range ... ok [INFO] [stdout] test mesh_tangent_frames::tests::frames_orthonormal_flat ... ok [INFO] [stdout] test mesh_terrain_gen::tests::test_terrain_vertex_xz_bounds ... ok [INFO] [stdout] test mesh_tangent_frames::tests::tangents_unit_length ... ok [INFO] [stdout] test mesh_tangent_frames::tests::world_to_tangent_space_normal ... ok [INFO] [stdout] test mesh_taper_modifier::tests::test_taper_is_uniform_true ... ok [INFO] [stdout] test mesh_terrain_gen::tests::test_terrain_fbm_range ... ok [INFO] [stdout] test mesh_tet::tests::tet_dihedral_angles_count ... ok [INFO] [stdout] test mesh_tangent_frame::tests::frac_pi_2_used ... ok [INFO] [stdout] test mesh_tet::tests::tet_centroid_unit_tet ... ok [INFO] [stdout] test mesh_tangent_frame::tests::frame_to_matrix_shape ... ok [INFO] [stdout] test mesh_tet::tests::tet_mesh_volume_positive ... ok [INFO] [stdout] test mesh_tet::tests::tet_volume_degenerate_is_zero ... ok [INFO] [stdout] test mesh_tet::tests::tet_volume_flipped_is_negative ... ok [INFO] [stdout] test mesh_tet::tests::tetrahedralize_all_indices_valid ... ok [INFO] [stdout] test mesh_tetrahedron_gen::tests::test_tetrahedron_faces_count ... ok [INFO] [stdout] test mesh_tet::tests::tetrahedralize_interior_vertex_count ... ok [INFO] [stdout] test mesh_tetrahedron_gen::tests::test_tetrahedron_vertices_count ... ok [INFO] [stdout] test mesh_tet::tests::validate_tet_mesh_invalid_index ... ok [INFO] [stdout] test mesh_taper_modifier::tests::test_new_taper_params ... ok [INFO] [stdout] test mesh_tetrahedron_gen::tests::test_tetrahedron_equal_edges ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_bake_dispatch_vertex_color ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_bake_ao_produces_values ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_bake_normal_map_produces_output ... ok [INFO] [stdout] test mesh_tet::tests::tet_dihedral_angles_finite_positive ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_bake_curvature_runs ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_bake_normal_map_z_channel ... ok [INFO] [stdout] test mesh_tet::tests::tet_dihedral_angles_in_range ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_bake_dispatch_normal ... ok [INFO] [stdout] test mesh_tet::tests::tet_volume_unit_tet ... ok [INFO] [stdout] test mesh_tet::tests::tetrahedralize_nonzero_tet_count ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_bake_dispatch_ao ... ok [INFO] [stdout] test mesh_tet::tests::validate_tet_mesh_valid ... ok [INFO] [stdout] test mesh_tetrahedron_gen::tests::test_tetrahedron_volume_positive ... ok [INFO] [stdout] test mesh_tetrahedron_gen::tests::test_tetrahedron_circumradius ... ok [INFO] [stdout] test mesh_tetrahedron_gen::tests::test_tetrahedron_surface_area_positive ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_bake_target_to_u8_clamp ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_load_bake_from_f32_slice ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_new_bake_target_initial_alpha ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_ray_triangle_intersect_hit ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_new_bake_target_size ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_save_bake_ppm_header ... ok [INFO] [stdout] test mesh_texture_proj::tests::cylindrical_u_range ... ok [INFO] [stdout] test mesh_texture_proj::tests::box_project_in_range ... ok [INFO] [stdout] test mesh_texture_proj::tests::empty_uvs_normalize ... ok [INFO] [stdout] test mesh_texture_proj::tests::normalize_uvs_range ... ok [INFO] [stdout] test mesh_texture_proj::tests::planar_project_basic ... ok [INFO] [stdout] test mesh_texture_proj::tests::projection_mode_planar_all ... ok [INFO] [stdout] test mesh_texture_proj::tests::spherical_on_unit_sphere ... ok [INFO] [stdout] test mesh_texture_proj::tests::pi_tau_used ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_sample_bake_at_uv_center ... ok [INFO] [stdout] test mesh_texture_proj::tests::uv_bounds_test ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_bake_target_to_u8_length ... ok [INFO] [stdout] test mesh_thicken::tests::inner_shell_offset ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_ray_triangle_intersect_miss ... ok [INFO] [stdout] test mesh_thicken::tests::inner_winding_flipped ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_save_bake_ppm_length ... ok [INFO] [stdout] test mesh_thicken::tests::outer_shell_unchanged ... ok [INFO] [stdout] test mesh_texture_proj::tests::tile_uvs_scales ... ok [INFO] [stdout] test mesh_thicken::tests::thicken_doubles_triangles ... ok [INFO] [stdout] test mesh_thicken::tests::compute_vertex_normals_flat_mesh ... ok [INFO] [stdout] test mesh_texture_bake::tests::test_bake_thickness_runs ... ok [INFO] [stdout] test mesh_thicken::tests::thicken_doubles_vertices ... ok [INFO] [stdout] test mesh_thicken::tests::thickness_stored ... ok [INFO] [stdout] test mesh_thicken::tests::triangle_count_formula ... ok [INFO] [stdout] test mesh_thicken::tests::zero_thickness ... ok [INFO] [stdout] test mesh_thicken_normals::tests::test_thicken_is_normalized_false ... ok [INFO] [stdout] test mesh_thicken_normals::tests::test_thicken_is_normalized_true ... ok [INFO] [stdout] test mesh_thicken_normals::tests::test_thicken_vertex ... ok [INFO] [stdout] test mesh_thickness_map::tests::test_mean ... ok [INFO] [stdout] test mesh_thickness_map::tests::test_mean_empty ... ok [INFO] [stdout] test mesh_thickness_map::tests::test_new_thickness_map ... ok [INFO] [stdout] test mesh_thickness_map::tests::test_set_get ... ok [INFO] [stdout] test mesh_thickness_map::tests::test_to_color ... ok [INFO] [stdout] test mesh_thin_shell::tests::test_half_turn ... ok [INFO] [stdout] test mesh_thin_shell::tests::test_default_config ... ok [INFO] [stdout] test mesh_thin_shell::tests::test_cross_product ... ok [INFO] [stdout] test mesh_thicken_normals::tests::test_thicken_boundary_vertex_moves ... ok [INFO] [stdout] test mesh_thicken_normals::tests::test_thicken_mesh_vertices_count ... ok [INFO] [stdout] test mesh_thin_shell::tests::test_inward_offset ... ok [INFO] [stdout] test mesh_thicken_normals::tests::test_thicken_average_normal_upward ... ok [INFO] [stdout] test mesh_thickness_map::tests::test_max ... ok [INFO] [stdout] test mesh_thin_shell::tests::test_offset_by_normal_direction ... ok [INFO] [stdout] test mesh_thin_shell::tests::test_thin_shell_doubles_faces ... ok [INFO] [stdout] test mesh_thin_shell::tests::test_thin_shell_doubles_vertices ... ok [INFO] [stdout] test mesh_topo_repair_ext::tests::auto_fix_winding_no_panic ... ok [INFO] [stdout] test mesh_topo_repair_ext::tests::build_edge_adjacency_one_tri ... ok [INFO] [stdout] test mesh_topo_repair_ext::tests::config_default_values ... ok [INFO] [stdout] test mesh_thicken::tests::vertex_count_formula ... ok [INFO] [stdout] test mesh_thin_shell::tests::test_shell_volume_positive ... ok [INFO] [stdout] test mesh_thin_shell::tests::test_thickness_stored ... ok [INFO] [stdout] test mesh_thin_shell::tests::test_vertex_normals_upward ... ok [INFO] [stdout] test mesh_topo_repair_ext::tests::degenerate_detection_collinear ... ok [INFO] [stdout] test mesh_topo_repair_ext::tests::remove_degenerate_reduces_count ... ok [INFO] [stdout] test mesh_topo_repair_ext::tests::repair_topology_ext_default ... ok [INFO] [stdout] test mesh_topo_repair_ext::tests::result_default_all_zero ... ok [INFO] [stdout] test mesh_topo_repair_ext::tests::signed_area_unit_triangle ... ok [INFO] [stdout] test mesh_topo_sort::tests::test_build_dag_empty ... ok [INFO] [stdout] test mesh_topo_sort::tests::test_diamond_dag ... ok [INFO] [stdout] test mesh_topo_sort::tests::test_in_degree ... ok [INFO] [stdout] test mesh_topo_sort::tests::test_no_edges ... ok [INFO] [stdout] test mesh_topo_sort::tests::test_reverse_topo ... ok [INFO] [stdout] test mesh_topo_sort::tests::test_sort_faces_basic ... ok [INFO] [stdout] test mesh_topology_flow::tests::adjacent_vertices_triangle ... ok [INFO] [stdout] test mesh_topology_flow::tests::boundary_vertices_triangle ... ok [INFO] [stdout] test mesh_topo_sort::tests::test_order_complete ... ok [INFO] [stdout] test mesh_topology_flow::tests::edge_loop_start_returns_vertices ... ok [INFO] [stdout] test mesh_topology_flow::tests::adjacent_faces_two_triangles ... ok [INFO] [stdout] test mesh_topo_repair_ext::tests::out_of_bounds_indices_skipped ... ok [INFO] [stdout] test mesh_topology_flow::tests::find_poles_triangle ... ok [INFO] [stdout] test mesh_topo_repair_ext::tests::remove_all_degenerate_gives_empty ... ok [INFO] [stdout] test mesh_topology_flow::tests::build_triangle_topology ... ok [INFO] [stdout] test mesh_topo_sort::tests::test_assign_levels_chain ... ok [INFO] [stdout] test mesh_topo_sort::tests::test_cycle_detected ... ok [INFO] [stdout] test mesh_topo_sort::tests::test_simple_chain ... ok [INFO] [stdout] test mesh_topology_flow::tests::boundary_vertices_two_triangles ... ok [INFO] [stdout] test mesh_topology_flow::tests::is_closed_single_triangle ... ok [INFO] [stdout] test mesh_topology_flow::tests::topology_stats_triangle ... ok [INFO] [stdout] test mesh_topology_flow::tests::two_triangles_shared_edge_has_twins ... ok [INFO] [stdout] test mesh_topology_flow::tests::vertex_valence_triangle ... ok [INFO] [stdout] test mesh_topology_query::tests::test_connected_components_two_separate ... ok [INFO] [stdout] test mesh_topology_query::tests::test_connected_components_single ... ok [INFO] [stdout] test mesh_topology_query::tests::test_euler_characteristic_tetrahedron ... ok [INFO] [stdout] test mesh_topology_query::tests::test_genus_sphere ... ok [INFO] [stdout] test mesh_topology_repair::tests::find_isolated_vertices_detects_orphan ... ok [INFO] [stdout] test mesh_topology_query::tests::test_boundary_edges_open_mesh ... ok [INFO] [stdout] test mesh_topology_query::tests::test_query_topology_tetrahedron ... ok [INFO] [stdout] test mesh_topology_repair::tests::find_isolated_vertices_empty_on_full_mesh ... ok [INFO] [stdout] test mesh_topology_repair::tests::detects_non_manifold_edge ... ok [INFO] [stdout] test mesh_topology_repair::tests::find_t_junctions_empty_on_clean_mesh ... ok [INFO] [stdout] test mesh_topology_flow::tests::topology_stats_two_triangles ... ok [INFO] [stdout] test mesh_topology_query::tests::test_genus_torus ... ok [INFO] [stdout] test mesh_topology_repair::tests::is_locally_manifold_single_triangle ... ok [INFO] [stdout] test mesh_topology_query::tests::test_edge_set_triangle_count ... ok [INFO] [stdout] test mesh_topology_flow::tests::triangle_face_vertex_count ... ok [INFO] [stdout] test mesh_topology_query::tests::test_query_topology_empty ... ok [INFO] [stdout] test mesh_topology_repair::tests::remove_isolated_vertices_compacts_positions ... ok [INFO] [stdout] test mesh_topology_repair::tests::remove_non_manifold_faces_removes_bad ... ok [INFO] [stdout] test mesh_topology_flow::tests::triangle_no_twins_boundary ... ok [INFO] [stdout] test mesh_topology_repair::tests::no_non_manifold_on_clean_mesh ... ok [INFO] [stdout] test mesh_topology_repair::tests::resolve_t_junctions_returns_count ... ok [INFO] [stdout] test mesh_topology_repair::tests::stitch_boundary_edges_returns_zero_when_nothing_to_stitch ... ok [INFO] [stdout] test mesh_topology_repair::tests::vertex_face_count_correct ... ok [INFO] [stdout] test mesh_torus::tests::test_new_torus ... ok [INFO] [stdout] test mesh_torus::tests::test_torus_face_count ... ok [INFO] [stdout] test mesh_torus::tests::test_torus_vertex_count_different ... ok [INFO] [stdout] test mesh_torus::tests::test_torus_vertex_count ... ok [INFO] [stdout] test mesh_torus_gen::tests::test_default_config ... ok [INFO] [stdout] test mesh_torus::tests::test_torus_vertex_radius ... ok [INFO] [stdout] test mesh_topology_repair::tests::stitch_boundary_edges_welds_close_vertices ... ok [INFO] [stdout] test mesh_torus::tests::test_torus_volume ... ok [INFO] [stdout] test mesh_topology_repair::tests::topology_repair_report_is_valid_json ... ok [INFO] [stdout] test mesh_topology_repair::tests::topology_report_clean_mesh_zeros ... ok [INFO] [stdout] test mesh_torus::tests::test_torus_surface_area ... ok [INFO] [stdout] test mesh_torus_gen::tests::test_generate_produces_vertices ... ok [INFO] [stdout] test mesh_torus_gen::tests::test_index_count ... ok [INFO] [stdout] test mesh_torus_gen::tests::test_small_torus ... ok [INFO] [stdout] test mesh_torus_gen::tests::test_volume_positive ... ok [INFO] [stdout] test mesh_torus_gen::tests::test_to_json ... ok [INFO] [stdout] test mesh_torus_knot::tests::expected_vertex_count_formula ... ok [INFO] [stdout] test mesh_torus_knot::tests::knot_has_vertices ... ok [INFO] [stdout] test mesh_torus_gen::tests::test_indices_are_valid ... ok [INFO] [stdout] test mesh_torus_knot::tests::knot_point_nonzero ... ok [INFO] [stdout] test mesh_torus_knot::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_torus_gen::tests::test_normals_count ... ok [INFO] [stdout] test mesh_torus_knot::tests::validate_bad_radii ... ok [INFO] [stdout] test mesh_torus_gen::tests::test_surface_area_positive ... ok [INFO] [stdout] test mesh_torus_ring::tests::normals_match ... ok [INFO] [stdout] test mesh_torus_knot::tests::validate_ok ... ok [INFO] [stdout] test mesh_torus_ring::tests::torus_has_triangles ... ok [INFO] [stdout] test mesh_torus_knot::tests::uvs_match ... ok [INFO] [stdout] test mesh_torus_knot::tests::normals_match ... ok [INFO] [stdout] test mesh_torus_ring::tests::indices_in_bounds ... ok [INFO] [stdout] test mesh_torus_ring::tests::surface_area_positive ... ok [INFO] [stdout] test mesh_torus_gen::tests::test_vertex_count ... ok [INFO] [stdout] test mesh_torus_ring::tests::validate_bad_radii ... ok [INFO] [stdout] test mesh_track_to::tests::axis_name_neg_z ... ok [INFO] [stdout] test mesh_torus_ring::tests::torus_has_vertices ... ok [INFO] [stdout] test mesh_track_to::tests::json_contains_label ... ok [INFO] [stdout] test mesh_track_to::tests::new_constraint_default_track_axis_is_pos_y ... ok [INFO] [stdout] test mesh_track_to::tests::set_track_axis_changes_axis ... ok [INFO] [stdout] test mesh_track_to::tests::set_up_axis_updates_field ... ok [INFO] [stdout] test mesh_track_to::tests::track_direction_normalized ... ok [INFO] [stdout] test mesh_transfer_attr::tests::test_attrs_same_name_false ... ok [INFO] [stdout] test mesh_transfer_attr::tests::test_attrs_same_name_true ... ok [INFO] [stdout] test mesh_track_to::tests::new_constraint_default_influence_one ... ok [INFO] [stdout] test mesh_transfer_attr::tests::test_nearest_vertex ... ok [INFO] [stdout] test mesh_transfer_attr::tests::test_sq_dist_zero ... ok [INFO] [stdout] test mesh_transfer_attr::tests::test_transfer_empty_target ... ok [INFO] [stdout] test mesh_transfer_attr::tests::test_transfer_vec3_nn ... ok [INFO] [stdout] test mesh_transfer_weights::tests::test_new_weight_map ... ok [INFO] [stdout] test mesh_torus_ring::tests::torus_point_at_u0_v0 ... ok [INFO] [stdout] test mesh_torus_ring::tests::validate_ok ... ok [INFO] [stdout] test mesh_track_to::tests::target_distance_correct ... ok [INFO] [stdout] test mesh_torus_knot::tests::knot_has_triangles ... ok [INFO] [stdout] test mesh_transfer_attr::tests::test_scale_scalar_attr ... ok [INFO] [stdout] test mesh_transfer_attr::tests::test_nearest_vertex_exact_match ... ok [INFO] [stdout] test mesh_transfer_weights::tests::test_weight_blend_factor_zero ... ok [INFO] [stdout] test mesh_transfer_attr::tests::test_transfer_scalar_nn ... ok [INFO] [stdout] test mesh_torus_ring::tests::volume_positive ... ok [INFO] [stdout] test mesh_track_to::tests::axis_name_pos_x ... ok [INFO] [stdout] test mesh_transfer_attr::tests::test_barycentric_centroid ... ok [INFO] [stdout] test mesh_transfer_weights::tests::test_weight_blend_midpoint ... ok [INFO] [stdout] test mesh_transfer_weights::tests::test_weight_normalize ... ok [INFO] [stdout] test mesh_transform_constraint::tests::channel_name_location_x ... ok [INFO] [stdout] test mesh_transform_constraint::tests::default_influence_is_one ... ok [INFO] [stdout] test mesh_transform_constraint::tests::map_value_at_from_max_returns_to_max ... ok [INFO] [stdout] test mesh_transform_constraint::tests::map_value_at_from_min_returns_to_min ... ok [INFO] [stdout] test mesh_transfer_weights::tests::test_weight_set_get ... ok [INFO] [stdout] test mesh_transform_constraint::tests::channel_name_scale_z ... ok [INFO] [stdout] test mesh_transfer_weights::tests::test_weight_transfer_nearest ... ok [INFO] [stdout] test mesh_transform_constraint::tests::json_contains_label ... ok [INFO] [stdout] test mesh_transform_constraint::tests::map_value_zero_influence_yields_zero ... ok [INFO] [stdout] test mesh_transfer_weights::tests::test_weight_get_out_of_bounds ... ok [INFO] [stdout] test mesh_transform_constraint::tests::validate_default_constraint_is_valid ... ok [INFO] [stdout] test mesh_transform_constraint::tests::validate_inverted_range_fails ... ok [INFO] [stdout] test mesh_trapezohedron::tests::test_sides_stored ... ok [INFO] [stdout] test mesh_trapezohedron::tests::test_surface_area_positive ... ok [INFO] [stdout] test mesh_trapezohedron::tests::test_trapezohedron_tri_count ... ok [INFO] [stdout] test mesh_trapezohedron::tests::test_trapezohedron_vertex_count ... ok [INFO] [stdout] test mesh_trapezohedron::tests::test_validate_trapezohedron ... ok [INFO] [stdout] test mesh_trefoil::tests::all_positions_finite ... ok [INFO] [stdout] test mesh_trefoil::tests::indices_multiple_of_three ... ok [INFO] [stdout] test mesh_trefoil::tests::path_nonempty ... ok [INFO] [stdout] test mesh_trapezohedron::tests::test_ten_sided_trapezohedron ... ok [INFO] [stdout] test mesh_trefoil::tests::trefoil_vertex_count_helper ... ok [INFO] [stdout] test mesh_trefoil::tests::vertex_count_correct ... ok [INFO] [stdout] test mesh_tri_strip::tests::test_efficiency_single ... ok [INFO] [stdout] test mesh_tri_strip::tests::test_empty_strip ... ok [INFO] [stdout] test mesh_trefoil::tests::index_max_within_bounds ... ok [INFO] [stdout] test mesh_tri_strip::tests::test_encode_single_triangle ... ok [INFO] [stdout] test mesh_trapezohedron::tests::test_cube_trapezohedron ... ok [INFO] [stdout] test mesh_trefoil::tests::trefoil_point_finite ... ok [INFO] [stdout] test mesh_tri_strip::tests::test_decode_roundtrip ... ok [INFO] [stdout] test mesh_trefoil::tests::trefoil_triangle_count_helper ... ok [INFO] [stdout] test mesh_trapezohedron::tests::test_trapezohedron_expected_tris ... ok [INFO] [stdout] test mesh_tri_strip::tests::test_index_count ... ok [INFO] [stdout] test mesh_tri_strip::tests::test_json_output ... ok [INFO] [stdout] test mesh_tri_strip::tests::test_restart_count_two_triangles ... ok [INFO] [stdout] test mesh_trefoil::tests::more_segs_more_vertices ... ok [INFO] [stdout] test mesh_tri_strip::tests::test_strip_count_two ... ok [INFO] [stdout] test mesh_trefoil::tests::path_all_finite ... ok [INFO] [stdout] test mesh_tri_strip::tests::test_three_triangles ... ok [INFO] [stdout] test mesh_trapezohedron::tests::test_trapezohedron_empty_on_too_few ... ok [INFO] [stdout] test mesh_tri_to_quad::tests::coplanar_tris_merge_to_quad ... ok [INFO] [stdout] test mesh_tri_strip::tests::test_half_angle ... ok [INFO] [stdout] test mesh_tri_to_quad::tests::no_remaining_after_merge ... ok [INFO] [stdout] test mesh_tri_to_quad::tests::quad_verts_in_bounds ... ok [INFO] [stdout] test mesh_trim::tests::count_above_plane_correct ... ok [INFO] [stdout] test mesh_tri_to_quad::tests::original_tri_count_stored ... ok [INFO] [stdout] test mesh_tri_to_quad::tests::quadification_ratio_correct ... ok [INFO] [stdout] test mesh_tri_to_quad::tests::high_planarity_threshold_prevents_merge ... ok [INFO] [stdout] test mesh_tri_to_quad::tests::quads_to_flat_buffer_correct ... ok [INFO] [stdout] test mesh_tri_to_quad::tests::empty_mesh_no_quads ... ok [INFO] [stdout] test mesh_tri_to_quad::tests::single_tri_no_pair ... ok [INFO] [stdout] test mesh_trim::tests::horizontal_plane_normal ... ok [INFO] [stdout] test mesh_tri_to_quad::tests::merge_tris_produces_four_verts ... ok [INFO] [stdout] test mesh_trim::tests::kept_vertex_count_matches ... ok [INFO] [stdout] test mesh_trim::tests::trim_keeps_above_faces ... ok [INFO] [stdout] test mesh_trim::tests::trim_removes_below_faces ... ok [INFO] [stdout] test mesh_tris_to_quads::tests::test_merge_ratio ... ok [INFO] [stdout] test mesh_trim::tests::compact_indices_in_range ... ok [INFO] [stdout] test mesh_trim::tests::signed_distance_negative_below ... ok [INFO] [stdout] test mesh_trim::tests::signed_distance_positive_above ... ok [INFO] [stdout] test mesh_trim::tests::trim_all_above ... ok [INFO] [stdout] test mesh_trim::tests::trim_empty_mesh ... ok [INFO] [stdout] test mesh_tris_to_quads::tests::test_quad_count ... ok [INFO] [stdout] test mesh_tris_to_quads::tests::test_quads_to_tri_indices ... ok [INFO] [stdout] test mesh_tris_to_quads::tests::test_total_faces ... ok [INFO] [stdout] test mesh_tris_to_quads::tests::test_tri_count_no_merge ... ok [INFO] [stdout] test mesh_tris_to_quads::tests::test_tris_to_quads_merges ... ok [INFO] [stdout] test mesh_tris_to_quads::tests::test_shared_edge ... ok [INFO] [stdout] test mesh_tris_to_quads::tests::test_validate_quads ... ok [INFO] [stdout] test mesh_tube::tests::test_generate_tube_produces_vertices ... ok [INFO] [stdout] test mesh_tube::tests::test_single_point_returns_empty ... ok [INFO] [stdout] test mesh_tube::tests::test_ring_count ... ok [INFO] [stdout] test mesh_tube::tests::test_curved_spine ... ok [INFO] [stdout] test mesh_tube::tests::test_indices_valid ... ok [INFO] [stdout] test mesh_tube::tests::test_surface_area_positive ... ok [INFO] [stdout] test mesh_tube::tests::test_index_count_matches ... ok [INFO] [stdout] test mesh_tube::tests::test_normals_count_matches ... ok [INFO] [stdout] test mesh_tube::tests::test_to_json ... ok [INFO] [stdout] test mesh_tube::tests::test_vertex_count_matches ... ok [INFO] [stdout] test mesh_tube_curve::tests::expected_triangle_count_formula ... ok [INFO] [stdout] test mesh_tube_curve::tests::expected_vertex_count_formula ... ok [INFO] [stdout] test mesh_tube_curve::tests::short_spine_empty ... ok [INFO] [stdout] test mesh_tube_curve::tests::triangle_count_correct ... ok [INFO] [stdout] test mesh_tube_curve::tests::uvs_count_matches_positions ... ok [INFO] [stdout] test mesh_tube_curve::tests::normals_count_matches_positions ... ok [INFO] [stdout] test mesh_tube_curve::tests::validate_params_ok ... ok [INFO] [stdout] test mesh_tube_deform::tests::test_new_tube_path_radius_default ... ok [INFO] [stdout] test mesh_tube_deform::tests::test_tube_deform_vertex_no_blend ... ok [INFO] [stdout] test mesh_tube_deform::tests::test_tube_path_at_endpoints ... ok [INFO] [stdout] test mesh_tube_deform::tests::test_tube_path_length_two_points ... ok [INFO] [stdout] test mesh_tube_curve::tests::validate_params_zero_radius ... ok [INFO] [stdout] test mesh_tube_deform::tests::test_tube_point_count ... ok [INFO] [stdout] test mesh_tube_curve::tests::vertex_count_correct ... ok [INFO] [stdout] test mesh_tube_curve::tests::validate_params_bad_sides ... ok [INFO] [stdout] test mesh_tube_mesh::tests::test_empty_path ... ok [INFO] [stdout] test mesh_tube_mesh::tests::test_indices_valid ... ok [INFO] [stdout] test mesh_tube_mesh::tests::test_json_output ... ok [INFO] [stdout] test mesh_tube_mesh::tests::test_segments_stored ... ok [INFO] [stdout] test mesh_tube_mesh::tests::test_normals_unit ... ok [INFO] [stdout] test mesh_tube_mesh::tests::test_generate_tube_vertex_count ... ok [INFO] [stdout] test mesh_tube_mesh::tests::test_tube_face_count ... ok [INFO] [stdout] test mesh_tweak_tool::tests::test_affected_count ... ok [INFO] [stdout] test mesh_tweak_tool::tests::test_apply_tweak_moves_inside ... ok [INFO] [stdout] test mesh_tweak_tool::tests::test_count_selected ... ok [INFO] [stdout] test mesh_tweak_tool::tests::test_scale_tweak_delta ... ok [INFO] [stdout] test mesh_tube_deform::tests::test_tube_path_at_midpoint ... ok [INFO] [stdout] test mesh_tweak_tool::tests::test_soft_weight_boundary ... ok [INFO] [stdout] test mesh_tweak_tool::tests::test_undo_tweak ... ok [INFO] [stdout] test mesh_twist_modifier::tests::test_twist_angle_at_half ... ok [INFO] [stdout] test mesh_twist_modifier::tests::test_new_twist_params ... ok [INFO] [stdout] test mesh_twist_modifier::tests::test_twist_is_zero_true ... ok [INFO] [stdout] test mesh_twist_modifier::tests::test_twist_vertex_90deg_at_top ... ok [INFO] [stdout] test mesh_unfold::tests::place_triangle_2d_nonoverlap ... ok [INFO] [stdout] test mesh_twist_modifier::tests::test_twist_vertex_zero ... ok [INFO] [stdout] test mesh_tweak_tool::tests::test_clamp_tweak_result ... ok [INFO] [stdout] test mesh_unfold::tests::unfold_coverage_full_planar ... ok [INFO] [stdout] test mesh_unfold::tests::unfold_coverage_nonnegative ... ok [INFO] [stdout] test mesh_unfold::tests::unfold_coverage_connected_mesh ... ok [INFO] [stdout] test mesh_tweak_tool::tests::test_compute_soft_weights_length ... ok [INFO] [stdout] test mesh_tweak_tool::tests::test_soft_weight_centre ... ok [INFO] [stdout] test mesh_unfold::tests::unfold_empty_mesh ... ok [INFO] [stdout] test mesh_unfold::tests::unfold_first_vertex_at_origin ... ok [INFO] [stdout] test mesh_unfold::tests::unfold_second_vertex_on_x_axis ... ok [INFO] [stdout] test mesh_unfold::tests::unfold_visited_count_single_tri ... ok [INFO] [stdout] test mesh_twist_modifier::tests::test_twist_is_zero_false ... ok [INFO] [stdout] test mesh_tube_mesh::tests::test_single_ring ... ok [INFO] [stdout] test mesh_tube_mesh::tests::test_circumference ... ok [INFO] [stdout] test mesh_tube_mesh::tests::test_surface_area_positive ... ok [INFO] [stdout] test mesh_unsubdivide::tests::test_vertex_reduction_ratio_no_change ... ok [INFO] [stdout] test mesh_unsubdivide::tests::test_vertex_reduction_ratio_zero_original ... ok [INFO] [stdout] test mesh_unsubdivide::tests::test_default_config ... ok [INFO] [stdout] test mesh_unfold::tests::unfold_visits_all_faces ... ok [INFO] [stdout] test mesh_unsubdivide::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_unsubdivide::tests::test_find_loop_midpoints_empty ... ok [INFO] [stdout] test mesh_unsubdivide::tests::test_had_effect_false ... ok [INFO] [stdout] test mesh_unsubdivide::tests::test_had_effect_true ... ok [INFO] [stdout] test mesh_unsubdivide::tests::test_surviving_tri_count ... ok [INFO] [stdout] test mesh_tube_deform::tests::test_tube_radius_at_interpolation ... ok [INFO] [stdout] test mesh_uv_align_axis::tests::align_to_u_axis_empty ... ok [INFO] [stdout] test mesh_uv_align_axis::tests::bounding_box_correct ... ok [INFO] [stdout] test mesh_uv_align_axis::tests::bounding_box_empty ... ok [INFO] [stdout] test mesh_unsubdivide::tests::test_unsubdivide_single_tri ... ok [INFO] [stdout] test mesh_uv_align_axis::tests::centroid_empty ... ok [INFO] [stdout] test mesh_uv_align_axis::tests::align_axis_variants_differ ... ok [INFO] [stdout] test mesh_uv_atlas::tests::test_add_island ... ok [INFO] [stdout] test mesh_uv_atlas::tests::test_find_missing_island ... ok [INFO] [stdout] test mesh_uv_atlas::tests::test_islands_no_overlap ... ok [INFO] [stdout] test mesh_uv_atlas::tests::test_islands_overlap ... ok [INFO] [stdout] test mesh_uv_atlas::tests::test_json_output ... ok [INFO] [stdout] test mesh_uv_atlas::tests::test_new_atlas_empty ... ok [INFO] [stdout] test mesh_uv_atlas::tests::test_total_faces ... ok [INFO] [stdout] test mesh_uv_atlas::tests::test_utilization_positive ... ok [INFO] [stdout] test mesh_uv_align_axis::tests::dominant_angle_horizontal ... ok [INFO] [stdout] test mesh_uv_atlas::tests::test_uv_in_bounds ... ok [INFO] [stdout] test mesh_uv_atlas::tests::test_find_island ... ok [INFO] [stdout] test mesh_uv_align_axis::tests::align_to_axis_returns_count ... ok [INFO] [stdout] test mesh_uv_copy_paste::tests::copy_fills_clipboard ... ok [INFO] [stdout] test mesh_uv_copy_paste::tests::copy_overwrites_previous ... ok [INFO] [stdout] test mesh_uv_align_axis::tests::centroid_of_unit_square ... ok [INFO] [stdout] test mesh_uv_copy_paste::tests::new_clipboard_empty ... ok [INFO] [stdout] test mesh_uv_copy_paste::tests::paste_exact_size_mismatch ... ok [INFO] [stdout] test mesh_uv_copy_paste::tests::paste_copies_uvs ... ok [INFO] [stdout] test mesh_uv_copy_paste::tests::paste_exact_success ... ok [INFO] [stdout] test mesh_uv_copy_paste::tests::paste_truncates_to_destination_size ... ok [INFO] [stdout] test mesh_uv_minimize_stretch::tests::average_stretch_empty ... ok [INFO] [stdout] test mesh_uv_minimize_stretch::tests::average_stretch_single_triangle ... ok [INFO] [stdout] test mesh_uv_copy_paste::tests::clear_empties_clipboard ... ok [INFO] [stdout] test mesh_uv_copy_paste::tests::clipboard_fits_exact ... ok [INFO] [stdout] test mesh_uv_minimize_stretch::tests::minimize_stretch_runs ... ok [INFO] [stdout] test mesh_uv_align_axis::tests::rotate_uv_90_degrees ... ok [INFO] [stdout] test mesh_uv_minimize_stretch::tests::minimize_stretch_zero_iterations ... ok [INFO] [stdout] test mesh_uv_pack::tests::empty_input_returns_empty_result ... ok [INFO] [stdout] test mesh_uv_pack::tests::multiple_small_islands_all_fit ... ok [INFO] [stdout] test mesh_uv_pack::tests::no_rotation_flag_respected ... ok [INFO] [stdout] test mesh_uv_pack::tests::oversized_islands_overflow ... ok [INFO] [stdout] test mesh_uv_pack::tests::pack_from_mesh_updates_uvs ... ok [INFO] [stdout] test mesh_uv_pack::tests::pack_stats_returns_non_empty_string ... ok [INFO] [stdout] test mesh_uv_pack::tests::packed_rects_within_atlas_bounds ... ok [INFO] [stdout] test mesh_uv_minimize_stretch::tests::default_config_reasonable ... ok [INFO] [stdout] test mesh_uv_minimize_stretch::tests::stretch_result_initial_le_one ... ok [INFO] [stdout] test mesh_uv_minimize_stretch::tests::triangle_uv_stretch_unit_triangle ... ok [INFO] [stdout] test mesh_uv_pack::tests::single_island_is_packed ... ok [INFO] [stdout] test mesh_uv_minimize_stretch::tests::stretch_threshold_in_config ... ok [INFO] [stdout] test mesh_uv_minimize_stretch::tests::triangle_uv_stretch_degenerate_uv ... ok [INFO] [stdout] test mesh_uv_pack::tests::atlas_full_overflows_remainder ... ok [INFO] [stdout] test mesh_uv_pack::tests::utilization_is_positive_for_packed_islands ... ok [INFO] [stdout] test mesh_uv_pack::tests::rotation_applied_to_tall_island ... ok [INFO] [stdout] test mesh_uv_pack::tests::uv_rect_bounds_correct ... ok [INFO] [stdout] test mesh_uv_pack::tests::uv_rect_bounds_empty_is_zero ... ok [INFO] [stdout] test mesh_uv_pin::tests::clear_removes_all ... ok [INFO] [stdout] test mesh_uv_pin::tests::get_missing_none ... ok [INFO] [stdout] test mesh_uv_pack::tests::transform_island_uvs_remaps_correctly ... ok [INFO] [stdout] test mesh_uv_pack::tests::transform_island_uvs_rotated_swaps_axes ... ok [INFO] [stdout] test mesh_uv_pin::tests::get_pin_uv_returns_coordinate ... ok [INFO] [stdout] test mesh_uv_pin::tests::pin_vertex_adds_entry ... ok [INFO] [stdout] test mesh_uv_pin::tests::unpin_missing_returns_false ... ok [INFO] [stdout] test mesh_uv_pin::tests::unpin_removes_entry ... ok [INFO] [stdout] test mesh_uv_rotate_align::tests::edge_angle_horizontal_is_zero ... ok [INFO] [stdout] test mesh_uv_pack::tests::sort_by_height_packs_without_error ... ok [INFO] [stdout] test mesh_uv_pack::tests::sort_by_width_packs_without_error ... ok [INFO] [stdout] test mesh_uv_pack::tests::sort_none_preserves_insertion_order ... ok [INFO] [stdout] test mesh_uv_pin::tests::is_pinned_true_after_pin ... ok [INFO] [stdout] test mesh_uv_pin::tests::new_set_empty ... ok [INFO] [stdout] test mesh_uv_pin::tests::overwrite_updates_uv ... ok [INFO] [stdout] test mesh_uv_rotate_align::tests::edge_is_horizontal_false ... ok [INFO] [stdout] test mesh_uv_pin::tests::is_pinned_false_for_other ... ok [INFO] [stdout] test mesh_uv_rotate_align::tests::edge_is_horizontal_true ... ok [INFO] [stdout] test mesh_uv_rotate_align::tests::rotate_align_returns_count ... ok [INFO] [stdout] test mesh_uv_rotate_align::tests::rotate_island_empty_no_panic ... ok [INFO] [stdout] test mesh_uv_scale_to_bounds::tests::default_bounds_is_unit_square ... ok [INFO] [stdout] test mesh_uv_scale_to_bounds::tests::scale_empty_returns_false ... ok [INFO] [stdout] test mesh_uv_scale_to_bounds::tests::scale_to_bounds_moves_to_unit_square ... ok [INFO] [stdout] test mesh_uv_scale_to_bounds::tests::scale_uniform_empty_no_panic ... ok [INFO] [stdout] test mesh_uv_scale_to_bounds::tests::scale_uniform_factor_1_unchanged ... ok [INFO] [stdout] test mesh_uv_scale_to_bounds::tests::scale_uniform_factor_2_doubles_extents ... ok [INFO] [stdout] test mesh_uv_rotate_align::tests::rotate_align_makes_edge_horizontal ... ok [INFO] [stdout] test mesh_uv_scale_to_bounds::tests::uv_extents_correct ... ok [INFO] [stdout] test mesh_uv_rotate_align::tests::rotate_align_out_of_bounds_returns_zero ... ok [INFO] [stdout] test mesh_uv_rotate_align::tests::rotate_island_360_is_identity ... ok [INFO] [stdout] test mesh_uv_rotate_align::tests::edge_angle_vertical_is_90 ... ok [INFO] [stdout] test mesh_uv_scale_to_bounds::tests::uv_extents_empty ... ok [INFO] [stdout] test mesh_uv_seam::tests::test_clear_seams ... ok [INFO] [stdout] test mesh_uv_seam::tests::test_detect_boundary_seam_triangle ... ok [INFO] [stdout] test mesh_uv_seam::tests::test_empty_set ... ok [INFO] [stdout] test mesh_uv_seam::tests::test_is_seam ... ok [INFO] [stdout] test mesh_uv_seam::tests::test_json_output ... ok [INFO] [stdout] test mesh_uv_scale_to_bounds::tests::uv_extents_single ... ok [INFO] [stdout] test mesh_uv_seam::tests::test_no_duplicate_seams ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_boundary_uv_edges ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_clamp_uvs ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_detect_uv_islands_stitched_basic ... ok [INFO] [stdout] test mesh_uv_seam::tests::test_seam_vertices ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_mirror_uvs_horizontal ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_mirror_uvs_vertical ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_detect_uv_islands_stitched_empty ... ok [INFO] [stdout] test mesh_uv_seam::tests::test_remove_seam ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_stitch_seam_count_zero ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_island_area_s_basic ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_uv_seam_length ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_stitch_all_seams_remap ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_uv_seam_length_out_of_bounds ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_uv_stretch_diff ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_uv_stretch_same ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_stitch_seam_averages ... ok [INFO] [stdout] test mesh_vertex_animation::tests::test_duration_empty ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_stitch_seam_count_nonzero ... ok [INFO] [stdout] test mesh_uv_seam::tests::test_add_seam ... ok [INFO] [stdout] test mesh_vertex_animation::tests::test_frame_at_time ... ok [INFO] [stdout] test mesh_vertex_animation::tests::test_lerp_frames_at_zero ... ok [INFO] [stdout] test mesh_uv_seam::tests::test_internal_edge_not_boundary ... ok [INFO] [stdout] test mesh_uv_stitch::tests::test_stitch_all_seams_count ... ok [INFO] [stdout] test mesh_vertex_animation::tests::test_duration_last_frame ... ok [INFO] [stdout] test mesh_vertex_animation::tests::test_frame_centroid_origin ... ok [INFO] [stdout] test mesh_vertex_animation::tests::test_lerp_frames_at_one ... ok [INFO] [stdout] test mesh_vertex_animation::tests::test_max_frame_displacement_same ... ok [INFO] [stdout] test mesh_vertex_animation::tests::test_new_sequence_empty ... ok [INFO] [stdout] test mesh_vertex_attr::tests::test_add_layer ... ok [INFO] [stdout] test mesh_vertex_attr::tests::test_attr_average ... ok [INFO] [stdout] test mesh_vertex_attr::tests::test_find_layer ... ok [INFO] [stdout] test mesh_vertex_attr::tests::test_find_missing_layer ... ok [INFO] [stdout] test mesh_vertex_attr::tests::test_initial_data_zero ... ok [INFO] [stdout] test mesh_vertex_attr::tests::test_json_output ... ok [INFO] [stdout] test mesh_vertex_attr::tests::test_new_empty_layers ... ok [INFO] [stdout] test mesh_vertex_attr::tests::test_out_of_bounds_layer ... ok [INFO] [stdout] test mesh_vertex_attr::tests::test_width_stored ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_apply_vertex_remap ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_cluster_centroid ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_cluster_reduction_ratio ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_build_cluster_grid ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_cluster_vertex_count ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_merge_close_vertices_collapses_duplicates ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_merge_close_vertices_no_merge ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_remove_degenerate_all_degenerate ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_remove_degenerate_triangles ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_merge_duplicate_uvs ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_verify_cluster_remap_invalid ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_verify_cluster_remap_valid ... ok [INFO] [stdout] test mesh_vertex_color::tests::test_blend_clamp ... ok [INFO] [stdout] test mesh_vertex_color::tests::test_blend_colors ... ok [INFO] [stdout] test mesh_vertex_animation::tests::test_push_frame ... ok [INFO] [stdout] test mesh_vertex_color::tests::test_clear_colors ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_cluster_vertices_basic ... ok [INFO] [stdout] test mesh_vertex_animation::tests::test_validate_frame_vertex_counts_valid ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_cluster_reduction_ratio_zero_original ... ok [INFO] [stdout] test mesh_vertex_attr::tests::test_set_get_attr ... ok [INFO] [stdout] test mesh_vertex_cluster::tests::test_default_cluster_config ... ok [INFO] [stdout] test mesh_vertex_color::tests::test_color_count ... ok [INFO] [stdout] test mesh_vertex_color::tests::test_color_to_rgba ... ok [INFO] [stdout] test mesh_vertex_color::tests::test_get_default_color ... ok [INFO] [stdout] test mesh_vertex_color::tests::test_set_get_color ... ok [INFO] [stdout] test mesh_vertex_color_layer::tests::add_layer_increases_count ... ok [INFO] [stdout] test mesh_vertex_color::tests::test_vertex_colors_to_bytes ... ok [INFO] [stdout] test mesh_vertex_color_layer::tests::average_color_correct ... ok [INFO] [stdout] test mesh_vertex_color::tests::test_new_map_empty ... ok [INFO] [stdout] test mesh_vertex_color_layer::tests::first_layer_is_active ... ok [INFO] [stdout] test mesh_vertex_color_layer::tests::remove_missing_returns_false ... ok [INFO] [stdout] test mesh_vertex_deform::tests::test_clear_deform ... ok [INFO] [stdout] test mesh_vertex_color_layer::tests::set_active_layer_works ... ok [INFO] [stdout] test mesh_vertex_deform::tests::test_json_output ... ok [INFO] [stdout] test mesh_vertex_color::tests::test_overwrite_color ... ok [INFO] [stdout] test mesh_vertex_deform::tests::test_scale_deform ... ok [INFO] [stdout] test mesh_vertex_degree::tests::test_avg_degree ... ok [INFO] [stdout] test mesh_vertex_color_layer::tests::average_color_missing_layer_none ... ok [INFO] [stdout] test mesh_vertex_deform::tests::test_set_delta ... ok [INFO] [stdout] test mesh_vertex_color_layer::tests::new_set_is_empty ... ok [INFO] [stdout] test mesh_vertex_deform::tests::test_sine_deform_non_zero ... ok [INFO] [stdout] test mesh_vertex_color_layer::tests::remove_layer_decrements_count ... ok [INFO] [stdout] test mesh_vertex_deform::tests::test_deform_magnitude ... ok [INFO] [stdout] test mesh_vertex_degree::tests::test_degree_result_to_json ... ok [INFO] [stdout] test mesh_vertex_deform::tests::test_out_of_bounds_magnitude ... ok [INFO] [stdout] test mesh_vertex_deform::tests::test_apply_deform ... ok [INFO] [stdout] test mesh_vertex_deform::tests::test_max_magnitude ... ok [INFO] [stdout] test mesh_vertex_color_layer::tests::set_active_missing_returns_false ... ok [INFO] [stdout] test mesh_vertex_deform::tests::test_new_zero_deltas ... ok [INFO] [stdout] test mesh_vertex_degree::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_vertex_degree::tests::test_irregular_vertex_count ... ok [INFO] [stdout] test mesh_vertex_degree::tests::test_min_nonzero_degree ... ok [INFO] [stdout] test mesh_vertex_degree::tests::test_two_tris_shared_vertex ... ok [INFO] [stdout] test mesh_vertex_degree::tests::test_vertex_degree_oob ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_add_vertex_to_group ... ok [INFO] [stdout] test mesh_vertex_degree::tests::test_max_degree ... ok [INFO] [stdout] test mesh_vertex_degree::tests::test_single_tri_degrees ... ok [INFO] [stdout] test mesh_vertex_degree::tests::test_vertices_with_degree ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_add_group ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_empty_group_average ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_empty_set ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_multiple_groups ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_remove_from_group ... ok [INFO] [stdout] test mesh_vertex_group_weight::tests::test_dominant_group ... ok [INFO] [stdout] test mesh_vertex_group_weight::tests::test_set_weight_updates_existing ... ok [INFO] [stdout] test mesh_vertex_merge::tests::test_apply_merge_map ... ok [INFO] [stdout] test mesh_vertex_merge::tests::test_build_merge_map ... ok [INFO] [stdout] test mesh_vertex_merge::tests::test_merge_at_indices ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_find_by_name ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_find_missing ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_weight_in_group ... ok [INFO] [stdout] test mesh_vertex_merge::tests::test_empty_merge ... ok [INFO] [stdout] test mesh_vertex_group_weight::tests::test_normalize_across_groups ... ok [INFO] [stdout] test mesh_vertex_group_weight::tests::test_dominant_group_zero_weight ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_json_output ... ok [INFO] [stdout] test mesh_vertex_merge::tests::test_merge_breaks_topology ... ok [INFO] [stdout] test mesh_vertex_group_weight::tests::test_get_weight ... ok [INFO] [stdout] test mesh_vertex_merge::tests::test_merge_preserves_topology ... ok [INFO] [stdout] test mesh_vertex_merge::tests::test_merge_close_vertices ... ok [INFO] [stdout] test mesh_vertex_merge::tests::test_merge_threshold ... ok [INFO] [stdout] test mesh_vertex_merge::tests::test_merged_vertex_count ... ok [INFO] [stdout] test mesh_vertex_merge::tests::test_no_merge ... ok [INFO] [stdout] test mesh_vertex_order_v2::tests::test_apply_order ... ok [INFO] [stdout] test mesh_vertex_group_weight::tests::test_group_count ... ok [INFO] [stdout] test mesh_vertex_order_v2::tests::test_empty_positions ... ok [INFO] [stdout] test mesh_vertex_group_weight::tests::test_set_weight_clamps ... ok [INFO] [stdout] test mesh_vertex_group::tests::test_average_weight ... ok [INFO] [stdout] test mesh_vertex_order_v2::tests::test_invalid_permutation_duplicate ... ok [INFO] [stdout] test mesh_vertex_group_weight::tests::test_get_weight_missing_vertex_zero ... ok [INFO] [stdout] test mesh_vertex_order_v2::tests::test_invert_permutation ... ok [INFO] [stdout] test mesh_vertex_order_v2::tests::test_order_cache_linear ... ok [INFO] [stdout] test mesh_vertex_order_v2::tests::test_remap_indices ... ok [INFO] [stdout] test mesh_vertex_order_v2::tests::test_strategy_axis_y ... ok [INFO] [stdout] test mesh_vertex_project::tests::test_project_along_normal ... ok [INFO] [stdout] test mesh_vertex_project::tests::test_project_count ... ok [INFO] [stdout] test mesh_vertex_project::tests::test_project_to_cylinder ... ok [INFO] [stdout] test mesh_vertex_project::tests::test_project_to_sphere ... ok [INFO] [stdout] test mesh_vertex_project::tests::test_project_to_plane ... ok [INFO] [stdout] test mesh_vertex_project::tests::test_project_to_json ... ok [INFO] [stdout] test mesh_vertex_project::tests::test_project_to_sphere_at_center ... ok [INFO] [stdout] test mesh_vertex_slide::tests::test_slide_half ... ok [INFO] [stdout] test mesh_vertex_project::tests::test_project_to_surface ... ok [INFO] [stdout] test mesh_vertex_slide::tests::test_slide_zero_not_moved ... ok [INFO] [stdout] test mesh_vertex_slide::tests::test_slide_full ... ok [INFO] [stdout] test mesh_vertex_slide::tests::test_vertex_edge_direction ... ok [INFO] [stdout] test mesh_vertex_project::tests::test_projected_distance ... ok [INFO] [stdout] test mesh_vertex_slide::tests::test_vertex_slide_offset ... ok [INFO] [stdout] test mesh_vertex_smooth_v2::tests::test_json_output ... ok [INFO] [stdout] test mesh_vertex_slide::tests::test_vertex_slide_toward_nearest ... ok [INFO] [stdout] test mesh_vertex_smooth_v2::tests::test_lambda_in_range ... ok [INFO] [stdout] test mesh_vertex_smooth_v2::tests::test_laplacian_step_same_size ... ok [INFO] [stdout] test mesh_vertex_order_v2::tests::test_json_output ... ok [INFO] [stdout] test mesh_vertex_slide::tests::test_vertex_slide_position ... ok [INFO] [stdout] test mesh_vertex_order_v2::tests::test_order_by_x ... ok [INFO] [stdout] test mesh_vertex_order_v2::tests::test_valid_permutation ... ok [INFO] [stdout] test mesh_vertex_smooth_v2::tests::test_preserve_boundary_flag ... ok [INFO] [stdout] test mesh_vertex_smooth_v2::tests::test_smooth_displacement_positive ... ok [INFO] [stdout] test mesh_vertex_smooth_v2::tests::test_smooth_displacement_zero_same ... ok [INFO] [stdout] test mesh_vertex_smooth_v2::tests::test_taubin_smooth_same_size ... ok [INFO] [stdout] test mesh_vertex_project::tests::test_project_to_plane_zero_normal ... ok [INFO] [stdout] test mesh_vertex_snap::tests::test_snap_precision ... ok [INFO] [stdout] test mesh_vertex_smooth_v2::tests::test_default_config ... ok [INFO] [stdout] test mesh_vertex_snap::tests::test_snap_to_grid_zero ... ok [INFO] [stdout] test mesh_vertex_snap::tests::test_snap_to_plane ... ok [INFO] [stdout] test mesh_vertex_snap::tests::test_snap_count ... ok [INFO] [stdout] test mesh_vertex_snap::tests::test_snap_threshold ... ok [INFO] [stdout] test mesh_vertex_smooth_v2::tests::test_build_adjacency_count ... ok [INFO] [stdout] test mesh_vertex_snap::tests::test_snap_undo ... ok [INFO] [stdout] test mesh_vertex_snap::tests::test_snap_vertex_to_nearest ... ok [INFO] [stdout] test mesh_vertex_snap::tests::test_snapped_positions ... ok [INFO] [stdout] test mesh_vertex_split::tests::test_empty_indices ... ok [INFO] [stdout] test mesh_vertex_smooth_v2::tests::test_empty_positions_smooth ... ok [INFO] [stdout] test mesh_vertex_split::tests::test_normals_length_matches_positions ... ok [INFO] [stdout] test mesh_vertex_snap::tests::test_snap_to_grid ... ok [INFO] [stdout] test mesh_vertex_split::tests::test_original_map_length ... ok [INFO] [stdout] test mesh_vertex_split::tests::test_json_output ... ok [INFO] [stdout] test mesh_vertex_split::tests::test_uvs_unique ... ok [INFO] [stdout] test mesh_vertex_split::tests::test_indices_valid ... ok [INFO] [stdout] test mesh_vertex_weight::tests::test_above_threshold ... ok [INFO] [stdout] test mesh_vertex_weight::tests::test_clamp_weights ... ok [INFO] [stdout] test mesh_vertex_split::tests::test_uvs_length_matches_positions ... ok [INFO] [stdout] test mesh_vertex_weight::tests::test_json_output ... ok [INFO] [stdout] test mesh_vertex_weight::tests::test_average_weight ... ok [INFO] [stdout] test mesh_vertex_weight::tests::test_blend_buffers ... ok [INFO] [stdout] test mesh_vertex_weight::tests::test_weights_valid_after_new ... ok [INFO] [stdout] test mesh_vertex_weld::tests::test_unweld_vertex ... ok [INFO] [stdout] test mesh_vertex_split::tests::test_split_with_shared_vertex_different_uvs ... ok [INFO] [stdout] test mesh_vertex_weld::tests::test_weld_by_normal ... ok [INFO] [stdout] test mesh_vertex_weld::tests::test_weld_by_position ... ok [INFO] [stdout] test mesh_vertex_snap::tests::test_snap_vertex_to_nearest_empty ... ok [INFO] [stdout] test mesh_vertex_weld::tests::test_weld_count ... ok [INFO] [stdout] test mesh_vertex_weight::tests::test_set_get ... ok [INFO] [stdout] test mesh_vertex_split::tests::test_index_count_matches_input ... ok [INFO] [stdout] test mesh_vertex_split::tests::test_split_no_duplication ... ok [INFO] [stdout] test mesh_vertex_weight::tests::test_new_buffer_zeros ... ok [INFO] [stdout] test mesh_vertex_weight::tests::test_normalize_weights ... ok [INFO] [stdout] test mesh_vertex_weight::tests::test_vertex_count ... ok [INFO] [stdout] test mesh_vertex_weld::tests::test_weld_empty ... ok [INFO] [stdout] test mesh_vertex_weld::tests::test_weld_map ... ok [INFO] [stdout] test mesh_vertex_weld::tests::test_weld_threshold_value ... ok [INFO] [stdout] test mesh_vertex_weld::tests::test_weld_statistics ... ok [INFO] [stdout] test mesh_vertex_weld::tests::test_weld_vertices_with_weld ... ok [INFO] [stdout] test mesh_view_dependent_lod::tests::test_camera_distance_basic ... ok [INFO] [stdout] test mesh_view_dependent_lod::tests::test_coverage_clamps_to_one ... ok [INFO] [stdout] test mesh_view_dependent_lod::tests::test_query_lod_distance_positive ... ok [INFO] [stdout] test mesh_view_dependent_lod::tests::test_query_lod_returns_valid_level ... ok [INFO] [stdout] test mesh_view_dependent_lod::tests::test_screen_coverage_positive ... ok [INFO] [stdout] test mesh_view_dependent_lod::tests::test_select_lod_clamps ... ok [INFO] [stdout] test mesh_view_dependent_lod::tests::test_select_lod_full_coverage ... ok [INFO] [stdout] test mesh_view_dependent_lod::tests::test_select_lod_zero_coverage ... ok [INFO] [stdout] test mesh_view_dependent_lod::tests::test_within_distance_budget_false ... ok [INFO] [stdout] test mesh_view_dependent_lod::tests::test_within_distance_budget_true ... ok [INFO] [stdout] test mesh_visibility::tests::test_classify_back_facing ... ok [INFO] [stdout] test mesh_visibility::tests::test_classify_front_facing ... ok [INFO] [stdout] test mesh_visibility::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_visibility::tests::test_face_normal_z_up ... ok [INFO] [stdout] test mesh_visibility::tests::test_front_facing_ratio_empty ... ok [INFO] [stdout] test mesh_visibility::tests::test_front_facing_ratio_full ... ok [INFO] [stdout] test mesh_visibility::tests::test_grazing_angle_deg_ninety ... ok [INFO] [stdout] test mesh_volume_query::tests::test_aabb_volume_cube ... ok [INFO] [stdout] test mesh_visibility::tests::test_grazing_angle_deg_zero ... ok [INFO] [stdout] test mesh_volume_query::tests::test_aabb_volume_empty ... ok [INFO] [stdout] test mesh_volume_query::tests::test_estimate_is_closed_empty ... ok [INFO] [stdout] test mesh_volume_query::tests::test_estimate_is_closed_true ... ok [INFO] [stdout] test mesh_volume_query::tests::test_fill_ratio_at_most_one ... ok [INFO] [stdout] test mesh_volume_query::tests::test_mesh_volume_cube_approx_one ... ok [INFO] [stdout] test mesh_volume_query::tests::test_mesh_volume_signed ... ok [INFO] [stdout] test mesh_volume_query::tests::test_signed_tet_volume_nonzero ... ok [INFO] [stdout] test mesh_voronoi::tests::test_boundary_edges_non_empty_for_multi_cell ... ok [INFO] [stdout] test mesh_volume_query::tests::test_mesh_volume_empty ... ok [INFO] [stdout] test mesh_voronoi::tests::test_cell_count_matches_seeds ... ok [INFO] [stdout] test mesh_voronoi::tests::test_centroidal_step_moves_seeds ... ok [INFO] [stdout] test mesh_vertex_weld::tests::test_weld_vertices_no_weld ... ok [INFO] [stdout] test mesh_visibility::tests::test_dot3_vis ... ok [INFO] [stdout] test mesh_voronoi::tests::test_compute_voronoi_pipeline ... ok [INFO] [stdout] test mesh_visibility::tests::test_visibility_to_json ... ok [INFO] [stdout] test mesh_voronoi::tests::test_default_voronoi_config ... ok [INFO] [stdout] test mesh_voronoi::tests::test_largest_smallest_cell ... ok [INFO] [stdout] test mesh_voronoi::tests::test_random_seeds_correct_count ... ok [INFO] [stdout] test mesh_voronoi::tests::test_vertex_cell_id_valid ... ok [INFO] [stdout] test mesh_voronoi::tests::test_random_seeds_deterministic ... ok [INFO] [stdout] test mesh_voronoi::tests::test_random_seeds_in_range ... ok [INFO] [stdout] test mesh_voronoi::tests::test_voronoi_from_seeds_covers_all_vertices ... ok [INFO] [stdout] test mesh_voronoi_cell::tests::aabb_contains_center ... ok [INFO] [stdout] test mesh_voronoi::tests::test_voronoi_cell_centroid ... ok [INFO] [stdout] test mesh_voronoi::tests::test_voronoi_cell_area ... ok [INFO] [stdout] test mesh_voronoi_cell::tests::cell_count_equals_seed_count ... ok [INFO] [stdout] test mesh_voronoi_cell::tests::seed_index_stored ... ok [INFO] [stdout] test mesh_voronoi_cell::tests::cells_partition_all_points ... ok [INFO] [stdout] test mesh_voronoi::tests::test_voronoi_balance_score_two_cells ... ok [INFO] [stdout] test mesh_voronoi_cell::tests::zero_resolution_returns_empty ... ok [INFO] [stdout] test mesh_voronoi_cell::tests::aabb_excludes_outside ... ok [INFO] [stdout] test mesh_voxel_oct::tests::test_build_octree_nonempty ... ok [INFO] [stdout] test mesh_voxel_oct::tests::test_empty_input_tree ... ok [INFO] [stdout] test mesh_voronoi::tests::test_voronoi_balance_score_single_cell ... ok [INFO] [stdout] test mesh_voxel_oct::tests::test_compute_aabb ... ok [INFO] [stdout] test mesh_voronoi_cell::tests::nearest_seed_basic ... ok [INFO] [stdout] test mesh_voxel_oct::tests::test_compute_aabb_empty ... ok [INFO] [stdout] test mesh_voxel_oct::tests::test_occupied_leaf_count_positive ... ok [INFO] [stdout] test mesh_voronoi_cell::tests::single_seed_gets_all_points ... ok [INFO] [stdout] test mesh_voronoi_cell::tests::total_points_equals_grid_size ... ok [INFO] [stdout] test mesh_voronoi_cell::tests::empty_seeds_returns_empty ... ok [INFO] [stdout] test mesh_voxel_oct::tests::test_split_aabb_coverage ... ok [INFO] [stdout] test mesh_voxel_oct::tests::test_point_in_aabb_inside ... ok [INFO] [stdout] test mesh_voxel_oct::tests::test_split_aabb_eight_children ... ok [INFO] [stdout] test mesh_voxel_oct::tests::test_point_in_aabb_outside ... ok [INFO] [stdout] test mesh_voxelize::tests::default_params_resolution ... ok [INFO] [stdout] test mesh_voxelize::tests::voxelize_single_triangle ... ok [INFO] [stdout] test mesh_warp::tests::displacement_field_count ... ok [INFO] [stdout] test mesh_warp::tests::displacement_field_single_step ... ok [INFO] [stdout] test mesh_warp::tests::dist3_known_values ... ok [INFO] [stdout] test mesh_warp::tests::falloff_radius_clips_distant_vertices ... ok [INFO] [stdout] test mesh_voxelize::tests::grid_new_empty ... ok [INFO] [stdout] test mesh_voxelize::tests::index_mapping_consistent ... ok [INFO] [stdout] test mesh_warp::tests::handle_count_correct ... ok [INFO] [stdout] test mesh_warp::tests::kernel_gaussian_decays ... ok [INFO] [stdout] test mesh_warp::tests::inverse_distance_kernel_warp ... ok [INFO] [stdout] test mesh_voxelize::tests::total_voxel_count_correct ... ok [INFO] [stdout] test mesh_voxelize::tests::voxel_center_correct ... ok [INFO] [stdout] test mesh_voxelize::tests::voxel_triangle_overlap_far_away ... ok [INFO] [stdout] test mesh_voxelize::tests::voxel_triangle_overlap_touching ... ok [INFO] [stdout] test mesh_warp::tests::kernel_inverse_distance_decreasing ... ok [INFO] [stdout] test mesh_warp::tests::kernel_gaussian_unit_at_zero ... ok [INFO] [stdout] test mesh_voxelize::tests::voxelize_cube_surface_nonempty ... ok [INFO] [stdout] test mesh_voxel_oct::tests::test_vox_octree_to_json ... ok [INFO] [stdout] test mesh_warp::tests::warp_no_handles_identity ... ok [INFO] [stdout] test mesh_warp::tests::warp_single_handle_interpolates_source ... ok [INFO] [stdout] test mesh_warp_deform::tests::test_active_handle_count ... ok [INFO] [stdout] test mesh_warp::tests::kernel_linear_identity ... ok [INFO] [stdout] test mesh_voxelize::tests::grid_set_get ... ok [INFO] [stdout] test mesh_warp::tests::kernel_multiquadric_positive ... ok [INFO] [stdout] test mesh_warp::tests::kernel_tps_positive_nonzero ... ok [INFO] [stdout] test mesh_warp::tests::kernel_tps_zero_at_zero ... ok [INFO] [stdout] test mesh_warp::tests::multiquadric_kernel_warp ... ok [INFO] [stdout] test mesh_warp::tests::simple_warp_moves_near_vertices ... ok [INFO] [stdout] test mesh_warp::tests::write_displacement_field_to_tmp ... ok [INFO] [stdout] test mesh_warp::tests::simple_warp_no_handles_identity ... ok [INFO] [stdout] test mesh_warp::tests::warp_apply_changes_positions ... ok [INFO] [stdout] test mesh_warp::tests::write_warped_positions_to_tmp ... ok [INFO] [stdout] test mesh_warp::tests::warp_mesh_convenience ... ok [INFO] [stdout] test mesh_warp_deform::tests::test_apply_warp_moves_position ... ok [INFO] [stdout] test mesh_warp_deform::tests::test_avg_warp_displacement_zero ... ok [INFO] [stdout] test mesh_warp_deform::tests::test_apply_warp_no_handles ... ok [INFO] [stdout] test mesh_warp_deform::tests::test_rbf_weight_at_origin ... ok [INFO] [stdout] test mesh_warp_modifier::tests::falloff_zero_radius_returns_zero ... ok [INFO] [stdout] test mesh_warp_modifier::tests::vertex_far_from_origin_unchanged ... ok [INFO] [stdout] test mesh_warp_modifier::tests::vertex_at_origin_fully_warped ... ok [INFO] [stdout] test mesh_warp_deform::tests::test_rbf_weight_beyond_radius ... ok [INFO] [stdout] test mesh_warp_modifier::tests::warp_moves_in_correct_direction ... ok [INFO] [stdout] test mesh_warp_modifier::tests::falloff_at_radius_is_zero ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_apply_multiple_ripples ... ok [INFO] [stdout] test mesh_warp_modifier::tests::falloff_at_zero_is_one ... ok [INFO] [stdout] test mesh_warp_modifier::tests::zero_strength_no_displacement ... ok [INFO] [stdout] test mesh_warp_modifier::tests::falloff_beyond_radius_is_zero ... ok [INFO] [stdout] test mesh_warp_deform::tests::test_dist3_wd_basic ... ok [INFO] [stdout] test mesh_warp_deform::tests::test_empty_positions ... ok [INFO] [stdout] test mesh_warp_deform::tests::test_rbf_weight_at_radius ... ok [INFO] [stdout] test mesh_warp_modifier::tests::apply_warp_preserves_count ... ok [INFO] [stdout] test mesh_warp_deform::tests::test_warp_config_to_json ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_apply_ripple_changes_positions ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_apply_wave_deform_changes_positions ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_distance3 ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_dot3 ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_normalize3 ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_wave_value_sine_at_zero ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_wave_value_cosine_at_zero ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_ripple_value_at_center ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_ripple_value_away_from_center ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_standing_wave_at_zero ... ok [INFO] [stdout] test mesh_wave_mesh::tests::test_generate_wave_mesh_index_count ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_standing_wave_quarter_period ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_wave_envelope_decay ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_wave_envelope_no_decay ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_wave_interference ... ok [INFO] [stdout] test mesh_wave_mesh::tests::test_generate_wave_mesh_indices_in_bounds ... ok [INFO] [stdout] test mesh_wave_mesh::tests::test_generate_wave_mesh_vertex_count ... ok [INFO] [stdout] test mesh_wave_deform::tests::test_wave_value_changes_with_position ... ok [INFO] [stdout] test mesh_wave_mesh::tests::test_wave_height_not_nan ... ok [INFO] [stdout] test mesh_wave_mesh::tests::test_wave_height_zero_amplitude ... ok [INFO] [stdout] test mesh_wave_mesh::tests::test_wave_y_range_finite ... ok [INFO] [stdout] test mesh_wedge::tests::test_wedge_base_angle_right ... ok [INFO] [stdout] test mesh_wedge::tests::test_wedge_to_json ... ok [INFO] [stdout] test mesh_wedge::tests::test_wedge_indices_valid ... ok [INFO] [stdout] test mesh_wedge::tests::test_wedge_negative_height ... ok [INFO] [stdout] test mesh_wedge::tests::test_wedge_positions_all_finite ... ok [INFO] [stdout] test mesh_winding_query::tests::test_winding_batch_empty_queries ... ok [INFO] [stdout] test mesh_winding_query::tests::test_winding_batch_same_length ... ok [INFO] [stdout] test mesh_wave_mesh::tests::test_phase_shift_changes_height ... ok [INFO] [stdout] test mesh_wave_mesh::tests::test_wave_params_to_json ... ok [INFO] [stdout] test mesh_wave_mesh::tests::test_wave_triangle_count ... ok [INFO] [stdout] test mesh_wave_mesh::tests::test_wave_vertex_count ... ok [INFO] [stdout] test mesh_winding_query::tests::test_count_inside_all_outside ... ok [INFO] [stdout] test mesh_winding_query::tests::test_is_inside_outside_mesh ... ok [INFO] [stdout] test mesh_winding_query::tests::test_solid_angle_finite ... ok [INFO] [stdout] test mesh_winding_query::tests::test_solid_angle_zero_empty ... ok [INFO] [stdout] test mesh_wedge::tests::test_wedge_volume_positive ... ok [INFO] [stdout] test mesh_winding_query::tests::test_winding_number_empty_mesh ... ok [INFO] [stdout] test mesh_winding_query::tests::test_winding_outside_near_zero ... ok [INFO] [stdout] test mesh_wire_frame::tests::empty_mesh_no_edges ... ok [INFO] [stdout] test mesh_wire_frame::tests::total_wireframe_length_positive ... ok [INFO] [stdout] test mesh_wire_frame::tests::max_edge_length_at_least_avg ... ok [INFO] [stdout] test mesh_wire_mesh::tests::test_extract_wire_edges_count ... ok [INFO] [stdout] test mesh_wire_mesh::tests::test_empty_mesh ... ok [INFO] [stdout] test mesh_wire_mesh::tests::test_wire_indices_valid ... ok [INFO] [stdout] test mesh_wire_frame::tests::average_edge_length_positive ... ok [INFO] [stdout] test mesh_wire_frame::tests::single_triangle_three_edges ... ok [INFO] [stdout] test mesh_wire_frame::tests::edge_length_positive ... ok [INFO] [stdout] test mesh_wire_frame::tests::wireframe_edges_unique ... ok [INFO] [stdout] test mesh_wire_frame::tests::wireframe_has_edges ... ok [INFO] [stdout] test mesh_wedge::tests::test_wedge_vertex_count ... ok [INFO] [stdout] test mesh_wire_frame::tests::wireframe_indices_valid_check ... ok [INFO] [stdout] test mesh_wire_frame::tests::wireframe_line_buffer_even_count ... ok [INFO] [stdout] test mesh_wire_mesh::tests::test_two_adjacent_tris_share_edge ... ok [INFO] [stdout] test mesh_wire_mesh::tests::test_wire_avg_length_positive ... ok [INFO] [stdout] test mesh_wedge::tests::test_wedge_triangle_count ... ok [INFO] [stdout] test mesh_wire_mesh::tests::test_wire_avg_length_empty ... ok [INFO] [stdout] test mesh_wire_mesh::tests::test_wire_mesh_to_json ... ok [INFO] [stdout] test mesh_wire_mesh::tests::test_wire_no_duplicate_edges ... ok [INFO] [stdout] test mesh_wireframe_modifier::tests::test_new_wireframe_params ... ok [INFO] [stdout] test mesh_wrinkle_map::tests::test_weights_at_halfway ... ok [INFO] [stdout] test mesh_wrinkle_map::tests::test_peak_count ... ok [INFO] [stdout] test mesh_wireframe_modifier::tests::test_wireframe_vertex_count ... ok [INFO] [stdout] test mesh_wrinkle_map::tests::test_mean_weight ... ok [INFO] [stdout] test mesh_wireframe_modifier::tests::test_wireframe_tube_length ... ok [INFO] [stdout] test mesh_wireframe_modifier::tests::test_wireframe_edge_count ... ok [INFO] [stdout] test mesh_wireframe_modifier::tests::test_wireframe_params_negative_clamped ... ok [INFO] [stdout] test mesh_wireframe_modifier::tests::test_wireframe_edge_tube_vert_count ... ok [INFO] [stdout] test mesh_wrinkle_map::tests::test_factor_at_max ... ok [INFO] [stdout] test mesh_wire_mesh::tests::test_wire_total_length_positive ... ok [INFO] [stdout] test mesh_wrinkle_map::tests::test_new_wrinkle_driver ... ok [INFO] [stdout] test mesh_zup_convert::tests::test_bounds_zup_none_empty ... ok [INFO] [stdout] test mesh_wrinkle_map::tests::test_factor_at_min ... ok [INFO] [stdout] test mesh_zup_convert::tests::test_convert_yup_to_zup_count ... ok [INFO] [stdout] test mesh_zup_convert::tests::test_normals_yup_to_zup_count ... ok [INFO] [stdout] test mesh_zup_convert::tests::test_bounds_zup_some ... ok [INFO] [stdout] test mesh_zup_convert::tests::test_convert_up_axis_identity ... ok [INFO] [stdout] test mesh_zup_convert::tests::test_convert_up_axis_zup_to_yup ... ok [INFO] [stdout] test mesh_zup_convert::tests::test_round_trip_empty ... ok [INFO] [stdout] test mesh_zup_convert::tests::test_yup_to_zup_x_unchanged ... ok [INFO] [stdout] test microdisp::tests::test_apply_micro_displacement_amplitude_zero ... ok [INFO] [stdout] test microdisp::tests::test_micro_disp_result_stats ... ok [INFO] [stdout] test mesh_zup_convert::tests::test_yup_to_zup_y_becomes_z ... ok [INFO] [stdout] test mesh_zup_convert::tests::test_zup_to_yup_roundtrip ... ok [INFO] [stdout] test microdisp::tests::test_apply_micro_displacement_basic ... ok [INFO] [stdout] test microdisp::tests::test_apply_micro_displacement_blend ... ok [INFO] [stdout] test microdisp::tests::test_sample_displacement_sine ... ok [INFO] [stdout] test microdisp::tests::test_sample_displacement_value_noise ... ok [INFO] [stdout] test microdisp::tests::test_value_noise_range ... ok [INFO] [stdout] test microdisp::tests::test_skin_displacement ... ok [INFO] [stdout] test normal_map_bake::tests::test_closest_surface_point ... ok [INFO] [stdout] test normal_map_bake::tests::test_coverage ... ok [INFO] [stdout] test normal_map_bake::tests::test_lerp_normal_helper ... ok [INFO] [stdout] test normal_map_bake::tests::test_rasterize_uv_triangle_basic ... ok [INFO] [stdout] test normal_map_bake::tests::test_bake_normal_map_basic ... ok [INFO] [stdout] test normal_map_bake::tests::test_bake_tangent_space ... ok [INFO] [stdout] test microdisp::tests::test_voronoi_deterministic ... ok [INFO] [stdout] test normal_map_bake::tests::test_rasterize_uv_triangle_empty ... ok [INFO] [stdout] test microdisp::tests::test_wrinkle_displacement ... ok [INFO] [stdout] test normal_map_bake::tests::test_rgb_to_normal_decoding ... ok [INFO] [stdout] test normal_map_bake::tests::test_normal_map_get_set ... ok [INFO] [stdout] test normal_map_bake::tests::test_normal_map_texture_new ... ok [INFO] [stdout] test normal_map_bake::tests::test_to_rgb_u8 ... ok [INFO] [stdout] test normal_map_bake::tests::test_normal_roundtrip ... ok [INFO] [stdout] test normals::tests::compute_tangents_length_matches_verts ... ok [INFO] [stdout] test normal_map_bake::tests::test_normal_to_rgb_encoding ... ok [INFO] [stdout] test normal_map_bake::tests::test_save_ppm ... ok [INFO] [stdout] test microdisp::tests::test_value_noise_deterministic ... ok [INFO] [stdout] test microdisp::tests::test_voronoi_range ... ok [INFO] [stdout] test normals::tests::empty_mesh_tangents_empty ... ok [INFO] [stdout] test microdisp::tests::test_vertex_mask_applied ... ok [INFO] [stdout] test microdisp::tests::test_fbm_noise_range ... ok [INFO] [stdout] test normals::tests::tangents_are_unit_length ... ok [INFO] [stdout] test octree::tests::octree_aabb_octants_count_is_8 ... ok [INFO] [stdout] test normals::tests::tangent_perpendicular_to_normal ... ok [INFO] [stdout] test normals::tests::tangent_w_is_plus_or_minus_one ... ok [INFO] [stdout] test octree::tests::octree_aabb_not_contains_point_outside ... ok [INFO] [stdout] test octree::tests::octree_build_empty_still_works ... ok [INFO] [stdout] test octree::tests::octree_build_many_points ... ok [INFO] [stdout] test normals::tests::normals_point_up_z ... ok [INFO] [stdout] test octree::tests::octree_aabb_contains_point_inside ... ok [INFO] [stdout] test octree::tests::octree_aabb_from_points_correct_bounds ... ok [INFO] [stdout] test octree::tests::octree_build_single_point ... ok [INFO] [stdout] test octree::tests::octree_len_matches_input ... ok [INFO] [stdout] test octree::tests::octree_nearest_among_many ... ok [INFO] [stdout] test octree::tests::octree_radius_search_excludes_far ... ok [INFO] [stdout] test octree::tests::octree_nearest_returns_closest ... ok [INFO] [stdout] test pose_library::tests::standard_library_has_four_poses ... ok [INFO] [stdout] test pose_library::tests::blend_at_t0_equals_a ... ok [INFO] [stdout] test pose_library::tests::t_pose_has_shoulder_rotations ... ok [INFO] [stdout] test octree::tests::octree_radius_search_finds_nearby ... ok [INFO] [stdout] test octree::tests::octree_nearest_single_point_returns_it ... ok [INFO] [stdout] test proxy_gen::tests::test_fit_aabb_basic ... ok [INFO] [stdout] test proxy_gen::tests::test_box_mesh_basic ... ok [INFO] [stdout] test octree::tests::octree_sq_dist_to_aabb_zero_when_inside ... ok [INFO] [stdout] test proxy_gen::tests::test_fit_obb_basic ... ok [INFO] [stdout] test pose_library::tests::slerp_identity_to_identity_is_identity ... ok [INFO] [stdout] test pose_library::tests::blend_at_t1_equals_b ... ok [INFO] [stdout] test proxy_gen::tests::test_proxy_shape_center_capsule ... ok [INFO] [stdout] test proxy_gen::tests::test_fit_sphere_multiple ... ok [INFO] [stdout] test proxy_gen::tests::test_proxy_shape_center_sphere ... ok [INFO] [stdout] test ray_pick::tests::test_box_select_vertices ... ok [INFO] [stdout] test proxy_gen::tests::test_fit_sphere_single_point ... ok [INFO] [stdout] test proxy_gen::tests::test_proxy_shape_volume_aabb ... ok [INFO] [stdout] test proxy_gen::tests::test_proxy_shape_volume_sphere ... ok [INFO] [stdout] test proxy_gen::tests::test_fit_capsule_vertical ... ok [INFO] [stdout] test proxy_gen::tests::test_mesh_proxy_sphere ... ok [INFO] [stdout] test proxy_gen::tests::test_sphere_mesh_basic ... ok [INFO] [stdout] test pose_library::tests::apply_to_skeleton_overrides_rotations ... ok [INFO] [stdout] test proxy_gen::tests::test_capsule_mesh_basic ... ok [INFO] [stdout] test pose_library::tests::rotation_for_unknown_returns_identity ... ok [INFO] [stdout] test ray_pick::tests::test_pick_vertex ... ok [INFO] [stdout] test ray_pick::tests::test_point_to_ray_distance_perp ... ok [INFO] [stdout] test ray_pick::tests::test_point_to_ray_distance_zero ... ok [INFO] [stdout] test ray_pick::tests::test_closest_ray_point ... ok [INFO] [stdout] test ray_pick::tests::test_pick_all_faces ... ok [INFO] [stdout] test ray_pick::tests::test_pick_face_hit ... ok [INFO] [stdout] test ray_pick::tests::test_pick_face_miss ... ok [INFO] [stdout] test ray_pick::tests::test_ray_at ... ok [INFO] [stdout] test ray_pick::tests::test_ray_new ... ok [INFO] [stdout] test ray_pick::tests::test_project_onto_ray ... ok [INFO] [stdout] test ray_pick::tests::test_ray_normalized ... ok [INFO] [stdout] test ray_pick::tests::test_sphere_select_vertices ... ok [INFO] [stdout] test remesh::tests::test_collapse_short_edges_basic ... ok [INFO] [stdout] test remesh::tests::test_default_params ... ok [INFO] [stdout] test remesh::tests::test_flip_edges_for_valence ... ok [INFO] [stdout] test remesh::tests::test_split_preserves_face_count_below_threshold ... ok [INFO] [stdout] test repair::tests::count_zero_length_edges_zero_for_clean ... ok [INFO] [stdout] test remesh::tests::test_remesh_simple_quad ... ok [INFO] [stdout] test repair::tests::fix_out_of_range_clamps ... ok [INFO] [stdout] test remesh::tests::test_collapse_no_op_above_threshold ... ok [INFO] [stdout] test repair::tests::has_degenerate_faces_detects_bad ... ok [INFO] [stdout] test remesh::tests::test_compute_mean_edge_length_triangle ... ok [INFO] [stdout] test remesh::tests::test_compute_target_edge_length ... ok [INFO] [stdout] test remesh::tests::test_split_long_edges_basic ... ok [INFO] [stdout] test repair::tests::flip_winding_reverses_order ... ok [INFO] [stdout] test remesh::tests::test_smooth_vertices ... ok [INFO] [stdout] test remesh::tests::test_remesh_iterations ... ok [INFO] [stdout] test repair::tests::has_valid_indices_false_for_bad_index ... ok [INFO] [stdout] test repair::tests::has_valid_indices_true_for_clean_mesh ... ok [INFO] [stdout] test repair::tests::remove_degenerate_same_index_triangle ... ok [INFO] [stdout] test remesh::tests::test_remesh_result_fields ... ok [INFO] [stdout] test repair::tests::remove_duplicate_faces_keeps_uniques ... ok [INFO] [stdout] test repair::tests::remove_degenerate_zero_area_triangle ... ok [INFO] [stdout] test repair::tests::ensure_complete_triangles_trims_partial ... ok [INFO] [stdout] test repair::tests::repair_mesh_cleans_degenerate ... ok [INFO] [stdout] test retarget::tests::retarget_map_add_and_resolve ... ok [INFO] [stdout] test repair::tests::remove_duplicate_faces_deduplicates ... ok [INFO] [stdout] test retarget::tests::retarget_map_identity_resolves_same_name ... ok [INFO] [stdout] test retarget::tests::retarget_sequence_each_pose_correct_length ... ok [INFO] [stdout] test retarget::tests::retarget_sequence_length_matches_input ... ok [INFO] [stdout] test retarget::tests::retarget_map_new_is_empty ... ok [INFO] [stdout] test normals::tests::compute_normals_no_nan ... ok [INFO] [stdout] test repair::tests::repair_report_counts_correctly ... ok [INFO] [stdout] test retarget::tests::retarget_map_resolve_missing_returns_none ... ok [INFO] [stdout] test retarget::tests::retarget_pose_identity_map_preserves_quats ... ok [INFO] [stdout] test retarget::tests::retarget_pose_length_equals_target_count ... ok [INFO] [stdout] test retarget::tests::retarget_pose_mapped_joint_transfers_correctly ... ok [INFO] [stdout] test retarget::tests::retarget_pose_unmapped_joint_is_identity_quat ... ok [INFO] [stdout] test sampling::tests::face_area_known_triangle ... ok [INFO] [stdout] test sampling::tests::face_area_zero_for_degenerate ... ok [INFO] [stdout] test sampling::tests::face_areas_length_matches_face_count ... ok [INFO] [stdout] test sampling::tests::lcg_new_advances_state ... ok [INFO] [stdout] test sampling::tests::lcg_next_f32_in_range ... ok [INFO] [stdout] test sampling::tests::sample_one_per_face_count_equals_face_count ... ok [INFO] [stdout] test sampling::tests::sample_surface_normals_unit_length ... ok [INFO] [stdout] test seam_cut::tests::cut_seams_added_vertices_reported ... ok [INFO] [stdout] test sampling::tests::surface_point_from_barycentric_on_face ... ok [INFO] [stdout] test seam_cut::tests::cut_seams_new_vertex_count_gte_original ... ok [INFO] [stdout] test seam_cut::tests::cut_seams_result_has_vertex_map ... ok [INFO] [stdout] test sampling::tests::sample_surface_correct_count ... ok [INFO] [stdout] test seam_cut::tests::cut_seams_vertex_map_values_in_range ... ok [INFO] [stdout] test sampling::tests::sample_surface_positions_finite ... ok [INFO] [stdout] test sampling::tests::sample_surface_uvs_in_range ... ok [INFO] [stdout] test seam_cut::tests::count_uv_islands_single_triangle_one_island ... ok [INFO] [stdout] test seam_cut::tests::cut_seams_face_count_unchanged ... ok [INFO] [stdout] test seam_cut::tests::cut_seams_vertex_map_length_matches_new_count ... ok [INFO] [stdout] test sampling::tests::total_surface_area_positive ... ok [INFO] [stdout] test seam_cut::tests::cut_seams_no_seam_mesh_unchanged_vert_count ... ok [INFO] [stdout] test seam_cut::tests::face_uv_bounds_correct_min_max ... ok [INFO] [stdout] test seam_cut::tests::face_uv_bounds_length_matches_faces ... ok [INFO] [stdout] test seam_cut::tests::find_seam_edges_two_tris_no_seam_returns_empty ... ok [INFO] [stdout] test seam_cut::tests::has_uv_seams_false_for_no_seam_mesh ... ok [INFO] [stdout] test seam_cut::tests::split_islands_single_triangle ... ok [INFO] [stdout] test sampling::tests::sample_poisson_disk_min_distance_respected ... ok [INFO] [stdout] test shapes::tests::box_face_count ... ok [INFO] [stdout] test shapes::tests::cone_index_bounds ... ok [INFO] [stdout] test seam_cut::tests::find_seam_edges_no_seams_empty ... ok [INFO] [stdout] test shapes::tests::cylinder_index_bounds ... ok [INFO] [stdout] test seam_cut::tests::split_islands_count_matches ... ok [INFO] [stdout] test shapes::tests::sphere_positions_on_surface ... ok [INFO] [stdout] test shapes::tests::capsule_has_more_faces_than_cylinder ... ok [INFO] [stdout] test shapes::tests::sphere_index_bounds ... ok [INFO] [stdout] test shapes::tests::quad_has_2_faces ... ok [INFO] [stdout] test seam_cut::tests::has_uv_seams_two_disconnected_tris ... ok [INFO] [stdout] test skeleton::tests::add_joint_increments_index ... ok [INFO] [stdout] test skeleton::tests::joint_rotation_identity_is_unit ... ok [INFO] [stdout] test shapes::tests::sphere_vertex_count ... ok [INFO] [stdout] test skeleton::tests::roots_are_single_root ... ok [INFO] [stdout] test skinning::tests::bind_pose_no_deformation ... ok [INFO] [stdout] test skeleton::tests::human_body_has_expected_joint_count ... ok [INFO] [stdout] test skinning::tests::normalize_weights_sum_to_one ... ok [INFO] [stdout] test skinning::tests::nearest_joint_assigns_all_verts ... ok [INFO] [stdout] test skinning::tests::identity_skinning_is_valid ... ok [INFO] [stdout] test skeleton::tests::children_of_hips ... ok [INFO] [stdout] test smooth::tests::smooth_preserves_index_count ... ok [INFO] [stdout] test smooth::tests::smooth_interior_moves_toward_neighbors ... ok [INFO] [stdout] test smooth::tests::taubin_smooth_less_shrinkage ... ok [INFO] [stdout] test smooth::tests::smooth_normals_length_unchanged ... ok [INFO] [stdout] test smooth::tests::smooth_preserves_vertex_count ... ok [INFO] [stdout] test skinning::tests::lbs_single_joint_translation ... ok [INFO] [stdout] test spring_deform::tests::test_build_edge_springs ... ok [INFO] [stdout] test spring_deform::tests::test_find_boundary_vertices ... ok [INFO] [stdout] test spring_deform::tests::test_jiggle_deform ... ok [INFO] [stdout] test spring_deform::tests::test_apply_impulse ... ok [INFO] [stdout] test spring_deform::tests::test_fixed_vertex_stays_fixed ... ok [INFO] [stdout] test spring_deform::tests::test_spring_count ... ok [INFO] [stdout] test spring_deform::tests::test_is_settled ... ok [INFO] [stdout] test spring_deform::tests::test_step_moves_unfixed_vertices ... ok [INFO] [stdout] test spring_deform::tests::test_kinetic_energy ... ok [INFO] [stdout] test spring_deform::tests::test_reset ... ok [INFO] [stdout] test spring_deform::tests::test_spring_system_from_mesh ... ok [INFO] [stdout] test smooth::tests::zero_iterations_no_change ... ok [INFO] [stdout] test stats::tests::stats_summary_nonempty ... ok [INFO] [stdout] test stats::tests::unit_triangle_area ... ok [INFO] [stdout] test stats::tests::unit_triangle_face_count ... ok [INFO] [stdout] test subdivide::tests::loop_two_iterations_sixteen_faces ... ok [INFO] [stdout] test spring_deform::tests::test_to_mesh ... ok [INFO] [stdout] test spring_deform::tests::test_vertex_count ... ok [INFO] [stdout] test stats::tests::edge_lengths_unit_triangle ... ok [INFO] [stdout] test stats::tests::face_areas_length ... ok [INFO] [stdout] test subdivide::tests::loop_one_iter_quadruples_faces ... ok [INFO] [stdout] test stats::tests::face_aspect_ratios_length ... ok [INFO] [stdout] test stats::tests::stats_euler_characteristic ... ok [INFO] [stdout] test stats::tests::stats_vertex_count_correct ... ok [INFO] [stdout] test stats::tests::surface_area_two_triangles ... ok [INFO] [stdout] test subdivide::tests::loop_zero_iterations_unchanged ... ok [INFO] [stdout] test subdivide::tests::loop_uv_count_matches_position_count ... ok [INFO] [stdout] test subdivide::tests::midpoint_vertex_count_increases ... ok [INFO] [stdout] test suit::tests::bare_mesh_fails_suit_check ... ok [INFO] [stdout] test suit::tests::suit_applied_passes_check ... ok [INFO] [stdout] test terrain::tests::test_generate_dome_terrain ... ok [INFO] [stdout] test terrain::tests::test_generate_grid ... ok [INFO] [stdout] test terrain::tests::test_heightfield_from_fn ... ok [INFO] [stdout] test terrain::tests::test_generate_sine_terrain ... ok [INFO] [stdout] test terrain::tests::test_heightfield_new ... ok [INFO] [stdout] test terrain::tests::test_heightfield_get_set ... ok [INFO] [stdout] test terrain::tests::test_heightfield_normalize ... ok [INFO] [stdout] test terrain::tests::test_heightfield_flat ... ok [INFO] [stdout] test terrain::tests::test_heightfield_sample_bilinear ... ok [INFO] [stdout] test terrain::tests::test_smooth_heightfield ... ok [INFO] [stdout] test thickness::tests::test_compute_thickness_basic ... ok [INFO] [stdout] test terrain::tests::test_mesh_to_heightfield ... ok [INFO] [stdout] test terrain::tests::test_heightfield_min_max ... ok [INFO] [stdout] test terrain::tests::test_terrain_from_heightfield_basic ... ok [INFO] [stdout] test thickness::tests::test_cone_samples_count ... ok [INFO] [stdout] test thickness::tests::test_ray_mesh_hits_empty ... ok [INFO] [stdout] test thickness::tests::test_ray_mesh_hits_simple ... ok [INFO] [stdout] test thickness::tests::test_ray_triangle_miss_behind ... ok [INFO] [stdout] test thickness::tests::test_ray_triangle_hit_basic ... ok [INFO] [stdout] test thickness::tests::test_ray_triangle_miss_outside ... ok [INFO] [stdout] test thickness::tests::test_ray_triangle_miss_parallel ... ok [INFO] [stdout] test thickness::tests::test_sample_thickness_at ... ok [INFO] [stdout] test subdivide::tests::midpoint_check_index_bounds ... ok [INFO] [stdout] test thickness::tests::test_thickness_map_to_colors ... ok [INFO] [stdout] test thickness::tests::test_thickness_params_default ... ok [INFO] [stdout] test subdivide::tests::midpoint_one_iter_quadruples_faces ... ok [INFO] [stdout] test uv_quality::tests::compute_face_stretches_length_matches_faces ... ok [INFO] [stdout] test terrain::tests::test_compute_slope ... ok [INFO] [stdout] test uv_quality::tests::compute_uv_utilization_tiny_uv_is_low ... ok [INFO] [stdout] test uv_quality::tests::face_conformal_distortion_identity_near_zero ... ok [INFO] [stdout] test uv_quality::tests::face_uv_stretch_identity_no_stretch ... ok [INFO] [stdout] test uv_quality::tests::compute_uv_utilization_full_quad_is_high ... ok [INFO] [stdout] test uv_quality::tests::face_uv_stretch_scaled_uv ... ok [INFO] [stdout] test uv_quality::tests::count_uv_overlaps_no_overlap_mesh ... ok [INFO] [stdout] test thickness::tests::test_thickness_map_normalized ... ok [INFO] [stdout] test uv_quality::tests::is_degenerate_uv_face_detects_collapsed ... ok [INFO] [stdout] test uvgen::tests::cylindrical_uv_count ... ok [INFO] [stdout] test uvgen::tests::cylindrical_v_in_range ... ok [INFO] [stdout] test uv_quality::tests::uv_triangle_area_unit_triangle ... ok [INFO] [stdout] test uvgen::tests::cylindrical_u_in_range ... ok [INFO] [stdout] test uv_quality::tests::uv_quality_report_avg_stretch_nonnegative ... ok [INFO] [stdout] test uv_quality::tests::uv_triangle_area_zero_for_degenerate ... ok [INFO] [stdout] test uv_quality::tests::worst_stretch_faces_sorted_desc ... ok [INFO] [stdout] test uvgen::tests::flip_v_inverts ... ok [INFO] [stdout] test uv_quality::tests::uv_quality_report_face_count ... ok [INFO] [stdout] test uvgen::tests::normalize_uvs_result_in_range ... ok [INFO] [stdout] test uvgen::tests::rotate_uvs_at_zero_unchanged ... ok [INFO] [stdout] test uvgen::tests::spherical_u_in_range ... ok [INFO] [stdout] test uvgen::tests::tile_uvs_doubles ... ok [INFO] [stdout] test visibility::tests::classify_aabb_inside ... ok [INFO] [stdout] test visibility::tests::backface_cull_half_sphere_approx ... ok [INFO] [stdout] test visibility::tests::frustum_contains_point_outside ... ok [INFO] [stdout] test visibility::tests::count_front_facing_positive ... ok [INFO] [stdout] test visibility::tests::classify_aabb_outside ... ok [INFO] [stdout] test visibility::tests::frustum_intersects_aabb_inside ... ok [INFO] [stdout] test visibility::tests::frustum_intersects_sphere_outside ... ok [INFO] [stdout] test visibility::tests::is_front_facing_forward_face ... ok [INFO] [stdout] test visibility::tests::frustum_intersects_aabb_outside ... ok [INFO] [stdout] test visibility::tests::frustum_orthographic_contains_center ... ok [INFO] [stdout] test visibility::tests::is_front_facing_back_face ... ok [INFO] [stdout] test voxelize::tests::test_voxel_grid_density ... ok [INFO] [stdout] test voxelize::tests::test_voxel_grid_new ... ok [INFO] [stdout] test uvgen::tests::offset_uvs_shifts ... ok [INFO] [stdout] test voxelize::tests::test_voxel_grid_get_set ... ok [INFO] [stdout] test voxelize::tests::test_mesh_bounds_triangle ... ok [INFO] [stdout] test uvgen::tests::planar_top_uv_count ... ok [INFO] [stdout] test visibility::tests::frustum_intersects_sphere_inside ... ok [INFO] [stdout] test visibility::tests::frustum_contains_point_inside ... ok [INFO] [stdout] test visibility::tests::plane_from_points_normal_correct ... ok [INFO] [stdout] test mesh_wedge::tests::test_wedge_zero_height_zero_volume ... ok [INFO] [stdout] test visibility::tests::frustum_orthographic_excludes_outside ... ok [INFO] [stdout] test visibility::tests::plane_signed_distance_negative_outside ... ok [INFO] [stdout] test visibility::tests::plane_signed_distance_positive_inside ... ok [INFO] [stdout] test thickness::tests::test_cone_samples_angle ... ok [INFO] [stdout] test voxelize::tests::test_voxel_grid_world_pos ... ok [INFO] [stdout] test voxelize::tests::test_voxel_to_mesh_single ... ok [INFO] [stdout] test voxelize::tests::test_voxelize_dispatch_solid ... ok [INFO] [stdout] test voxelize::tests::test_voxelize_dispatch_surface_only ... ok [INFO] [stdout] test voxelize::tests::test_voxelize_solid_simple ... ok [INFO] [stdout] test vpaint::tests::blend_at_zero_equals_other ... ok [INFO] [stdout] test voxelize::tests::test_voxelize_surface_triangle ... ok [INFO] [stdout] test vpaint::tests::flood_fill_sets_all ... ok [INFO] [stdout] test vpaint::tests::build_adjacency_triangle_has_mutual_edges ... ok [INFO] [stdout] test voxelize::tests::test_voxelize_params_default ... ok [INFO] [stdout] test voxelize::tests::test_voxelize_resolution ... ok [INFO] [stdout] test vpaint::tests::blend_at_one_equals_self ... ok [INFO] [stdout] test vpaint::tests::count_above_threshold ... ok [INFO] [stdout] test vpaint::tests::paint_clamps_above_one ... ok [INFO] [stdout] test vpaint::tests::paint_clamps_below_zero ... ok [INFO] [stdout] test vpaint::tests::smooth_once_averages_neighbors ... ok [INFO] [stdout] test vpaint::tests::weight_map_new_initializes_correctly ... ok [INFO] [stdout] test vpaint::tests::paint_sphere_does_not_affect_distant_vertices ... ok [INFO] [stdout] test vpaint::tests::weight_map_zeros_all_zero ... ok [INFO] [stdout] test vpaint::tests::weight_map_ones_all_one ... ok [INFO] [stdout] test weld::tests::deduplicate_removes_repeated_face ... ok [INFO] [stdout] test weld::tests::remove_unused_removes_orphan ... ok [INFO] [stdout] test weld::tests::weld_by_position_and_uv_different_uv_not_merged ... ok [INFO] [stdout] test weld::tests::weld_duplicate_verts_reduces_count ... ok [INFO] [stdout] test weld::tests::weld_preserves_triangle_integrity ... ok [INFO] [stdout] test winding::tests::test_mesh_surface_area_quad ... ok [INFO] [stdout] test winding::tests::test_batch_empty ... ok [INFO] [stdout] test vpaint::tests::invert_flips_weights ... ok [INFO] [stdout] test winding::tests::test_winding_sign ... ok [INFO] [stdout] test vpaint::tests::normalize_rescales_range ... ok [INFO] [stdout] test winding::tests::test_winding_number_outside ... ok [INFO] [stdout] test vpaint::tests::multiply_zeros_result ... ok [INFO] [stdout] test winding::tests::test_winding_threshold_constant ... ok [INFO] [stdout] test winding::tests::test_batch_winding_numbers ... ok [INFO] [stdout] test winding::tests::test_classify_points ... ok [INFO] [stdout] test weld::tests::weld_result_remap_covers_all_old_verts ... ok [INFO] [stdout] test winding::tests::test_triangle_solid_angle_degenerate ... ok [INFO] [stdout] test winding::tests::test_triangle_solid_angle_basic ... ok [INFO] [stdout] test vpaint::tests::paint_sphere_affects_nearby_vertices ... ok [INFO] [stdout] test winding::tests::test_winding_number_inside_single_triangle ... ok [INFO] [stdout] test winding::tests::test_mesh_surface_area_triangle ... ok [INFO] [stdout] test winding::tests::test_is_inside_point ... ok [INFO] [stderr] Running tests/proptest_mesh.rs (/opt/rustwide/target/debug/deps/proptest_mesh-a9f0200bd35568b2) [INFO] [stdout] test mesh_power_crust::tests::reconstruct_sphere_produces_closed_mesh ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 5708 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.78s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 7 tests [INFO] [stdout] test normalize_uvs_in_unit_range ... ok [INFO] [stdout] test decimation_never_increases_faces ... ok [INFO] [stdout] test decimation_with_zero_target_never_panics ... ok [INFO] [stdout] test flip_v_preserves_unit_range ... ok [INFO] [stdout] test normals_are_unit_length_or_default ... ok [INFO] [stdout] test normals_never_nan ... ok [INFO] [stdout] test uv_projection_stays_in_unit_range ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s [INFO] [stdout] [INFO] [stderr] Doc-tests oxihuman_mesh [INFO] [stdout] [INFO] [stdout] running 1 test [INFO] [stdout] test src/lib.rs - (line 21) ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.87s [INFO] [stdout] [INFO] running `Command { std: "docker" "inspect" "a5845812ca13e4651783dc868671718e8a8bb8e7830c8173d780f7844f8ec181", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "a5845812ca13e4651783dc868671718e8a8bb8e7830c8173d780f7844f8ec181", kill_on_drop: false }` [INFO] [stdout] a5845812ca13e4651783dc868671718e8a8bb8e7830c8173d780f7844f8ec181