[INFO] cloning repository https://github.com/markpasternak/terminal-weather [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/markpasternak/terminal-weather" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmarkpasternak%2Fterminal-weather", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmarkpasternak%2Fterminal-weather'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 70d975c6304fca101a467cd892332af2bcd45391 [INFO] testing markpasternak/terminal-weather against try#8da20828b6ea601dfd8e2448cb50ace88876bd78 for pr-150933 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmarkpasternak%2Fterminal-weather" "/workspace/builds/worker-1-tc2/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-1-tc2/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/markpasternak/terminal-weather [INFO] finished tweaking git repo https://github.com/markpasternak/terminal-weather [INFO] tweaked toml for git repo https://github.com/markpasternak/terminal-weather written to /workspace/builds/worker-1-tc2/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/markpasternak/terminal-weather on toolchain 8da20828b6ea601dfd8e2448cb50ace88876bd78 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+8da20828b6ea601dfd8e2448cb50ace88876bd78" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/markpasternak/terminal-weather 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" "+8da20828b6ea601dfd8e2448cb50ace88876bd78" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Blocking waiting for file lock on package cache [INFO] [stderr] Blocking waiting for file lock on package cache [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:cfa559dde23f44738f9990739aaa3487d8df3af37eb5df0572f7cf76004a604a" "/opt/rustwide/cargo-home/bin/cargo" "+8da20828b6ea601dfd8e2448cb50ace88876bd78" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 4b7323771b560cf6b36be4596e7726b220a33645d76276df320736c2274d03bc [INFO] running `Command { std: "docker" "start" "-a" "4b7323771b560cf6b36be4596e7726b220a33645d76276df320736c2274d03bc", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "4b7323771b560cf6b36be4596e7726b220a33645d76276df320736c2274d03bc", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "4b7323771b560cf6b36be4596e7726b220a33645d76276df320736c2274d03bc", kill_on_drop: false }` [INFO] [stdout] 4b7323771b560cf6b36be4596e7726b220a33645d76276df320736c2274d03bc [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:cfa559dde23f44738f9990739aaa3487d8df3af37eb5df0572f7cf76004a604a" "/opt/rustwide/cargo-home/bin/cargo" "+8da20828b6ea601dfd8e2448cb50ace88876bd78" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 07549b1a9729ef8cad3f3a63ebe1df6fc5ab8d9a371ccccbb45b626461508e9d [INFO] running `Command { std: "docker" "start" "-a" "07549b1a9729ef8cad3f3a63ebe1df6fc5ab8d9a371ccccbb45b626461508e9d", kill_on_drop: false }` [INFO] [stderr] Compiling quote v1.0.44 [INFO] [stderr] Compiling unicode-ident v1.0.23 [INFO] [stderr] Compiling libc v0.2.181 [INFO] [stderr] Compiling stable_deref_trait v1.2.1 [INFO] [stderr] Compiling smallvec v1.15.1 [INFO] [stderr] Compiling futures-sink v0.3.31 [INFO] [stderr] Compiling find-msvc-tools v0.1.9 [INFO] [stderr] Compiling memchr v2.8.0 [INFO] [stderr] Compiling writeable v0.6.2 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling litemap v0.8.1 [INFO] [stderr] Compiling futures-io v0.3.31 [INFO] [stderr] Compiling zeroize v1.8.2 [INFO] [stderr] Compiling icu_properties_data v2.1.2 [INFO] [stderr] Compiling icu_normalizer_data v2.1.1 [INFO] [stderr] Compiling http-body v1.0.1 [INFO] [stderr] Compiling futures-channel v0.3.31 [INFO] [stderr] Compiling unicode-width v0.2.0 [INFO] [stderr] Compiling proc-macro2 v1.0.106 [INFO] [stderr] Compiling compact_str v0.9.0 [INFO] [stderr] Compiling cc v1.2.55 [INFO] [stderr] Compiling zerocopy v0.8.39 [INFO] [stderr] Compiling getrandom v0.3.4 [INFO] [stderr] Compiling rustls-pki-types v1.14.0 [INFO] [stderr] Compiling rustls v0.23.36 [INFO] [stderr] Compiling deranged v0.5.6 [INFO] [stderr] Compiling time-core v0.1.8 [INFO] [stderr] Compiling num-conv v0.2.0 [INFO] [stderr] Compiling tracing v0.1.44 [INFO] [stderr] Compiling form_urlencoded v1.2.2 [INFO] [stderr] Compiling sync_wrapper v1.0.2 [INFO] [stderr] Compiling ipnet v2.11.0 [INFO] [stderr] Compiling unicode-truncate v2.0.1 [INFO] [stderr] Compiling anyhow v1.0.101 [INFO] [stderr] Compiling iri-string v0.7.10 [INFO] [stderr] Compiling clap_builder v4.5.58 [INFO] [stderr] Compiling http-body-util v0.1.3 [INFO] [stderr] Compiling chrono v0.4.43 [INFO] [stderr] Compiling nerd-font-symbols v0.3.0 [INFO] [stderr] Compiling syn v2.0.115 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling webpki-roots v1.0.6 [INFO] [stderr] Compiling ring v0.17.14 [INFO] [stderr] Compiling errno v0.3.14 [INFO] [stderr] Compiling mio v1.1.1 [INFO] [stderr] Compiling socket2 v0.6.2 [INFO] [stderr] Compiling getrandom v0.2.17 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Compiling signal-hook-registry v1.4.8 [INFO] [stderr] Compiling rand_core v0.9.5 [INFO] [stderr] Compiling signal-hook v0.3.18 [INFO] [stderr] Compiling parking_lot v0.12.5 [INFO] [stderr] Compiling signal-hook-mio v0.2.5 [INFO] [stderr] Compiling time v0.3.47 [INFO] [stderr] Compiling synstructure v0.13.2 [INFO] [stderr] Compiling darling_core v0.23.0 [INFO] [stderr] Compiling ppv-lite86 v0.2.21 [INFO] [stderr] Compiling rand_chacha v0.9.0 [INFO] [stderr] Compiling rand v0.9.2 [INFO] [stderr] Compiling zerofrom-derive v0.1.6 [INFO] [stderr] Compiling yoke-derive v0.8.1 [INFO] [stderr] Compiling zerovec-derive v0.11.2 [INFO] [stderr] Compiling displaydoc v0.2.5 [INFO] [stderr] Compiling futures-macro v0.3.31 [INFO] [stderr] Compiling tokio-macros v2.6.0 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling strum_macros v0.27.2 [INFO] [stderr] Compiling derive_more-impl v2.1.1 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling clap_derive v4.5.55 [INFO] [stderr] Compiling rustls-webpki v0.103.9 [INFO] [stderr] Compiling derive_more v2.1.1 [INFO] [stderr] Compiling crossterm v0.29.0 [INFO] [stderr] Compiling tokio v1.49.0 [INFO] [stderr] Compiling futures-util v0.3.31 [INFO] [stderr] Compiling zerofrom v0.1.6 [INFO] [stderr] Compiling yoke v0.8.1 [INFO] [stderr] Compiling darling_macro v0.23.0 [INFO] [stderr] Compiling zerovec v0.11.5 [INFO] [stderr] Compiling zerotrie v0.2.3 [INFO] [stderr] Compiling kasuari v0.4.11 [INFO] [stderr] Compiling darling v0.23.0 [INFO] [stderr] Compiling instability v0.3.11 [INFO] [stderr] Compiling tinystr v0.8.2 [INFO] [stderr] Compiling potential_utf v0.1.4 [INFO] [stderr] Compiling icu_collections v2.1.1 [INFO] [stderr] Compiling icu_locale_core v2.1.1 [INFO] [stderr] Compiling strum v0.27.2 [INFO] [stderr] Compiling ratatui-core v0.1.0 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling clap v4.5.58 [INFO] [stderr] Compiling serde_urlencoded v0.7.1 [INFO] [stderr] Compiling icu_provider v2.1.1 [INFO] [stderr] Compiling icu_normalizer v2.1.1 [INFO] [stderr] Compiling icu_properties v2.1.2 [INFO] [stderr] Compiling ratatui-widgets v0.3.0 [INFO] [stderr] Compiling ratatui-crossterm v0.1.0 [INFO] [stderr] Compiling hyper v1.8.1 [INFO] [stderr] Compiling tower v0.5.3 [INFO] [stderr] Compiling futures-executor v0.3.31 [INFO] [stderr] Compiling futures v0.3.31 [INFO] [stderr] Compiling ratatui-macros v0.7.0 [INFO] [stderr] Compiling tower-http v0.6.8 [INFO] [stderr] Compiling ratatui v0.30.0 [INFO] [stderr] Compiling idna_adapter v1.2.1 [INFO] [stderr] Compiling idna v1.1.0 [INFO] [stderr] Compiling url v2.5.8 [INFO] [stderr] Compiling hyper-util v0.1.20 [INFO] [stderr] Compiling tokio-rustls v0.26.4 [INFO] [stderr] Compiling hyper-rustls v0.27.7 [INFO] [stderr] Compiling reqwest v0.12.28 [INFO] [stderr] Compiling terminal-weather v0.8.0 (/opt/rustwide/workdir) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 02s [INFO] running `Command { std: "docker" "inspect" "07549b1a9729ef8cad3f3a63ebe1df6fc5ab8d9a371ccccbb45b626461508e9d", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "07549b1a9729ef8cad3f3a63ebe1df6fc5ab8d9a371ccccbb45b626461508e9d", kill_on_drop: false }` [INFO] [stdout] 07549b1a9729ef8cad3f3a63ebe1df6fc5ab8d9a371ccccbb45b626461508e9d [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:cfa559dde23f44738f9990739aaa3487d8df3af37eb5df0572f7cf76004a604a" "/opt/rustwide/cargo-home/bin/cargo" "+8da20828b6ea601dfd8e2448cb50ace88876bd78" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 2910f0a74e5b24d87345a67184050ea3089abe04bf2cda11fd5a8dc53fa28897 [INFO] running `Command { std: "docker" "start" "-a" "2910f0a74e5b24d87345a67184050ea3089abe04bf2cda11fd5a8dc53fa28897", kill_on_drop: false }` [INFO] [stderr] Compiling futures-channel v0.3.31 [INFO] [stderr] Compiling rustix v1.1.3 [INFO] [stderr] Compiling tokio-util v0.7.18 [INFO] [stderr] Compiling indexmap v2.13.0 [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Compiling getrandom v0.4.1 [INFO] [stderr] Compiling fastrand v2.3.0 [INFO] [stderr] Compiling regex-syntax v0.8.9 [INFO] [stderr] Compiling aho-corasick v1.1.4 [INFO] [stderr] Compiling num_cpus v1.17.0 [INFO] [stderr] Compiling wait-timeout v0.2.1 [INFO] [stderr] Compiling deadpool-runtime v0.1.4 [INFO] [stderr] Compiling quick-error v1.2.3 [INFO] [stderr] Compiling bit-vec v0.8.0 [INFO] [stderr] Compiling assert-json-diff v2.0.2 [INFO] [stderr] Compiling rand_xorshift v0.4.0 [INFO] [stderr] Compiling console v0.15.11 [INFO] [stderr] Compiling unarray v0.1.4 [INFO] [stderr] Compiling deadpool v0.12.3 [INFO] [stderr] Compiling bit-set v0.8.0 [INFO] [stderr] Compiling similar v2.7.0 [INFO] [stderr] Compiling futures-util v0.3.31 [INFO] [stderr] Compiling h2 v0.4.13 [INFO] [stderr] Compiling chrono v0.4.43 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling crossterm v0.29.0 [INFO] [stderr] Compiling tempfile v3.25.0 [INFO] [stderr] Compiling rusty-fork v0.3.1 [INFO] [stderr] Compiling insta v1.46.3 [INFO] [stderr] Compiling proptest v1.10.0 [INFO] [stderr] Compiling ratatui-crossterm v0.1.0 [INFO] [stderr] Compiling ratatui v0.30.0 [INFO] [stderr] Compiling hyper v1.8.1 [INFO] [stderr] Compiling tower v0.5.3 [INFO] [stderr] Compiling futures-executor v0.3.31 [INFO] [stderr] Compiling futures v0.3.31 [INFO] [stderr] Compiling hyper-util v0.1.20 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling tower-http v0.6.8 [INFO] [stderr] Compiling hyper-rustls v0.27.7 [INFO] [stderr] Compiling wiremock v0.6.5 [INFO] [stderr] Compiling reqwest v0.12.28 [INFO] [stderr] Compiling terminal-weather v0.8.0 (/opt/rustwide/workdir) [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 47.80s [INFO] running `Command { std: "docker" "inspect" "2910f0a74e5b24d87345a67184050ea3089abe04bf2cda11fd5a8dc53fa28897", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "2910f0a74e5b24d87345a67184050ea3089abe04bf2cda11fd5a8dc53fa28897", kill_on_drop: false }` [INFO] [stdout] 2910f0a74e5b24d87345a67184050ea3089abe04bf2cda11fd5a8dc53fa28897 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:cfa559dde23f44738f9990739aaa3487d8df3af37eb5df0572f7cf76004a604a" "/opt/rustwide/cargo-home/bin/cargo" "+8da20828b6ea601dfd8e2448cb50ace88876bd78" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] 531cf832156285f176aabfe436a9ebfb91e8fd5599b83c92047e04bf8d03b167 [INFO] running `Command { std: "docker" "start" "-a" "531cf832156285f176aabfe436a9ebfb91e8fd5599b83c92047e04bf8d03b167", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.46s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/terminal_weather-baf361f03e25f62f) [INFO] [stdout] [INFO] [stdout] running 539 tests [INFO] [stdout] test app::events::tests::demo_script_contains_expected_flow_markers ... ok [INFO] [stdout] test app::events::tests::demo_city_stops_are_stable ... ok [INFO] [stdout] test app::settings::tests::cli_mapping::from_cli_defaults_hardcoded_fields ... ok [INFO] [stdout] test app::settings::tests::cli_mapping::from_cli_defaults_basic_mapping ... ok [INFO] [stdout] test app::settings::tests::cli_mapping::from_cli_defaults_icon_mode_logic ... ok [INFO] [stdout] test app::settings::tests::cli_mapping::from_cli_defaults_ignores_animation_flags ... ok [INFO] [stdout] test app::settings::tests::cli_mapping::override_refresh_interval_non_default_updates ... ok [INFO] [stdout] test app::events::tests::push_city_demo_step_adds_open_and_switch_actions ... ok [INFO] [stdout] test app::settings::tests::cli_mapping::override_icon_mode_emoji_sets_emoji ... ok [INFO] [stdout] test app::settings::tests::cli_mapping::override_theme_non_auto_updates_settings ... ok [INFO] [stdout] test app::events::tests::start_frame_task_emits_tick_frame ... ok [INFO] [stdout] test app::events::tests::start_frame_task_clamps_fps_to_minimum ... ok [INFO] [stdout] test app::settings::tests::cli_mapping::test_hourly_view_from_cli ... ok [INFO] [stdout] test app::settings::tests::persistence::deserialize_settings_without_update_fields_defaults_to_none ... ok [INFO] [stdout] test app::settings::tests::persistence::load_runtime_settings_without_disk_returns_cli_defaults ... ok [INFO] [stdout] test app::settings::tests::recent_location::display_name_both_none_returns_name_only ... ok [INFO] [stdout] test app::settings::tests::persistence::hourly_view_from_cli_maps_all_variants ... ok [INFO] [stdout] test app::settings::tests::recent_location::display_name_admin_only_returns_name_only ... ok [INFO] [stdout] test app::settings::tests::recent_location::from_location_and_to_location_roundtrip_core_fields ... ok [INFO] [stdout] test app::settings::tests::recent_location::from_location_copies_all_fields ... ok [INFO] [stdout] test app::settings::tests::recent_location::same_place_both_missing_country_returns_true ... ok [INFO] [stdout] test app::settings::tests::recent_location::same_place_coordinates_within_tolerance_returns_true ... ok [INFO] [stdout] test app::settings::tests::recent_location::same_place_country_mismatch_returns_false ... ok [INFO] [stdout] test app::settings::tests::recent_location::same_place_handles_unicode_case ... ok [INFO] [stdout] test app::settings::tests::recent_location::same_place_identical_returns_true ... ok [INFO] [stdout] test app::settings::tests::recent_location::same_place_lat_not_close_returns_false ... ok [INFO] [stdout] test app::settings::tests::permissions::save_runtime_settings_creates_directory_with_strict_permissions ... ok [INFO] [stdout] test app::settings::tests::persistence::clear_runtime_settings_is_ok_for_existing_and_missing_file ... ok [INFO] [stdout] test app::settings::tests::persistence::clear_runtime_settings_returns_error_on_failure ... ok [INFO] [stdout] test app::settings::tests::persistence::load_runtime_settings_with_override_uses_custom_path ... ok [INFO] [stdout] test app::settings::tests::recent_location::same_place_lon_not_close_returns_false ... ok [INFO] [stdout] test app::settings::tests::recent_location::same_place_name_mismatch_returns_false ... ok [INFO] [stdout] test app::settings::tests::persistence::load_runtime_settings_with_invalid_json_uses_defaults ... ok [INFO] [stdout] test app::settings::tests::persistence::save_runtime_settings_fails_when_path_is_directory ... ok [INFO] [stdout] test app::settings::tests::recent_location::same_place_missing_country_handled_as_empty_string ... ok [INFO] [stdout] test app::settings::tests::persistence::save_runtime_settings_succeeds_with_valid_path ... ok [INFO] [stdout] test app::settings::tests::recent_location::recent_location_display_name_variants ... ok [INFO] [stdout] test app::settings::tests::recent_location::recent_location_to_location_preserves_fields ... ok [INFO] [stdout] test app::state::input::tests::command_char_returns_lowercase_for_plain_char ... ok [INFO] [stdout] test app::state::input::tests::command_char_returns_none_for_non_char_key ... ok [INFO] [stdout] test app::state::input::tests::command_char_returns_none_with_modifiers ... ok [INFO] [stdout] test app::state::input::tests::initial_selected_location_returns_none_when_no_recent ... ok [INFO] [stdout] test app::state::input::tests::is_city_char_accepts_valid_chars ... ok [INFO] [stdout] test app::state::input::tests::initial_selected_location_returns_none_when_demo ... ok [INFO] [stdout] test app::state::input::tests::is_city_char_rejects_special_chars ... ok [INFO] [stdout] test app::state::input::tests::settings_close_key_matches_esc_s_q ... ok [INFO] [stdout] test app::state::input::tests::initial_selected_location_returns_none_when_city_provided ... ok [INFO] [stdout] test app::settings::tests::persistence::load_runtime_settings_with_missing_file_uses_defaults ... ok [INFO] [stdout] test app::state::input::tests::initial_selected_location_returns_first_recent_when_no_flags ... ok [INFO] [stdout] test app::settings::tests::persistence::save_runtime_settings_fails_when_parent_is_file ... ok [INFO] [stdout] test app::state::methods_async::tests::command_bar_executes_view_command ... ok [INFO] [stdout] test app::settings::tests::permissions::save_runtime_settings_sets_strict_permissions ... ok [INFO] [stdout] test app::state::methods_async::tests::command_from_char_maps_known_commands ... ok [INFO] [stdout] test app::settings::tests::persistence::load_runtime_settings_with_explicit_override_path_reads_saved ... ok [INFO] [stdout] test app::settings::tests::persistence::runtime_settings_roundtrip_preserves_hourly_view ... ok [INFO] [stdout] test app::state::methods_async::tests::control_shortcuts_emit_expected_events ... ok [INFO] [stdout] test app::state::methods_async::tests::open_helpers_toggle_expected_modal_state ... ok [INFO] [stdout] test app::state::methods_async::tests::handle_char_command_cycles_hourly_view ... ok [INFO] [stdout] test app::state::methods_async::tests::global_main_key_handles_help_and_escape ... ok [INFO] [stdout] test app::state::methods_async::tests::panel_focus_keys_cycle_focus ... ok [INFO] [stdout] test app::state::methods_async::tests::hourly_navigation_moves_and_clamps_bounds ... ok [INFO] [stdout] test app::state::methods_async::tests::fetch_succeeded_resets_state_and_caches_bundle ... ok [INFO] [stdout] test app::state::methods_async::tests::sync_handlers_update_mode_and_flags ... ok [INFO] [stdout] test app::state::methods_async::tests::update_check_finished_updates_state_and_persists_metadata ... ok [INFO] [stdout] test app::state::methods_async::tests::parse_helpers_accept_known_values ... ok [INFO] [stdout] test app::state::methods_fetch::tests::demo_open_city_picker_sets_expected_ui_state ... ok [INFO] [stdout] test app::state::methods_async::tests::try_select_pending_location_requires_selecting_mode ... ok [INFO] [stdout] test app::state::methods_async::tests::update_check_scheduling_respects_cli_and_interval ... ok [INFO] [stdout] test app::state::methods_fetch::tests::demo_set_hero_visual_changes_only_when_needed ... ok [INFO] [stdout] test app::state::methods_async::tests::try_select_pending_location_consumes_selected_entry ... ok [INFO] [stdout] test app::state::methods_fetch::tests::apply_demo_action_handles_all_non_quit_variants ... ok [INFO] [stdout] test app::state::methods_fetch::tests::fetch_blocked_when_in_flight_or_selecting_location ... ok [INFO] [stdout] test app::state::methods_fetch::tests::demo_set_theme_changes_only_when_needed ... ok [INFO] [stdout] test app::state::methods_fetch::tests::start_fetch_auto_lookup_sets_detecting_loading_message ... ok [INFO] [stdout] test app::state::methods_fetch::tests::resolve_saved_location_keeps_named_location_without_reverse_lookup ... ok [INFO] [stdout] test app::state::methods_fetch::tests::build_forecast_client_honors_override_combinations ... ok [INFO] [stdout] test app::state::methods_fetch::tests::start_fetch_returns_early_when_blocked ... ok [INFO] [stdout] test app::state::methods_fetch::tests::handle_demo_action_quit_emits_quit_event ... ok [INFO] [stdout] test app::state::methods_fetch::tests::should_auto_lookup_only_without_city_or_lat ... ok [INFO] [stdout] test app::state::methods_fetch::tests::start_fetch_city_lookup_keeps_existing_loading_message ... ok [INFO] [stdout] test app::state::methods_ui::tests::push_city_query_char_accepts_valid_and_ignores_control_chars ... ok [INFO] [stdout] test app::state::methods_fetch::tests::try_fetch_existing_location_returns_true_with_selection ... ok [INFO] [stdout] test app::state::methods_ui::tests::ctrl_char_matches_case_insensitively_with_control_modifier ... ok [INFO] [stdout] test app::state::methods_ui::tests::handle_help_key_closes_overlay_and_emits_shortcuts ... ok [INFO] [stdout] test app::state::methods_fetch::tests::try_fetch_existing_location_returns_false_without_selection ... ok [INFO] [stdout] test app::state::methods_fetch::tests::resolve_saved_location_updates_coordinate_label_when_reverse_available ... ok [INFO] [stdout] test app::state::methods_fetch::tests::try_fetch_coords_falls_back_when_reverse_geocode_fails ... ok [INFO] [stdout] test app::state::methods_ui::tests::push_city_query_char_enforces_length_limit ... ok [INFO] [stdout] test app::state::methods_ui::tests::submit_city_picker_can_clear_history_without_search ... ok [INFO] [stdout] test app::state::methods_ui::tests::test_handle_vertical_nav_other_key ... ok [INFO] [stdout] test app::state::methods_ui::tests::switch_to_location_uses_cache_without_fetch_when_fresh ... ok [INFO] [stdout] test app::state::methods_ui::tests::test_handle_vertical_nav_movement_cases ... ok [INFO] [stdout] test app::state::methods_ui::tests::select_recent_city_keeps_picker_open_if_not_cached ... ok [INFO] [stdout] test app::state::methods_ui::tests::submit_city_picker_keeps_picker_open_during_search ... ok [INFO] [stdout] test app::state::methods_ui::tests::select_recent_city_by_index_switches_to_selected_location ... ok [INFO] [stdout] test app::state::settings::options::tests::theme_options_matches_theme_labels_order ... ok [INFO] [stdout] test app::state::methods_fetch::tests::try_fetch_coords_returns_false_without_complete_pair ... ok [INFO] [stdout] test app::state::settings::tests::cycle_wraps_in_both_directions ... ok [INFO] [stdout] test app::state::methods_ui::tests::push_recent_location_deduplicates_and_respects_history_limit ... ok [INFO] [stdout] test app::state::methods_fetch::tests::fetch_forecast_emits_failed_event_on_error ... ok [INFO] [stdout] test app::state::settings::tests::adjust_hourly_and_refresh_settings_update_runtime_values ... ok [INFO] [stdout] test app::state::settings::tests::adjust_setting_selection_cycles_major_editable_fields ... ok [INFO] [stdout] test app::state::settings::tests::adjust_setting_selection_handles_non_editable_and_flash ... ok [INFO] [stdout] test app::state::methods_ui::tests::city_picker_index_helpers_track_visible_rows ... ok [INFO] [stdout] test app::state::methods_ui::tests::clear_recent_locations_handles_empty_and_non_empty_states ... ok [INFO] [stdout] test app::state::settings::tests::settings_entries_include_actions_and_editable_rows ... ok [INFO] [stdout] test app::state::settings::tests::settings_hint_changes_for_hero_visual_selection ... ok [INFO] [stdout] test app::state::tests::apply_runtime_settings_updates_refresh_interval_runtime ... ok [INFO] [stdout] test app::state::methods_fetch::tests::try_fetch_coords_emits_selected_location_when_present ... ok [INFO] [stdout] test app::state::settings::tests::settings_selection_navigation_is_bounded ... ok [INFO] [stdout] test app::state::tests::city_input_accepts_unicode_letters ... ok [INFO] [stdout] test app::state::tests::adjust_setting_cycles_forward_and_backward ... ok [INFO] [stdout] test app::state::tests::city_input_rejects_control_chars ... ok [INFO] [stdout] test app::state::tests::initial_selected_location_uses_recent_when_no_cli_location ... ok [INFO] [stdout] test app::state::tests::initial_selected_location_respects_cli_city_override ... ok [INFO] [stdout] test app::state::tests::new_applies_cli_overrides_to_state ... ok [INFO] [stdout] test app::state::tests::new_initializes_with_correct_defaults ... ok [INFO] [stdout] test app::state::tests::settings_hint_explains_hero_visual ... ok [INFO] [stdout] test data::forecast::tests::parse_air_quality_prefers_us_index ... ok [INFO] [stdout] test cli::tests::validate_accepts_valid_coords ... ok [INFO] [stdout] test cli::tests::parses_hourly_view_override ... ok [INFO] [stdout] test cli::tests::validate_rejects_invalid_lat ... ok [INFO] [stdout] test cli::tests::rejects_color_and_no_color_together ... ok [INFO] [stdout] test cli::tests::parses_no_color_alias ... ok [INFO] [stdout] test data::forecast::tests::parse_air_quality_returns_none_when_missing ... ok [INFO] [stdout] test data::forecast::tests::resolve_api_urls_prefers_env_values ... ok [INFO] [stdout] test data::forecast::tests::resolve_api_urls_uses_defaults_when_env_missing ... ok [INFO] [stdout] test data::geocode::tests::ambiguity_detected_when_population_close ... ok [INFO] [stdout] test data::forecast::tests::with_urls_sets_both_endpoints ... ok [INFO] [stdout] test data::geocode::tests::infer_reverse_geocode_url_switches_search_suffix ... ok [INFO] [stdout] test cli::tests::parses_color_enum_values ... ok [INFO] [stdout] test data::geocode::tests::normalize_is_unicode_case_insensitive ... ok [INFO] [stdout] test cli::tests::validate_rejects_invalid_lon ... ok [INFO] [stdout] test data::forecast::tests::parse_hourly_skips_bad_timestamps ... ok [INFO] [stdout] test data::geocode::tests::resolve_rejects_huge_city_name ... ok [INFO] [stdout] test data::geocode::tests::resolve_rejects_huge_country_code ... ok [INFO] [stdout] test domain::alerts::tests::freezing_rain_alert_fires_for_code_56 ... ok [INFO] [stdout] test domain::alerts::tests::low_visibility_alert_fires_below_1000m ... ok [INFO] [stdout] test domain::alerts::tests::no_alerts_for_benign_conditions ... ok [INFO] [stdout] test cli::tests::effective_motion_mode_prefers_explicit_motion_flag ... ok [INFO] [stdout] test domain::alerts::tests::scan_alerts_orders_danger_before_warning ... ok [INFO] [stdout] test data::geocode::tests::ranking_prefers_exact_then_population ... ok [INFO] [stdout] test domain::alerts::tests::heavy_precip_alert_fires_when_total_above_25mm ... ok [INFO] [stdout] test domain::alerts::tests::wind_gust_warning_level_fires_between_50_and_79 ... ok [INFO] [stdout] test cli::tests::effective_color_mode_prefers_no_color ... ok [INFO] [stdout] test domain::alerts::tests::scan_alerts_handles_temperature_threshold_messages ... ok [INFO] [stdout] test domain::alerts::tests::uv_warning_fires_between_6_and_7 ... ok [INFO] [stdout] test data::geoip::tests::detect_location_rejects_invalid_coordinates ... ok [INFO] [stdout] test data::geocode::tests::resolve_sanitizes_inputs ... ok [INFO] [stdout] test data::geocode::tests::reverse_resolve_returns_first_location_when_present ... ok [INFO] [stdout] test data::geoip::tests::detect_location_accepts_valid_city ... ok [INFO] [stdout] test domain::weather::insights::tests::carry_umbrella_when_rain_imminent ... ok [INFO] [stdout] test domain::weather::insights::tests::confidence_degrades_under_stale_data ... ok [INFO] [stdout] test domain::weather::insights::tests::comfortable_action_for_clear_mild_weather ... ok [INFO] [stdout] test domain::weather::insights::tests::next_notable_change_returns_none_for_stable_clear ... ok [INFO] [stdout] test domain::weather::tests::aqi_tests::air_quality_display_value_falls_back_to_european ... ok [INFO] [stdout] test domain::weather::tests::aqi_tests::air_quality_display_value_uses_us_index_first ... ok [INFO] [stdout] test domain::weather::tests::aqi_tests::air_quality_reading_prefers_us_index_when_available ... ok [INFO] [stdout] test domain::weather::tests::aqi_tests::air_quality_reading_returns_none_when_both_indices_absent ... ok [INFO] [stdout] test domain::weather::insights::tests::reliability_line_contains_freshness_state ... ok [INFO] [stdout] test domain::weather::tests::aqi_tests::air_quality_categorizes_via_european_when_us_absent ... ok [INFO] [stdout] test domain::weather::insights::tests::winter_traction_when_snow_with_precip ... ok [INFO] [stdout] test domain::weather::insights::tests::layer_up_when_below_freezing ... ok [INFO] [stdout] test domain::weather::insights::tests::next_notable_change_detects_precip_start ... ok [INFO] [stdout] test domain::weather::tests::aqi_tests::european_aqi_categories_cover_full_range ... ok [INFO] [stdout] test domain::weather::tests::aqi_tests::us_aqi_categories_follow_epa_thresholds ... ok [INFO] [stdout] test domain::weather::tests::conversion_tests::convert_temp_to_celsius_returns_same_value ... ok [INFO] [stdout] test domain::weather::tests::conversion_tests::convert_temp_to_fahrenheit_calculates_correctly ... ok [INFO] [stdout] test domain::weather::tests::conversion_tests::wind_speed_conversion_rounding_covers_negative_and_fractional_values ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::clear_conditions_respect_day_night_for_labels_and_icons ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::daypart_aggregation_handles_all_none_fields ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::daypart_summary_aggregates_expected_fields ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::fahrenheit_conversion_rounding ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::freezing_drizzle_codes_have_labels ... ok [INFO] [stdout] test domain::weather::tests::aqi_tests::air_quality_category_label_covers_all_variants ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::location_display_name_name_only ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::daypart_bucket_boundaries_are_correct ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::high_low_calculation ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::forecast_bundle_current_helpers_return_correct_values ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::parse_date_success_and_failure ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::summarize_dayparts_returns_empty_for_empty_hourly ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::parse_datetime_success_and_failure ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::weather_icon_all_modes ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::weather_label_for_time_code_one_day_night ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::wind_speed_conversion_rounding ... ok [INFO] [stdout] test domain::weather::tests::insight_tests::derive_nowcast_insight_confidence_drops_to_low_when_offline ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::summarize_dayparts_returns_empty_for_zero_max_days ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::temp_rounding_handles_positive_and_negative_values ... ok [INFO] [stdout] test domain::weather::tests::insight_tests::derive_nowcast_insight_ignores_distant_light_precip_for_now_action ... ok [INFO] [stdout] test domain::weather::tests::insight_tests::derive_nowcast_insight_returns_rain_action_when_precip_signal_is_high ... ok [INFO] [stdout] test domain::weather::tests::insight_tests::derive_nowcast_insight_uses_rain_action_for_nonfreezing_thunder ... ok [INFO] [stdout] test domain::weather::tests::insight_tests::derive_nowcast_insight_uses_winter_action_for_snow_signal ... ok [INFO] [stdout] test domain::weather::tests::insight_tests::next_notable_change_prefers_precip_start_over_later_changes ... ok [INFO] [stdout] test domain::weather::tests::insight_tests::precip_window_has_precip_now_when_first_hour_has_precip ... ok [INFO] [stdout] test domain::weather::tests::insight_tests::summarize_precip_window_guard_cases ... ok [INFO] [stdout] test data::geoip::tests::detect_location_rejects_long_city ... ok [INFO] [stdout] test domain::weather::tests::insight_tests::summarize_precip_window_includes_12h_boundary ... ok [INFO] [stdout] test domain::weather::tests::refresh_tests::refresh_metadata_mark_success_clears_failure_state ... ok [INFO] [stdout] test domain::weather::tests::daypart_tests::weather_code_to_particle_all_categories ... ok [INFO] [stdout] test domain::weather::tests::refresh_tests::refresh_metadata_schedule_retry_sets_next_retry ... ok [INFO] [stdout] test domain::weather::tests::refresh_tests::retry_countdown_is_clamped_at_zero ... ok [INFO] [stdout] test resilience::backoff::tests::test_exponential_increase ... ok [INFO] [stdout] test resilience::backoff::tests::test_max_cap ... ok [INFO] [stdout] test resilience::backoff::tests::test_initial_state ... ok [INFO] [stdout] test resilience::backoff::tests::test_reset ... ok [INFO] [stdout] test tests::one_shot_icon_mode_ascii_takes_precedence ... ok [INFO] [stdout] test tests::one_shot_icon_mode_has_expected_precedence ... ok [INFO] [stdout] test tests::one_shot_units_maps_cli_arg ... ok [INFO] [stdout] test data::geoip::tests::detect_location_filters_long_fields ... ok [INFO] [stdout] test tests::print_helpers_execute_for_sample_bundle ... ok [INFO] [stdout] test tests::handle_input_event_updates_viewport_on_resize_and_accepts_none ... ok [INFO] [stdout] test resilience::backoff::tests::test_mixed_flow ... ok [INFO] [stdout] test ui::narrative::tests::truncate_with_ellipsis_applies_marker ... ok [INFO] [stdout] test ui::animation::tests::weather_motion_profile_uses_visibility_and_cloud_thresholds ... ok [INFO] [stdout] test tests::resolve_one_shot_location_uses_geocoder_selection ... ok [INFO] [stdout] test tests::run_errors_without_tty_in_interactive_mode ... ok [INFO] [stdout] test tests::resolve_one_shot_location_disambiguation_picks_first ... ok [INFO] [stdout] test tests::resolve_one_shot_location_errors_on_not_found ... ok [INFO] [stdout] test tests::resolve_one_shot_location_uses_reverse_geocode_for_coordinates ... ok [INFO] [stdout] test tests::setup_terminal_errors_when_stdout_is_not_a_tty ... ok [INFO] [stdout] test ui::animation::tests::animation_clock_advances_elapsed_and_frame_index ... ok [INFO] [stdout] test ui::animation::tests::motion_mode_legacy_flags_map_as_expected ... ok [INFO] [stdout] test ui::animation::tests::seeded_motion_is_stable ... ok [INFO] [stdout] test ui::narrative::tests::truncate_with_ellipsis_handles_tiny_width ... ok [INFO] [stdout] test ui::particles::tests::particle_engine_clears_when_motion_mode_is_off ... ok [INFO] [stdout] test ui::particles::tests::reduced_motion_uses_lower_density_than_cinematic ... ok [INFO] [stdout] test ui::particles::tests::particle_engine_spawns_particles_for_rain_profile ... ok [INFO] [stdout] test tests::resolve_one_shot_location_falls_back_to_raw_coordinates_on_reverse_failure ... ok [INFO] [stdout] test ui::narrative::tests::truncate_with_ellipsis_short_input_unchanged ... ok [INFO] [stdout] test ui::animation::tests::transition_progress_uses_easing ... ok [INFO] [stdout] test ui::particles::tests::thunder_flash_respects_motion_mode ... ok [INFO] [stdout] test ui::theme::tests::basic16_light_themes_keep_expected_semantic_polarity ... ok [INFO] [stdout] test ui::theme::tests::detect_color_capability_respects_mode_and_env_overrides ... ok [INFO] [stdout] test ui::tests::footer_text_includes_update_hint_for_wide_layout ... ok [INFO] [stdout] test ui::tests::footer_text_omits_update_hint_for_narrow_layout ... ok [INFO] [stdout] test ui::tests::update_hint_for_width_shows_only_when_update_available ... ok [INFO] [stdout] test ui::theme::tests::all_themes_have_readable_contrast ... ok [INFO] [stdout] test ui::theme::tests::auto_basic16_clear_day_and_night_are_distinct ... ok [INFO] [stdout] test ui::symbols::tests::symbols_have_ascii_parity ... ok [INFO] [stdout] test ui::theme::tests::auto_basic16_gradient_matches_category_map ... ok [INFO] [stdout] test ui::theme::tests::auto_theme_seed_matrix_is_complete_and_unique ... ok [INFO] [stdout] test ui::theme::tests::basic16_explicit_themes_are_distinct ... ok [INFO] [stdout] test ui::theme::tests::quantize_basic16_covers_achromatic_and_hue_paths ... ok [INFO] [stdout] test ui::theme::tests::quantize_truecolor_passes_through ... ok [INFO] [stdout] test ui::widgets::alerts::tests::alert_color_danger ... ok [INFO] [stdout] test ui::widgets::alerts::tests::alert_color_warning ... ok [INFO] [stdout] test ui::widgets::alerts::tests::alert_row_height_one_for_non_empty ... ok [INFO] [stdout] test ui::theme::tests::light_themes_keep_semantic_tokens_legible ... ok [INFO] [stdout] test ui::widgets::alerts::tests::format_alert_entry_uses_now_for_zero_eta ... ok [INFO] [stdout] test ui::theme::tests::temp_color_covers_all_five_bands ... ok [INFO] [stdout] test ui::widgets::alerts::tests::push_alert_span_returns_false_on_width_overflow ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::city_status_kind_detects_failure ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::format_recent_location_includes_all_fields ... ok [INFO] [stdout] test ui::widgets::alerts::tests::alert_row_height_zero_for_empty ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::format_recent_location_with_marker_when_selected ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::format_recent_location_without_timezone_shows_placeholder ... ok [INFO] [stdout] test ui::widgets::alerts::tests::push_alert_span_returns_true_when_fits ... ok [INFO] [stdout] test ui::widgets::alerts::tests::format_alert_entry_uses_decision_why_details_order ... ok [INFO] [stdout] test ui::widgets::alerts::tests::alert_color_info ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::is_selected_location_returns_false_when_no_selected ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::is_selected_location_returns_true_when_match ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::recent_city_items_empty_returns_empty_vec ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::recent_city_items_non_empty_includes_clear_option ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::render_status_line_uses_custom_status_when_present ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::selected_recent_index_zero_for_empty_items ... ok [INFO] [stdout] test ui::widgets::daily::layout::tests::for_area_selects_expected_layout_breakpoints ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::average_duration_computes_correctly ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::average_duration_returns_placeholder_for_zero_count ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::average_precip_hours_returns_placeholder_for_zero_count ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::average_precip_hours_formats_correctly ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::format_day_value_mm_none_returns_placeholder ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::format_day_value_mps_none_returns_placeholder ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::format_day_value_mm_some_formats_correctly ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::recent_city_list_empty_items_shows_no_recent_message ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::recent_city_list_non_empty_items ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::week_thermal_span_celsius_range ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::week_thermal_span_missing_data_returns_placeholder ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::profiles::append_compact_profiles_covers_return_and_skip_paths ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::profiles::append_profile_line_renders_and_consumes_row_when_values_present ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::selected_recent_index_clamps_to_items_count ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::format_uv_peak_none_returns_placeholder ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::week_thermal_span_fahrenheit ... ok [INFO] [stdout] test ui::widgets::daily::layout::tests::max_rows_respects_header_and_seven_day_cap ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::formatting::format_day_value_mps_some_formats_in_mps ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::profiles::append_profile_line_returns_when_values_empty ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::profiles::summarize_week_null_precipitation_skipped ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::profiles::append_profile_line_returns_when_no_rows_left ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::rendering::render_week_summary_returns_early_on_narrow_width ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::first_day_shifted_time_applies_offset ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::rendering::render_week_summary_returns_early_on_zero_height ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::day_cue_combines_precip_gust_and_sun ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::first_day_shifted_time_placeholder_when_no_value ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::profiles::append_week_profiles_covers_guard_and_render_paths ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::format_duration_hm_negative_clamps_to_zero ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::format_duration_hm_zero_is_double_zero ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::profiles::summarize_week_empty_daily_returns_defaults ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::first_day_time_returns_formatted_time ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::day_cue_dry_calm_returns_mostly_dry ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::first_day_time_returns_placeholder_when_no_daily ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::profiles::summarize_week_aggregates_single_day ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::gust_cue_breezy_threshold ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::format_duration_hm_rounds_to_minutes ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::gust_cue_gusty_threshold ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::precipitation_cue_heavy_rain ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::precipitation_cue_light_precip_when_type_not_identified ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::precipitation_cue_snow_takes_priority ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::gust_cue_none_below_threshold ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::precipitation_cue_dry ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::sunlight_cue_none_for_mid_range ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::precipitation_cue_light_rain ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::profile_bar_returns_correct_width ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::sunlight_cue_dim ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::profile_bar_empty_returns_empty ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::sunlight_cue_bright ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::sunlight_cue_none_when_data_missing ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::sunlight_cue_none_when_daylight_is_zero ... ok [INFO] [stdout] test ui::widgets::daily::tests::daily_layout_changes_by_width ... ok [INFO] [stdout] test ui::widgets::daily::summary::utils::tests::precipitation_cue_light_snow_when_rain_is_zero ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::render_sets_cursor_position_when_query_active ... ok [INFO] [stdout] test ui::widgets::daily::tests::summarize_week_aggregates_three_day_dataset ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::color_to_rgb_black ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::color_to_rgb_rgb_variant ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::gradient_ratio_height_one_returns_zero ... ok [INFO] [stdout] test ui::widgets::daily::tests::range_bounds_are_clamped ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::lerp_color_interpolates_correctly ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::color_to_rgb_dark_gray ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::color_to_rgb_gray ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::lerp_color_clamps_above_255 ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::color_to_rgb_catch_all ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::particle_position_clamped_to_bounds ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::particle_position_in_bounds_returns_some ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::lerp_color_negative_t_goes_opposite_direction ... ok [INFO] [stdout] test ui::widgets::hero::landmark_panel::tests::loading_scene_height_2_or_more_has_center_message ... ok [INFO] [stdout] test ui::widgets::hero::landmark_panel::tests::colorize_scene_line_produces_output ... ok [INFO] [stdout] test ui::widgets::hero::landmark_panel::tests::scene_char_color_gauge_matches_various_chars ... ok [INFO] [stdout] test ui::widgets::hero::landmark_panel::tests::scene_char_color_atmos_matches_various_chars ... ok [INFO] [stdout] test ui::widgets::hero::landmark_panel::tests::colorize_scene_line_single_color_no_transition ... ok [INFO] [stdout] test ui::widgets::hero::landmark_panel::tests::scene_char_color_sky_matches_various_chars ... ok [INFO] [stdout] test ui::widgets::hero::weather::loading::tests::indeterminate_bar_contains_highlight_blocks ... ok [INFO] [stdout] test ui::widgets::hero::weather::loading::tests::loading_lane_uses_lane_specific_texture ... ok [INFO] [stdout] test ui::widgets::hero::weather::loading::tests::indeterminate_bar_returns_empty_for_zero_width ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::rendering::render_week_summary_returns_early_on_empty_daily ... ok [INFO] [stdout] test ui::widgets::hero::landmark_panel::tests::tint_color_neutral ... ok [INFO] [stdout] test ui::widgets::hero::weather::loading::tests::loading_spinner_changes_with_motion_mode ... ok [INFO] [stdout] test ui::widgets::hero::weather::loading::tests::loading_stage_index_cycles_over_time ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::color_to_rgb_white ... ok [INFO] [stdout] test ui::widgets::hero::background::tests::gradient_ratio_normal_height_computes_correctly ... ok [INFO] [stdout] test ui::widgets::hero::landmark_panel::tests::tint_color_warm ... ok [INFO] [stdout] test ui::widgets::hero::landmark_panel::tests::loading_scene_height_below_2_no_center_message ... ok [INFO] [stdout] test ui::widgets::hero::weather::metric_lines::tests::push_metric_lines_compact_produces_four_rows ... ok [INFO] [stdout] test ui::widgets::hero::weather::metrics::tests::cloud_layers_with_data_returns_some ... ok [INFO] [stdout] test ui::widgets::hero::weather::metrics::tests::pressure_trend_marker_returns_correct_arrows ... ok [INFO] [stdout] test ui::widgets::hero::weather::metrics::tests::compass_maps_all_eight_directions ... ok [INFO] [stdout] test ui::widgets::hero::landmark_panel::tests::tint_color_cool ... ok [INFO] [stdout] test ui::widgets::hero::weather::tests::compass_rounds_directions ... ok [INFO] [stdout] test ui::widgets::hero::weather::metrics::tests::format_cloud_layers_formats_correctly ... ok [INFO] [stdout] test ui::widgets::hero::weather::metrics::tests::format_visibility_handles_edge_cases ... ok [INFO] [stdout] test ui::widgets::hero::weather::metric_lines::tests::push_metric_lines_standard_produces_five_rows ... ok [INFO] [stdout] test ui::widgets::hero::weather::metrics::tests::cloud_layers_all_none_returns_none ... ok [INFO] [stdout] test ui::widgets::hero::weather::tests::last_updated_label_without_success_uses_placeholder ... ok [INFO] [stdout] test ui::widgets::hero::weather::tests::fetch_context_line_is_suppressed_when_fresh ... ok [INFO] [stdout] test ui::widgets::daily::summary::tests::rendering::render_week_summary_hits_meta_and_sunrise_layout_paths ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::tests::expanded_fetch_context_truncates_long_multiline_errors ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::tests::expanded_fetch_context_is_suppressed_when_fresh ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::tests::last_updated_label_without_success_uses_placeholder ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::tests::next_precip_summary_covers_now_in_nh_and_none ... ok [INFO] [stdout] test ui::widgets::hero::weather::tests::format_visibility_formats_km ... ok [INFO] [stdout] test ui::widgets::hero::weather::tests::last_updated_label_includes_timezone ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::trends::tests::next_precip_summary_returns_none_message_for_empty ... ok [INFO] [stdout] test ui::widgets::hero::weather::tests::freshness_flag_warns_on_stale ... ok [INFO] [stdout] test ui::widgets::hero::weather::tests::fetch_context_line_shows_retry_when_available ... ok [INFO] [stdout] test ui::widgets::hero::weather::tests::fetch_context_line_truncates_long_multiline_errors ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::trends::tests::peak_gust_summary_formats_max_gust ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::trends::tests::peak_gust_summary_returns_placeholder_when_no_gusts ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::tests::next_precip_summary_includes_12h_boundary ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::tests::pressure_span_summary_handles_empty_and_non_empty ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::tests::last_updated_label_includes_age_and_timezone ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::trends::tests::pressure_span_summary_returns_placeholder_for_empty ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::trends::tests::sparkline_empty_values_returns_dots ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::trends::tests::pressure_span_summary_formats_range ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::trends::tests::sparkline_with_data_produces_correct_length ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::trends::tests::sparkline_zero_width_returns_empty ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::render_uses_muted_style_for_empty_query_placeholder ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::can_render_daypart_cards_enforces_minimum_size ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::collect_parts_for_date_keeps_daypart_order ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::build_daypart_rows_respects_optional_sections ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::daypart_advisory_covers_all_outcomes ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::daypart_visibility_correct_for_all_height_bands ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::frozen_precip_code_detection_covers_snow_and_ice ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::trends::tests::value_span_empty_returns_none ... ok [INFO] [stdout] test ui::widgets::hero::weather_expanded::trends::tests::value_span_single_returns_same_min_max ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::render_daypart_cards_returns_false_for_small_area ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::temp_range_formats_all_option_shapes ... ok [INFO] [stdout] test ui::widgets::hourly::table::tests::format_window_details_strips_existing_prefix ... ok [INFO] [stdout] test ui::widgets::hourly::table::tests::strip_action_prefix_removes_now_action_label ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::render_daypart_cards_returns_false_when_no_dates ... ok [INFO] [stdout] test ui::widgets::hourly::tests::chart_mode_requires_height_8 ... ok [INFO] [stdout] test ui::widgets::hourly::tests::chart_mode_requires_more_height_than_hybrid ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::truncate_handles_short_and_long_values ... ok [INFO] [stdout] test ui::widgets::hourly::table::tests::format_decision_line_orders_sections_consistently ... ok [INFO] [stdout] test ui::widgets::hourly::tests::date_row_inserts_for_day_change_or_offset ... ok [INFO] [stdout] test ui::widgets::hourly::tests::height_below_5_forces_table ... ok [INFO] [stdout] test ui::widgets::hourly::tests::hourly_panel_title_multi_day ... ok [INFO] [stdout] test ui::widgets::hourly::tests::hourly_panel_title_empty_slice_includes_focus_prefix ... ok [INFO] [stdout] test ui::widgets::hourly::tests::hourly_panel_title_same_day ... ok [INFO] [stdout] test ui::widgets::hourly::tests::hourly_slice_clamps_offset_and_matches_visible_count ... ok [INFO] [stdout] test ui::widgets::hourly::tests::hybrid_mode_requires_height_6 ... ok [INFO] [stdout] test ui::widgets::hourly::tests::optional_metric_rows_keep_height_thresholds ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::render_daypart_section_returns_true_when_some_parts_missing ... ok [INFO] [stdout] test ui::widgets::hourly::tests::width_below_70_forces_table ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::average_and_sample_helpers_handle_small_inputs ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::range_labels_and_time_axis_handle_empty_inputs ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::render_chart_metrics_short_circuits_on_zero_dimensions ... ok [INFO] [stdout] test ui::tests::render_sets_cursor_in_command_bar ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::render_temp_precip_timeline_short_circuits_on_tiny_areas ... ok [INFO] [stdout] test ui::widgets::hourly::tests::compact_chart_context_line_is_shorter_and_removes_now_action_prefix ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::time_axis_label_clips_at_right_edge ... ok [INFO] [stdout] test ui::widgets::hourly::tests::sanitize_precip_non_negative ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::sparkline_and_barline_handle_empty_inputs ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::time_axis_labels_are_not_repeated_per_column ... ok [INFO] [stdout] test ui::widgets::hourly::tests::daypart_visibility_thresholds_match_layout_contract ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::capped_precip_barline_uses_absolute_intensity_scale ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::time_axis_handles_dense_sampling_and_day_change_labels ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::timeline_line_falls_back_to_range_when_chart_has_no_room ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::timeline_lines_omit_time_axis_for_two_rows ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::time_axis_marks_day_boundaries ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::hud::tests::atmos_context_ignores_precip_beyond_12h_window ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::hud::tests::atmos_context_reports_precip_within_12h_window ... ok [INFO] [stdout] test ui::widgets::hourly::timeline::tests::expanded_timeline_uses_vertical_space_and_right_scales ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::celestial_tests::moon_visible_uses_sun_window ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::celestial_tests::paint_starfield_small_canvas_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::celestial_tests::place_celestial_body_night_renders_when_moon_visible ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::celestial_tests::place_celestial_body_small_canvas_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::celestial_tests::paint_starfield_normal_canvas_writes_stars ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::celestial_tests::place_celestial_body_night_skips_when_moon_not_visible ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::celestial_tests::paint_starfield_overcast_skips_stars ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::celestial_tests::place_celestial_body_normal_canvas_writes_symbol ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::cloud_tests::paint_cloud_layer_high_coverage_covers_more_of_canvas ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::cloud_tests::paint_cloud_layer_small_horizon_no_op ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::cloud_tests::paint_cloud_layer_very_high_coverage_exercises_70_branch ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::ambient_sky_life_deterministic_for_same_inputs ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::cloud_tests::paint_cloud_layer_low_cloud_pct_no_op ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::cloud_tests::paint_cloud_layer_medium_coverage_exercises_50_branch ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::ambient_sky_life_not_rendered_at_night ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::ambient_sky_life_not_rendered_outside_clear_sky ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::ambient_sky_life_renders_when_clear_day_and_phase_nonzero ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_fog_banks_zero_width_no_panic ... ok [INFO] [stdout] test ui::widgets::hourly::daypart::tests::render_daypart_cards_returns_false_when_sections_too_short ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_hail_writes_hailstone_chars ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_hail_zero_width_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_heat_shimmer_shallow_horizon_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_fog_banks_writes_fog_chars ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_ice_glaze_horizon_out_of_bounds_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_heat_shimmer_writes_shimmer_chars ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_ice_glaze_writes_ice_chars ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_lightning_bolts_no_flash_when_phase_not_aligned ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_lightning_bolts_writes_bolt_chars_when_visible ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_rain_zero_width_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_rain_heavy_denser_than_light ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_snowfall_writes_flake_chars ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_rain_zero_horizon_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_snowfall_zero_width_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::scene_tests::overlay_horizon_line_marks_terrain_above_horizon ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::effects_tests::paint_rain_light_writes_rain_chars ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::scene_tests::overlay_horizon_line_no_panic_when_horizon_beyond_height ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::scene_tests::paint_horizon_haze_with_zero_haze_y_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::scene_tests::paint_horizon_haze_writes_dots_at_normal_horizon ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::scene_tests::scene_for_weather_compact_for_small_area ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::scene_tests::scene_for_weather_few_hourly_samples_falls_back_to_compact ... ok [INFO] [stdout] test ui::widgets::hourly::tests::render_handles_loading_and_empty_hourly_states ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::scene_tests::scene_for_weather_freezing_rain_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::gauge::tests::collect_gauge_data_and_tracks_use_bundle_content ... ok [INFO] [stdout] test ui::widgets::landmark::gauge::tests::gauge_context_line_prioritizes_rules_in_order ... ok [INFO] [stdout] test ui::widgets::landmark::gauge::tests::gauge_sun_times_default_and_explicit ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::scene_tests::scene_for_weather_night_vs_day_produces_different_output ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::scene_tests::scene_for_weather_hail_code_no_panic ... ok [INFO] [stdout] test ui::widgets::landmark::gauge::tests::left_column_width_changes_at_breakpoints ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::canvas_to_lines_produces_correct_rows ... ok [INFO] [stdout] test ui::widgets::landmark::gauge::tests::meter_and_range_helpers_cover_edge_cases ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::compass_arrow_wraps_360 ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::compass_short_returns_cardinal_labels ... ok [INFO] [stdout] test ui::widgets::landmark::gauge::tests::scene_for_gauge_cluster_renders_context_and_lines ... ok [INFO] [stdout] test ui::widgets::landmark::gauge::tests::gauge_context_line_uses_secondary_conditions ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::compass_arrow_covers_all_eight_directions ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::fit_line_exact_length_unchanged ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::fit_line_pads_short_line ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::fit_lines_centered_centers_vertically ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::fit_lines_pads_to_target_height ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::fit_lines_centered_full_height_no_padding ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::fit_lines_truncates_excess_rows ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::paint_char_force_overwrites_any_cell ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::paint_char_does_not_overwrite_non_space_without_force ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::fit_line_truncates_long_line ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::paint_char_writes_to_valid_cell ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::paint_char_ignores_out_of_bounds ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::center_symbol_returns_correct_glyph ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::arc_glyph_returns_dash_at_top_and_corners ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::format_time_hm_rounds_minutes_correctly ... ok [INFO] [stdout] test ui::widgets::landmark::atmos::tests::scene_tests::scene_for_weather_renders_all_weather_categories ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::moon_phase_returns_a_valid_moon_symbol ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::precip_symbol_covers_all_thresholds ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::scene_for_sky_observatory_compact_for_tiny_area ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::sky_context_line_day_with_remaining_daylight ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::sky_context_line_day_sunset_passing ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::sky_context_line_night_after_sunset ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::scene_for_sky_observatory_full_for_normal_area ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::sky_context_line_night_before_sunrise ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::symbol_for_code_maps_all_categories ... ok [INFO] [stdout] test ui::widgets::landmark::sky::tests::symbol_for_unknown_code_returns_question_mark ... ok [INFO] [stdout] test ui::widgets::selector::tests::selector_entry_includes_timezone_and_coordinates ... ok [INFO] [stdout] test ui::widgets::selector::tests::selector_state_line_ambiguous_when_candidates_present ... ok [INFO] [stdout] test ui::widgets::settings::tests::hint_style_is_warning_when_contains_save_settings ... ok [INFO] [stdout] test ui::widgets::settings::tests::hint_text_shows_settings_hint_when_no_error ... ok [INFO] [stdout] test ui::widgets::settings::tests::hint_text_shows_settings_hint_for_non_save_error ... ok [INFO] [stdout] test ui::widgets::settings::tests::settings_items_produces_editable_format ... ok [INFO] [stdout] test ui::widgets::settings::tests::hint_style_is_muted_when_no_save_settings ... ok [INFO] [stdout] test ui::widgets::settings::tests::hint_text_shows_error_when_contains_save_settings ... ok [INFO] [stdout] test ui::widgets::shared::tests::sparkline_blocks_rising_values_end_with_full_bar ... ok [INFO] [stdout] test ui::widgets::shared::tests::sparkline_blocks_uniform_values_returns_mid_bar ... ok [INFO] [stdout] test ui::widgets::shared::tests::sparkline_blocks_zero_width_returns_empty ... ok [INFO] [stdout] test ui::widgets::settings::tests::settings_items_function_returns_items ... ok [INFO] [stdout] test ui::widgets::settings::tests::settings_items_produces_non_editable_format_for_actions ... ok [INFO] [stdout] test ui::widgets::shared::tests::sparkline_blocks_empty_values_returns_empty ... ok [INFO] [stdout] test update::tests::parse_formula_version_extracts_standard_line ... ok [INFO] [stdout] test ui::widgets::landmark::shared::tests::paint_char_ignores_negative_coords ... ok [INFO] [stdout] test update::tests::parse_formula_version_handles_spacing ... ok [INFO] [stdout] test update::tests::should_check_respects_interval_and_future_timestamps ... ok [INFO] [stdout] test update::tests::parse_formula_version_returns_none_without_version ... ok [INFO] [stdout] test update::tests::disable_update_check_value_parses_bool_like_strings ... ok [INFO] [stdout] test update::tests::is_newer_version_compares_semver_like_values ... ok [INFO] [stdout] test update::tests::check_latest_version_rejects_large_response ... ok [INFO] [stdout] test update::tests::check_for_update_with_url_returns_unknown_on_error ... ok [INFO] [stdout] test update::tests::check_for_update_with_url_detects_update ... ok [INFO] [stdout] test ui::widgets::settings::tests::render_handles_settings_popup_with_and_without_save_errors ... ok [INFO] [stdout] test ui::widgets::hourly::tests::render_exercises_hybrid_and_chart_modes ... ok [INFO] [stdout] test ui::widgets::city_picker::tests::format_recent_location_second_entry_has_index_two ... ok [INFO] [stdout] test app::state::methods_ui::tests::handle_city_picker_nav_key_handles_up_down_esc_and_enter ... ok [INFO] [stdout] test ui::widgets::hourly::tests::render_mode_helpers_cover_size_branches ... ok [INFO] [stdout] test app::events::tests::schedule_retry_sends_tick_refresh ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 539 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.00s [INFO] [stdout] [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/debug/deps/terminal_weather-dc39bf77e80b676c) [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] [stderr] Running tests/caching.rs (/opt/rustwide/target/debug/deps/caching-7dd8e6c45f242241) [INFO] [stdout] [INFO] [stdout] running 1 test [INFO] [stdout] test caching_reduces_network_calls ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stderr] Running tests/flows.rs (/opt/rustwide/target/debug/deps/flows-2bc76ae5823eba29) [INFO] [stdout] [INFO] [stdout] running 16 tests [INFO] [stdout] test flow_cli_hourly_view_override_applies_at_runtime ... ok [INFO] [stdout] test flow_settings_hourly_view_updates_runtime_mode ... ok [INFO] [stdout] test flow_hourly_scroll_clamps_bounds ... ok [INFO] [stdout] test flow_tab_cycles_panel_focus ... ok [INFO] [stdout] test flow_refresh_interval_setting_updates_runtime_value_immediately ... ok [INFO] [stdout] test flow_help_shortcut_ignored_while_city_picker_typing ... ok [INFO] [stdout] test flow_question_mark_opens_help_overlay ... ok [INFO] [stdout] test flow_f1_toggles_help_overlay ... ok [INFO] [stdout] test flow_esc_closes_help_before_quit ... ok [INFO] [stdout] test flow_city_picker_keeps_dialog_open_while_typing_l ... ok [INFO] [stdout] test flow_command_bar_captures_keys_without_opening_modals ... ok [INFO] [stdout] test flow_ctrl_c_quits_without_toggling_units ... ok [INFO] [stdout] test flow_unit_toggle_changes_display_units ... ok [INFO] [stdout] test flow_ctrl_l_requests_force_redraw ... ok [INFO] [stdout] test flow_colon_opens_command_bar_and_executes_quit ... ok [INFO] [stdout] test flow_v_cycles_hourly_view_and_wraps ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stderr] Running tests/freshness_integration.rs (/opt/rustwide/target/debug/deps/freshness_integration-ff10db55720a6775) [INFO] [stdout] [INFO] [stdout] running 4 tests [INFO] [stderr] Running tests/geocode_ambiguity.rs (/opt/rustwide/target/debug/deps/geocode_ambiguity-467240669190a18b) [INFO] [stdout] test freshness_none_last_success_with_few_failures_is_stale ... ok [INFO] [stdout] test backoff_progression_and_cap ... ok [INFO] [stdout] test freshness_none_last_success_with_many_failures_is_offline ... ok [INFO] [stdout] test freshness_transitions_and_recovery ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 1 test [INFO] [stdout] test ambiguous_candidates_trigger_selector_resolution ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/property_range_bar.rs (/opt/rustwide/target/debug/deps/property_range_bar-5b4b10cd46f044fa) [INFO] [stdout] [INFO] [stdout] running 1 test [INFO] [stdout] test bar_bounds_never_overflow ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stderr] Running tests/render_snapshots.rs (/opt/rustwide/target/debug/deps/render_snapshots-8c2713e6fb134509) [INFO] [stdout] [INFO] [stdout] running 26 tests [INFO] [stdout] test cli_shape_contract_for_snapshot_tests ... ok [INFO] [stdout] test fixture_bundle_shape_contract ... ok [INFO] [stdout] test below_minimum_terminal_shows_resize_guidance ... ok [INFO] [stdout] test snapshot_19x9_tiny_fallback ... ok [INFO] [stdout] test snapshot_40x15_fog ... ok [INFO] [stdout] test snapshot_100x30_help_overlay ... ok [INFO] [stdout] test snapshot_60x20_snow ... ok [INFO] [stdout] test narrow_layout_forces_table_for_chart_mode ... ok [INFO] [stdout] test snapshot_100x30_chart ... ok [INFO] [stdout] test snapshot_60x20_hybrid ... ok [INFO] [stdout] test snapshot_60x20_chart ... ok [INFO] [stdout] test narrow_layout_forces_table_for_hybrid_mode ... ok [INFO] [stdout] test snapshot_120x40_hybrid ... ok [INFO] [stdout] test snapshot_120x40_chart ... ok [INFO] [stdout] test snapshot_100x30_hybrid ... ok [INFO] [stdout] test snapshot_80x24_syncing_badge ... ok [INFO] [stdout] test small_terminal_still_renders_main_ui ... ok [INFO] [stdout] test snapshot_80x24_hybrid ... ok [INFO] [stdout] test snapshot_80x24_thunder ... ok [INFO] [stdout] test snapshot_120x40_clear ... ok [INFO] [stdout] test snapshot_80x24_chart ... ok [INFO] [stdout] test regular_layout_renders_footer_shortcuts ... ok [INFO] [stdout] test snapshot_80x24_rain_with_aqi ... ok [INFO] [stdout] test snapshot_80x24_stale_retry_badge ... ok [INFO] [stdout] test snapshot_80x24_rain ... ok [INFO] [stdout] test snapshot_80x24_offline_badge ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 26 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.49s [INFO] [stdout] [INFO] [stderr] Doc-tests terminal_weather [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" "531cf832156285f176aabfe436a9ebfb91e8fd5599b83c92047e04bf8d03b167", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "531cf832156285f176aabfe436a9ebfb91e8fd5599b83c92047e04bf8d03b167", kill_on_drop: false }` [INFO] [stdout] 531cf832156285f176aabfe436a9ebfb91e8fd5599b83c92047e04bf8d03b167