[INFO] fetching crate sokoban-elements 0.2.1...
[INFO] testing sokoban-elements-0.2.1 against 1.100.0-beta.1 for beta-1.100-2
[INFO] extracting crate sokoban-elements 0.2.1 into /workspace/builds/worker-5-tc2/source
[INFO] started tweaking crates.io crate sokoban-elements 0.2.1
[INFO] finished tweaking crates.io crate sokoban-elements 0.2.1
[INFO] tweaked toml for crates.io crate sokoban-elements 0.2.1 written to /workspace/builds/worker-5-tc2/source/Cargo.toml
[INFO] validating manifest of crates.io crate sokoban-elements 0.2.1 on toolchain 1.100.0-beta.1
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.100.0-beta.1" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate sokoban-elements 0.2.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" "+1.100.0-beta.1" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc2/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:3111399a4047eeb3a02b7a90e478d715f38a8c6669b5c4b49d30a17385265909" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea
[INFO] running `Command { std: "docker" "start" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea", 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" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea", 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" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling indexmap v1.9.3
[INFO] [stderr]    Compiling zerocopy v0.8.55
[INFO] [stderr]    Compiling radium v0.7.0
[INFO] [stderr]    Compiling tap v1.0.1
[INFO] [stderr]    Compiling nohash-hasher v0.2.0
[INFO] [stderr]    Compiling funty v2.0.0
[INFO] [stderr]    Compiling once_cell v1.21.4
[INFO] [stderr]    Compiling ahash v0.8.12
[INFO] [stderr]    Compiling itertools v0.15.0
[INFO] [stderr]    Compiling roxmltree v0.21.1
[INFO] [stderr]    Compiling getrandom v0.3.4
[INFO] [stderr]    Compiling peginator v0.7.0
[INFO] [stderr]    Compiling wyz v0.5.1
[INFO] [stderr]    Compiling bitvec v1.1.1
[INFO] [stderr]    Compiling simple-xml-builder v1.1.0
[INFO] [stderr]    Compiling sokoban-elements v0.2.1 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 9.36s
[INFO] running `Command { std: "docker" "inspect" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea", 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" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling once_cell v1.21.4
[INFO] [stderr]    Compiling unicode-xid v0.2.6
[INFO] [stderr]    Compiling konst_macro_rules v0.2.19
[INFO] [stderr]    Compiling const_format_proc_macros v0.2.34
[INFO] [stderr]    Compiling konst v0.2.20
[INFO] [stderr]    Compiling ahash v0.8.12
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling sokoban-elements v0.2.1 (/opt/rustwide/workdir)
[INFO] [stderr]    Compiling const_format v0.2.36
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 7.19s
[INFO] running `Command { std: "docker" "inspect" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea", 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" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "test" "--frozen", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.10s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/build/sokoban-elements/eacec207652c0c29/out/sokoban_elements-eacec207652c0c29)
[INFO] [stdout] 
[INFO] [stdout] running 391 tests
[INFO] [stdout] test board_area::tests::it_reports_count_of_remaining_points_while_iterating ... ok
[INFO] [stdout] test board_area::tests::it_calculates_bounds_of_single_point_area ... ok
[INFO] [stdout] test board_area::tests::it_calculates_bounds_when_extremes_are_in_different_rows ... ok
[INFO] [stdout] test board_area::tests::it_calculates_set_operations_on_disjoint_and_equal_areas ... ok
[INFO] [stdout] test board_area::tests::it_can_add_points ... ok
[INFO] [stdout] test board_area::tests::when_area_is_empty_it_has_no_bounds ... ok
[INFO] [stdout] test board_area::tests::it_treats_empty_area_as_subset_of_every_area_of_same_board_size ... ok
[INFO] [stdout] test board_area::tests::it_can_be_cleared_while_keeping_board_size ... ok
[INFO] [stdout] test board_area::tests::it_can_be_extended_from_points_and_from_references ... ok
[INFO] [stdout] test board_area::tests::it_can_check_if_it_is_empty ... ok
[INFO] [stdout] test board_area::tests::it_can_iterate_over_points ... ok
[INFO] [stdout] test board_area::tests::it_can_remove_points ... ok
[INFO] [stdout] test board_area::tests::it_checks_subset_superset_and_disjoint ... ok
[INFO] [stdout] test board_area::tests::it_iterates_in_row_major_order ... ok
[INFO] [stdout] test board_area::tests::owning_iterator_reports_count_of_remaining_points_while_iterating ... ok
[INFO] [stdout] test board_area::tests::when_board_has_no_tiles_area_is_always_empty ... ok
[INFO] [stdout] test board_area::tests::when_board_sizes_differ_areas_are_not_comparable ... ok
[INFO] [stdout] test direction::tests::test_order_in_source_slice_doesnt_matter ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_empty_boards::when_board_is_empty_editing_does_not_panic ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_empty_boards::when_input_has_no_columns_parse_returns_empty_board ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_encoding_schemes::it_parses_scheme_scheme1_type1 ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_encoding_schemes::it_parses_scheme_scheme2_type1 ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_encoding_schemes::it_parses_scheme_scheme1_type2 ... ok
[INFO] [stdout] test direction::tests::it_can_be_constructed_from_and_compared_to_slice ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_encoding_schemes::it_parses_scheme_scheme2_type2 ... ok
[INFO] [stdout] test board_area::tests::it_calculates_set_operations ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_encoding_schemes::it_parses_scheme_scheme3_type2 ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_encoding_schemes::it_parses_scheme_scheme3_type1 ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_game_board_resizing::hexoban_single_source_parity_keeps_a_tight_width ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_game_board_resizing::hexoban_bottom_removal_preserves_width ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_game_board_resizing::hexoban_even_top_removal_preserves_width ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_encoding_schemes::it_parses_scheme_scheme4_type1 ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_game_board_resizing::hexoban_even_top_resize_is_one_batched_shift ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_game_board_resizing::hexoban_odd_top_removal_preserves_retained_adjacency ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_game_board_trimming::hexoban_trim_anchors_on_goals_and_pushers_too ... ok
[INFO] [stdout] test board_area::tests::when_board_sizes_differ_set_operations_return_none ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_game_board_resizing::hexoban_single_top_row_resize_preserves_adjacency ... ok
[INFO] [stdout] test board_area::tests::when_point_is_off_board_it_is_not_a_member ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_game_board_trimming::hexoban_trim_combines_horizontal_and_vertical_cropping ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_encoding_schemes::it_parses_scheme_scheme4_type2 ... ok
[INFO] [stdout] test direction::tests::it_can_be_iterated ... ok
[INFO] [stdout] test direction::tests::it_is_empty_by_default ... ok
[INFO] [stdout] test direction::tests::it_iterates_in_clockwise_direction ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_encoding_schemes::it_errors_on_illegal_scheme ... ok
[INFO] [stdout] test direction::tests::it_calculates_opposite_direction ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_game_board_resizing::hexoban_top_resize_does_not_normalize_by_content ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_game_board_resizing::resized_hexoban_round_trips_through_text ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_fed ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_mud ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_a ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_four ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_bird ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_gun ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_wildmil ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_littlerabbit ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_beetle ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_perfume ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_normalization::it_can_normalize_hexoban_board ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_v ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_bridge ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_losange ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_x ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_column_added_type1_left ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_column_added_type1_right ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_row_added_type1_top ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_column_removed_type1_right ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_puzzle_round_trips::it_parses_hexocet_kite ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_rotation::it_rotates_every_cell_to_its_computed_position ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_row_added_type1_bottom ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_column_added_type2_left ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_by_more_than_one_line_through_the_edge_dispatch ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_column_added_type2_right ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_column_removed_type2_left ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_column_removed_type1_left ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_row_parity_detection::it_parses_board_that_is_wider_than_it_is_high ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_column_removed_type2_right ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_row_added_type2_bottom ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_row_removed_type1_top ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_row_removed_type2_bottom ... ok
[INFO] [stdout] test game_board::index::tests::it_writes_tiles_by_x_and_y ... ok
[INFO] [stdout] test game_board::index::tests::it_reads_tiles_by_point ... ok
[INFO] [stdout] test game_board::index::tests::it_reads_tiles_by_x_and_y ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_row_parity_detection::it_finds_first_non_floor_below_row_index_width ... ok
[INFO] [stdout] test game_board::index::tests::when_indexed_by_position_it_matches_indexing_by_x_and_y ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_row_added_type2_top ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_row_removed_type1_bottom ... ok
[INFO] [stdout] test game_board::iterator::tests::it_iterates_over_all_tiles ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_row_parity_detection::it_derives_row_parities_from_first_non_floor_in_odd_row ... ok
[INFO] [stdout] test game_board::index::tests::when_indexed_by_point_it_matches_indexing_by_x_and_y ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_row_parity_detection::it_parses_board_whose_first_tile_is_in_the_first_column ... ok
[INFO] [stdout] test game_board::index::tests::it_writes_tiles_by_linear_position ... ok
[INFO] [stdout] test game_board::index::tests::it_writes_tiles_by_point ... ok
[INFO] [stdout] test game_board::parser::tests::test_parity_padding::odd_resizing_still_compensates_when_one_source_dimension_is_one ... ok
[INFO] [stdout] test game_board::iterator::tests::it_iterates_tiles_in_row_major_order ... ok
[INFO] [stdout] test game_board::parser::tests::test_parity_padding::even_top_and_left_resizing_needs_no_perpendicular_padding ... ok
[INFO] [stdout] test game_board::iterator::tests::when_board_is_empty_it_iterates_nothing ... ok
[INFO] [stdout] test game_board::parser::tests::test_parity_padding::odd_batched_resizing_preserves_adjacency_and_tile_shapes ... ok
[INFO] [stdout] test game_board::parser::tests::test_parity_padding::odd_left_resizing_adds_one_top_row_on_trioban_and_octoban ... ok
[INFO] [stdout] test game_board::parser::tests::test_parity_padding::even_batch_differs_from_two_odd_resizes_on_trioban_and_octoban ... ok
[INFO] [stdout] test game_board::parser::tests::test_parity_padding::odd_top_resizing_adds_one_left_column_on_trioban_and_octoban ... ok
[INFO] [stdout] test game_board::parser::tests::test_resizing::saturated_removal_does_not_pad_an_empty_result ... ok
[INFO] [stdout] test game_board::parser::tests::test_parsing::it_correctly_parses_board_with_internal_blank_rows ... ok
[INFO] [stdout] test game_board::parser::tests::test_parsing::it_parses_rle_encoded_board ... ok
[INFO] [stdout] test game_board::parser::tests::test_parity_padding::resized_trioban_and_octoban_round_trip_through_text ... ok
[INFO] [stdout] test game_board::parser::tests::test_resizing::bottom_and_right_resizing_applies_the_exact_available_count ... ok
[INFO] [stdout] test game_board::parser::tests::test_parity_padding::perpendicular_padding_depends_on_dimensions_not_content ... ok
[INFO] [stdout] test game_board::parser::tests::test_parsing::it_carefully_preserves_original_newlines ... ok
[INFO] [stdout] test game_board::parser::tests::test_trimming::trim_chooses_the_smallest_parity_compensation ... ok
[INFO] [stdout] test game_board::parser::tests::test_trimming::trim_keeps_goal_only_and_pusher_only_edge_lines ... ok
[INFO] [stdout] test game_board::parser::tests::test_trimming::trim_preserves_tile_shapes_on_parity_sensitive_boards ... ok
[INFO] [stdout] test game_board::sokoban_board::tests::test_rotation::it_rotates_board_clockwise ... ok
[INFO] [stdout] test game_board::sokoban_board::tests::test_resizing::test_it_can_enlarge_game_board ... ok
[INFO] [stdout] test game_board::sokoban_board::tests::test_resizing::test_it_can_shrink_game_board ... ok
[INFO] [stdout] test game_board::parser::tests::test_resizing::top_and_left_resizing_applies_the_exact_count ... ok
[INFO] [stdout] test game_board::tests::it_reports_width_and_height_of_non_square_board ... ok
[INFO] [stdout] test game_board::parser::tests::test_trimming::it_trims_empty_outer_rows_and_columns ... ok
[INFO] [stdout] test game_board::sokoban_board::tests::test_rotation::it_rotates_board_counter_clockwise ... ok
[INFO] [stdout] test game_board::sokoban_board::tests::test_mirroring::it_mirrors_board_left_right ... ok
[INFO] [stdout] test game_board::sokoban_board::tests::test_mirroring::it_mirrors_board_up_down ... ok
[INFO] [stdout] test game_board::tests::test_enclosing::enclose_confines_every_tessellation_without_losing_content ... ok
[INFO] [stdout] test game_board::tests::test_enclosing::enclose_is_deterministic_when_two_edges_leak ... ok
[INFO] [stdout] test game_board::tests::test_enclosing::enclose_then_normalize_yields_a_closed_normalized_board ... ok
[INFO] [stdout] test game_board::tests::test_enclosing::when_board_has_no_pusher_enclose_leaves_it_alone ... ok
[INFO] [stdout] test game_board::tests::test_enclosing::enclose_confines_the_playable_area ... ok
[INFO] [stdout] test game_board::tests::test_enclosing::enclose_is_a_no_op_on_a_closed_board ... ok
[INFO] [stdout] test game_board::tests::test_enclosing::enclose_is_idempotent ... ok
[INFO] [stdout] test game_board::tests::test_normalization::normalization_uses_one_rigid_crop_on_trioban_and_octoban ... ok
[INFO] [stdout] test game_board::tests::test_normalization::normalize_keeps_playable_tiles_on_the_board_edge ... ok
[INFO] [stdout] test game_board::tests::test_normalization::when_board_has_no_pusher_normalize_leaves_it_alone ... ok
[INFO] [stdout] test game_board::tests::test_parsing::when_declared_size_does_not_match_tiles_slice_it_errors ... ok
[INFO] [stdout] test game_board::tests::test_parsing::it_pads_short_rows_to_board_width ... ok
[INFO] [stdout] test game_board::tests::test_parsing::when_board_text_has_no_columns_it_parses_to_empty_board ... ok
[INFO] [stdout] test game_board::tests::test_normalization::it_can_normalize_sokoban_board ... ok
[INFO] [stdout] test game_board::tests::test_pieces_and_sokoban_plus::it_collects_pieces_matching_the_counters ... ok
[INFO] [stdout] test game_board::tests::test_normalization::it_can_normalize_board ... ok
[INFO] [stdout] test game_board::tests::test_parsing::when_rows_are_padded_only_visible_floor_printing_shows_it ... ok
[INFO] [stdout] test game_board::tests::test_pieces_and_sokoban_plus::it_assigns_piece_ids_in_row_major_order ... ok
[INFO] [stdout] test game_board::tests::test_parsing::when_tiles_slice_is_empty_it_constructs_empty_board ... ok
[INFO] [stdout] test game_board::tests::every_transform_preserves_piece_counts ... ok
[INFO] [stdout] test game_board::tests::test_pieces_and_sokoban_plus::it_reads_plus_ids_from_sokoban_plus ... ok
[INFO] [stdout] test game_board::tests::test_normalization::normalize_preserves_tile_shapes_of_edge_play_areas ... ok
[INFO] [stdout] test game_board::parser::tests::test_parity_padding::every_trioban_and_octoban_top_or_left_batch_is_rigid_and_injective ... ok
[INFO] [stdout] test game_board::tests::test_resizing::trim_empties_exactly_the_boards_that_are_blank ... ok
[INFO] [stdout] test game_board::tests::test_resizing::grow_never_shrinks_a_board ... ok
[INFO] [stdout] test game_board::tests::test_resizing::when_all_columns_are_removed_board_becomes_empty ... ok
[INFO] [stdout] test game_board::tests::test_pieces_and_sokoban_plus::when_board_has_more_pushers_than_pusher_id_can_represent_it_errors ... ok
[INFO] [stdout] test game_board::tests::test_pieces_and_sokoban_plus::when_piece_is_on_goal_it_is_both_a_piece_and_a_goal ... ok
[INFO] [stdout] test game_board::tests::test_pieces_and_sokoban_plus::when_board_is_empty_it_has_no_pieces ... ok
[INFO] [stdout] test game_board::tests::test_resizing::when_all_rows_are_removed_board_becomes_empty ... ok
[INFO] [stdout] test game_board::tests::test_resizing::when_board_is_emptied_by_editing_grow_brings_it_back ... ok
[INFO] [stdout] test game_board::tests::test_resizing::grow_adds_no_padding_and_moves_no_tile_in_any_tessellation ... ok
[INFO] [stdout] test game_board::tests::test_rotation::mirror_and_rotation_round_trips_restore_content ... ok
[INFO] [stdout] test game_board::tests::when_board_is_constructed_with_zero_dimension_it_is_empty ... ok
[INFO] [stdout] test game_board::tests::test_resizing::when_one_column_is_left_board_can_still_grow ... ok
[INFO] [stdout] test game_board::tests::test_resizing::when_board_is_resized_rows_stay_width_normalized ... ok
[INFO] [stdout] test game_board::tests::when_board_is_empty_editing_preserves_the_invariant ... ok
[INFO] [stdout] test game_board::tests::test_resizing::when_board_is_emptied_by_editing_it_cannot_be_grown_back ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_row_parity_detection::it_round_trips_single_wall_boards_of_every_small_shape ... ok
[INFO] [stdout] test game_board::hexoban_board::tests::test_resizing::it_resizes_row_removed_type2_top ... ok
[INFO] [stdout] test game_board::tests::test_resizing::resizer_implementors_identify_their_tessellation ... ok
[INFO] [stdout] test game_board::tests::test_resizing::when_board_is_all_floor_trim_empties_it ... ok
[INFO] [stdout] test game_board::index::tests::it_panics_when_point_y_is_out_of_bounds - should panic ... ok
[INFO] [stdout] test game_board::index::tests::it_panics_when_position_is_out_of_bounds - should panic ... ok
[INFO] [stdout] test game_board::index::tests::it_panics_when_point_x_is_out_of_bounds - should panic ... ok
[INFO] [stdout] test game_board::index::tests::it_panics_when_x_and_y_are_out_of_bounds - should panic ... ok
[INFO] [stdout] test game_board::index::tests::when_board_is_empty_indexing_by_point_panics - should panic ... ok
[INFO] [stdout] test game_board::index::tests::when_board_is_empty_indexing_by_position_panics - should panic ... ok
[INFO] [stdout] test game_board::transform::tests::empty_boards_are_unchanged_by_every_transform ... ok
[INFO] [stdout] test game_board::transform::tests::test_anchoring::it_breaks_an_exact_area_tie_by_adding_a_column ... ok
[INFO] [stdout] test io::file_format::tests::it_maps_every_file_extension_to_its_format ... ok
[INFO] [stdout] test game_board::transform::tests::test_anchoring::it_leaves_padding_cells_with_no_preimage ... ok
[INFO] [stdout] test io::file_format::tests::when_extension_is_unknown_there_is_no_format ... ok
[INFO] [stdout] test game_board::tests::when_board_is_empty_printing_round_trips ... ok
[INFO] [stdout] test game_board::trioban_board::tests::test_rotation::it_rotates_every_cell_to_its_computed_position ... ok
[INFO] [stdout] test io::file_format::tests::when_the_destination_fails_writing_reports_it ... ok
[INFO] [stdout] test game_board::transform::tests::every_transform_preserves_the_multiset_of_non_floor_tiles ... ok
[INFO] [stdout] test game_board::transform::tests::test_anchoring::it_anchors_to_the_smallest_area ... ok
[INFO] [stdout] test io::slc_file_format::tests::it_reads_collection_from_file ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_reads_99_as_a_plus_id_unless_legacy_sokoban_plus_is_set ... ok
[INFO] [stdout] test piece::piece_id::tests::test_box_id_can_be_constructed_from_integers ... ok
[INFO] [stdout] test piece::piece_id::tests::test_box_id_is_comparable ... ok
[INFO] [stdout] test piece::piece_id::tests::test_box_id_is_value_constrained ... ok
[INFO] [stdout] test piece::piece_id::tests::test_goal_id_can_be_constructed_from_integers ... ok
[INFO] [stdout] test piece::piece_id::tests::test_goal_id_is_comparable ... ok
[INFO] [stdout] test piece::piece_id::tests::test_goal_id_is_value_constrained ... ok
[INFO] [stdout] test piece::piece_id::tests::test_pusher_id_can_be_constructed_from_integers ... ok
[INFO] [stdout] test piece::piece_id::tests::test_pusher_id_is_comparable ... ok
[INFO] [stdout] test piece::piece_id::tests::test_pusher_id_is_value_constrained ... ok
[INFO] [stdout] test point2d::tests::it_can_be_constructed_from_1d_index ... ok
[INFO] [stdout] test point2d::tests::it_can_be_constructed_from_2d_coordinates ... ok
[INFO] [stdout] test rle::parser::tests::it_decodes_rle_encoded_string ... ok
[INFO] [stdout] test rle::parser::tests::it_preserves_new_lines ... ok
[INFO] [stdout] test rle::parser::tests::it_refuses_to_decode_only_digits ... ok
[INFO] [stdout] test rle::tests::it_refuses_to_encode_strings_having_any_digits ... ok
[INFO] [stdout] test rle::tests::it_rle_encodes_strings ... ok
[INFO] [stdout] test rle::tests::when_rle_encoding_replaces_newline_with_rle_newline ... ok
[INFO] [stdout] test saved_game::parser::tests::it_correctly_finds_current_move_position ... ok
[INFO] [stdout] test saved_game::parser::tests::it_forbids_pushes_in_jumps ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_uses_tessellation_value_from_puzzle_notes_and_ignores_hint_and_collection_notes ... ok
[INFO] [stdout] test saved_game::parser::tests::it_forbids_pushes_in_pusher_selection ... ok
[INFO] [stdout] test saved_game::parser::tests::it_ignores_spaces_in_input ... ok
[INFO] [stdout] test saved_game::parser::tests::it_parses_saved_game_string ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_loads_puzzle_with_multiple_saved_games ... ok
[INFO] [stdout] test io::slc_file_format::tests::it_writes_collection_to_file ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_loads_puzzle_without_title ... ok
[INFO] [stdout] test saved_game::tests::it_can_be_constructed_from_steps ... ok
[INFO] [stdout] test saved_game::tests::it_can_convert_steps_to_string ... ok
[INFO] [stdout] test saved_game::tests::it_can_be_constructed_from_char_data ... ok
[INFO] [stdout] test game_board::transform::tests::every_transform_is_injective_and_preserves_adjacency ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_uses_tessellation_value_from_collection_notes_even_if_hint_given ... ok
[INFO] [stdout] test saved_game::tests::it_correctly_recognizes_reverse_mode_saved_games_in_char_data ... ok
[INFO] [stdout] test saved_game::tests::when_constructed_from_steps_may_ignore_solving_mode_argument ... ok
[INFO] [stdout] test saved_game::tests::when_converting_steps_to_string_ensures_start_jump_for_reverse_mode_saved_games ... ok
[INFO] [stdout] test saved_game::tests::when_constructed_from_steps_may_use_default_solving_mode ... ok
[INFO] [stdout] test sokoban_plus::plus_id::tests::test_plus_id_is_comparable_to_integers ... ok
[INFO] [stdout] test sokoban_plus::plus_id::tests::test_plus_id_is_value_constrained ... ok
[INFO] [stdout] test sokoban_plus::tests::it_can_be_constructed_from_boxorder_and_goalorder ... ok
[INFO] [stdout] test sokoban_plus::tests::it_allows_being_created_from_blank_strings ... ok
[INFO] [stdout] test sokoban_plus::tests::it_pads_interior_gaps_in_boxorder_and_goalorder ... ok
[INFO] [stdout] test saved_game::tests::when_constructed_from_steps_may_use_solving_mode_argument ... ok
[INFO] [stdout] test sokoban_plus::tests::it_correctly_persists_sokoban_plus_ids ... ok
[INFO] [stdout] test sokoban_plus::tests::it_can_handle_legacy_default_plus_id ... ok
[INFO] [stdout] test sokoban_plus::tests::when_there_are_no_plus_ids_the_order_is_blank ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_defaults_to_sokoban_if_not_specified ... ok
[INFO] [stdout] test static_board_analysis::tests::it_calculates_hexoban_outer_cells ... ok
[INFO] [stdout] test sokoban_plus::tests::when_a_plus_id_is_cleared_the_later_pieces_keep_their_positions ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_1x2_bottom ... ok
[INFO] [stdout] test static_board_analysis::tests::it_calculates_playable_areas ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_board1x1 ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_board2x1_left ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_board2x1_right ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_board3x1_right ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_bottom_left_row_even ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_bottom_left_row_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_bottom_right_row_even_column_even ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_bottom_right_row_even_column_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_bottom_right_row_odd_column_even ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_bottom_right_row_odd_column_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_bottom_column_even_row_even ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_bottom_column_even_row_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_bottom_column_odd_row_even ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_bottom_column_odd_row_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_left_row_even ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_uses_value_from_hint_when_nothing_is_specified_in_file ... ok
[INFO] [stdout] test sokoban_plus::tests::when_a_plus_id_is_99_it_round_trips ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_left_row_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_right_row_even_column_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_right_row_odd_column_even ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_right_row_odd_column_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_row_even_column_even ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_row_even_column_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_row_odd_column_even ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_row_odd_column_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_top_column_even ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_right_row_even_column_even ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_top_right_column_even ... ok
[INFO] [stdout] test sokoban_plus::plus_id::tests::test_plus_id_can_be_constructed_from_integers ... ok
[INFO] [stdout] test sokoban_plus::tests::it_setter_doesnt_treat_99_specially ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_1x2_top ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_top_right_column_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_1x3_bottom ... ok
[INFO] [stdout] test sokoban_plus::tests::it_prints_correct_boxorder_and_goalorder ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_transforms::counter_clockwise_inverts_clockwise_and_mirrors_are_involutions ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_transforms::it_maps_negative_coordinates ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_transforms::it_maps_the_first_two_rows_under_every_transform ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_transforms::it_mirrors_odd_and_even_rows_differently ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_1x2_top ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_1x3_bottom ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_board1x1 ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_board2x1_left ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_board2x1_right ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_board3x1_right ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_bottom_left_row_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_bottom_left_row_odd ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_bottom_right_row_even_column_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_bottom_right_row_even_column_odd ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_bottom_right_row_odd_column_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_bottom_right_row_odd_column_odd ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_bottom_column_even_row_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_bottom_column_even_row_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_transforms::it_rotates_every_direction_by_one_step ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_bottom_column_odd_row_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_bottom_column_odd_row_odd ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_left_row_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_transforms::it_reports_which_translations_are_rigid ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_transforms::it_returns_to_the_start_only_after_a_full_turn ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_right_row_even_column_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_right_row_even_column_odd ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_left_row_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_row_even_column_odd ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_row_even_column_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_top_column_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_1x2_bottom ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_top_left ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_top_right_column_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_top_right_column_odd ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_row_odd_column_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_row_odd_column_odd ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_top_column_odd ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_transforms::it_maps_negative_coordinates ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_transforms::it_maps_the_first_two_rows_under_every_transform ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_top_left ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_right_row_odd_column_even ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_middle_right_row_odd_column_odd ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_transforms::counter_clockwise_inverts_clockwise_and_mirrors_are_involutions ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_transforms::it_reports_which_translations_are_rigid ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_transforms::it_returns_to_the_start_only_after_a_full_turn ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_1x2_top ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_boar_d2x1_right ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_1x2_bottom ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_transforms::it_rotates_every_direction_by_one_step ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_board2x1_left ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_bottom_left ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_middle_bottom ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_middle_left ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_middle_right ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_middle_top ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_top_left ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_top_right ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_board1x1 ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_bottom_right ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_transforms::it_maps_negative_coordinates ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_transforms::counter_clockwise_inverts_clockwise_and_mirrors_are_involutions ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_transforms::it_maps_the_first_two_rows_under_every_transform ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_transforms::it_reports_every_translation_as_rigid ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_transforms::it_rotates_every_direction_by_one_step ... ok
[INFO] [stdout] test tessellation::tests::it_agrees_with_its_implementation_module_over_the_whole_board ... ok
[INFO] [stdout] test tessellation::tests::it_has_no_neighbor_directions_off_board ... ok
[INFO] [stdout] test tessellation::tests::its_neighbor_directions_are_the_directions_that_have_a_neighbor ... ok
[INFO] [stdout] test tessellation::tests::it_dispatches_to_the_behavior_of_its_own_tessellation ... ok
[INFO] [stdout] test tessellation::tests::known_directions_are_closed_under_opposite ... ok
[INFO] [stdout] test tessellation::tests::it_dispatches_transform_geometry_to_its_own_tessellation ... ok
[INFO] [stdout] test tessellation::sokoban::tests::test_transforms::it_returns_to_the_start_only_after_a_full_turn ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_1x2_bottom ... ok
[INFO] [stdout] test tessellation::tests::opposite_is_the_geometric_inverse_of_neighbor ... ok
[INFO] [stdout] test tessellation::octoban::tests::test_transforms::it_preserves_tile_parity_under_every_transform ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_1x2_top ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_bottom_left_row_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_1x3_bottom ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_bottom_left_row_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_bottom_right_row_even_column_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_bottom_right_row_odd_column_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_bottom_right_row_odd_column_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_bottom_column_even_row_even ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_loads_last_saved_game_notes ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_bottom_column_odd_row_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_bottom_column_even_row_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_bottom_column_odd_row_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_board2x1_left ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_left_row_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_right_row_even_column_odd ... ok
[INFO] [stdout] test tessellation::hexoban::tests::test_middle_top_column_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_right_row_odd_column_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_bottom_right_row_even_column_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_row_even_column_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_right_row_odd_column_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_right_row_even_column_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_row_odd_column_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_row_even_column_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_top_column_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_top_left ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_row_odd_column_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_left_row_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_middle_top_column_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_board3x1_right ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_transforms::counter_clockwise_inverts_clockwise_and_mirrors_are_involutions ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_transforms::it_maps_the_first_two_rows_under_every_transform ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_transforms::it_reports_which_translations_are_rigid ... ok
[INFO] [stdout] test tile::tests::a_box_on_a_goal_still_has_a_box ... ok
[INFO] [stdout] test tile::tests::a_plain_box_cannot_start_a_row ... ok
[INFO] [stdout] test tile::tests::a_pusher_on_a_goal_still_has_a_pusher ... ok
[INFO] [stdout] test tile::tests::an_occupied_goal_still_has_a_goal ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_transforms::it_flips_triangle_orientation_under_every_transform_but_the_vertical_mirror ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_transforms::it_returns_to_the_start_only_after_a_full_turn ... ok
[INFO] [stdout] test tile::tests::only_the_floor_is_empty_floor ... ok
[INFO] [stdout] test tile::tests::only_the_wall_is_a_wall ... ok
[INFO] [stdout] test tile::tests::only_walls_and_boxes_on_goals_can_start_a_row ... ok
[INFO] [stdout] test tile::tests::the_default_tile_is_empty_floor ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_board1x1 ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_transforms::it_maps_negative_coordinates ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_top_right_column_even ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_top_right_column_odd ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_transforms::a_rotation_carries_neighbours_onto_neighbours ... ok
[INFO] [stdout] test tessellation::trioban::tests::test_board2x1_right ... ok
[INFO] [stdout] test sokoban_plus::tests::it_round_trips_through_boxorder_and_goalorder ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_correctly_loads_mixed_tessellations_collection ... ok
[INFO] [stdout] test io::file_format::tests::it_round_trips_a_collection_through_a_file ... ok
[INFO] [stdout] test io::file_format::tests::it_round_trips_a_collection_through_write_and_read ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_reads_collection_from_file ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_writes_sokoban_plus_interior_gaps_to_file ... ok
[INFO] [stdout] test io::sok_file_format::tests::it_writes_collection_to_file ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 391 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.67s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests sokoban_elements
[INFO] [stdout] 
[INFO] [stdout] running 44 tests
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard (line 212) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::enclose (line 966) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::add_rows (line 792) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard (line 66) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::boxes (line 519) ... ok
[INFO] [stdout] test src/board_area.rs - board_area::BoardArea::union (line 219) ... ok
[INFO] [stdout] test src/./lib.rs.md - (line 228) ... ok
[INFO] [stdout] test src/board_area.rs - board_area::BoardArea::bounds (line 157) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::add_columns (line 854) ... ok
[INFO] [stdout] test src/./lib.rs.md - (line 186) ... ok
[INFO] [stdout] test src/direction.rs - direction::DirectionsSet (line 101) ... ok
[INFO] [stdout] test src/./lib.rs.md - (line 121) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::boxes (line 549) ... ok
[INFO] [stdout] test src/board_area.rs - board_area::BoardArea::add_point (line 119) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::new (line 249) ... ok
[INFO] [stdout] test src/./lib.rs.md - (line 153) ... ok
[INFO] [stdout] test src/board_area.rs - board_area::BoardArea (line 16) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::remove_columns (line 883) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::pushers (line 467) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::parsed (line 280) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::grow (line 750) ... ok
[INFO] [stdout] test src/io/file_format.rs - io::file_format::FileFormat::read (line 374) - compile ... ok
[INFO] [stdout] test src/io/file_format.rs - io::file_format::FileFormat::write (line 466) - compile ... ok
[INFO] [stdout] test src/io/file_format.rs - io::file_format::FileFormat::write (line 509) - compile ... ok
[INFO] [stdout] test src/io/file_format.rs - io::file_format::FileFormat::write (line 488) - compile ... ok
[INFO] [stdout] test src/io/file_format.rs - io::file_format::FileFormat::read (line 392) - compile ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::remove_rows (line 820) ... ok
[INFO] [stdout] test src/game_board/edges.rs - game_board::edges::HorizontalEdge (line 8) ... ok
[INFO] [stdout] test src/saved_game.rs - saved_game::SavedGame::parsed (line 164) ... ok
[INFO] [stdout] test src/game_board/edges.rs - game_board::edges::VerticalEdge (line 30) ... ok
[INFO] [stdout] test src/sokoban_plus.rs - sokoban_plus::SokobanPlus::boxorder (line 318) ... ok
[INFO] [stdout] test src/saved_game.rs - saved_game::SavedGame::from_steps (line 259) ... ok
[INFO] [stdout] test src/saved_game.rs - saved_game::SavedGame (line 106) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::mirror (line 681) ... ok
[INFO] [stdout] test src/point2d.rs - point2d::Point2D (line 56) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::iter (line 645) ... ok
[INFO] [stdout] test src/saved_game.rs - saved_game::SavedGame (line 40) ... ok
[INFO] [stdout] test src/point2d.rs - point2d::Point2D (line 13) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::rotate (line 708) ... ok
[INFO] [stdout] test src/sokoban_plus.rs - sokoban_plus::SokobanPlus (line 85) ... ok
[INFO] [stdout] test src/sokoban_plus.rs - sokoban_plus::SokobanPlus::parsed_legacy (line 229) ... ok
[INFO] [stdout] test src/game_board.rs - game_board::GameBoard::goals (line 605) ... ok
[INFO] [stdout] test src/sokoban_plus.rs - sokoban_plus::SokobanPlus::box_plus_ids (line 369) ... ok
[INFO] [stdout] test src/sokoban_plus.rs - sokoban_plus::SokobanPlus (line 68) ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 44 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s
[INFO] [stdout] 
[INFO] [stdout] all doctests ran in 1.11s; merged doctests compilation took 1.02s
[INFO] running `Command { std: "docker" "inspect" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea", kill_on_drop: false }`
[INFO] [stdout] 5506e5a7a1e25c2f847e606520d9c5303ad2babf54fbe6a3da3392810192f4ea
