[INFO] cloning repository https://github.com/grancier/ratgames
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/grancier/ratgames" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fgrancier%2Fratgames", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fgrancier%2Fratgames'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 39ea8d842c697b67aca90111f3da47a21ad11fb2
[INFO] testing grancier/ratgames against 1.99.0-beta.8+cargoflags=--release for beta-release-1.100-2
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fgrancier%2Fratgames" "/workspace/builds/worker-3-tc1/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-3-tc1/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/grancier/ratgames
[INFO] removed 0 missing examples
[INFO] finished tweaking git repo https://github.com/grancier/ratgames
[INFO] tweaked toml for git repo https://github.com/grancier/ratgames written to /workspace/builds/worker-3-tc1/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/grancier/ratgames on toolchain 1.99.0-beta.8
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.99.0-beta.8" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/grancier/ratgames 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.99.0-beta.8" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded redox_syscall v0.9.0
[INFO] [stderr]   Downloaded libredox v0.1.18
[INFO] [stderr]   Downloaded xml-rs v0.8.28
[INFO] [stderr]   Downloaded font8x8 v0.3.1
[INFO] [stderr]   Downloaded sdl2 v0.38.0
[INFO] [stderr]   Downloaded sdl2-sys v0.38.0
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-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:77db811e55d90add9212f6832c23229e3de5f1c1f9905e8cb07319ea15df73ac" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28
[INFO] running `Command { std: "docker" "start" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28", 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" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28", 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" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "build" "--frozen" "--message-format=json" "--release", kill_on_drop: false }`
[INFO] [stderr]    Compiling proc-macro2 v1.0.106
[INFO] [stderr]    Compiling quote v1.0.46
[INFO] [stderr]    Compiling unicode-ident v1.0.24
[INFO] [stderr]    Compiling libm v0.2.16
[INFO] [stderr]    Compiling libc v0.2.186
[INFO] [stderr]    Compiling hashbrown v0.17.1
[INFO] [stderr]    Compiling zmij v1.0.21
[INFO] [stderr]    Compiling thiserror v2.0.18
[INFO] [stderr]    Compiling serde_json v1.0.150
[INFO] [stderr]    Compiling winnow v0.7.15
[INFO] [stderr]    Compiling toml_write v0.1.2
[INFO] [stderr]    Compiling slotmap v1.1.1
[INFO] [stderr]    Compiling foldhash v0.1.5
[INFO] [stderr]    Compiling roxmltree v0.20.0
[INFO] [stderr]    Compiling tinyvec v1.11.0
[INFO] [stderr]    Compiling ttf-parser v0.21.1
[INFO] [stderr]    Compiling itoa v1.0.18
[INFO] [stderr]    Compiling hashbrown v0.15.5
[INFO] [stderr]    Compiling log v0.4.33
[INFO] [stderr]    Compiling memchr v2.8.2
[INFO] [stderr]    Compiling font8x8 v0.3.1
[INFO] [stderr]    Compiling fontconfig-parser v0.5.8
[INFO] [stderr]    Compiling syn v2.0.118
[INFO] [stderr]    Compiling core_maths v0.1.1
[INFO] [stderr]    Compiling indexmap v2.14.0
[INFO] [stderr]    Compiling ttf-parser v0.25.1
[INFO] [stderr]    Compiling memmap2 v0.9.11
[INFO] [stderr]    Compiling fontdue v0.9.3
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling thiserror-impl v2.0.18
[INFO] [stderr]    Compiling fontdb v0.23.0
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling toml_datetime v0.6.11
[INFO] [stderr]    Compiling serde_spanned v0.6.9
[INFO] [stderr]    Compiling toml_edit v0.22.27
[INFO] [stderr]    Compiling toml v0.8.23
[INFO] [stderr]    Compiling ratgames v0.1.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 44.31s
[INFO] running `Command { std: "docker" "inspect" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28", 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" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "test" "--frozen" "--no-run" "--message-format=json" "--release", kill_on_drop: false }`
[INFO] [stderr]    Compiling anyhow v1.0.103
[INFO] [stderr]    Compiling demos v0.1.0 (/opt/rustwide/workdir/demos)
[INFO] [stderr]    Compiling ratgames v0.1.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 22.49s
[INFO] running `Command { std: "docker" "inspect" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28", 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" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "test" "--frozen" "--release", kill_on_drop: false }`
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 0.11s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/release/deps/ratgames-bcdcb2f2639325ec)
[INFO] [stdout] running 447 tests
[INFO] [stdout] test color::tests::packed_discards_alpha ... ok
[INFO] [stdout] test color::tests::serde_hex_round_trips_and_rejects_junk ... ok
[INFO] [stdout] test color::tests::scale_alpha_clamps_the_fraction_and_guards_zero ... ok
[INFO] [stdout] test color::tests::transparent_is_invisible_and_packs_to_zero ... ok
[INFO] [stdout] test config::levels::tests::take_levels_flag_accepts_the_equals_form ... ok
[INFO] [stdout] test config::device::tests::serde_uses_snake_case_names ... ok
[INFO] [stdout] test config::tests::a_partial_file_falls_back_to_defaults ... ok
[INFO] [stdout] test config::tests::a_reasonable_banner_builds_within_limits ... ok
[INFO] [stdout] test config::levels::tests::take_levels_flag_passes_everything_through_when_absent ... ok
[INFO] [stdout] test config::tests::builder_rejects_oversized_cell_px_without_a_font ... ok
[INFO] [stdout] test config::tests::a_colour_can_be_overridden_in_toml ... ok
[INFO] [stdout] test config::levels::tests::take_levels_flag_extracts_dir_and_keeps_the_rest_in_order ... ok
[INFO] [stdout] test config::tests::component_colours_default_from_the_theme ... ok
[INFO] [stdout] test config::tests::config_source_default_loads_builtin_defaults ... ok
[INFO] [stdout] test config::levels::tests::parses_a_flat_file_with_flattened_rules_and_content ... ok
[INFO] [stdout] test config::levels::tests::load_levels_dir_errs_on_a_dir_without_levels ... ok
[INFO] [stdout] test config::levels::tests::load_levels_dir_reads_files_in_index_order ... ok
[INFO] [stdout] test config::levels::tests::round_trips_through_json ... ok
[INFO] [stdout] test config::device::tests::default_is_desktop_at_1280x720 ... ok
[INFO] [stdout] test config::tests::config_source_load_or_else_uses_the_supplied_default ... ok
[INFO] [stdout] test config::device::tests::width_classification_covers_the_bands_and_boundaries ... ok
[INFO] [stdout] test color::tests::scale_alpha_fades_linearly_and_holds_the_rgb ... ok
[INFO] [stdout] test config::device::tests::each_preset_width_classifies_back_to_its_own_class ... ok
[INFO] [stdout] test config::levels::tests::level_index_parses_only_level_json_names ... ok
[INFO] [stdout] test color::tests::rgb_is_opaque_and_packs_channels ... ok
[INFO] [stdout] test config::levels::tests::load_levels_dir_errs_on_a_missing_dir ... ok
[INFO] [stdout] test config::tests::default_family_round_trips_as_the_keyword ... ok
[INFO] [stdout] test config::tests::config_source_defaults_without_a_path ... ok
[INFO] [stdout] test config::tests::config_source_is_a_file_when_a_path_is_given ... ok
[INFO] [stdout] test config::tests::default_strings_are_sourced_from_the_bundled_json ... ok
[INFO] [stdout] test config::tests::defaults_hold_no_magic_numbers_downstream ... ok
[INFO] [stdout] test config::tests::defaults_round_trip_through_json ... ok
[INFO] [stdout] test config::tests::font_source_reports_its_weight ... ok
[INFO] [stdout] test config::tests::defaults_round_trip_through_toml ... ok
[INFO] [stdout] test config::tests::font_weight_rejects_out_of_range_numbers ... ok
[INFO] [stdout] test config::tests::font_config_with_embedded_font_keeps_the_size ... ok
[INFO] [stdout] test config::tests::font_family_default_and_named_forms ... ok
[INFO] [stdout] test config::tests::load_config_file_reports_the_failing_format ... ok
[INFO] [stdout] test config::tests::load_config_file_reads_toml_and_json_by_extension ... ok
[INFO] [stdout] test config::tests::load_rejects_an_unsupported_extension ... ok
[INFO] [stdout] test config::tests::named_weight_round_trips_through_its_name ... ok
[INFO] [stdout] test config::tests::font_source_with_embedded_font_swaps_any_source_at_its_weight ... ok
[INFO] [stdout] test config::tests::nested_borders_match_configured_count_and_nest_inward ... ok
[INFO] [stdout] test config::tests::oversized_banner_is_rejected_before_allocation ... ok
[INFO] [stdout] test config::tests::panel_sits_in_the_bottom_fraction ... ok
[INFO] [stdout] test config::tests::parse_config_flag_extracts_path_and_keeps_positionals ... ok
[INFO] [stdout] test config::tests::parse_config_flag_missing_value_is_an_error ... ok
[INFO] [stdout] test config::tests::parse_config_flag_without_flag_is_all_positional ... ok
[INFO] [stdout] test config::tests::parse_config_flag_supports_equals_form ... ok
[INFO] [stdout] test config::tests::sample_marquee_bakes_through_the_raster_source ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test config::tests::raster_glyph_source_round_trips_through_toml ... ok
[INFO] [stdout] test config::tests::raster_threshold_defaults_to_128_when_omitted ... ok
[INFO] [stdout] test config::tests::nonstandard_weight_round_trips_as_a_number ... ok
[INFO] [stdout] test config::tests::raster_threshold_round_trips_through_toml ... ok
[INFO] [stdout] test config::tests::validate_rejects_oversized_raster_cell_px ... ok
[INFO] [stdout] test config::tests::system_source_accepts_a_numeric_weight ... ok
[INFO] [stdout] test config::tests::validate_rejects_zero_text_scale ... ok
[INFO] [stdout] test copy::tests::fill_substitutes_placeholders_left_to_right ... ok
[INFO] [stdout] test effects::wave::tests::a_frozen_speed_never_moves ... ok
[INFO] [stdout] test config::tests::system_source_parses_named_weight_style_and_stretch ... ok
[INFO] [stdout] test config::tests::sample_marquee_json_loads_and_validates ... ok
[INFO] [stdout] test config::tests::load_config_file_checks_the_extension_before_reading ... ok
[INFO] [stdout] test effects::wave::tests::at_rest_the_run_sits_along_the_bottom ... ok
[INFO] [stdout] test config::tests::load_missing_file_is_an_io_error ... ok
[INFO] [stdout] test config::tests::font_weight_rejects_an_unknown_name ... ok
[INFO] [stdout] test config::levels::tests::take_levels_flag_requires_a_dir ... ok
[INFO] [stdout] test config::tests::validate_rejects_zero_raster_cell_px ... ok
[INFO] [stdout] test config::tests::system_source_defaults_every_field_when_omitted ... ok
[INFO] [stdout] test config::tests::validate_accepts_a_reasonable_raster_marquee ... ok
[INFO] [stdout] test config::tests::validate_rejects_out_of_range_height_fraction ... ok
[INFO] [stdout] test config::tests::with_embedded_font_swaps_the_font_and_keeps_size_and_weight ... ok
[INFO] [stdout] test config::tests::validate_rejects_zero_dimensions ... ok
[INFO] [stdout] test effects::wave::tests::advancing_lifts_the_lead_letter_out_of_the_bottom_band ... ok
[INFO] [stdout] test effects::wave::tests::speed_scales_elapsed_time_not_the_cascade_spacing ... ok
[INFO] [stdout] test font::tests::default_source_is_generic_monospace ... ok
[INFO] [stdout] test effects::wave::tests::offsets_move_each_letter_to_the_top_then_back ... ok
[INFO] [stdout] test effects::wave::tests::offsets_delay_each_letters_start ... ok
[INFO] [stdout] test font::tests::loads_system_monospace_and_rasterizes ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test font::tests::styled_query_selects_a_distinct_face ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test effects::wave::tests::scale_magnifies_the_glyphs ... ok
[INFO] [stdout] test effects::wave::tests::empty_text_draws_nothing_without_panicking ... ok
[INFO] [stdout] test config::tests::sample_marquee_toml_loads_and_validates ... ok
[INFO] [stdout] test glyph::tests::italic_faces_produce_overhanging_ink ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test glyph::tests::raster_beats_8x8_resolution_through_big_text ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test glyph::tests::raster_glyph_box_is_the_ink_not_the_advance ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test glyph::tests::raster_source_has_a_tall_cell_and_inks_glyphs ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test glyph::tests::to_sprite_of_a_blank_mask_is_one_transparent_pixel ... ok
[INFO] [stdout] test geometry::tests::rect_contains_respects_offset_origin ... ok
[INFO] [stdout] test geometry::tests::size_contains_only_the_half_open_box ... ok
[INFO] [stdout] test geometry::tests::point_and_rect_round_trip_through_json_for_config ... ok
[INFO] [stdout] test glyph::tests::bitmap8x8_cell_is_eight_tall ... ok
[INFO] [stdout] test glyph::tests::known_glyph_has_ink_and_unknown_is_blank ... ok
[INFO] [stdout] test input::tests::handle_routes_editing_through_the_field ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test glyph::tests::to_sprite_crops_a_glyph_to_its_ink ... ok
[INFO] [stdout] test input::tests::prompt_round_trips_through_the_field ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test input::tests::editing_tracks_cursor_across_utf8 ... ok
[INFO] [stdout] test input::tests::submit_returns_the_answer_and_clears ... ok
[INFO] [stdout] test input::tests::backspace_at_start_is_a_noop ... ok
[INFO] [stdout] test overlay::tests::advance_width_is_zero_for_empty_and_grows_with_text ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test overlay::tests::draw_run_blends_glyphs_and_returns_the_advanced_pen ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test font::tests::embedded_weight_resolves_to_nearest_face ... ok
[INFO] [stdout] test input::tests::caret_moves_across_utf8_and_forward_deletes ... ok
[INFO] [stdout] test input::tests::home_end_and_handle_route_ui_input ... ok
[INFO] [stdout] test placard::tests::oversized_sprite_clips_without_panic ... ok
[INFO] [stdout] test input::tests::clear_resets_buffer_and_cursor ... ok
[INFO] [stdout] test marquee::tests::advance_wraps_modulo_width ... ok
[INFO] [stdout] test marquee::tests::render_tiles_the_strip_and_skips_transparent ... ok
[INFO] [stdout] test geometry::tests::area_is_width_times_height ... ok
[INFO] [stdout] test geometry::tests::inset_shrinks_both_sides_and_saturates ... ok
[INFO] [stdout] test glyph::tests::bitmap_glyph_carries_advance_and_zero_bearing ... ok
[INFO] [stdout] test placard::tests::centres_a_smaller_sprite ... ok
[INFO] [stdout] test overlay::tests::centered_baseline_places_the_line_in_the_middle ... ok
[INFO] [stdout] test present::tests::fit_scale_is_integer_and_never_zero ... ok
[INFO] [stdout] test scene::tests::go_starts_a_slide_toward_an_existing_neighbor ... ok
[INFO] [stdout] test scene::tests::direction_delta_and_opposite ... ok
[INFO] [stdout] test present::tests::min_scale_is_the_crisp_clip_floor ... ok
[INFO] [stdout] test scene::tests::go_into_a_wall_is_a_noop ... ok
[INFO] [stdout] test present::tests::render_upscales_pixel_layers_then_calls_overlays ... ok
[INFO] [stdout] test glyph::tests::blank_mask_is_all_off_and_get_clamps ... ok
[INFO] [stdout] test present::tests::viewport_centres_the_letterbox ... ok
[INFO] [stdout] test scene::tests::advance_commits_the_move_on_settle ... ok
[INFO] [stdout] test scene::tests::advance_while_settled_is_a_noop ... ok
[INFO] [stdout] test scene::tests::link_is_one_way_connect_is_both_ways ... ok
[INFO] [stdout] test scene::tests::map_inserts_and_looks_up_rooms ... ok
[INFO] [stdout] test scene::tests::room_id_roundtrips ... ok
[INFO] [stdout] test scene::tests::sliding_at_zero_progress_shows_only_the_current_room ... ok
[INFO] [stdout] test scene::tests::sliding_north_brings_the_incoming_room_in_from_the_top ... ok
[INFO] [stdout] test scene::tests::start_clamps_zero_frames_to_one ... ok
[INFO] [stdout] test scene::tests::overworld_requires_a_present_start ... ok
[INFO] [stdout] test scene::tests::transition_carries_target_and_runs_once ... ok
[INFO] [stdout] test session::attract::tests::a_reentered_card_holds_its_full_time_again ... ok
[INFO] [stdout] test scene::tests::settled_view_fills_the_current_backdrop ... ok
[INFO] [stdout] test session::attract::tests::a_single_card_loop_re_holds_that_card ... ok
[INFO] [stdout] test scene::tests::sliding_east_splits_the_screen_at_the_halfway_point ... ok
[INFO] [stdout] test session::attract::tests::attract_config_validate_rejects_a_rotation_with_no_hold ... ok
[INFO] [stdout] test session::attract::tests::cards_turn_on_each_hold_and_wrap_without_leaving ... ok
[INFO] [stdout] test session::attract::tests::collect_layers_shows_only_the_current_card ... ok
[INFO] [stdout] test session::challenge_screen::tests::cancel_routes_in_both_phases ... ok
[INFO] [stdout] test session::attract::tests::any_input_wakes_the_loop_through_the_transition ... ok
[INFO] [stdout] test session::challenge_screen::tests::collect_layers_swaps_the_answer_widget_for_the_beat ... ok
[INFO] [stdout] test session::challenge_screen::tests::grading_reads_the_clock_still_left ... ok
[INFO] [stdout] test session::attract::tests::the_dismiss_fires_at_most_once ... ok
[INFO] [stdout] test session::challenge_screen::tests::a_leave_resolution_returns_the_route ... ok
[INFO] [stdout] test session::challenge_screen::tests::choice_mode_commits_the_selection ... ok
[INFO] [stdout] test scene::tests::go_is_ignored_mid_slide ... ok
[INFO] [stdout] test session::challenge_screen::tests::the_clock_expiry_grades_a_timeout_exactly_once ... ok
[INFO] [stdout] test scene::tests::go_skips_a_dangling_link ... ok
[INFO] [stdout] test session::challenge_screen::tests::confirm_skips_the_beat_and_resolves_once ... ok
[INFO] [stdout] test session::choice_screen::tests::a_choice_fires_at_most_once ... ok
[INFO] [stdout] test session::challenge_screen::tests::the_beat_freezes_editing_and_resolves_when_done ... ok
[INFO] [stdout] test session::challenge_screen::tests::typed_mode_commits_the_shared_line_and_clears_it ... ok
[INFO] [stdout] test session::attract::tests::an_empty_loop_shows_nothing_and_still_wakes_on_input ... ok
[INFO] [stdout] test session::continue_prompt::tests::the_lapsed_countdown_exits_as_declined ... ok
[INFO] [stdout] test session::continue_prompt::tests::the_seconds_readout_rides_the_prompt ... ok
[INFO] [stdout] test session::continues::tests::rules_round_trip_through_json ... ok
[INFO] [stdout] test session::choice_screen::tests::cancel_routes_through_on_cancel ... ok
[INFO] [stdout] test session::continue_prompt::tests::collect_layers_delegates_to_the_card ... ok
[INFO] [stdout] test session::continue_prompt::tests::the_transition_fires_at_most_once ... ok
[INFO] [stdout] test session::game_run::tests::a_classic_continue_zeroes_the_score_and_rearms_the_one_up_thresholds ... ok
[INFO] [stdout] test session::choice_screen::tests::collect_layers_contributes_the_title_and_the_list ... ok
[INFO] [stdout] test session::game_run::tests::a_continue_resumes_a_game_over_run_where_it_ended ... ok
[INFO] [stdout] test session::continue_prompt::tests::cancel_exits_as_cancelled ... ok
[INFO] [stdout] test session::continues::tests::default_offers_no_continues ... ok
[INFO] [stdout] test session::choice_screen::tests::confirm_routes_the_highlighted_choice ... ok
[INFO] [stdout] test session::continue_prompt::tests::confirm_exits_as_continued ... ok
[INFO] [stdout] test session::game_run::tests::a_finished_run_ignores_further_attempts ... ok
[INFO] [stdout] test session::game_run::tests::a_one_up_fires_once_when_the_score_reaches_a_threshold ... ok
[INFO] [stdout] test session::game_run::tests::a_one_up_past_the_cap_is_forfeited_but_still_consumes_the_threshold ... ok
[INFO] [stdout] test session::game_run::tests::a_perfect_clear_pays_only_when_the_level_was_flawless ... ok
[INFO] [stdout] test session::choice_screen::tests::navigation_moves_the_highlight_without_choosing ... ok
[INFO] [stdout] test session::attract::tests::config_round_trips_and_arms_the_idle_trigger_only_when_on ... ok
[INFO] [stdout] test session::game_run::tests::a_uniform_campaign_matches_equivalent_game_rules ... ok
[INFO] [stdout] test session::game_run::tests::award_adds_bonus_points_without_sequencing ... ok
[INFO] [stdout] test session::game_run::tests::clearing_every_level_wins_the_run ... ok
[INFO] [stdout] test session::choice_screen::tests::navigation_rebakes_through_the_hud_factory ... ok
[INFO] [stdout] test session::game_run::tests::from_campaign_rejects_degenerate_campaigns ... ok
[INFO] [stdout] test session::game_run::tests::game_run_names_the_reusable_run_controller ... ok
[INFO] [stdout] test session::game_run::tests::failing_a_level_retries_the_same_levels_goal ... ok
[INFO] [stdout] test session::game_run::tests::level_spec_defaults_fill_omitted_fields ... ok
[INFO] [stdout] test session::game_run::tests::level_spec_and_campaign_round_trip_through_json ... ok
[INFO] [stdout] test session::game_run::tests::new_rejects_degenerate_rules ... ok
[INFO] [stdout] test session::game_run::tests::campaign_runs_each_levels_own_goal_reward_and_input ... ok
[INFO] [stdout] test session::game_run::tests::default_campaign_is_playable ... ok
[INFO] [stdout] test session::game_run::tests::running_out_of_lives_ends_the_run ... ok
[INFO] [stdout] test session::game_run::tests::scoring_defaults_to_a_no_op_so_a_run_scores_only_base_points ... ok
[INFO] [stdout] test session::game_run::tests::rank_reads_the_runs_own_facts ... ok
[INFO] [stdout] test session::game_run::tests::set_scoring_rejects_malformed_thresholds ... ok
[INFO] [stdout] test session::game_run::tests::reset_clears_the_combo_and_one_up_progress ... ok
[INFO] [stdout] test session::game_run::tests::a_bonus_award_can_trigger_a_one_up ... ok
[INFO] [stdout] test session::game_run::tests::reset_restores_a_full_playthrough_and_keeps_the_name ... ok
[INFO] [stdout] test session::game_run::tests::reset_restores_the_continue_allowance ... ok
[INFO] [stdout] test session::game_run::tests::streak_bonus_escalates_spans_levels_and_a_miss_breaks_the_combo ... ok
[INFO] [stdout] test session::game_run::tests::the_tally_spans_levels_and_stops_once_the_run_ends ... ok
[INFO] [stdout] test session::high_score_board::tests::an_empty_board_still_bakes_the_header_and_footer ... ok
[INFO] [stdout] test session::high_score_board::tests::caps_the_rows_at_capacity ... ok
[INFO] [stdout] test session::high_score_board::tests::into_banners_yields_the_same_stack_collect_layers_borrows ... ok
[INFO] [stdout] test session::game_run::tests::set_scoring_rejects_a_cap_below_starting_lives ... ok
[INFO] [stdout] test session::high_score_layout::tests::entries_wrap_top_to_bottom_then_into_columns ... ok
[INFO] [stdout] test session::high_score_board::tests::omits_an_absent_header_and_footer ... ok
[INFO] [stdout] test session::high_score_layout::tests::layout_round_trips_through_json_for_config ... ok
[INFO] [stdout] test session::high_score_layout::tests::a_row_is_rank_name_points_at_the_origin ... ok
[INFO] [stdout] test session::high_score_layout::tests::names_are_upper_cased_and_clipped_to_width ... ok
[INFO] [stdout] test session::high_score_layout::tests::an_empty_board_has_no_rows_and_a_footer_at_the_origin ... ok
[INFO] [stdout] test session::high_score_layout::tests::below_sits_under_the_tallest_column ... ok
[INFO] [stdout] test session::game_run::tests::exceeding_failures_fails_the_level_costs_a_life_and_rearms ... ok
[INFO] [stdout] test session::game_run::tests::successes_clear_a_level_award_points_and_rearm_the_goal ... ok
[INFO] [stdout] test session::game_run::tests::validate_rejects_degenerate_rules ... ok
[INFO] [stdout] test session::high_score_store::tests::a_malformed_file_is_a_parse_error ... ok
[INFO] [stdout] test session::high_score_store::tests::a_missing_file_loads_an_empty_board ... ok
[INFO] [stdout] test session::high_score_store::tests::both_backends_serve_the_same_seam ... ok
[INFO] [stdout] test session::high_score_store::tests::memory_store_seeded_serves_its_starting_board ... ok
[INFO] [stdout] test session::high_score_store::tests::memory_store_starts_empty_and_round_trips_saves ... ok
[INFO] [stdout] test session::high_score_board::tests::bakes_a_header_every_row_and_a_footer ... ok
[INFO] [stdout] test session::high_score_store::tests::save_then_load_round_trips ... ok
[INFO] [stdout] test session::high_score_store::tests::scores_config_builds_a_store_and_round_trips ... ok
[INFO] [stdout] test session::high_score_store::tests::save_overwrites_a_previous_board ... ok
[INFO] [stdout] test session::high_score_store::tests::scores_config_validate_rejects_an_unusable_board ... ok
[INFO] [stdout] test session::high_score_store::tests::the_error_message_names_the_file ... ok
[INFO] [stdout] test session::high_scores::tests::a_score_below_a_full_board_does_not_place ... ok
[INFO] [stdout] test session::high_scores::tests::capacity_caps_the_board_and_drops_the_lowest ... ok
[INFO] [stdout] test session::high_scores::tests::new_board_is_empty ... ok
[INFO] [stdout] test session::high_scores::tests::qualifies_covers_room_full_ties_and_zero_capacity ... ok
[INFO] [stdout] test session::level_goal::tests::cleared_is_sticky_and_freezes_counts ... ok
[INFO] [stdout] test session::high_scores::tests::record_returns_the_rank_it_landed_at ... ok
[INFO] [stdout] test session::high_scores::tests::records_keep_highest_first ... ok
[INFO] [stdout] test session::high_scores::tests::serialises_as_a_flat_array_and_round_trips ... ok
[INFO] [stdout] test session::high_scores::tests::ties_rank_below_the_incumbent ... ok
[INFO] [stdout] test session::level_goal::tests::accessors_report_thresholds_and_counts ... ok
[INFO] [stdout] test session::level_goal::tests::clears_on_reaching_required_successes ... ok
[INFO] [stdout] test session::level_goal::tests::interleaved_successes_and_failures_can_still_clear ... ok
[INFO] [stdout] test session::level_goal::tests::new_accepts_zero_max_failures ... ok
[INFO] [stdout] test session::level_goal::tests::new_rejects_zero_required_successes ... ok
[INFO] [stdout] test session::level_goal::tests::zero_max_failures_fails_on_first_failure ... ok
[INFO] [stdout] test session::player::tests::default_profile_is_nameless ... ok
[INFO] [stdout] test session::level_goal::tests::fails_once_failures_exceed_max ... ok
[INFO] [stdout] test session::player::tests::profile_carries_and_updates_a_name ... ok
[INFO] [stdout] test session::prompt_screen::tests::collect_layers_contributes_every_banner_and_no_pixel_layer ... ok
[INFO] [stdout] test session::progress::tests::accuracy_is_the_floored_hit_percentage ... ok
[INFO] [stdout] test session::progress::tests::level_progress_advances_to_completion ... ok
[INFO] [stdout] test session::progress::tests::score_adds_and_resets_and_saturates ... ok
[INFO] [stdout] test session::progress::tests::zero_levels_is_complete_immediately ... ok
[INFO] [stdout] test session::prompt_screen::tests::any_input_pushes_the_idle_trigger_back ... ok
[INFO] [stdout] test session::prompt_screen::tests::the_idle_trigger_expires_into_idled ... ok
[INFO] [stdout] test session::prompt_screen::tests::the_transition_fires_at_most_once ... ok
[INFO] [stdout] test session::prompt_screen::tests::without_an_idle_trigger_tick_never_exits ... ok
[INFO] [stdout] test session::rank::tests::min_points_gates_a_low_score ... ok
[INFO] [stdout] test session::rank::tests::requires_won_gates_a_lost_run ... ok
[INFO] [stdout] test session::rank::tests::the_first_matching_rule_wins ... ok
[INFO] [stdout] test session::rank::tests::validate_rejects_an_empty_title ... ok
[INFO] [stdout] test session::run::tests::a_continue_refills_lives_keeps_the_level_and_forks_on_the_score ... ok
[INFO] [stdout] test session::run::tests::a_one_up_revives_a_dead_pool_and_reset_refills ... ok
[INFO] [stdout] test session::rank::tests::rules_round_trip_through_json_as_a_bare_list ... ok
[INFO] [stdout] test session::run::tests::game_over_takes_precedence_over_an_unfinished_run ... ok
[INFO] [stdout] test session::rank::tests::default_is_a_no_op_policy ... ok
[INFO] [stdout] test session::run::tests::lives_lose_down_to_game_over ... ok
[INFO] [stdout] test session::rank::tests::max_failures_tolerates_up_to_the_limit ... ok
[INFO] [stdout] test session::run::tests::run_plays_through_levels_to_a_win ... ok
[INFO] [stdout] test session::run::tests::run_reaches_game_over_when_lives_run_out ... ok
[INFO] [stdout] test session::run::tests::zero_lives_is_game_over_immediately ... ok
[INFO] [stdout] test session::run::tests::run_awards_points_and_resets ... ok
[INFO] [stdout] test session::scoring::tests::streak_bonus_escalates_from_the_second_in_a_row ... ok
[INFO] [stdout] test session::prompt_screen::tests::other_input_does_not_exit ... ok
[INFO] [stdout] test session::scoring::tests::streak_bonus_of_zero_never_pays ... ok
[INFO] [stdout] test session::scoring::tests::streak_bonus_saturates_instead_of_overflowing ... ok
[INFO] [stdout] test session::game_run::tests::a_single_award_crossing_several_thresholds_grants_several_lives ... ok
[INFO] [stdout] test session::scoring::tests::validate_accepts_no_thresholds ... ok
[INFO] [stdout] test session::scoring::tests::validate_accepts_ascending_nonzero_thresholds ... ok
[INFO] [stdout] test session::prompt_screen::tests::cancel_exits_as_cancelled ... ok
[INFO] [stdout] test session::scoring::tests::validate_rejects_a_zero_threshold ... ok
[INFO] [stdout] test session::scoring::tests::validate_rejects_non_ascending_thresholds ... ok
[INFO] [stdout] test session::screen::tests::rendering_starts_at_the_topmost_opaque_screen ... ok
[INFO] [stdout] test session::text_entry_screen::tests::cancel_exits_as_cancelled_and_leaves_the_line ... ok
[INFO] [stdout] test session::text_entry_screen::tests::collect_layers_contributes_the_field_overlay ... ok
[INFO] [stdout] test session::text_entry_screen::tests::confirm_submits_the_entered_text_and_clears_the_line ... ok
[INFO] [stdout] test session::game_run::tests::default_rules_are_playable ... ok
[INFO] [stdout] test session::screen::tests::push_pop_replace_move_the_stack ... ok
[INFO] [stdout] test session::screen::tests::input_and_tick_reach_only_the_top ... ok
[INFO] [stdout] test session::screen::tests::handle_and_tick_thread_the_shared_context ... ok
[INFO] [stdout] test session::timed_card::tests::collect_layers_contributes_every_banner_and_no_pixel_layer ... ok
[INFO] [stdout] test session::timed_card::tests::confirm_exits_as_confirmed ... ok
[INFO] [stdout] test session::timed_card::tests::a_zero_fps_readout_is_clamped_rather_than_dividing_by_zero ... ok
[INFO] [stdout] test session::timed_card::tests::an_attract_card_wakes_on_any_input ... ok
[INFO] [stdout] test session::timed_card::tests::the_seconds_readout_counts_whole_seconds_down ... ok
[INFO] [stdout] test session::timed_card::tests::tick_exits_as_expired_when_the_countdown_elapses ... ok
[INFO] [stdout] test sprite::tests::from_pixels_validates_length ... ok
[INFO] [stdout] test session::text_entry_screen::tests::editing_input_reaches_the_shared_line ... ok
[INFO] [stdout] test session::text_entry_screen::tests::the_transition_fires_at_most_once ... ok
[INFO] [stdout] test session::timed_card::tests::cancel_exits_as_cancelled ... ok
[INFO] [stdout] test session::timed_card::tests::other_input_does_not_exit ... ok
[INFO] [stdout] test surface::tests::blend_rect_composites_a_region_by_the_colour_alpha_and_clips ... ok
[INFO] [stdout] test surface::tests::blend_rect_is_a_noop_at_zero_alpha ... ok
[INFO] [stdout] test surface::tests::blend_rect_at_full_alpha_replaces_the_region ... ok
[INFO] [stdout] test surface::tests::blend_composites_by_coverage ... ok
[INFO] [stdout] test surface::tests::draw_sprite_scaled_clips_at_the_edge ... ok
[INFO] [stdout] test surface::tests::draw_sprite_silhouette_recolours_opaque_pixels ... ok
[INFO] [stdout] test surface::tests::draw_upscaled_expands_each_pixel_to_a_block ... ok
[INFO] [stdout] test surface::tests::ex_a_region_fully_outside_draws_nothing ... ok
[INFO] [stdout] test surface::tests::ex_a_region_past_the_sprite_is_clamped ... ok
[INFO] [stdout] test surface::tests::ex_clips_at_the_edges_without_panicking ... ok
[INFO] [stdout] test surface::tests::ex_default_options_match_draw_sprite ... ok
[INFO] [stdout] test surface::tests::ex_flip_x_mirrors_horizontally ... ok
[INFO] [stdout] test surface::tests::draw_sprite_composites_and_clips ... ok
[INFO] [stdout] test surface::tests::ex_flip_y_mirrors_vertically ... ok
[INFO] [stdout] test surface::tests::draw_sprite_scaled_blocks_and_skips_transparent ... ok
[INFO] [stdout] test sprite::tests::get_set_roundtrip_and_out_of_bounds ... ok
[INFO] [stdout] test surface::tests::ex_half_turn_rotates_180 ... ok
[INFO] [stdout] test surface::tests::ex_mirror_applies_before_the_turn ... ok
[INFO] [stdout] test surface::tests::ex_region_draws_only_the_subrect ... ok
[INFO] [stdout] test surface::tests::ex_scale_expands_each_pixel_into_blocks ... ok
[INFO] [stdout] test surface::tests::ex_tint_draws_a_silhouette_through_the_transform ... ok
[INFO] [stdout] test surface::tests::ex_three_quarter_turn_rotates_counter_clockwise ... ok
[INFO] [stdout] test surface::tests::fill_and_set_and_transparency ... ok
[INFO] [stdout] test surface::tests::fill_rect_clips_to_bounds ... ok
[INFO] [stdout] test surface::tests::rect_outline_draws_edges_not_interior ... ok
[INFO] [stdout] test surface::tests::transform_swaps_output_size_only_on_quarter_turns ... ok
[INFO] [stdout] test surface::tests::visible_blocks_clips_both_ends ... ok
[INFO] [stdout] test text::tests::advance_spaces_glyphs_and_overhang_is_kept ... ok
[INFO] [stdout] test sprite::tests::new_sprite_is_all_transparent ... ok
[INFO] [stdout] test surface::tests::ex_transparent_pixels_are_skipped ... ok
[INFO] [stdout] test surface::tests::ex_zero_scale_draws_nothing ... ok
[INFO] [stdout] test session::timed_card::tests::the_seconds_readout_renders_with_the_banners ... ok
[INFO] [stdout] test text::tests::footprint_matches_a_real_bake ... ok
[INFO] [stdout] test session::timed_card::tests::the_transition_fires_at_most_once ... ok
[INFO] [stdout] test text::tests::build_with_lays_out_by_the_source_metrics ... ok
[INFO] [stdout] test surface::tests::ex_quarter_turn_rotates_clockwise ... ok
[INFO] [stdout] test surface::tests::ex_scaled_blocks_clip_partially_at_the_edges ... ok
[INFO] [stdout] test text::tests::default_text_colors_match_palette ... ok
[INFO] [stdout] test text::tests::custom_colors_are_honoured ... ok
[INFO] [stdout] test text::tests::build_produces_all_three_layers_over_transparency ... ok
[INFO] [stdout] test text::tests::isolated_banner_keeps_left_outline_and_has_no_wrap_bleed ... ok
[INFO] [stdout] test session::high_score_layout::tests::capacity_caps_the_displayed_rows ... ok
[INFO] [stdout] test session::level_goal::tests::failed_is_sticky_and_freezes_counts ... ok
[INFO] [stdout] test session::prompt_screen::tests::confirm_exits_as_confirmed ... ok
[INFO] [stdout] test session::scoring::tests::default_is_a_no_op_policy ... ok
[INFO] [stdout] test text::tests::unknown_glyph_is_blank ... ok
[INFO] [stdout] test theme::tests::theme_round_trips_through_toml ... ok
[INFO] [stdout] test text::tests::outline_zero_draws_no_border ... ok
[INFO] [stdout] test tiles::tests::a_degenerate_tileset_is_empty_not_a_panic ... ok
[INFO] [stdout] test tiles::tests::cursor_new_clamps_into_the_grid ... ok
[INFO] [stdout] test text::tests::sprite_dimensions_follow_scale ... ok
[INFO] [stdout] test tiles::tests::marker_fills_exactly_its_cell ... ok
[INFO] [stdout] test tiles::tests::tile_grid_centres_within_an_area ... ok
[INFO] [stdout] test tiles::tests::cursor_steps_one_cell_and_holds_at_the_edge ... ok
[INFO] [stdout] test tiles::tests::tilemap_round_trips_through_json ... ok
[INFO] [stdout] test tiles::tests::tilemap_validates_dimensions_and_cell_counts ... ok
[INFO] [stdout] test tiles::tests::tileset_grid_slices_regions_and_bounds_check ... ok
[INFO] [stdout] test tiles::tests::tileset_slices_a_multi_row_sheet ... ok
[INFO] [stdout] test tiles::tests::tilesets_resolve_by_id ... ok
[INFO] [stdout] test tiles::tests::tile_grid_lays_out_rects_and_centres_sprites ... ok
[INFO] [stdout] test tiles::tests::view_paints_cells_and_skips_empties ... ok
[INFO] [stdout] test tiles::tests::tile_ids_round_trip ... ok
[INFO] [stdout] test tiles::tests::view_skips_an_unresolved_tileset ... ok
[INFO] [stdout] test ui::answer_mode::tests::validates_multiple_choice_option_count ... ok
[INFO] [stdout] test ui::banner_column::tests::a_text_past_the_ys_vector_lands_at_zero ... ok
[INFO] [stdout] test tiles::tests::tileset_flags_default_zero_and_read_back ... ok
[INFO] [stdout] test ui::answer_mode::tests::round_trips_through_json ... ok
[INFO] [stdout] test tiles::tests::view_scales_each_source_tile_to_the_grid_tile ... ok
[INFO] [stdout] test ui::banner_column::tests::plans_a_title_and_body_lines_in_order ... ok
[INFO] [stdout] test ui::answer_mode::tests::default_is_typed ... ok
[INFO] [stdout] test ui::answer_mode::tests::parses_the_tagged_forms ... ok
[INFO] [stdout] test ui::banner_column::tests::bake_renders_every_planned_line ... ok
[INFO] [stdout] test ui::blink::tests::advance_saturates_and_stays_done_and_dark ... ok
[INFO] [stdout] test ui::blink::tests::it_lights_the_configured_number_of_on_off_cycles_then_finishes ... ok
[INFO] [stdout] test theme::tests::a_partial_theme_keeps_other_tokens_default ... ok
[INFO] [stdout] test theme::tests::default_tokens_match_the_palette ... ok
[INFO] [stdout] test ui::choice_list::tests::rendering_draws_pixels_and_the_caret_follows_the_highlight ... ok
[INFO] [stdout] test tiles::tests::cursor_reenters_on_the_opposite_edge_in_the_same_lane ... ok
[INFO] [stdout] test ui::countdown::tests::config_builds_a_countdown_and_round_trips ... ok
[INFO] [stdout] test ui::choice_list::tests::an_empty_list_bakes_no_rows ... ok
[INFO] [stdout] test ui::choice_list::tests::bakes_one_row_per_option_starting_on_the_first ... ok
[INFO] [stdout] test ui::choice_list::tests::navigation_moves_the_highlight_and_confirm_returns_it ... ok
[INFO] [stdout] test ui::feedback_beat::tests::config_round_trips_and_arms_the_hold ... ok
[INFO] [stdout] test text::tests::negative_left_bearing_widens_the_grid ... ok
[INFO] [stdout] test ui::countdown::tests::over_pumping_saturates_at_expired ... ok
[INFO] [stdout] test ui::countdown::tests::reset_restores_the_full_budget ... ok
[INFO] [stdout] test ui::feedback_beat::tests::a_miss_runs_the_reject_blink_then_holds_the_verdict ... ok
[INFO] [stdout] test ui::feedback_beat::tests::advance_reports_done_once_at_the_end_of_the_whole_beat ... ok
[INFO] [stdout] test ui::label::tests::draw_blends_and_returns_the_advanced_pen ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test ui::countdown::tests::zero_frames_is_expired_from_the_start ... ok
[INFO] [stdout] test ui::feedback_beat::tests::a_hit_holds_the_verdict_with_a_fading_wash ... ok
[INFO] [stdout] test ui::layout::tests::oversubscribed_lengths_clamp_to_the_area ... ok
[INFO] [stdout] test ui::layout::tests::percentage_and_ratio_are_fractions_of_the_axis ... ok
[INFO] [stdout] test ui::layout::tests::two_fills_share_the_space_by_weight ... ok
[INFO] [stdout] test ui::menu::tests::empty_menu_confirms_to_nothing ... ok
[INFO] [stdout] test ui::flash::tests::set_color_updates_the_wash ... ok
[INFO] [stdout] test ui::flash::tests::tints_only_the_viewport_leaving_the_letterbox_untouched ... ok
[INFO] [stdout] test ui::label::tests::alignment_positions_the_run_within_the_area ... ok
[INFO] [stdout] test ui::layout::tests::length_then_fill_takes_the_remainder ... ok
[INFO] [stdout] test font::tests::embedded_source_loads_bundled_font ... ok
[INFO] [stdout] test ui::menu::tests::handle_navigates_and_confirms ... ok
[INFO] [stdout] test ui::menu::tests::multiple_choice_clamps_answer_to_range ... ok
[INFO] [stdout] test ui::menu::tests::multiple_choice_grades_the_highlighted_option ... ok
[INFO] [stdout] test ui::menu::tests::navigation_wraps_both_ways ... ok
[INFO] [stdout] test ui::menu::tests::select_ignores_out_of_range ... ok
[INFO] [stdout] test ui::meter_bar::tests::a_full_bar_fills_the_whole_track ... ok
[INFO] [stdout] test ui::countdown::tests::counts_down_and_expires ... ok
[INFO] [stdout] test text::tests::outline_px_thickens_the_border ... ok
[INFO] [stdout] test ui::meter_bar::tests::fraction_round_trips_what_was_set_even_out_of_range ... ok
[INFO] [stdout] test ui::meter_bar::tests::a_transparent_track_leaves_the_backdrop_between_fill_and_edge ... ok
[INFO] [stdout] test ui::feedback_beat::tests::config_validate_rejects_a_beat_that_would_show_nothing ... ok
[INFO] [stdout] test ui::meter_bar::tests::an_empty_bar_shows_only_the_track ... ok
[INFO] [stdout] test ui::meter_bar::tests::a_zero_denominator_reads_as_empty_not_a_panic ... ok
[INFO] [stdout] test ui::panel::tests::borderless_drops_lines_and_content_is_margin_plus_padding ... ok
[INFO] [stdout] test ui::panel::tests::border_rects_are_concentric_outermost_first ... ok
[INFO] [stdout] test ui::panel::tests::content_rect_insets_past_margin_borders_and_padding ... ok
[INFO] [stdout] test ui::panel::tests::borders_combine_and_report_membership ... ok
[INFO] [stdout] test ui::meter_bar::tests::with_fraction_matches_new_then_set_fraction ... ok
[INFO] [stdout] test ui::panel::tests::draw_paints_fill_then_border ... ok
[INFO] [stdout] test ui::panel::tests::partial_borders_stroke_only_selected_edges ... ok
[INFO] [stdout] test ui::panel::tests::title_rect_is_a_top_strip_of_content_width ... ok
[INFO] [stdout] test ui::meter_bar::tests::a_partial_bar_fills_the_left_portion_over_the_track ... ok
[INFO] [stdout] test ui::paragraph::tests::draw_wraps_long_text_to_multiple_lines ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test ui::panel::tests::all_borders_stroke_all_four_edges ... ok
[INFO] [stdout] test ui::paragraph::tests::a_word_wider_than_the_line_gets_its_own_line ... ok
[INFO] [stdout] test ui::meter_bar::tests::numerator_above_denominator_clamps_to_full ... ok
[INFO] [stdout] test ui::meter_bar::tests::config_round_trips_and_builds_a_bar ... ok
[INFO] [stdout] test ui::meter_bar::tests::the_bar_honours_its_rect_origin_and_height ... ok
[INFO] [stdout] test ui::flash::tests::a_zero_alpha_flash_draws_nothing ... ok
[INFO] [stdout] test ui::shadow_banner::tests::bake_drop_shadow_copies_the_fill_not_the_outlined_blob ... ok
[INFO] [stdout] test ui::paragraph::tests::wraps_greedily_on_word_boundaries ... ok
[INFO] [stdout] test ui::shadow_banner::tests::banner_style_round_trips_with_an_identity_default ... ok
[INFO] [stdout] test ui::paragraph::tests::preserves_explicit_and_blank_lines ... ok
[INFO] [stdout] test ui::shadow_banner::tests::banner_style_validate_rejects_zero_scales_and_bad_shadows ... ok
[INFO] [stdout] test ui::shadow_banner::tests::device_px_shadow_is_size_independent ... ok
[INFO] [stdout] test ui::shadow_banner::tests::em_accounts_for_the_bigtext_bake_scale ... ok
[INFO] [stdout] test ui::shadow_banner::tests::place_centres_at_scale_times_fit ... ok
[INFO] [stdout] test ui::shadow_banner::tests::factory_bakes_the_same_banners_as_direct_construction ... ok
[INFO] [stdout] test ui::shadow_banner::tests::em_shadow_scales_with_the_banner_scale ... ok
[INFO] [stdout] test ui::timed_gauge::tests::collect_layers_contributes_the_bar_and_the_baked_readout ... ok
[INFO] [stdout] test ui::timed_gauge::tests::advancing_drains_the_bar_with_the_clock ... ok
[INFO] [stdout] test ui::timed_gauge::tests::expiry_fires_exactly_once ... ok
[INFO] [stdout] test ui::shadow_banner::tests::shadow_config_builds_an_em_style_and_round_trips ... ok
[INFO] [stdout] test ui::shadow_banner::tests::place_projects_a_virtual_anchor_by_the_fit_factor ... ok
[INFO] [stdout] test ui::shadow_banner::tests::shadow_length_resolves_em_and_device_px ... ok
[INFO] [stdout] test ui::timed_gauge::tests::the_seconds_readout_counts_whole_seconds_down ... ok
[INFO] [stdout] test ui::timed_gauge::tests::without_a_readout_only_the_bar_is_contributed ... ok
[INFO] [stdout] test ui::view::tests::menu_view_draws_each_item ... ignored, requires a system font; run with `cargo test -- --ignored`
[INFO] [stdout] test ui::view::tests::stacked_rects_lay_out_a_vertical_list ... ok
[INFO] [stdout] test ui::shadow_banner::tests::shadow_config_validate_requires_finite_offsets ... ok
[INFO] [stdout] test ui::shadow_banner::tests::zero_offset_fully_occludes_the_shadow ... ok
[INFO] [stdout] test ui::view::tests::stacked_rects_empty_when_count_is_zero ... ok
[INFO] [stdout] test ui::timed_gauge::tests::a_zero_budget_fires_on_the_first_advance ... ok
[INFO] [stdout] test config::tests::embedded_glyph_source_resolves_without_a_system_font ... ok
[INFO] [stdout] test ui::blink::tests::it_draws_the_sprite_only_while_lit ... ok
[INFO] [stdout] test ui::blink::tests::config_stamps_its_pattern_and_round_trips ... ok
[INFO] [stdout] test font::tests::embedded_source_rasterizes_ink ... ok
[INFO] [stderr]      Running tests/compositor_frames.rs (/opt/rustwide/target/release/deps/compositor_frames-672a3ed5658a13c2)
[INFO] [stdout] test font::tests::embedded_bold_selects_a_heavier_face ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 433 passed; 0 failed; 14 ignored; 0 measured; 0 filtered out; finished in 0.15s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 4 tests
[INFO] [stdout] test the_red_cross_and_gameover_yellow_composite_through_the_presentation ... ok
[INFO] [stdout] test an_empty_world_shows_no_banner_colour ... ok
[INFO] [stdout] test the_win_marquee_composites_its_green_fill ... ok
[INFO] [stdout] test window_matches_virtual_screen_at_scale_one ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests ratgames
[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" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28", kill_on_drop: false }`
[INFO] [stdout] 2222f6aecf0ac3cff894eba0d8a986b808be01d05d610f7683a8b748b67d4c28
