[INFO] cloning repository https://github.com/mercaearth/exact-poly
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/mercaearth/exact-poly" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmercaearth%2Fexact-poly", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmercaearth%2Fexact-poly'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 1be0845742396768b9abccc777cd76ff29792253
[INFO] testing mercaearth/exact-poly against 1.98.0-beta.8+cargoflags=--release for beta-release-1.99-2
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmercaearth%2Fexact-poly" "/workspace/builds/worker-5-tc1/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-5-tc1/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/mercaearth/exact-poly
[INFO] finished tweaking git repo https://github.com/mercaearth/exact-poly
[INFO] tweaked toml for git repo https://github.com/mercaearth/exact-poly written to /workspace/builds/worker-5-tc1/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/mercaearth/exact-poly on toolchain 1.98.0-beta.8
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.98.0-beta.8" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/mercaearth/exact-poly 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" "+1.98.0-beta.8" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/target:/opt/rustwide/target:rw,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" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:8683fc1fc2eb5c9ac98e0d076ab094b2ffac7f99da555d2b6a2e27f346de2ec7" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46
[INFO] running `Command { std: "docker" "start" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "build" "--frozen" "--message-format=json" "--release", kill_on_drop: false }`
[INFO] [stderr]    Compiling wasm-bindgen-shared v0.2.118
[INFO] [stderr]    Compiling quote v1.0.45
[INFO] [stderr]    Compiling bumpalo v3.20.2
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]    Compiling unicode-ident v1.0.24
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling once_cell v1.21.4
[INFO] [stderr]    Compiling proc-macro2 v1.0.106
[INFO] [stderr]    Compiling rustversion v1.0.22
[INFO] [stderr]    Compiling wasm-bindgen v0.2.118
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling wasm-bindgen-macro-support v0.2.118
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling wasm-bindgen-macro v0.2.118
[INFO] [stderr]    Compiling js-sys v0.3.95
[INFO] [stderr]    Compiling serde-wasm-bindgen v0.6.5
[INFO] [stderr]    Compiling exact-poly v0.3.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 27.76s
[INFO] running `Command { std: "docker" "inspect" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "test" "--frozen" "--no-run" "--message-format=json" "--release", kill_on_drop: false }`
[INFO] [stderr]    Compiling exact-poly v0.3.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 8.55s
[INFO] running `Command { std: "docker" "inspect" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46" "/opt/rustwide/cargo-home/bin/cargo" "+1.98.0-beta.8" "test" "--frozen" "--release", kill_on_drop: false }`
[INFO] [stdout] 
[INFO] [stdout] running 272 tests
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 0.06s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/release/deps/exact_poly-09c13b352fdb19a1)
[INFO] [stdout] test aabb::tests::contains_point_includes_corner_and_excludes_outside ... ok
[INFO] [stdout] test aabb::tests::from_ring_handles_negative_coordinates ... ok
[INFO] [stdout] test aabb::tests::from_ring_handles_single_vertex ... ok
[INFO] [stdout] test aabb::tests::from_ring_tracks_extrema ... ok
[INFO] [stdout] test aabb::tests::intersects_contained_returns_true ... ok
[INFO] [stdout] test aabb::tests::intersects_is_symmetric ... ok
[INFO] [stdout] test aabb::tests::intersects_overlapping_returns_true ... ok
[INFO] [stdout] test aabb::tests::contains_point_works ... ok
[INFO] [stdout] test aabb::tests::intersects_touching_corner_returns_false ... ok
[INFO] [stdout] test aabb::tests::intersects_separated_returns_false ... ok
[INFO] [stdout] test aabb::tests::intersects_touching_edge_returns_false ... ok
[INFO] [stdout] test aabb::tests::merge_disjoint_boxes_contains_both ... ok
[INFO] [stdout] test aabb::tests::merge_nested_boxes_equals_outer_box ... ok
[INFO] [stdout] test area::tests::area_conservation_check ... ok
[INFO] [stdout] test area::tests::area_display_1m_x_1m_is_1_m2 ... ok
[INFO] [stdout] test area::tests::area_display_converts_correctly ... ok
[INFO] [stdout] test area::tests::area_display_scales_large_values ... ok
[INFO] [stdout] test area::tests::area_is_order_independent_for_ccw_and_cw ... ok
[INFO] [stdout] test area::tests::area_display_zero_area_is_zero ... ok
[INFO] [stdout] test area::tests::areas_conserved_rejects_overage ... ok
[INFO] [stdout] test area::tests::cw_and_ccw_negative_polygon_match ... ok
[INFO] [stdout] test area::tests::degenerate_ring_returns_zero ... ok
[INFO] [stdout] test area::tests::matches_move_on_u64_domain ... ok
[INFO] [stdout] test area::tests::negative_coords_are_handled_correctly ... ok
[INFO] [stdout] test area::tests::square_10m_twice_area_matches_move ... ok
[INFO] [stdout] test area::tests::triangle_twice_area_correct ... ok
[INFO] [stdout] test area::tests::twice_area_fp2_degenerate_two_vertices_is_zero ... ok
[INFO] [stdout] test area::tests::twice_area_fp2_l_shape_matches_expected ... ok
[INFO] [stdout] test area::tests::twice_area_fp2_square_ring_matches ... ok
[INFO] [stdout] test area::tests::twice_area_fp2_triangle_with_diagonal_edge ... ok
[INFO] [stdout] test bayazit::tests::bayazit_area_is_conserved_exactly ... ok
[INFO] [stdout] test bayazit::tests::bayazit_find_steiner_points_reports_new_vertices ... ok
[INFO] [stdout] test bayazit::tests::bayazit_l_shape_decomposes_into_multiple_parts ... ok
[INFO] [stdout] test bayazit::tests::bayazit_no_steiner_points_when_disallowed ... ok
[INFO] [stdout] test bayazit::tests::bayazit_triangle_returns_single_part ... ok
[INFO] [stdout] test containment::tests::completely_outside_returns_false ... ok
[INFO] [stdout] test containment::tests::edge_sampling_catches_concave_bridge ... ok
[INFO] [stdout] test containment::tests::empty_inner_returns_false ... ok
[INFO] [stdout] test containment::tests::empty_outer_returns_false ... ok
[INFO] [stdout] test containment::tests::multipart_inner_fully_contained ... ok
[INFO] [stdout] test containment::tests::multipart_inner_one_part_outside ... ok
[INFO] [stdout] test containment::tests::multipart_outer_contains_inner ... ok
[INFO] [stdout] test containment::tests::multipart_outer_inner_bridges_gap_returns_false ... ok
[INFO] [stdout] test containment::tests::partially_outside_returns_false ... ok
[INFO] [stdout] test bayazit::tests::bayazit_parts_are_convex_and_valid ... ok
[INFO] [stdout] test containment::tests::same_polygon_contains_itself ... ok
[INFO] [stdout] test containment::tests::point_inside_any_part_works ... ok
[INFO] [stdout] test decompose::tests::cascade_falls_back_to_bayazit_when_exact_fails ... ok
[INFO] [stdout] test decompose::tests::collect_steiner_points_from_bayazit_parts_stays_within_bounds ... ok
[INFO] [stdout] test decompose::tests::clockwise_inputs_normalize_successfully ... ok
[INFO] [stdout] test decompose::tests::cascade_prefers_exact_before_other_strategies ... ok
[INFO] [stdout] test containment::tests::touching_outer_boundary_is_not_contained ... ok
[INFO] [stdout] test bayazit::tests::bayazit_square_returns_single_part ... ok
[INFO] [stdout] test bayazit::tests::bayazit_parts_have_minimum_vertex_count ... ok
[INFO] [stdout] test decompose::tests::collect_steiner_points_reports_new_vertices_only ... ok
[INFO] [stdout] test decompose::tests::bayazit_is_skipped_when_steiner_is_disallowed ... ok
[INFO] [stdout] test containment::tests::small_square_inside_large_square ... ok
[INFO] [stdout] test decompose::tests::convex_family_stays_single_part ... ok
[INFO] [stdout] test decompose::tests::max_rotation_attempts_limits_retry_budget ... ok
[INFO] [stdout] test decompose::tests::cascade_falls_back_to_ear_clip_when_others_fail ... ok
[INFO] [stdout] test decompose::tests::minimize_parts_falls_through_when_exact_invalid ... ok
[INFO] [stdout] test decompose::tests::minimize_parts_breaks_ties_with_exact_over_bayazit ... ok
[INFO] [stdout] test decompose::tests::exact_partition_can_succeed_with_single_part_budget ... ok
[INFO] [stdout] test decompose::tests::rotation_retry_recovers_on_later_start_vertex ... ok
[INFO] [stdout] test decompose::tests::self_intersecting_polygon_returns_error ... ok
[INFO] [stdout] test decompose::tests::hertel_mehlhorn_optimizes_ear_clip_fallback ... ok
[INFO] [stdout] test decompose::tests::strategy_reports_correct_winner ... ok
[INFO] [stdout] test decompose::tests::comb_polygon_decomposes_and_passes_topology ... ok
[INFO] [stdout] test ear_clip::tests::all_triangles_have_positive_area ... ok
[INFO] [stdout] test decompose::tests::steiner_points_empty_when_disallowed ... ok
[INFO] [stdout] test decompose::tests::minimize_parts_prefers_fewer_steiner_points_on_tie ... ok
[INFO] [stdout] test decompose::tests::all_output_parts_validate_for_sample_family ... ok
[INFO] [stdout] test decompose::tests::minimize_parts_picks_fewest_across_strategies ... ok
[INFO] [stdout] test decompose::tests::too_few_vertices_returns_error ... ok
[INFO] [stdout] test ear_clip::tests::area_conservation_l_shape ... ok
[INFO] [stdout] test decompose::tests::all_sample_polygons_conserve_area ... ok
[INFO] [stdout] test ear_clip::tests::area_conservation_square ... ok
[INFO] [stdout] test decompose::tests::all_sample_polygons_respect_max_parts ... ok
[INFO] [stdout] test decompose::tests::trace_enabled_records_attempts ... ok
[INFO] [stdout] test decompose::tests::l_shape_trace_shows_multiple_attempts ... ok
[INFO] [stdout] test decompose::tests::trace_disabled_by_default ... ok
[INFO] [stdout] test ear_clip::tests::l_shape_produces_4_triangles ... ok
[INFO] [stdout] test ear_clip::tests::n_vertices_produces_n_minus_2_triangles ... ok
[INFO] [stdout] test ear_clip::tests::point_on_triangle_edge_is_not_treated_as_ear_interior_clearance ... ok
[INFO] [stdout] test ear_clip::tests::square_produces_2_triangles ... ok
[INFO] [stdout] test ear_clip::tests::too_few_vertices_returns_error ... ok
[INFO] [stdout] test ear_clip::tests::triangle_input_returns_one_triangle ... ok
[INFO] [stdout] test exact_partition::tests::all_parts_convex_when_successful ... ok
[INFO] [stdout] test exact_partition::tests::area_conservation ... ok
[INFO] [stdout] test exact_partition::tests::arrow_shape_decomposes_correctly ... ok
[INFO] [stdout] test exact_partition::tests::convex_polygon_returns_as_single_part ... ok
[INFO] [stdout] test exact_partition::tests::l_shape_decomposes_using_only_original_vertices ... ok
[INFO] [stdout] test exact_partition::tests::only_original_vertices_accepts_valid ... ok
[INFO] [stdout] test exact_partition::tests::only_original_vertices_matches_exact_partition_and_rejects_new_points ... ok
[INFO] [stdout] test exact_partition::tests::only_original_vertices_rejects_steiner ... ok
[INFO] [stdout] test exact_partition::tests::rejects_degenerate_input ... ok
[INFO] [stdout] test exact_partition::tests::triangle_returns_as_single_part ... ok
[INFO] [stdout] test exact_partition::tests::u_shape_decomposes ... ok
[INFO] [stdout] test hertel_mehlhorn::tests::hertel_mehlhorn_area_conservation ... ok
[INFO] [stdout] test hertel_mehlhorn::tests::hertel_mehlhorn_l_shape_triangles_optimize ... ok
[INFO] [stdout] test hertel_mehlhorn::tests::hertel_mehlhorn_merge_convex_pair_edge_cases ... ok
[INFO] [stdout] test hertel_mehlhorn::tests::hertel_mehlhorn_merge_non_convex_returns_none ... ok
[INFO] [stdout] test hertel_mehlhorn::tests::hertel_mehlhorn_merge_convex_pair_works ... ok
[INFO] [stdout] test hertel_mehlhorn::tests::hertel_mehlhorn_single_triangle_unchanged ... ok
[INFO] [stdout] test hertel_mehlhorn::tests::hertel_mehlhorn_two_triangles_forming_square_merge_to_one ... ok
[INFO] [stdout] test overlap::tests::adjacent_squares_no_overlap ... ok
[INFO] [stdout] test overlap::tests::contained_square_overlaps ... ok
[INFO] [stdout] test overlap::tests::find_overlapping_parts_returns_empty_when_disjoint ... ok
[INFO] [stdout] test overlap::tests::find_overlapping_parts_returns_matching_indices ... ok
[INFO] [stdout] test overlap::tests::identical_squares_overlap ... ok
[INFO] [stdout] test overlap::tests::one_pixel_penetration_is_overlap ... ok
[INFO] [stdout] test overlap::tests::overlapping_squares_overlap ... ok
[INFO] [stdout] test overlap::tests::parts_overlap_false_when_all_pairs_separated ... ok
[INFO] [stdout] test overlap::tests::parts_overlap_multipart ... ok
[INFO] [stdout] test overlap::tests::parts_overlap_true_when_one_pair_overlaps ... ok
[INFO] [stdout] test overlap::tests::separated_squares_no_overlap ... ok
[INFO] [stdout] test primitives::tests::cross2d_handles_max_world_without_overflow ... ok
[INFO] [stdout] test primitives::tests::cross2d_matches_expected_magnitude ... ok
[INFO] [stdout] test primitives::tests::cross2d_sign_and_collinearity_cases ... ok
[INFO] [stdout] test primitives::tests::edge_squared_length_handles_max_world ... ok
[INFO] [stdout] test primitives::tests::edge_squared_length_is_symmetric_and_zero_for_same_point ... ok
[INFO] [stdout] test primitives::tests::edge_squared_length_matches_known_distances ... ok
[INFO] [stdout] test primitives::tests::is_reflex_distinguishes_concave_and_convex_vertices ... ok
[INFO] [stdout] test primitives::tests::is_reflex_handles_shifted_vertices ... ok
[INFO] [stdout] test primitives::tests::is_reflex_uses_exact_orientation_semantics ... ok
[INFO] [stdout] test primitives::tests::orientation_classifies_three_cases ... ok
[INFO] [stdout] test primitives::tests::orientation_handles_degenerate_repeated_points ... ok
[INFO] [stdout] test primitives::tests::orientation_handles_shifted_and_negative_points ... ok
[INFO] [stdout] test primitives::tests::point_on_segment_handles_diagonal_and_vertical_segments ... ok
[INFO] [stdout] test primitives::tests::point_on_segment_handles_midpoint_endpoint_and_outside ... ok
[INFO] [stdout] test primitives::tests::point_on_segment_handles_reversed_bounds ... ok
[INFO] [stdout] test primitives::tests::segments_intersect_detects_collinear_overlap_and_containment ... ok
[INFO] [stdout] test primitives::tests::segments_intersect_detects_proper_and_endpoint_intersections ... ok
[INFO] [stdout] test primitives::tests::segments_intersect_excludes_disjoint_segments ... ok
[INFO] [stdout] test primitives::tests::segments_properly_intersect_detects_crossings ... ok
[INFO] [stdout] test primitives::tests::segments_properly_intersect_excludes_parallel_touching_and_collinear_cases ... ok
[INFO] [stdout] test primitives::tests::segments_properly_intersect_excludes_separated_segments ... ok
[INFO] [stdout] test primitives::tests::side_predicates_classify_left_right_and_on ... ok
[INFO] [stdout] test primitives::tests::side_predicates_work_with_negative_coordinates ... ok
[INFO] [stdout] test primitives::tests::side_predicates_work_with_vertical_lines ... ok
[INFO] [stdout] test ring::tests::ensure_ccw_leaves_ccw_ring_unchanged ... ok
[INFO] [stdout] test ring::tests::ensure_ccw_reverses_cw_ring ... ok
[INFO] [stdout] test ring::tests::is_ccw_detects_winding ... ok
[INFO] [stdout] test ring::tests::is_simple_convex_ring ... ok
[INFO] [stdout] test ring::tests::is_simple_self_intersecting ... ok
[INFO] [stdout] test ring::tests::normalize_ring_removes_collinear_and_ensures_ccw ... ok
[INFO] [stdout] test ring::tests::remove_collinear_exact_zero_check ... ok
[INFO] [stdout] test ring::tests::remove_collinear_preserves_non_collinear ... ok
[INFO] [stdout] test ring::tests::remove_collinear_removes_midpoint_on_edge ... ok
[INFO] [stdout] test ring::tests::rotate_ring_shifts_start ... ok
[INFO] [stdout] test ring::tests::rotate_ring_zero_start_unchanged ... ok
[INFO] [stdout] test ring::tests::signed_area_ccw_is_positive ... ok
[INFO] [stdout] test ring::tests::signed_area_cw_is_negative ... ok
[INFO] [stdout] test sat::tests::aabb_pipeline_rejects_far_polygons ... ok
[INFO] [stdout] test sat::tests::aabb_prefilter_allows_sat_for_overlapping ... ok
[INFO] [stdout] test sat::tests::identical_squares_overlap ... ok
[INFO] [stdout] test sat::tests::right_triangles_sharing_hypotenuse_do_not_overlap ... ok
[INFO] [stdout] test sat::tests::sat_corner_touching_does_not_overlap ... ok
[INFO] [stdout] test sat::tests::contained_square_overlaps ... ok
[INFO] [stdout] test sat::tests::sat_gap_detected ... ok
[INFO] [stdout] test sat::tests::sat_is_symmetric ... ok
[INFO] [stdout] test sat::tests::sat_handles_world_extreme_coordinates ... ok
[INFO] [stdout] test sat::tests::sat_micro_overlap_detected ... ok
[INFO] [stdout] test ring::tests::signed_area_magnitude_is_twice_area ... ok
[INFO] [stdout] test sat::tests::sat_overlap_detected ... ok
[INFO] [stdout] test sat::tests::sat_triangle_touching_does_not_overlap ... ok
[INFO] [stdout] test sat::tests::sat_touching_edges_do_not_overlap ... ok
[INFO] [stdout] test sat::tests::sat_with_aabb_rejects_far_apart_polygons ... ok
[INFO] [stdout] test sat::tests::triangle_fully_inside_another_overlaps ... ok
[INFO] [stdout] test sat::tests::triangles_overlap_correctly ... ok
[INFO] [stdout] test shared_edge::tests::classify_contact_none_for_separated_squares ... ok
[INFO] [stdout] test shared_edge::tests::classify_contact_partial_edge_is_t_junction ... ok
[INFO] [stdout] test shared_edge::tests::classify_contact_symmetric_shared_edge ... ok
[INFO] [stdout] test shared_edge::tests::classify_contact_t_junction_returns_partial_contact ... ok
[INFO] [stdout] test shared_edge::tests::classify_contact_t_junction_symmetric ... ok
[INFO] [stdout] test shared_edge::tests::classify_contact_vertex_only_is_none ... ok
[INFO] [stdout] test shared_edge::tests::classify_contact_vertex_only_sharing_one_corner_is_none ... ok
[INFO] [stdout] test shared_edge::tests::classify_contact_via_exact_edge ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_exact_detected ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_exact_direction_independent ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_no_match_collinear_but_disjoint_edges ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_no_match_partial_overlap_subsegment ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_no_match_separated_squares ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_no_match_vertex_only_contact ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_normalize_degenerate_point ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_normalize_orders_lexicographically ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_normalize_same_x_sorts_by_y ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_segments_collinear_overlap ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_segments_collinear_overlap_diagonal ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_segments_degenerate_point ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_segments_not_collinear ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_segments_reversed_direction ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_segments_touching_endpoint_no_overlap ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_triangles_sharing_hypotenuse ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_segments_collinear_overlap_vertical ... ok
[INFO] [stdout] test signed::tests::cross_sign_large_negative_no_overflow ... ok
[INFO] [stdout] test signed::tests::cross_sign_matches_move_test_vectors ... ok
[INFO] [stdout] test signed::tests::cross_sign_left_turn_is_positive ... ok
[INFO] [stdout] test signed::tests::cross_sign_no_overflow_with_max_world_coordinates ... ok
[INFO] [stdout] test signed::tests::cross_sign_right_turn_is_negative ... ok
[INFO] [stdout] test signed::tests::sign_returns_correct_values ... ok
[INFO] [stdout] test signed::tests::sub_u64_positive_and_negative ... ok
[INFO] [stdout] test spatial::tests::collinear_overlap_same_side_returns_true ... ok
[INFO] [stdout] test spatial::tests::adjacent_polygons_opposite_sides_no_overlap ... ok
[INFO] [stdout] test spatial::tests::non_collinear_segments_return_false ... ok
[INFO] [stdout] test spatial::tests::point_at_vertex_not_strictly_inside ... ok
[INFO] [stdout] test spatial::tests::point_inside_or_on_boundary_inclusive_cases ... ok
[INFO] [stdout] test spatial::tests::point_inside_or_on_boundary_interior ... ok
[INFO] [stdout] test spatial::tests::point_inside_or_on_boundary_non_convex_l_shape_interior ... ok
[INFO] [stdout] test spatial::tests::point_inside_or_on_boundary_outside ... ok
[INFO] [stdout] test spatial::tests::point_inside_or_on_boundary_vertex ... ok
[INFO] [stdout] test spatial::tests::point_on_boundary_not_strictly_inside ... ok
[INFO] [stdout] test spatial::tests::point_on_polygon_boundary_edge_midpoint_and_off_edge ... ok
[INFO] [stdout] test spatial::tests::point_outside ... ok
[INFO] [stdout] test spatial::tests::point_strictly_inside ... ok
[INFO] [stdout] test spatial::tests::point_strictly_inside_convex_rhombus_centroid_and_edge_neighbors ... ok
[INFO] [stdout] test spatial::tests::ray_cast_non_convex_star_interior ... ok
[INFO] [stdout] test topology::tests::allow_vertex_contact_accepts_corner_touching ... ok
[INFO] [stdout] test topology::tests::dumbbell_with_thin_strip_accepted ... ok
[INFO] [stdout] test topology::tests::needle_like_single_part_rejected_by_boundary_compactness ... ok
[INFO] [stdout] test topology::tests::not_connected_reports_disconnected_parts ... ok
[INFO] [stdout] test topology::tests::permissive_config_accepts_many_connected_parts ... ok
[INFO] [stdout] test topology::tests::t_junction_partial_edge_rejected ... ok
[INFO] [stdout] test topology::tests::too_many_parts_reports_count ... ok
[INFO] [stdout] test topology::tests::topology_corner_touching_squares_toggle_vertex_contact ... ok
[INFO] [stdout] test topology::tests::topology_eleven_parts_exceed_merca_limit ... ok
[INFO] [stdout] test topology::tests::topology_empty_parts_invalid ... ok
[INFO] [stdout] test topology::tests::topology_hole_rejected_by_boundary_graph ... ok
[INFO] [stdout] test topology::tests::topology_three_part_l_shape_valid ... ok
[INFO] [stdout] test topology::tests::topology_too_many_parts_rejected ... ok
[INFO] [stdout] test topology::tests::topology_two_adjacent_squares_valid ... ok
[INFO] [stdout] test topology::tests::topology_two_disconnected_squares_invalid ... ok
[INFO] [stdout] test topology::tests::topology_two_parts_forming_l_shape_valid ... ok
[INFO] [stdout] test topology::tests::topology_vertex_only_contact_rejected ... ok
[INFO] [stdout] test topology::tests::vertex_contact_false_rejects_corner_only ... ok
[INFO] [stdout] test validate_onchain::tests::rejects_area_mismatch ... ok
[INFO] [stdout] test validate_onchain::tests::rejects_area_mismatch_with_connected_parts ... ok
[INFO] [stdout] test validate_onchain::tests::rejects_overlapping_parts ... ok
[INFO] [stdout] test validate_onchain::tests::valid_single_convex_part ... ok
[INFO] [stdout] test validate_onchain::tests::valid_two_part_l_shape ... ok
[INFO] [stdout] test validate_onchain::tests::valid_two_part_l_shape_permissive_config ... ok
[INFO] [stdout] test validate_onchain::tests::warns_negative_coords ... ok
[INFO] [stdout] test validation::tests::is_convex_accepts_triangle ... ok
[INFO] [stdout] test validation::tests::is_convex_rejects_l_shape ... ok
[INFO] [stdout] test validation::tests::is_convex_rejects_two_points ... ok
[INFO] [stdout] test validation::tests::perimeter_l1_handles_negative_coordinates ... ok
[INFO] [stdout] test validation::tests::perimeter_l1_large_square_does_not_overflow ... ok
[INFO] [stdout] test validation::tests::perimeter_l1_not_euclidean ... ok
[INFO] [stdout] test validation::tests::perimeter_l1_uses_manhattan ... ok
[INFO] [stdout] test validation::tests::validate_compactness_compact_square_passes ... ok
[INFO] [stdout] test topology::tests::topology_single_part_is_valid ... ok
[INFO] [stdout] test validation::tests::is_convex_accepts_square ... ok
[INFO] [stdout] test validation::tests::is_convex_accepts_weakly_convex_with_collinear ... ok
[INFO] [stdout] test validation::tests::validate_compactness_uses_checked_mul ... ok
[INFO] [stdout] test area::tests::areas_conserved_accepts_exact_sum ... ok
[INFO] [stdout] test validation::tests::validate_edge_lengths_accepts_large_negative_coordinates ... ok
[INFO] [stdout] test validation::tests::validate_part_rejects_l_shape ... ok
[INFO] [stdout] test validation::tests::validate_part_short_square_fails_merca_but_passes_permissive ... ok
[INFO] [stdout] test validation::tests::validate_part_square_passes_both_configs ... ok
[INFO] [stdout] test validation::tests::validate_part_valid_square ... ok
[INFO] [stdout] test validation::tests::validate_edge_lengths_exact_threshold ... ok
[INFO] [stdout] test validation::tests::validate_edge_lengths_rejects_short_edge ... ok
[INFO] [stdout] test validation::tests::validate_edge_lengths_rejects_unit_edge ... ok
[INFO] [stdout] test validation::tests::validate_part_rejects_too_few_vertices ... ok
[INFO] [stdout] test signed::tests::cross_sign_collinear_is_zero ... ok
[INFO] [stdout] test validate_onchain::tests::rejects_overlapping_parts_permissive_config ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_segments_parallel_not_collinear ... ok
[INFO] [stdout] test shared_edge::tests::shared_edge_segments_no_overlap_gap ... ok
[INFO] [stdout] test aabb::tests::merge_covers_both ... ok
[INFO] [stdout] test spatial::tests::point_inside_or_on_boundary_edge ... ok
[INFO] [stdout] test validation::tests::is_convex_accepts_convex_pentagon ... ok
[INFO] [stdout] test validation::tests::validate_edge_lengths_valid ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 272 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.19s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests exact_poly
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46", kill_on_drop: false }`
[INFO] [stdout] 84eb7e90a1bf3d186e363015c9818a424daa4f505978875a1e7c81ef3910bf46
