[INFO] cloning repository https://github.com/Esgrove/cli-tools [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/Esgrove/cli-tools" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FEsgrove%2Fcli-tools", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FEsgrove%2Fcli-tools'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] a5b9c3d2b6ba95118759cb45c6860a5e2ed1bf35 [INFO] testing Esgrove/cli-tools against 1.95.0 for beta-1.96-1 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FEsgrove%2Fcli-tools" "/workspace/builds/worker-5-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-5-tc1/source'... [INFO] [stderr] done. [INFO] removed /workspace/builds/worker-5-tc1/source/.cargo/config.toml [INFO] started tweaking git repo https://github.com/Esgrove/cli-tools [INFO] finished tweaking git repo https://github.com/Esgrove/cli-tools [INFO] tweaked toml for git repo https://github.com/Esgrove/cli-tools written to /workspace/builds/worker-5-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/Esgrove/cli-tools on toolchain 1.95.0 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.95.0" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/Esgrove/cli-tools 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.95.0" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded rsqlite-vfs v0.1.0 [INFO] [stderr] Downloaded titlecase v3.6.0 [INFO] [stderr] Downloaded rust_xlsxwriter_derive v0.2.0 [INFO] [stderr] Downloaded libredox v0.1.16 [INFO] [stderr] Downloaded line-clipping v0.3.7 [INFO] [stderr] Downloaded toml_edit v0.25.11+spec-1.1.0 [INFO] [stderr] Downloaded clap_complete v4.6.2 [INFO] [stderr] Downloaded kasuari v0.4.12 [INFO] [stderr] Downloaded openssl-sys v0.9.113 [INFO] [stderr] Downloaded euclid v0.22.14 [INFO] [stderr] Downloaded cookie_store v0.22.1 [INFO] [stderr] Downloaded difference v2.0.0 [INFO] [stderr] Downloaded webpki-root-certs v1.0.7 [INFO] [stderr] Downloaded rusqlite v0.39.0 [INFO] [stderr] Downloaded hashlink v0.11.0 [INFO] [stderr] Downloaded serde_bencode v0.2.4 [INFO] [stderr] Downloaded git2 v0.20.4 [INFO] [stderr] Downloaded libssh2-sys v0.3.1 [INFO] [stderr] Downloaded rust_xlsxwriter v0.94.0 [INFO] [stderr] Downloaded libgit2-sys v0.18.3+1.9.2 [INFO] [stderr] Downloaded libsqlite3-sys v0.37.0 [INFO] [stderr] Downloaded sqlite-wasm-rs v0.5.2 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+1.95.0" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] d0ebd28cecd0a8540eb372ed44a5bf2bfc4a8d7162abf8791b9069aabb2d00ef [INFO] running `Command { std: "docker" "start" "-a" "d0ebd28cecd0a8540eb372ed44a5bf2bfc4a8d7162abf8791b9069aabb2d00ef", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "d0ebd28cecd0a8540eb372ed44a5bf2bfc4a8d7162abf8791b9069aabb2d00ef", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "d0ebd28cecd0a8540eb372ed44a5bf2bfc4a8d7162abf8791b9069aabb2d00ef", kill_on_drop: false }` [INFO] [stdout] d0ebd28cecd0a8540eb372ed44a5bf2bfc4a8d7162abf8791b9069aabb2d00ef [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+1.95.0" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] d6e51a4d12c1fe7abe43f8ddb4a52c331b05bb41e2cc12a7073e879deddceca0 [INFO] running `Command { std: "docker" "start" "-a" "d6e51a4d12c1fe7abe43f8ddb4a52c331b05bb41e2cc12a7073e879deddceca0", kill_on_drop: false }` [INFO] [stderr] Compiling syn v2.0.117 [INFO] [stderr] Compiling libc v0.2.185 [INFO] [stderr] Compiling scopeguard v1.2.0 [INFO] [stderr] Compiling pkg-config v0.3.33 [INFO] [stderr] Compiling bitflags v2.11.1 [INFO] [stderr] Compiling unicode-segmentation v1.13.2 [INFO] [stderr] Compiling aws-lc-rs v1.16.3 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling num_threads v0.1.7 [INFO] [stderr] Compiling typenum v1.19.0 [INFO] [stderr] Compiling castaway v0.2.4 [INFO] [stderr] Compiling itertools v0.14.0 [INFO] [stderr] Compiling rustls v0.23.38 [INFO] [stderr] Compiling instability v0.3.12 [INFO] [stderr] Compiling indoc v2.0.7 [INFO] [stderr] Compiling lock_api v0.4.14 [INFO] [stderr] Compiling litrs v1.0.0 [INFO] [stderr] Compiling signal-hook v0.3.18 [INFO] [stderr] Compiling rustix v1.1.4 [INFO] [stderr] Compiling compact_str v0.9.0 [INFO] [stderr] Compiling tracing v0.1.44 [INFO] [stderr] Compiling linux-raw-sys v0.12.1 [INFO] [stderr] Compiling anstyle-parse v1.0.0 [INFO] [stderr] Compiling colorchoice v1.0.5 [INFO] [stderr] Compiling unicase v2.9.0 [INFO] [stderr] Compiling nix v0.31.2 [INFO] [stderr] Compiling line-clipping v0.3.7 [INFO] [stderr] Compiling convert_case v0.10.0 [INFO] [stderr] Compiling document-features v0.2.12 [INFO] [stderr] Compiling anstream v1.0.0 [INFO] [stderr] Compiling zlib-rs v0.6.3 [INFO] [stderr] Compiling bumpalo v3.20.2 [INFO] [stderr] Compiling simd-adler32 v0.3.9 [INFO] [stderr] Compiling mime_guess v2.0.5 [INFO] [stderr] Compiling psl-types v2.0.11 [INFO] [stderr] Compiling iana-time-zone v0.1.65 [INFO] [stderr] Compiling openssl-probe v0.2.1 [INFO] [stderr] Compiling portable-atomic v1.13.1 [INFO] [stderr] Compiling winnow v1.0.1 [INFO] [stderr] Compiling zopfli v0.8.3 [INFO] [stderr] Compiling clap_builder v4.6.0 [INFO] [stderr] Compiling rustls-native-certs v0.8.3 [INFO] [stderr] Compiling hybrid-array v0.4.10 [INFO] [stderr] Compiling toml_datetime v1.1.1+spec-1.1.0 [INFO] [stderr] Compiling const-oid v0.10.2 [INFO] [stderr] Compiling toml_writer v1.1.1+spec-1.1.0 [INFO] [stderr] Compiling jobserver v0.1.34 [INFO] [stderr] Compiling typed-path v0.12.3 [INFO] [stderr] Compiling tinyvec v1.11.0 [INFO] [stderr] Compiling cc v1.2.60 [INFO] [stderr] Compiling unicode-truncate v2.0.1 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling hashlink v0.11.0 [INFO] [stderr] Compiling serde_bytes v0.11.19 [INFO] [stderr] Compiling fallible-streaming-iterator v0.1.9 [INFO] [stderr] Compiling cpufeatures v0.3.0 [INFO] [stderr] Compiling unit-prefix v0.5.2 [INFO] [stderr] Compiling fallible-iterator v0.3.0 [INFO] [stderr] Compiling unicode-normalization v0.1.25 [INFO] [stderr] Compiling block-buffer v0.12.0 [INFO] [stderr] Compiling crypto-common v0.2.1 [INFO] [stderr] Compiling colored v3.1.1 [INFO] [stderr] Compiling difference v2.0.0 [INFO] [stderr] Compiling titlecase v3.6.0 [INFO] [stderr] Compiling cmake v0.1.58 [INFO] [stderr] Compiling toml_parser v1.1.2+spec-1.1.0 [INFO] [stderr] Compiling digest v0.11.2 [INFO] [stderr] Compiling errno v0.3.14 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Compiling mio v1.2.0 [INFO] [stderr] Compiling socket2 v0.6.3 [INFO] [stderr] Compiling time v0.3.47 [INFO] [stderr] Compiling console v0.16.3 [INFO] [stderr] Compiling dirs-sys v0.5.0 [INFO] [stderr] Compiling aws-lc-sys v0.40.0 [INFO] [stderr] Compiling openssl-sys v0.9.113 [INFO] [stderr] Compiling signal-hook-registry v1.4.8 [INFO] [stderr] Compiling libz-sys v1.1.28 [INFO] [stderr] Compiling libssh2-sys v0.3.1 [INFO] [stderr] Compiling parking_lot v0.12.5 [INFO] [stderr] Compiling libsqlite3-sys v0.37.0 [INFO] [stderr] Compiling libgit2-sys v0.18.3+1.9.2 [INFO] [stderr] Compiling getrandom v0.4.2 [INFO] [stderr] Compiling signal-hook-mio v0.2.5 [INFO] [stderr] Compiling ctrlc v3.5.2 [INFO] [stderr] Compiling dirs v6.0.0 [INFO] [stderr] Compiling toml v1.1.2+spec-1.1.0 [INFO] [stderr] Compiling toml_edit v0.25.11+spec-1.1.0 [INFO] [stderr] Compiling sha1 v0.11.0 [INFO] [stderr] Compiling tempfile v3.27.0 [INFO] [stderr] Compiling num_cpus v1.17.0 [INFO] [stderr] Compiling synstructure v0.13.2 [INFO] [stderr] Compiling darling_core v0.23.0 [INFO] [stderr] Compiling flate2 v1.1.9 [INFO] [stderr] Compiling zerofrom-derive v0.1.7 [INFO] [stderr] Compiling yoke-derive v0.8.2 [INFO] [stderr] Compiling zerovec-derive v0.11.3 [INFO] [stderr] Compiling displaydoc v0.2.5 [INFO] [stderr] Compiling tokio-macros v2.7.0 [INFO] [stderr] Compiling futures-macro v0.3.32 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling tokio v1.52.1 [INFO] [stderr] Compiling strum_macros v0.27.2 [INFO] [stderr] Compiling derive_more-impl v2.1.1 [INFO] [stderr] Compiling futures-util v0.3.32 [INFO] [stderr] Compiling cookie v0.18.1 [INFO] [stderr] Compiling clap_derive v4.6.1 [INFO] [stderr] Compiling zip v7.2.0 [INFO] [stderr] Compiling zerofrom v0.1.7 [INFO] [stderr] Compiling rust_xlsxwriter_derive v0.2.0 [INFO] [stderr] Compiling yoke v0.8.2 [INFO] [stderr] Compiling derive_more v2.1.1 [INFO] [stderr] Compiling crossterm v0.29.0 [INFO] [stderr] Compiling zerovec v0.11.6 [INFO] [stderr] Compiling zerotrie v0.2.4 [INFO] [stderr] Compiling darling_macro v0.23.0 [INFO] [stderr] Compiling kasuari v0.4.12 [INFO] [stderr] Compiling darling v0.23.0 [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 tinystr v0.8.3 [INFO] [stderr] Compiling potential_utf v0.1.5 [INFO] [stderr] Compiling clap v4.6.1 [INFO] [stderr] Compiling clap_complete v4.6.2 [INFO] [stderr] Compiling icu_collections v2.2.0 [INFO] [stderr] Compiling icu_locale_core v2.2.0 [INFO] [stderr] Compiling chrono v0.4.44 [INFO] [stderr] Compiling serde_urlencoded v0.7.1 [INFO] [stderr] Compiling serde_bencode v0.2.4 [INFO] [stderr] Compiling ratatui-widgets v0.3.0 [INFO] [stderr] Compiling ratatui-crossterm v0.1.0 [INFO] [stderr] Compiling icu_provider v2.2.0 [INFO] [stderr] Compiling futures-executor v0.3.32 [INFO] [stderr] Compiling icu_normalizer v2.2.0 [INFO] [stderr] Compiling icu_properties v2.2.0 [INFO] [stderr] Compiling futures v0.3.32 [INFO] [stderr] Compiling trash v5.2.5 [INFO] [stderr] Compiling rust_xlsxwriter v0.94.0 [INFO] [stderr] Compiling tokio-util v0.7.18 [INFO] [stderr] Compiling tower v0.5.3 [INFO] [stderr] Compiling indicatif v0.18.4 [INFO] [stderr] Compiling ratatui-macros v0.7.0 [INFO] [stderr] Compiling ratatui v0.30.0 [INFO] [stderr] Compiling tower-http v0.6.8 [INFO] [stderr] Compiling h2 v0.4.13 [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 publicsuffix v2.3.0 [INFO] [stderr] Compiling cookie_store v0.22.1 [INFO] [stderr] Compiling rusqlite v0.39.0 [INFO] [stderr] Compiling hyper v1.9.0 [INFO] [stderr] Compiling hyper-util v0.1.20 [INFO] [stderr] Compiling git2 v0.20.4 [INFO] [stderr] Compiling rustls-webpki v0.103.12 [INFO] [stderr] Compiling tokio-rustls v0.26.4 [INFO] [stderr] Compiling rustls-platform-verifier v0.6.2 [INFO] [stderr] Compiling hyper-rustls v0.27.9 [INFO] [stderr] Compiling reqwest v0.13.2 [INFO] [stderr] Compiling cli-tools v9.11.0 (/opt/rustwide/workdir) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 30s [INFO] running `Command { std: "docker" "inspect" "d6e51a4d12c1fe7abe43f8ddb4a52c331b05bb41e2cc12a7073e879deddceca0", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "d6e51a4d12c1fe7abe43f8ddb4a52c331b05bb41e2cc12a7073e879deddceca0", kill_on_drop: false }` [INFO] [stdout] d6e51a4d12c1fe7abe43f8ddb4a52c331b05bb41e2cc12a7073e879deddceca0 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+1.95.0" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] acfa2dafb4a14ebbe4f00b32bba46538c6be6a801eb559e421fe2d624d214f83 [INFO] running `Command { std: "docker" "start" "-a" "acfa2dafb4a14ebbe4f00b32bba46538c6be6a801eb559e421fe2d624d214f83", kill_on_drop: false }` [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling zerocopy-derive v0.8.48 [INFO] [stderr] Compiling alloca v0.4.0 [INFO] [stderr] Compiling page_size v0.6.0 [INFO] [stderr] Compiling criterion-plot v0.8.2 [INFO] [stderr] Compiling chrono v0.4.44 [INFO] [stderr] Compiling cookie_store v0.22.1 [INFO] [stderr] Compiling serde_urlencoded v0.7.1 [INFO] [stderr] Compiling serde_bencode v0.2.4 [INFO] [stderr] Compiling tinytemplate v1.2.1 [INFO] [stderr] Compiling zerocopy v0.8.48 [INFO] [stderr] Compiling reqwest v0.13.2 [INFO] [stderr] Compiling trash v5.2.5 [INFO] [stderr] Compiling rust_xlsxwriter v0.94.0 [INFO] [stderr] Compiling cli-tools v9.11.0 (/opt/rustwide/workdir) [INFO] [stderr] Compiling half v2.7.1 [INFO] [stderr] Compiling ciborium-ll v0.2.2 [INFO] [stderr] Compiling ciborium v0.2.2 [INFO] [stderr] Compiling criterion v0.8.2 [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 52.51s [INFO] running `Command { std: "docker" "inspect" "acfa2dafb4a14ebbe4f00b32bba46538c6be6a801eb559e421fe2d624d214f83", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "acfa2dafb4a14ebbe4f00b32bba46538c6be6a801eb559e421fe2d624d214f83", kill_on_drop: false }` [INFO] [stdout] acfa2dafb4a14ebbe4f00b32bba46538c6be6a801eb559e421fe2d624d214f83 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+1.95.0" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] cd07d886dae2c5bb75b52f1915298f702c6efd0c381d8a1f6821f1d245cca56b [INFO] running `Command { std: "docker" "start" "-a" "cd07d886dae2c5bb75b52f1915298f702c6efd0c381d8a1f6821f1d245cca56b", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.58s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/cli_tools-2a8a1c1520d4e02e) [INFO] [stdout] [INFO] [stdout] running 492 tests [INFO] [stdout] test additional_path_utility_tests::append_extension_preserves_directory ... ok [INFO] [stdout] test additional_path_utility_tests::get_relative_path_or_filename_no_filename ... ok [INFO] [stdout] test additional_path_utility_tests::insert_suffix_preserves_directory ... ok [INFO] [stdout] test additional_path_utility_tests::get_unique_path_returns_original_when_no_conflict ... ok [INFO] [stdout] test additional_path_utility_tests::get_unique_path_handles_no_extension ... ok [INFO] [stdout] test additional_path_utility_tests::get_unique_path_increments_multiple_times ... ok [INFO] [stdout] test additional_path_utility_tests::get_unique_path_increments_counter ... ok [INFO] [stdout] test color_diff_tests::identical_strings ... ok [INFO] [stdout] test color_diff_tests::addition_only ... ok [INFO] [stdout] test assert_f64_eq_tests::equal_values ... ok [INFO] [stdout] test color_diff_tests::completely_different_strings ... ok [INFO] [stdout] test color_diff_tests::partial_change ... ok [INFO] [stdout] test color_diff_tests::stacked_mode ... ok [INFO] [stdout] test assert_f64_eq_tests::very_close_values ... ok [INFO] [stdout] test color_diff_tests::empty_strings ... ok [INFO] [stdout] test colorize_bool_tests::colorize_false ... ok [INFO] [stdout] test color_diff_tests::removal_only ... ok [INFO] [stdout] test colorize_bool_tests::colorize_true ... ok [INFO] [stdout] test date::date_struct_tests::boundary_day_31 ... ok [INFO] [stdout] test date::date_struct_tests::boundary_month_12 ... ok [INFO] [stdout] test date::date_struct_tests::dash_format ... ok [INFO] [stdout] test date::date_struct_tests::boundary_year_1990 ... ok [INFO] [stdout] test date::date_struct_tests::display_format ... ok [INFO] [stdout] test date::date_struct_tests::boundary_year_1991 ... ok [INFO] [stdout] test date::date_struct_tests::dash_format_pads_single_digits ... ok [INFO] [stdout] test date::date_struct_tests::dot_format ... ok [INFO] [stdout] test date::date_struct_tests::dot_format_pads_single_digits ... ok [INFO] [stdout] test date::date_struct_tests::parse_from_short_invalid_year_length ... ok [INFO] [stdout] test date::date_struct_tests::swap_year_invalid_result ... ok [INFO] [stdout] test date::date_struct_tests::swap_year_valid ... ok [INFO] [stdout] test date::date_struct_tests::try_from_invalid_day_32 ... ok [INFO] [stdout] test date::date_struct_tests::try_from_invalid_day_zero ... ok [INFO] [stdout] test date::date_struct_tests::parse_from_short_invalid_year_single_digit ... ok [INFO] [stdout] test date::date_struct_tests::try_from_invalid_month_zero ... ok [INFO] [stdout] test date::date_struct_tests::try_from_invalid_year_future ... ok [INFO] [stdout] test date::date_struct_tests::try_from_valid_date ... ok [INFO] [stdout] test date::date_struct_tests::try_from_invalid_year_too_old ... ok [INFO] [stdout] test date::date_struct_tests::parse_from_short_valid ... ok [INFO] [stdout] test date::date_struct_tests::try_from_invalid_month_thirteen ... ok [INFO] [stdout] test additional_path_utility_tests::get_relative_path_or_filename_outside_root ... ok [INFO] [stdout] test date::directory_tests::correct_format_with_different_separators ... ok [INFO] [stdout] test date::directory_tests::replace_file_date_with_directory_date ... ok [INFO] [stdout] test date::directory_tests::yyyy_mm_dd_format ... ok [INFO] [stdout] test date::directory_tests::no_date ... ok [INFO] [stdout] test date::directory_tests::unrecognized_date_format ... ok [INFO] [stdout] test date::directory_tests::dd_mm_yyyy_format ... ok [INFO] [stdout] test date::mm_dd_yyyy_tests::date_format_mm_dd_yyyy_with_various_resolutions ... ok [INFO] [stdout] test date::mm_dd_yyyy_tests::date_format_mm_dd_yyyy ... ok [INFO] [stdout] test date::directory_tests::single_digit_date ... ok [INFO] [stdout] test date::date_reorder_tests::full_date ... ok [INFO] [stdout] test date::date_reorder_tests::single_digit_date_with_full_year ... ok [INFO] [stdout] test date::date_reorder_tests::short_date ... ok [INFO] [stdout] test date::date_reorder_tests::single_digit_date ... ok [INFO] [stdout] test date::date_reorder_tests::normal_date ... ok [INFO] [stdout] test date::regex_tests::correct_date_format ... ok [INFO] [stdout] test date::regex_tests::full_date_invalid_dates ... ok [INFO] [stdout] test date::regex_tests::full_date_valid_dates ... ok [INFO] [stdout] test date::swap_year_tests::swap_year_at_different_positions ... ok [INFO] [stdout] test date::date_format_detection_tests::correct_date_format_year_first ... ok [INFO] [stdout] test date::date_format_detection_tests::no_date ... ok [INFO] [stdout] test date::swap_year_tests::swap_year ... ok [INFO] [stdout] test date::ordinal_tests::ordinal_numbers_not_detected_as_date ... ok [INFO] [stdout] test date::ordinal_tests::ordinal_with_varied_name_lengths_not_detected_as_date ... ok [INFO] [stdout] test date::extra_numbers_tests::extra_numbers ... ok [INFO] [stdout] test date::ordinal_tests::ordinal_at_end_of_string_not_detected_as_date ... ok [INFO] [stdout] test date::ordinal_tests::ordinal_at_different_positions_not_detected_as_date ... ok [INFO] [stdout] test date::ordinal_tests::ordinal_with_different_boundaries_not_detected_as_date ... ok [INFO] [stdout] test date::ordinal_tests::ordinal_higher_numbers_not_detected_as_date ... ok [INFO] [stdout] test date::ordinal_tests::ordinal_with_nearby_real_date ... ok [INFO] [stdout] test date::swap_year_tests::swap_year_does_not_apply_to_non_correct_format ... ok [INFO] [stdout] test date::date_format_detection_tests::correct_date_format ... ok [INFO] [stdout] test date::swap_year_tests::swap_year_boundary_values ... ok [INFO] [stdout] test date::swap_year_tests::swap_year_invalid_future_year ... ok [INFO] [stdout] test dir_move::types::test_prefix_group_builder::concatenated_form_is_not_replaced_by_better_dotted_casing ... ok [INFO] [stdout] test date::swap_year_tests::swap_year_with_various_extensions ... ok [INFO] [stdout] test dir_move::types::test_prefix_group_builder::dotted_prefix_prefers_stable_display_casing ... ok [INFO] [stdout] test date::swap_year_tests::swap_year_with_long_names ... ok [INFO] [stdout] test date::year_first_tests::full_date_year_first ... ok [INFO] [stdout] test date::swap_year_tests::swap_year_does_not_trigger_without_flag ... ok [INFO] [stdout] test directory_utility_tests::is_directory_empty_with_file ... ok [INFO] [stdout] test directory_utility_tests::is_directory_empty_with_subdir ... ok [INFO] [stdout] test date::year_first_tests::year_first_changes_short_date_interpretation ... ok [INFO] [stdout] test date::year_first_tests::year_first_with_various_boundaries ... ok [INFO] [stdout] test dot_rename::config::compile_regex_patterns_tests::handles_empty_input ... ok [INFO] [stdout] test directory_utility_tests::is_directory_empty_true ... ok [INFO] [stdout] test date::swap_year_tests::swap_year_with_year_first_flag ... ok [INFO] [stdout] test dot_rename::config::dot_rename_config_display_tests::display_shows_empty_lists ... ok [INFO] [stdout] test dot_rename::config::dot_rename_config_display_tests::display_shows_include_exclude ... ok [INFO] [stdout] test dot_rename::config::dot_rename_config_display_tests::display_formats_config ... ok [INFO] [stdout] test dot_rename::config::dots_config_tests::from_toml_str_default_date_starts_with_year_is_true ... ok [INFO] [stdout] test dot_rename::config::dots_config_tests::from_toml_str_can_override_date_starts_with_year ... ok [INFO] [stdout] test dot_rename::config::dots_config_tests::from_toml_str_parses_dots_section ... ok [INFO] [stdout] test date::year_first_tests::year_first_does_not_affect_full_year_dates ... ok [INFO] [stdout] test dot_rename::config::dots_config_tests::from_toml_str_parses_empty_config ... ok [INFO] [stdout] test dot_rename::config::dots_config_tests::from_toml_str_parses_move_lists ... ok [INFO] [stdout] test dot_rename::config::dots_config_tests::from_toml_str_parses_include_list ... ok [INFO] [stdout] test dot_rename::config::compile_regex_patterns_tests::compiles_valid_patterns ... ok [INFO] [stdout] test date::invalid_date_tests::not_a_valid_date ... ok [INFO] [stdout] test dot_rename::config::dots_config_tests::from_toml_str_parses_regex_replace ... ok [INFO] [stdout] test dot_rename::config::dots_config_tests::from_toml_str_parses_prefix_dir_options ... ok [INFO] [stdout] test date::swap_year_tests::swap_year_with_single_digit_result ... ok [INFO] [stdout] test dot_rename::config::dots_config_tests::from_toml_str_parses_replace_pairs ... ok [INFO] [stdout] test dot_rename::config::parse_regex_substitutes_tests::ignores_incomplete_pairs ... ok [INFO] [stdout] test dot_rename::config::parse_substitutes_tests::ignores_incomplete_pair ... ok [INFO] [stdout] test dot_rename::config::parse_substitutes_tests::trims_whitespace ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::double_dots_collapsed ... ok [INFO] [stdout] test dot_rename::config::parse_removes_tests::trims_whitespace ... ok [INFO] [stdout] test dot_rename::config::parse_removes_tests::skips_empty_patterns ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::filename_with_double_dots ... ok [INFO] [stdout] test dot_rename::config::parse_removes_tests::parses_valid_removes ... ok [INFO] [stdout] test date::year_first_tests::year_first_with_ambiguous_short_dates ... ok [INFO] [stdout] test dot_rename::config::parse_substitutes_tests::handles_empty_input ... ok [INFO] [stdout] test dot_rename::config::parse_substitutes_tests::skips_empty_pattern ... ok [INFO] [stdout] test dot_rename::config::parse_substitutes_tests::parses_valid_pairs ... ok [INFO] [stdout] test assert_f64_eq_tests::close_values - should panic ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::empty_string ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::in_place_no_change_needed ... ok [INFO] [stdout] test assert_f64_eq_tests::different_values - should panic ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::in_place_mutates_string ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::trim_removes_leading_and_trailing_dots ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::trim_no_change_needed ... ok [INFO] [stdout] test dot_rename::config::compile_regex_patterns_tests::returns_error_for_invalid_pattern ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::trim_only_dots_becomes_empty ... ok [INFO] [stdout] test dot_rename::config::dots_config_tests::from_toml_str_invalid_toml_returns_error ... ok [INFO] [stdout] test dot_rename::config::parse_regex_substitutes_tests::returns_error_for_invalid_regex ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::multiple_groups_of_dots ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::only_dots ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::many_consecutive_dots_collapsed ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::triple_dots_collapsed ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::single_dots_unchanged ... ok [INFO] [stdout] test dot_rename::config::parse_regex_substitutes_tests::parses_valid_regex_pairs ... ok [INFO] [stdout] test dot_rename::format::collapse_consecutive_dots_tests::no_dots ... ok [INFO] [stdout] test dot_rename::format::normalize_extension_tests::maps_jpeg_to_jpg ... ok [INFO] [stdout] test dot_rename::format::normalize_extension_tests::handles_empty_extension ... ok [INFO] [stdout] test dot_rename::format::normalize_extension_tests::returns_already_normal_extension ... ok [INFO] [stdout] test dot_rename::format::normalize_extension_tests::lowercases_extension ... ok [INFO] [stdout] test dot_rename::format::test_deduplicate_patterns::test_no_duplicates ... ok [INFO] [stdout] test dot_rename::format::move_date_tests::test_no_match_with_valid_date ... ok [INFO] [stdout] test dot_rename::format::test_remove_from_start::test_no_patterns ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_convert_case ... ok [INFO] [stdout] test dot_rename::format::test_remove_from_start::test_consecutive_patterns ... ok [INFO] [stdout] test dot_rename::format::test_deduplicate_patterns::test_triple_duplicate ... ok [INFO] [stdout] test dot_rename::format::test_deduplicate_patterns::test_mixed_case_duplicates ... ok [INFO] [stdout] test dot_rename::format::test_remove_from_start::test_partial_word_match ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_basic ... ok [INFO] [stdout] test dot_rename::format::test_deduplicate_patterns::test_substitute_creates_duplicate ... ok [INFO] [stdout] test dot_rename::format::test_deduplicate_patterns::test_double_duplicate ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_date ... ok [INFO] [stdout] test dot_rename::format::test_remove_from_start::test_single_occurrence ... ok [INFO] [stdout] test dot_rename::format::move_date_tests::test_valid_date ... ok [INFO] [stdout] test dot_rename::format::move_date_tests::test_short_date ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_empty_string ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_no_brackets ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_with_weird_characters ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_with_extra_dots ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_with_combined_cases ... ok [INFO] [stdout] test dot_rename::format::test_remove_from_start::test_multiple_occurrences ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_with_parentheses ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_without_prefix_suffix ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_no_changes ... ok [INFO] [stdout] test dot_rename::format::tests::test_move_to_end ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_with_brackets ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_with_exclamations ... ok [INFO] [stdout] test dot_rename::format::tests::test_move_to_end_word_boundary ... ok [INFO] [stdout] test dot_rename::format::tests::test_prefix_already_present_in_filename ... ok [INFO] [stdout] test dot_rename::format::tests::test_suffix_already_present_in_filename ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_date_with_adjacent_resolution ... ok [INFO] [stdout] test dot_rename::format::tests::test_prefix_and_suffix_together ... ok [INFO] [stdout] test dot_rename::format::tests::test_prefix_with_explicit_name ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_with_dotcom ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_date_year_first ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_with_newlines ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_name_full_resolution ... ok [INFO] [stdout] test dot_rename::format::tests::test_move_to_start ... ok [INFO] [stdout] test dot_rename::format::tests::test_format_date_mm_dd_yyyy ... ok [INFO] [stdout] test dot_rename::format::tests::test_suffix_with_explicit_name ... ok [INFO] [stdout] test dot_rename::format::written_date_tests::test_mixed_text ... ok [INFO] [stdout] test dot_rename::format::written_date_tests::test_no_date_in_text ... ok [INFO] [stdout] test dot_rename::format::tests::test_starts_with_five_or_more_digits ... ok [INFO] [stdout] test dot_rename::format::tests::test_prefix_dir ... ok [INFO] [stdout] test dot_rename::format::written_date_tests::test_edge_case_single_digit_day ... ok [INFO] [stdout] test dot_rename::format::tests::test_prefix_dir_start_option ... ok [INFO] [stdout] test dot_rename::format::tests::test_remove_identifier ... ok [INFO] [stdout] test dot_rename::format::written_date_tests::test_leading_and_trailing_spaces ... ok [INFO] [stdout] test dot_rename::format::written_date_tests::test_multiple_dates ... ok [INFO] [stdout] test dot_rename::format::written_date_tests::test_single_date ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_already_present_in_filename ... ok [INFO] [stdout] test dot_rename::rename::test_extension_only_rename::uppercase_extension_renamed_when_stem_unchanged ... ok [INFO] [stdout] test dot_rename::rename::test_extension_only_rename::already_normalized_extension_skipped ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_dir_with_deeply_nested_directories ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_and_suffix_cannot_both_be_set ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_dir_recursive_uses_parent_directory_names ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_recursive_with_exclude_filter ... ok [INFO] [stdout] test dot_rename::rename::test_extension_only_rename::jpeg_renamed_to_jpg_when_stem_unchanged ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_recursive_different_subdirs_get_different_prefixes ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_with_explicit_name ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_recursive_with_include_filter ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_suffix_already_present_in_filename ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_dir_start_prevents_date_reordering ... ok [INFO] [stdout] test dot_rename::format::tests::test_prefix_dir_with_leading_digits ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_recursive_empty_subdirectories ... ok [INFO] [stdout] test format_duration_tests::format_duration_seconds_basic ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_suffix_recursive_different_subdirs ... ok [INFO] [stdout] test format_duration_tests::format_duration_seconds_minutes ... ok [INFO] [stdout] test format_duration_tests::format_duration_seconds_hours ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_suffix_with_explicit_name ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_suffix_dir_recursive_uses_parent_directory_names ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_recursive_mode_includes_root_and_subdir_files ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_suffix_dir_uses_root_directory_name ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_with_date_reordering_full_date ... ok [INFO] [stdout] test format_duration_tests::hours_minutes_seconds ... ok [INFO] [stdout] test format_duration_tests::format_duration_seconds_negative ... ok [INFO] [stdout] test format_duration_tests::minutes_and_seconds ... ok [INFO] [stdout] test format_size_tests::bytes_only ... ok [INFO] [stdout] test format_duration_tests::seconds_only ... ok [INFO] [stdout] test format_size_tests::kilobytes ... ok [INFO] [stdout] test format_size_tests::terabytes ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_suffix_with_special_characters_in_directory_name ... ok [INFO] [stdout] test format_size_tests::megabytes ... ok [INFO] [stdout] test hidden_file_tests::is_hidden_file ... ok [INFO] [stdout] test path_utility_tests::append_extension_to_path_with_directory ... ok [INFO] [stdout] test hidden_file_tests::is_hidden_directory ... ok [INFO] [stdout] test format_size_tests::gigabytes ... ok [INFO] [stdout] test path_utility_tests::get_normalized_dir_name_basic ... ok [INFO] [stdout] test path_utility_tests::get_normalized_file_name_and_extension_basic ... ok [INFO] [stdout] test hidden_file_tests::is_not_hidden_file ... ok [INFO] [stdout] test path_utility_tests::append_extension_to_path_basic ... ok [INFO] [stdout] test path_utility_tests::get_unique_path_no_extension ... ok [INFO] [stdout] test path_utility_tests::get_normalized_file_name_and_extension_no_extension ... ok [INFO] [stdout] test path_utility_tests::get_relative_path_or_filename_same_as_root ... ok [INFO] [stdout] test path_utility_tests::get_relative_path_or_filename_within_root ... ok [INFO] [stdout] test path_utility_tests::get_unique_path_no_conflict ... ok [INFO] [stdout] test path_utility_tests::insert_suffix_before_extension_multiple_dots ... ok [INFO] [stdout] test path_utility_tests::insert_suffix_before_extension_basic ... ok [INFO] [stdout] test path_utility_tests::append_extension_to_path_no_extension ... ok [INFO] [stdout] test path_utility_tests::get_unique_path_with_conflict ... ok [INFO] [stdout] test path_utility_tests::insert_suffix_before_extension_no_extension ... ok [INFO] [stdout] test path_utility_tests::insert_suffix_before_extension_with_directory ... ok [INFO] [stdout] test path_utility_tests::os_str_to_string_basic ... ok [INFO] [stdout] test path_utility_tests::get_unique_path_multiple_conflicts ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_dir_non_recursive_uses_root_for_all ... ok [INFO] [stdout] test path_utility_tests::path_to_file_extension_string_basic ... ok [INFO] [stdout] test path_utility_tests::path_to_file_extension_string_no_extension ... ok [INFO] [stdout] test path_utility_tests::path_to_filename_string_basic ... ok [INFO] [stdout] test path_utility_tests::path_to_string_basic ... ok [INFO] [stdout] test path_utility_tests::path_to_file_stem_string_basic ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_dir_uses_root_directory_name ... ok [INFO] [stdout] test print_function_tests::print_bold_does_not_panic ... ok [INFO] [stdout] test print_function_tests::print_cyan_does_not_panic ... ok [INFO] [stdout] test print_function_tests::print_error_does_not_panic ... ok [INFO] [stdout] test print_function_tests::print_dimmed_does_not_panic ... ok [INFO] [stdout] test print_function_tests::print_green_does_not_panic ... ok [INFO] [stdout] test print_function_tests::print_magenta_bold_does_not_panic ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_multiple_files_same_directory_get_same_prefix ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_preserves_file_extension ... ok [INFO] [stdout] test network_path_tests::non_windows_always_false ... ok [INFO] [stdout] test print_function_tests::print_magenta_does_not_panic ... ok [INFO] [stdout] test print_function_tests::print_yellow_does_not_panic ... ok [INFO] [stdout] test relative_path_tests::path_to_string_relative_converts ... ok [INFO] [stdout] test resolution::test_compute_bounds::bounds_720p ... ok [INFO] [stdout] test resolution::test_compute_bounds::bounds_large_value ... ok [INFO] [stdout] test resolution::test_compute_bounds::bounds_4k_height ... ok [INFO] [stdout] test resolution::test_compute_bounds::bounds_one ... ok [INFO] [stdout] test resolution::test_compute_bounds::bounds_very_small_value ... ok [INFO] [stdout] test resolution::test_compute_bounds::standard_resolution ... ok [INFO] [stdout] test resolution::test_compute_bounds::small_value ... ok [INFO] [stdout] test resolution::test_compute_bounds::zero ... ok [INFO] [stdout] test resolution::test_compute_bounds::bounds_4k_width ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_dir_empty_directory ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_with_special_characters_in_directory_name ... ok [INFO] [stdout] test relative_path_tests::get_relative_path_from_cwd_returns_path ... ok [INFO] [stdout] test resolution::test_dimension_regex::matches_case_insensitive_vertical ... ok [INFO] [stdout] test resolution::test_dimension_regex::respects_word_boundaries ... ok [INFO] [stdout] test resolution::test_dimension_regex::unknown_resolution_does_not_match_others ... ok [INFO] [stdout] test resolution::test_dimension_regex::vertical_prefix_without_dot_is_matched ... ok [INFO] [stdout] test resolution::test_dimension_regex::does_not_match_partial_numbers ... ok [INFO] [stdout] test resolution::test_dimension_regex::known_resolution_does_not_match_other_resolutions ... ok [INFO] [stdout] test resolution::test_dimension_regex::square_resolution_matches_only_one_pattern ... ok [INFO] [stdout] test resolution::test_dimension_regex::unknown_resolution_creates_new_regex ... ok [INFO] [stdout] test resolution::test_full_resolution_regex::does_not_match_p_labels ... ok [INFO] [stdout] test resolution::test_fuzzy_resolutions::all_known_resolutions_have_fuzzy_match ... ok [INFO] [stdout] test resolution::test_full_resolution_regex::matches_3_digit_dimensions ... ok [INFO] [stdout] test resolution::test_fuzzy_resolutions::fuzzy_resolution_1080p_bounds ... ok [INFO] [stdout] test resolution::test_fuzzy_resolutions::count_matches_known ... ok [INFO] [stdout] test resolution::test_fuzzy_resolutions::fuzzy_resolution_2160p_bounds ... ok [INFO] [stdout] test resolution::test_fuzzy_resolutions::fuzzy_resolution_720p_bounds ... ok [INFO] [stdout] test resolution::test_fuzzy_resolutions::no_overlapping_height_ranges ... ok [INFO] [stdout] test resolution::test_fuzzy_resolutions::resolution_match_display ... ok [INFO] [stdout] test resolution::test_full_resolution_regex::matches_at_word_boundaries ... ok [INFO] [stdout] test resolution::test_full_resolution_regex::does_not_match_too_few_digits ... ok [INFO] [stdout] test resolution::test_fuzzy_resolutions::fuzzy_resolution_480p_bounds ... ok [INFO] [stdout] test resolution::test_full_resolution_regex::does_not_match_too_many_digits ... ok [INFO] [stdout] test resolution::test_full_resolution_regex::does_not_match_wrong_separator ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_540p ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_544p ... ok [INFO] [stdout] test resolution::test_full_resolution_regex::extracts_correct_match ... ok [INFO] [stdout] test resolution::test_full_resolution_regex::matches_4_digit_dimensions ... ok [INFO] [stdout] test resolution::test_full_resolution_regex::matches_mixed_digit_counts ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_576p ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_600p ... ok [INFO] [stdout] test resolution::test_dimension_regex::extracts_correct_match_from_filename ... ok [INFO] [stdout] test resolution::test_full_resolution_regex::matches_vertical_prefix ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_960x540 ... ok [INFO] [stdout] test resolution::test_dimension_regex::known_resolution_returns_cached_regex ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_dir_start_with_5_digit_filename ... ok [INFO] [stdout] test dot_rename::rename::test_prefix_suffix_options::test_prefix_dir_with_numeric_directory_name ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_horizontal ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_vertical ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_vertical_480p ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_vertical_540p ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_vertical_540x960 ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_vertical_544p ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_vertical_576p ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_vertical_600p ... ok [INFO] [stdout] test resolution::test_label_exact_matches::sd_resolutions ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::approximate_matches ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::fuzzy_matches_4k_variations ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::horizontal_near_boundaries ... ok [INFO] [stdout] test resolution::test_dimension_regex::all_known_resolutions_are_cached ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::just_inside_tolerance_1080p ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::just_outside_tolerance_1080p ... ok [INFO] [stdout] test resolution::test_dimension_regex::all_cached_resolutions_match_both_orientations ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::lower_bound_tolerance ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::slightly_cropped_1080p ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::near_720p_within_tolerance ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::vertical_1080p_slightly_off ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::upper_bound_tolerance ... ok [INFO] [stdout] test resolution::test_label_out_of_range::beyond_tolerance ... ok [INFO] [stdout] test resolution::test_label_fuzzy_matches::vertical_near_boundaries ... ok [INFO] [stdout] test resolution::test_label_out_of_range::exact_1440p ... ok [INFO] [stdout] test resolution::test_label_out_of_range::dci_4k ... ok [INFO] [stdout] test resolution::test_label_out_of_range::resolution_8k_horizontal ... ok [INFO] [stdout] test resolution::test_label_out_of_range::between_known_resolutions ... ok [INFO] [stdout] test resolution::test_label_out_of_range::resolution_8k_vertical ... ok [INFO] [stdout] test resolution::test_label_out_of_range::exact_vertical_1440p ... ok [INFO] [stdout] test resolution::test_label_out_of_range::single_pixel ... ok [INFO] [stdout] test resolution::test_label_out_of_range::near_720p_outside_tolerance ... ok [INFO] [stdout] test resolution::test_label_out_of_range::small_resolutions ... ok [INFO] [stdout] test resolution::test_label_out_of_range::square_treated_as_horizontal ... ok [INFO] [stdout] test resolution::test_label_out_of_range::ultrawide_1440p ... ok [INFO] [stdout] test resolution::test_label_out_of_range::unknown_horizontal ... ok [INFO] [stdout] test resolution::test_label_out_of_range::unknown_resolutions ... ok [INFO] [stdout] test resolution::test_label_out_of_range::unknown_vertical ... ok [INFO] [stdout] test resolution::test_label_out_of_range::unusual_aspect_ratios ... ok [INFO] [stdout] test resolution::test_label_out_of_range::very_small_resolution ... ok [INFO] [stdout] test resolution::test_label_out_of_range::zero_dimensions ... ok [INFO] [stdout] test resolution::test_resolution_aspect_ratio::square ... ok [INFO] [stdout] test resolution::test_resolution_aspect_ratio::standard_16_9 ... ok [INFO] [stdout] test resolution::test_resolution_aspect_ratio::zero_height ... ok [INFO] [stdout] test resolution::test_resolution_display::debug_format ... ok [INFO] [stdout] test resolution::test_resolution_display::horizontal_resolution ... ok [INFO] [stdout] test resolution::test_resolution_display::resolution_4k ... ok [INFO] [stdout] test resolution::test_resolution_display::resolution_8k ... ok [INFO] [stdout] test resolution::test_resolution_display::small_resolution ... ok [INFO] [stdout] test resolution::test_resolution_display::square_resolution ... ok [INFO] [stdout] test resolution::test_resolution_display::ultrawide_resolution ... ok [INFO] [stdout] test resolution::test_resolution_display::vertical_4k ... ok [INFO] [stdout] test resolution::test_p_label_regex::does_not_match_unknown_labels ... ok [INFO] [stdout] test resolution::test_p_label_regex::does_not_match_without_p_suffix ... ok [INFO] [stdout] test resolution::test_p_label_regex::does_not_match_full_dimensions ... ok [INFO] [stdout] test resolution::test_p_label_regex::extracts_correct_match ... ok [INFO] [stdout] test resolution::test_p_label_regex::matches_all_standard_labels ... ok [INFO] [stdout] test resolution::test_p_label_regex::matches_at_word_boundaries ... ok [INFO] [stdout] test resolution::test_p_label_regex::matches_case_insensitive ... ok [INFO] [stdout] test resolution::test_p_label_regex::matches_multiple_finds_first ... ok [INFO] [stdout] test resolution::test_p_label_regex::matches_vertical_prefix ... ok [INFO] [stdout] test resolution::test_label_exact_matches::exact_matches_480p ... ok [INFO] [stdout] test resolution::test_resolution_display::vertical_resolution ... ok [INFO] [stdout] test resolution::test_resolution_from_options::both_missing ... ok [INFO] [stdout] test resolution::test_resolution_from_options::both_present ... ok [INFO] [stdout] test resolution::test_resolution_from_options::height_missing ... ok [INFO] [stdout] test resolution::test_resolution_from_options::width_missing ... ok [INFO] [stdout] test resolution::test_resolution_hash::different_resolutions_hash_different ... ok [INFO] [stdout] test resolution::test_resolution_hash::same_resolutions_hash_equal ... ok [INFO] [stdout] test resolution::test_resolution_is_landscape::portrait ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::at_exact_limit ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::both_above_limit ... ok [INFO] [stdout] test resolution::test_resolution_is_landscape::square ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::both_below_limit ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::height_below_limit ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::max_u32_limit ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::one_at_limit_one_below ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::one_dimension_at_limit ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::vertical_video_width_below ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::width_below_limit ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::large_limit ... ok [INFO] [stdout] test resolution::test_resolution_is_landscape::landscape ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::zero_resolution ... ok [INFO] [stdout] test resolution::test_resolution_new::creates_resolution_with_correct_dimensions ... ok [INFO] [stdout] test resolution::test_resolution_new::creates_with_max_u32 ... ok [INFO] [stdout] test resolution::test_resolution_new::creates_with_zero_dimensions ... ok [INFO] [stdout] test resolution::test_resolution_new::creates_with_asymmetric_dimensions ... ok [INFO] [stdout] test resolution::test_resolution_ordering::equal_resolutions ... ok [INFO] [stdout] test resolution::test_resolution_ordering::inequality ... ok [INFO] [stdout] test resolution::test_resolution_ordering::lower_width_is_less ... ok [INFO] [stdout] test resolution::test_resolution_ordering::ordering_by_width_first ... ok [INFO] [stdout] test resolution::test_resolution_ordering::ordering_same_width_different_height ... ok [INFO] [stdout] test resolution::test_resolution_ordering::ordering_vertical_vs_horizontal ... ok [INFO] [stdout] test resolution::test_resolution_ordering::same_width_lower_height_is_less ... ok [INFO] [stdout] test resolution::test_resolution_pixel_count::large_resolution ... ok [INFO] [stdout] test resolution::test_resolution_pixel_count::single_pixel ... ok [INFO] [stdout] test resolution::test_resolution_pixel_count::standard_1080p ... ok [INFO] [stdout] test resolution::test_resolution_pixel_count::zero_dimensions ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::vertical_video_both_above ... ok [INFO] [stdout] test resolution::test_resolution_to_labeled_string::small_resolution ... ok [INFO] [stdout] test resolution::test_resolution_is_smaller_than::zero_limit ... ok [INFO] [stdout] test resolution::test_resolution_to_labeled_string::square_resolution ... ok [INFO] [stdout] test resolution::test_resolution_to_labeled_string::vertical_4k ... ok [INFO] [stdout] test resolution::test_resolution_to_labeled_string::vertical_resolution ... ok [INFO] [stdout] test resolve_path_tests::resolve_input_path_default ... ok [INFO] [stdout] test resolve_path_tests::resolve_input_path_empty ... ok [INFO] [stdout] test resolve_path_tests::resolve_input_path_valid ... ok [INFO] [stdout] test resolve_path_tests::resolve_output_path_default ... ok [INFO] [stdout] test resolve_path_tests::resolve_input_path_nonexistent ... ok [INFO] [stdout] test resolve_path_tests::resolve_required_input_path_valid ... ok [INFO] [stdout] test resolve_path_tests::resolve_required_input_path_nonexistent ... ok [INFO] [stdout] test resolve_path_tests::resolve_output_path_with_file ... ok [INFO] [stdout] test resolve_path_tests::resolve_required_input_path_empty ... ok [INFO] [stdout] test scan_cache::test_cached_video_info_conversion::zero_bitrate_becomes_none ... ok [INFO] [stdout] test scan_cache::test_cached_video_info_conversion::zero_duration_becomes_none ... ok [INFO] [stdout] test show_diff_tests::show_diff_does_not_panic_on_different ... ok [INFO] [stdout] test show_diff_tests::show_diff_does_not_panic_on_identical ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_linux_lost_found ... ok [INFO] [stdout] test scan_cache::test_cached_video_info_conversion::empty_codec_becomes_none ... ok [INFO] [stdout] test show_diff_tests::show_diff_does_not_panic_on_empty ... ok [INFO] [stdout] test scan_cache::test_scan_cache_open::opens_in_memory_database ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_macos_spotlight ... ok [INFO] [stdout] test scan_cache::test_cached_video_info_conversion::roundtrip_through_database ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_path_nas_recycle_mixed_case ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_path_nas_recycle ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_macos_trashes ... ok [INFO] [stdout] test scan_cache::test_scan_cache_upsert::upsert_empty_input_returns_zero ... ok [INFO] [stdout] test scan_cache::test_scan_cache_open::empty_cache_returns_empty_map ... ok [INFO] [stdout] test scan_cache::test_scan_cache_upsert::upsert_skips_entry_without_size ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_nas_recycle_mixed_case ... ok [INFO] [stdout] test scan_cache::test_scan_cache_upsert::upsert_multiple_entries ... ok [INFO] [stdout] test scan_cache::test_scan_cache_upsert::upsert_updates_existing_entry ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_path_normal_directory_unix ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_path_recycle_bin_case_insensitive_unix ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_path_system_volume_information_unix ... ok [INFO] [stdout] test video_info::test_compute_median_f64::empty_returns_zero ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_walkdir ... ok [INFO] [stdout] test video_info::test_compute_median_f64::odd_count ... ok [INFO] [stdout] test video_info::test_compute_median_f64::even_count ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_nas_recycle ... ok [INFO] [stdout] test video_info::test_compute_median_f64::single_value ... ok [INFO] [stdout] test video_info::test_compute_median_u64::empty_returns_zero ... ok [INFO] [stdout] test video_info::test_compute_median_u64::even_count ... ok [INFO] [stdout] test video_info::test_compute_median_u64::odd_count ... ok [INFO] [stdout] test video_info::test_compute_median_u64::single_value ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::empty_output ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::first_bitrate_source_wins ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::handles_large_resolution ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::handles_malformed_height ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::handles_malformed_width ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::handles_na_bitrate_value ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::ignores_zero_bitrate ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::missing_bitrate ... ok [INFO] [stdout] test system_directory_tests::should_skip_entry_system_dir ... ok [INFO] [stdout] test system_directory_tests::should_skip_entry_nas_recycle ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_path_recycle_bin_unix ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::missing_codec ... ok [INFO] [stdout] test system_directory_tests::should_skip_entry_hidden_file ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::missing_duration ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::missing_height ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::missing_width ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::parses_all_fields ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::parses_bitrate_from_bps_eng_tag ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::parses_bitrate_from_bps_tag ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::parses_codec_as_lowercase ... ok [INFO] [stdout] test trash_or_delete_tests::returns_error_for_nonexistent_file ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::skips_empty_lines ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::skips_unknown_keys ... ok [INFO] [stdout] test video_info::test_parse_ffprobe_output::missing_resolution ... ok [INFO] [stdout] test video_info::test_video_info::resolution_string_formats_correctly ... ok [INFO] [stdout] test video_info::test_video_info::default_has_all_none ... ok [INFO] [stdout] test video_info::test_video_info::resolution_returns_none_when_missing ... ok [INFO] [stdout] test video_info::test_video_info::resolution_returns_some_when_present ... ok [INFO] [stdout] test video_info::test_video_info::resolution_string_formats_portrait ... ok [INFO] [stdout] test video_info::test_video_info::resolution_string_returns_none_when_resolution_missing ... ok [INFO] [stdout] test video_info::test_video_stats::add_collects_all_fields ... ok [INFO] [stdout] test video_info::test_video_stats::add_counts_duplicate_resolutions ... ok [INFO] [stdout] test video_info::test_video_stats::add_counts_duplicate_codecs ... ok [INFO] [stdout] test video_info::test_video_stats::add_skips_none_fields ... ok [INFO] [stdout] test video_info::test_video_stats::new_creates_empty_stats ... ok [INFO] [stdout] test scan_cache::test_scan_cache_upsert::upsert_and_retrieve_single_entry ... ok [INFO] [stdout] test resolution::test_resolution_to_labeled_string::horizontal_resolution ... ok [INFO] [stdout] test resolve_path_tests::resolve_required_input_path_whitespace ... ok [INFO] [stdout] test system_directory_tests::is_system_directory_path_similar_name_unix ... ok [INFO] [stdout] test trash_or_delete_tests::deletes_local_file ... ok [INFO] [stdout] test system_directory_tests::should_skip_entry_normal_file ... ok [INFO] [stdout] test scan_cache::test_cached_video_info_conversion::converts_all_fields ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 492 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.39s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/dir_move/main.rs (/opt/rustwide/target/debug/deps/dirmove-6e5ac02ebc17096f) [INFO] [stdout] [INFO] [stdout] running 592 tests [INFO] [stdout] test config::cli_args_tests::config_from_args_force_enables_overwrite ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_default_min_prefix_chars_is_five ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_ignored_group_names_normalized ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_cli_flags_enable_options ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_includes_cli_patterns ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_ignored_group_names_lowercase ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_includes_unpack_dirs_lowercase ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_parses_custom_mappings ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_print_enables_dryrun ... ok [INFO] [stdout] test config::cli_args_tests::default_min_prefix_chars_is_none ... ok [INFO] [stdout] test config::cli_args_tests::default_group_size_is_none ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_ignored_group_parts_lowercase ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_normalizes_custom_mapping_pattern ... ok [INFO] [stdout] test config::cli_args_tests::parses_combined_short_flags ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_uses_cli_min_prefix_chars ... ok [INFO] [stdout] test config::cli_args_tests::parses_multiple_ignored_group_names ... ok [INFO] [stdout] test config::cli_args_tests::empty_arrays_by_default ... ok [INFO] [stdout] test config::cli_args_tests::parses_custom_mapping_cli_arg ... ok [INFO] [stdout] test config::cli_args_tests::parses_long_flags ... ok [INFO] [stdout] test config::cli_args_tests::config_from_args_warns_on_invalid_mapping_format ... ok [INFO] [stdout] test config::cli_args_tests::parses_ignored_group_parts_long_form ... ok [INFO] [stdout] test config::cli_args_tests::parses_min_prefix_chars ... ok [INFO] [stdout] test config::cli_args_tests::parses_multiple_include_patterns ... ok [INFO] [stdout] test config::cli_args_tests::parses_multiple_custom_mappings ... ok [INFO] [stdout] test config::cli_args_tests::parses_custom_mapping_long_form ... ok [INFO] [stdout] test config::cli_args_tests::parses_multiple_exclude_patterns ... ok [INFO] [stdout] test config::cli_args_tests::parses_min_prefix_chars_long_form ... ok [INFO] [stdout] test config::cli_args_tests::parses_group_size ... ok [INFO] [stdout] test config::cli_args_tests::parses_ignored_group_names_long_form ... ok [INFO] [stdout] test config::cli_args_tests::parses_multiple_prefix_overrides ... ok [INFO] [stdout] test config::cli_args_tests::parses_multiple_prefix_ignores ... ok [INFO] [stdout] test config::cli_args_tests::rejects_invalid_group_size ... ok [INFO] [stdout] test config::cli_args_tests::parses_path_argument ... ok [INFO] [stdout] test config::cli_args_tests::parses_multiple_ignored_group_parts ... ok [INFO] [stdout] test config::config_tests::from_toml_str_parses_empty_config ... ok [INFO] [stdout] test config::config_tests::from_toml_str_default_custom_mappings_is_empty ... ok [INFO] [stdout] test config::config_tests::from_toml_str_default_min_prefix_chars_is_none ... ok [INFO] [stdout] test config::cli_args_tests::rejects_invalid_min_prefix_chars ... ok [INFO] [stdout] test config::config_tests::from_toml_str_invalid_toml_returns_error ... ok [INFO] [stdout] test config::config_tests::from_toml_str_parses_dirmove_section ... ok [INFO] [stdout] test config::config_tests::from_toml_str_parses_include_exclude ... ok [INFO] [stdout] test config::config_tests::from_toml_str_parses_min_group_size ... ok [INFO] [stdout] test config::config_tests::from_toml_str_parses_ignored_group_names ... ok [INFO] [stdout] test config::config_tests::from_toml_str_parses_min_prefix_chars ... ok [INFO] [stdout] test config::config_tests::from_toml_str_parses_custom_mappings ... ok [INFO] [stdout] test config::config_tests::from_toml_str_parses_prefix_options ... ok [INFO] [stdout] test config::config_tests::from_toml_str_parses_unpack_directories ... ok [INFO] [stdout] test config::custom_mapping_tests::new_handles_mixed_separators ... ok [INFO] [stdout] test config::custom_mapping_tests::new_normalizes_pattern_to_lowercase ... ok [INFO] [stdout] test config::custom_mapping_tests::new_preserves_directory_name_case ... ok [INFO] [stdout] test config::custom_mapping_tests::new_removes_dots_from_pattern ... ok [INFO] [stdout] test config::custom_mapping_tests::new_removes_spaces_from_pattern ... ok [INFO] [stdout] test config::config_tests::from_toml_str_parses_ignored_group_parts ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::skips_duplicate_dotted_match ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::adds_to_empty_config ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::adds_to_existing_array ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::adds_multiple_names_sequentially_in_alphabetical_order ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::case_insensitive_duplicate_detection ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::skips_duplicate_normalized_match ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::creates_dirmove_section_if_missing ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::skips_duplicate_exact_match ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::inserts_alphabetically_case_insensitive ... ok [INFO] [stdout] test database::tests::display_entry ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::inline_array_stays_inline ... ok [INFO] [stdout] test config::config_tests::from_toml_str_ignores_other_sections ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::inserts_alphabetically_between_existing ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::multiline_array_stays_multiline ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::multiline_array_multiple_sequential_inserts ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::preserves_8_space_indentation ... ok [INFO] [stdout] test database::tests::dotted_and_spaced_same_entry ... ok [INFO] [stdout] test config::test_add_ignored_name_to_toml::preserves_existing_config ... ok [INFO] [stdout] test database::tests::different_spacing_same_entry ... ok [INFO] [stdout] test dir_move::test_custom_mappings::find_directory_matches_exact_name ... ok [INFO] [stdout] test dir_move::test_custom_mappings::find_directory_matches_dotted_name ... ok [INFO] [stdout] test config::cli_args_tests::parses_multiple_unpack_directories ... ok [INFO] [stdout] test dir_move::test_custom_mappings::find_directory_matches_normalized_name ... ok [INFO] [stdout] test dir_move::test_custom_mappings::find_directory_no_match ... ok [INFO] [stdout] test dir_move::test_custom_mappings::find_directory_selects_correct_index ... ok [INFO] [stdout] test database::tests::upsert_updates_display_name ... ok [INFO] [stdout] test database::tests::normalized_name_removes_spaces ... ok [INFO] [stdout] test database::tests::upsert_new_entry ... ok [INFO] [stdout] test dir_move::test_custom_mappings::process_custom_mappings_empty_when_no_mappings ... ok [INFO] [stdout] test dir_move::test_custom_mappings::process_custom_mappings_case_insensitive_pattern ... ok [INFO] [stdout] test dir_move::test_custom_mappings::process_custom_mappings_no_match_without_directory ... ok [INFO] [stdout] test dir_move::test_custom_mappings::process_custom_mappings_ignores_dots_in_pattern ... ok [INFO] [stdout] test database::tests::insert_if_new_preserves_original ... ok [INFO] [stdout] test dir_move::test_database_suggestion::no_database_returns_none ... ok [INFO] [stdout] test database::tests::get_all_entries_sorted ... ok [INFO] [stdout] test dir_move::test_custom_mappings::process_custom_mappings_returns_unmatched_files ... ok [INFO] [stdout] test dir_move::test_directory_matching::basic_match ... ok [INFO] [stdout] test dir_move::test_directory_matching::case_insensitive ... ok [INFO] [stdout] test dir_move::test_directory_matching::concatenated_directory_matches_dotted_files_without_prefix ... ok [INFO] [stdout] test dir_move::test_directory_matching::concatenated_directory_matches_dotted_files ... ok [INFO] [stdout] test dir_move::test_directory_matching::concatenated_directory_with_dotted_files_and_prefix ... ok [INFO] [stdout] test dir_move::test_directory_matching::concatenated_filename_matches_spaced_directory ... ok [INFO] [stdout] test dir_move::test_directory_matching::dir_has_prefix_file_does_not ... ok [INFO] [stdout] test dir_move::test_directory_matching::dots_replaced_with_spaces ... ok [INFO] [stdout] test dir_move::test_directory_matching::empty_dirs ... ok [INFO] [stdout] test dir_move::test_directory_matching::empty_files ... ok [INFO] [stdout] test dir_move::test_directory_matching::longer_match_wins ... ok [INFO] [stdout] test dir_move::test_directory_matching::mixed_concatenated_and_dotted_filenames ... ok [INFO] [stdout] test dir_move::test_database_suggestion::exact_match_with_dots ... ok [INFO] [stdout] test dir_move::test_directory_matching::mixed_separators ... ok [INFO] [stdout] test dir_move::test_directory_matching::no_matches ... ok [INFO] [stdout] test dir_move::test_database_suggestion::exact_match_same_case ... ok [INFO] [stdout] test dir_move::test_directory_matching::file_has_prefix_dir_does_not ... ok [INFO] [stdout] test dir_move::test_directory_matching::numbers_in_directory_name ... ok [INFO] [stdout] test dir_move::test_directory_matching::partial_match ... ok [INFO] [stdout] test dir_move::test_directory_matching::prefix_ignore_applied_to_both ... ok [INFO] [stdout] test dir_move::test_database_suggestion::exact_match_no_spaces ... ok [INFO] [stdout] test dir_move::test_directory_matching::special_characters_in_names ... ok [INFO] [stdout] test database::tests::open_in_memory ... ok [INFO] [stdout] test dir_move::test_database_suggestion::multiple_entries_exact_match ... ok [INFO] [stdout] test dir_move::test_database_suggestion::no_match_for_completely_different ... ok [INFO] [stdout] test dir_move::test_database_suggestion::preserves_database_formatting ... ok [INFO] [stdout] test dir_move::test_database_suggestion::no_match_for_prefix_only ... ok [INFO] [stdout] test dir_move::test_database_suggestion::exact_match_dots_and_different_case ... ok [INFO] [stdout] test dir_move::test_database_suggestion::no_match_for_longer_name ... ok [INFO] [stdout] test dir_move::test_database_suggestion::empty_database_returns_none ... ok [INFO] [stdout] test dir_move::test_database_suggestion::no_match_for_partial_overlap ... ok [INFO] [stdout] test dir_move::test_database_suggestion::exact_match_different_case ... ok [INFO] [stdout] test dir_move::test_directory_matching::with_multiple_prefix_ignores ... ok [INFO] [stdout] test dir_move::test_directory_matching::multiple_dirs ... ok [INFO] [stdout] test dir_move::test_directory_matching::with_prefix_ignore ... ok [INFO] [stdout] test dir_move::test_directory_matching::with_repeated_prefix_ignore ... ok [INFO] [stdout] test dir_move::test_custom_mappings::multiple_mappings_first_match_wins ... ok [INFO] [stdout] test dir_move::test_full_flow::with_resolution_numbers ... ok [INFO] [stdout] test dir_move::test_full_flow::simulation_with_filtering ... ok [INFO] [stdout] test dir_move::test_full_flow::with_glue_words ... ok [INFO] [stdout] test dir_move::test_full_flow::files_with_resolution_grouped_correctly ... ok [INFO] [stdout] test dir_move::test_full_flow::with_resolution_pattern ... ok [INFO] [stdout] test dir_move::test_full_flow::short_prefix_with_shared_parts ... ok [INFO] [stdout] test dir_move::test_full_flow::files_with_2160p_resolution ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::case_insensitive_prefix_matching ... ok [INFO] [stdout] test dir_move::test_full_flow::files_with_dimension_resolution ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::chained_prefix_stripping ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::dryrun_does_not_modify_files ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::empty_prefix_ignores_does_nothing ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::merges_only_when_sibling_exists ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::merges_subdirectories ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::multiple_prefix_ignores ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::no_merge_without_matching_target ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::non_recursive_ignores_subdirectories ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::only_merges_siblings_not_across_levels ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::overwrites_existing_files_with_force_flag ... ok [INFO] [stdout] test dir_move::test_ignored_group_parts::multiple_ignored_parts ... ok [INFO] [stdout] test dir_move::test_ignored_group_names::multiple_ignored_group_names ... ok [INFO] [stdout] test dir_move::test_ignored_group_parts::does_not_filter_substring_matches ... ok [INFO] [stdout] test dir_move::test_ignored_group_parts::case_insensitive_matching ... ok [INFO] [stdout] test dir_move::test_ignored_group_names::ignored_group_names_mixed_formats_all_match ... ok [INFO] [stdout] test dir_move::test_ignored_group_names::ignored_group_name_not_offered ... ok [INFO] [stdout] test dir_move::test_ignored_group_parts::filters_groups_containing_ignored_part ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::recursive_merges_at_multiple_levels ... ok [INFO] [stdout] test dir_move::test_ignored_group_names::ignored_multi_part_group_name_with_dots ... ok [INFO] [stdout] test dir_move::test_ignored_group_names::ignored_group_names_case_insensitive ... ok [INFO] [stdout] test dir_move::test_ignored_group_names::ignored_group_name_with_common_words ... ok [INFO] [stdout] test dir_move::test_ignored_group_names::empty_ignored_list_allows_all ... ok [INFO] [stdout] test dir_move::test_ignored_group_names::ignored_multi_part_group_name ... ok [INFO] [stdout] test dir_move::test_ignored_group_names::ignored_multi_part_group_name_with_spaces ... ok [INFO] [stdout] test dir_move::test_ignored_group_parts::empty_ignored_parts_allows_all ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::skips_existing_files_without_overwrite ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::recursive_merges_in_subdirectories ... ok [INFO] [stdout] test dir_move::test_parallel_grouping_consistency::parallel_handles_ignored_group_names_correctly ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::prefix_ignore_multiple_prefixes_stripped ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::recursive_deeply_nested ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::prefix_ignore_not_offered_as_dir_name ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::prefix_ignore_only_prefix_results_in_empty ... ok [INFO] [stdout] test dir_move::test_parallel_grouping_consistency::parallel_handles_ignored_group_parts_correctly ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::different_name_still_offered ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::prefix_ignore_stripped_from_dir_name ... ok [INFO] [stdout] test dir_move::test_merge_prefixed_directories::merges_prefixed_directory_into_non_prefixed ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::parent_dir_name_with_dots_matches_spaced ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::ignored_group_name_checked_after_prefix_strip ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::parent_dir_name_with_spaces_matches_concatenated ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::parent_dir_name_case_insensitive ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::parent_dir_name_not_offered_as_new_dir ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::prefix_ignore_not_in_create_mode_dir_name ... ok [INFO] [stdout] test dir_move::test_prefix_groups::dot_separated_and_concatenated_grouped_together ... ok [INFO] [stdout] test dir_move::test_prefix_groups::files_with_completely_different_prefixes ... ok [INFO] [stdout] test dir_move::test_prefix_groups::no_files_no_groups ... ok [INFO] [stdout] test dir_move::test_prefix_groups::order_by_prefix_length ... ok [INFO] [stdout] test dir_move::test_prefix_groups::prefix_ignores_and_overrides_combined ... ok [INFO] [stdout] test dir_move::test_prefix_groups::case_variations_grouped_together ... ok [INFO] [stdout] test dir_move::test_prefix_groups::same_prefix_different_case_grouped ... ok [INFO] [stdout] test dir_move::test_prefix_groups::files_appear_in_multiple_groups ... ok [INFO] [stdout] test dir_move::test_prefix_groups::prefix_ignores_strips_prefix_from_grouping ... ok [INFO] [stdout] test dir_move::test_prefix_groups::single_file_no_group ... ok [INFO] [stdout] test dir_move::test_prefix_groups::prefix_overrides_no_match_keeps_original ... ok [INFO] [stdout] test dir_move::test_prefix_groups::min_group_size_affects_grouping ... ok [INFO] [stdout] test dir_move::test_prefix_groups::prefers_concatenated_prefix_for_directory_name ... ok [INFO] [stdout] test dir_move::test_prefix_groups::prefix_overrides_merge_groups ... ok [INFO] [stdout] test dir_move::test_prefix_groups::prefix_overrides_multiple_overrides ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::case_insensitive_ignore ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::all_parts_are_ignored ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::dot_prefix_multiple_ignores ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::dot_prefix_single_ignore ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::multiple_ignores ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::ignore_in_middle_not_stripped ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::no_ignores ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::no_match ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::repeated_prefix_in_name ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::is_ignored_prefix_exact_match ... ok [INFO] [stdout] test dir_move::test_prefix_ignores::single_ignore ... ok [INFO] [stdout] test dir_move::test_prefix_overrides::empty_groups ... ok [INFO] [stdout] test dir_move::test_prefix_overrides::merges_groups ... ok [INFO] [stdout] test dir_move::test_prefix_overrides::multiple_overrides ... ok [INFO] [stdout] test dir_move::test_prefix_overrides::matching_override ... ok [INFO] [stdout] test dir_move::test_prefix_overrides::non_matching ... ok [INFO] [stdout] test dir_move::test_prefix_overrides::no_overrides ... ok [INFO] [stdout] test dir_move::test_prefix_overrides::partial_match_only ... ok [INFO] [stdout] test dir_move::test_prefix_overrides::override_with_case_sensitivity ... ok [INFO] [stdout] test dir_move::test_prefix_overrides::override_more_specific_than_prefix ... ok [INFO] [stdout] test dir_move::test_parallel_grouping_consistency::parallel_produces_deterministic_groups ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::contiguity_numbers_break_adjacency ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::contiguity_resolution_in_middle_does_not_break ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::contiguity_long_date_sequences ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::contiguity_mixed_separators_large_dataset ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::contiguity_glue_words_break_adjacency ... ok [INFO] [stdout] test dir_move::test_prefix_groups::min_group_size_respected_in_groups ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::contiguity_prefix_appears_multiple_times ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::empty_filename_parts_handled ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::contiguity_three_part_prefix_various_forms ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::contiguity_dotted_vs_concatenated_large_group ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::files_with_only_extension_no_prefix ... ok [INFO] [stdout] test dir_move::test_parent_directory_skipped::prefix_ignore_with_mixed_dotted_and_concatenated_names ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::alphanumeric_prefix_not_filtered ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::mixed_case_and_format_all_normalized_correctly ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::multiple_valid_groupings_all_offered ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::min_group_size_one_creates_single_file_groups ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::mixed_extensions_same_prefix_grouped ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::all_prefix_lengths_offered_complete_hierarchy ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::non_contiguous_parts_do_not_form_group ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::groups_sorted_by_specificity_longest_prefix_first ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::long_single_word_prefix_forms_valid_group ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::four_part_prefix_uses_three_part_max ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::rejected_group_files_remain_available_for_next_group ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::prefix_ignore_strips_common_prefixes_for_better_grouping ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::contiguity_extended_prefix_groups ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::hyphenated_names_treated_as_single_part ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::concatenated_vs_dotted_same_name_grouped_with_concat_preferred ... ok [INFO] [stdout] test dir_move::test_parallel_grouping_consistency::parallel_large_file_set_stress_test ... ok [INFO] [stdout] test dir_move::test_second_pass_starts_with_matching::multiple_extended_variants_all_added ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::files_with_numeric_and_resolution_parts_filtered_for_grouping ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::underscore_names_not_split ... ok [INFO] [stdout] test dir_move::test_second_pass_starts_with_matching::already_in_group_not_duplicated ... ok [INFO] [stdout] test dir_move::test_second_pass_starts_with_matching::starts_with_does_not_add_unrelated_files ... ok [INFO] [stdout] test dir_move::test_second_pass_starts_with_matching::contiguity_check_prevents_false_positive_in_second_pass ... ok [INFO] [stdout] test dir_move::test_second_pass_starts_with_matching::concatenated_variant_added_to_existing_group ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::very_long_filename_prefix_extraction ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::realistic_scenario_seven_files_four_share_two_part_prefix ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::case_insensitive_ignored_group_name_after_stripping ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::user_can_reject_specific_group_and_use_broader_one ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::substring_prefix_does_not_incorrectly_match ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::single_character_prefix_forms_group ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::mixed_content_multiple_distinct_groups_with_noise ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::case_insensitive_prefix_ignore_result ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::min_group_size_respected_correctly ... ok [INFO] [stdout] test dir_move::test_realistic_grouping::three_part_prefix_coexists_with_two_part_and_one_part ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::multi_word_ignored_group_name_after_stripping ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::prefix_ignore_partial_match_not_filtered ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::multiple_prefix_ignores_chain_to_ignored_group_name ... ok [INFO] [stdout] test dir_move::test_unpack::chain_with_files_at_multiple_levels ... ok [INFO] [stdout] test dir_move::test_unpack::alternating_match_non_match_dirs ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::empty_after_full_strip_is_skipped ... ok [INFO] [stdout] test dir_move::test_unpack::case_insensitive_dirname_match ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::valid_name_after_stripping_is_offered ... ok [INFO] [stdout] test dir_move::test_unpack::chain_with_non_matching_subdirs_moved_directly ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::partial_match_not_filtered ... ok [INFO] [stdout] test dir_move::test_unpack::dryrun_does_not_modify_files ... ok [INFO] [stdout] test dir_move::test_unpack::dryrun_preserves_empty_matched_directory ... ok [INFO] [stdout] test dir_move::test_prefix_groups::large_file_set_multiple_series ... ok [INFO] [stdout] test dir_move::test_unpack::deeply_nested_structure ... ok [INFO] [stdout] test dir_move::test_unpack::basic_preserves_structure_and_removes_matched_dir ... ok [INFO] [stdout] test dir_move::test_unpack::does_not_prune_unrelated_empty_dirs ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::stripped_name_matches_ignored_group_name_not_offered ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::real_world_scenario_release_group_filtering ... ok [INFO] [stdout] test dir_move::test_unpack::collect_candidates_filters_nested ... ok [INFO] [stdout] test dir_move::test_stripped_name_filtering_integration::stripped_name_is_prefix_ignore_not_offered ... ok [INFO] [stdout] test dir_move::test_unpack::moves_non_matching_dirs_directly ... ok [INFO] [stdout] test dir_move::test_unpack::mixed_files_and_directories ... ok [INFO] [stdout] test dir_move::test_unpack::handles_special_characters_in_names ... ok [INFO] [stdout] test dir_move::test_unpack::multiple_matching_dirs_at_different_levels ... ok [INFO] [stdout] test dir_move::test_unpack::nested_chain_multiple_non_matching_dirs ... ok [INFO] [stdout] test dir_move::test_unpack::nested_chain_with_non_matching_dir_between ... ok [INFO] [stdout] test dir_move::test_unpack::collect_info_counts_correctly ... ok [INFO] [stdout] test dir_move::test_unpack::contains_unpack_directory_helper ... ok [INFO] [stdout] test dir_move::test_unpack::nested_chain_single_summary ... ok [INFO] [stdout] test dir_move::test_unpack::multiple_unpack_names ... ok [INFO] [stdout] test dir_move::test_unpack::empty_unpack_names_does_nothing ... ok [INFO] [stdout] test dir_move::test_unpack::nested_matching_dirs_are_flattened ... ok [INFO] [stdout] test dir_move::test_unpack::no_matching_directories ... ok [INFO] [stdout] test dir_move::test_unpack::non_recursive_only_checks_root_level ... ok [INFO] [stdout] test dir_move::test_unwanted_directories::collect_unwanted_and_unpack_combined ... ok [INFO] [stdout] test dir_move::test_unpack::preserves_file_content ... ok [INFO] [stdout] test dir_move::test_unwanted_directories::deleted ... ok [INFO] [stdout] test dir_move::test_unwanted_directories::skipped_in_collect_directories ... ok [INFO] [stdout] test dir_move::test_unwanted_directories::dryrun_preserves ... ok [INFO] [stdout] test dir_move::test_unpack::skips_existing_file_without_overwrite ... ok [INFO] [stdout] test dir_move::test_unpack::skips_existing_directory_without_overwrite ... ok [INFO] [stdout] test dir_move::test_unwanted_directories::case_insensitive ... ok [INFO] [stdout] test dir_move::test_unpack::separate_trees_get_separate_processing ... ok [INFO] [stdout] test dir_move::test_unpack::overwrites_existing_file_with_overwrite ... ok [INFO] [stdout] test dir_move::test_unwanted_directories::deleted_recursive ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::distinct_studio_names_form_separate_groups ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::broader_group_includes_extended_names ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::files_without_dots_form_single_groups ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::mixed_content_with_noise_files ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::prefix_ignore_case_insensitive ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::dotted_vs_concatenated_with_varied_prefixes ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::prefix_ignore_does_not_strip_from_middle ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::empty_prefix_ignore_list_no_effect ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::count_prefix_chars_helper_works_correctly ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::dotted_prefix_char_count_excludes_dots ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::near_match_extra_prefix_not_grouped ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::single_letter_prefix_ignore ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::dotted_prefix_included_when_chars_meet_threshold ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::exact_threshold_includes_prefix ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::numeric_looking_prefix_ignore ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::multiple_prefix_ignores_comprehensive ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::specific_groups_separate_from_unrelated_names ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::long_prefix_always_included ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::prefix_ignore_groups_files_with_and_without_prefix ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::prefix_ignore_multiple_ignored_prefixes ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::prefix_ignore_with_similar_non_matching_files ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::completely_different_files_isolated ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::integration_dotted_short_prefix_excluded ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::high_threshold_excludes_most_single_words ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::near_match_similar_names_different_groups ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::emoji_prefix_counted_as_chars ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::min_chars_zero_allows_all ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::substring_in_middle_not_matched ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::config_override_allows_short_prefixes ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::high_threshold_excludes_all_short_dotted ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::short_prefix_excluded_with_default_min_chars ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::min_chars_one_allows_single_char ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::three_part_dotted_prefix_char_count ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::short_prefix_included_with_low_min_chars ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::three_part_dotted_prefix_included_when_long_enough ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::integration_dotted_long_prefix_included ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::common_short_words_excluded ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::two_part_prefix_affected_by_min_chars ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::unicode_chars_counted_correctly ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::threshold_exact_boundary_dotted ... ok [INFO] [stdout] test types::test_casing_score::all_lowercase_scores_zero ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::mixed_lengths_correct_grouping ... ok [INFO] [stdout] test types::test_casing_score::all_uppercase_scores_second ... ok [INFO] [stdout] test types::test_casing_score::mixed_case_starting_lowercase_scores_third ... ok [INFO] [stdout] test types::test_filtered_parts_new::many_parts_produce_correct_combination_counts ... ok [INFO] [stdout] test types::test_filtered_parts_new::preserves_original_casing ... ok [INFO] [stdout] test types::test_casing_score::empty_string_scores_zero ... ok [INFO] [stdout] test types::test_filtered_parts_new::single_part_name_has_no_combinations ... ok [INFO] [stdout] test types::test_filtered_parts_new::single_parts_split_correctly ... ok [INFO] [stdout] test types::test_filtered_parts_new::three_part_combinations_computed ... ok [INFO] [stdout] test types::test_filtered_parts_new::two_part_name_has_no_three_part_combinations ... ok [INFO] [stdout] test types::test_filtered_parts_new::lowercased_parts_are_consistent_with_original ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::empty_target_matches_nothing ... ok [INFO] [stdout] test types::test_filtered_parts_new::empty_string_produces_single_empty_part ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::intense_not_matched_by_intensely ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::threshold_zero_allows_all_dotted_prefixes ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::all_uppercase_name_with_word_boundary ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::intense_exact_match ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::match_at_middle_position ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::prefix_not_at_start_of_any_part ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::no_match_returns_false ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::scandic_single_part_exact_match ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::scandic_starts_with_scandic_uppercase_boundary ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::scandic_starts_with_uppercase_boundary ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::scandic_starts_with_scandic_lowercase_rejected ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::scandic_two_part_combined_exact_match ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::scandic_two_part_combined_with_uppercase_boundary ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::single_part_exact_match ... ok [INFO] [stdout] test dir_move::test_word_boundary_grouping::lowercase_suffix_not_grouped_with_base ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::single_part_exact_match_case_insensitive ... ok [INFO] [stdout] test dir_move::test_word_boundary_grouping::intense_and_intensely_not_grouped_together ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::scandic_starts_with_lowercase_rejected ... ok [INFO] [stdout] test dir_move::test_word_boundary_grouping::camel_case_boundary_still_groups_correctly ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::three_part_prefix_with_ignores_and_noise ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::unicode_dotted_prefix_counted_correctly ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::single_part_file_exact_match ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::single_part_file_no_match ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::short_names_not_grouped_with_default_config ... ok [INFO] [stdout] test dir_move::test_varied_prefix_grouping::test_min_prefix_chars::mixed_dotted_and_single_word_with_threshold ... ok [INFO] [stdout] test types::test_filtered_parts_new::two_part_combinations_computed ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::starts_with_at_word_boundary_uppercase ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::starts_with_rejected_at_lowercase_continuation ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::three_part_combined_exact_match ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::three_part_combined_starts_with_at_word_boundary ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::three_part_combined_starts_with_rejected_at_lowercase ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::scandic_two_part_combined_with_lowercase_rejected ... ok [INFO] [stdout] test dir_move::test_word_boundary_grouping::digit_boundary_groups_correctly ... ok [INFO] [stdout] test types::test_casing_score::camel_case_scores_highest ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::starts_with_at_digit_boundary ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::two_part_combined_starts_with_at_word_boundary ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::two_part_combined_starts_with_rejected_at_lowercase ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::two_part_match_at_middle_position ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::two_part_combined_exact_match ... ok [INFO] [stdout] test types::test_filtered_parts_prefix_matches::umlaut_prefix_not_confused_with_ascii ... ok [INFO] [stdout] test types::test_is_better_prefix::all_uppercase_preferred_over_all_lowercase ... ok [INFO] [stdout] test types::test_is_better_prefix::camel_case_preferred_over_all_lowercase ... ok [INFO] [stdout] test types::test_is_better_prefix::alphabetical_order_breaks_ties ... ok [INFO] [stdout] test types::test_is_better_prefix::same_prefix_not_better ... ok [INFO] [stdout] test types::test_is_better_prefix::camel_case_preferred_over_all_uppercase ... ok [INFO] [stdout] test utils::test_contiguity::case_insensitive_concatenated_reverse ... ok [INFO] [stdout] test utils::test_contiguity::case_insensitive_mixed_case ... ok [INFO] [stdout] test utils::test_contiguity::case_insensitive_concatenated ... ok [INFO] [stdout] test utils::test_contiguity::concatenated_prefix_matches_dotted_original ... ok [INFO] [stdout] test utils::test_contiguity::case_insensitive_exact_match ... ok [INFO] [stdout] test utils::test_contiguity::dotted_three_part_prefix_matches_concatenated ... ok [INFO] [stdout] test utils::test_contiguity::empty_prefix_parts ... ok [INFO] [stdout] test utils::test_contiguity::episode_code_as_part ... ok [INFO] [stdout] test utils::test_contiguity::dotted_prefix_matches_concatenated_original ... ok [INFO] [stdout] test utils::test_contiguity::exact_concatenated_match_not_substring ... ok [INFO] [stdout] test utils::test_contiguity::exact_single_part_match ... ok [INFO] [stdout] test utils::test_contiguity::exact_three_part_match_at_start ... ok [INFO] [stdout] test utils::test_contiguity::concatenated_three_part_prefix_matches_dotted ... ok [INFO] [stdout] test utils::test_contiguity::extended_dotted_prefix_matches_concatenated ... ok [INFO] [stdout] test utils::test_contiguity::exact_two_part_match_at_end ... ok [INFO] [stdout] test utils::test_contiguity::exact_two_part_match_in_middle ... ok [INFO] [stdout] test utils::test_contiguity::extended_prefix_all_forms_match ... ok [INFO] [stdout] test utils::test_contiguity::exact_two_part_match_at_start ... ok [INFO] [stdout] test utils::test_contiguity::extended_prefix_matches ... ok [INFO] [stdout] test utils::test_contiguity::extended_prefix_matches_longer_concatenated ... ok [INFO] [stdout] test utils::test_contiguity::extended_single_part_prefix_matches ... ok [INFO] [stdout] test utils::test_contiguity::extended_single_part_prefix_various_extensions ... ok [INFO] [stdout] test utils::test_contiguity::long_filename_match_at_start ... ok [INFO] [stdout] test utils::test_contiguity::long_filename_match_deep_in_middle ... ok [INFO] [stdout] test utils::test_contiguity::mixed_concatenated_in_middle ... ok [INFO] [stdout] test utils::test_contiguity::matches_first_occurrence ... ok [INFO] [stdout] test utils::test_contiguity::numeric_parts_are_literal ... ok [INFO] [stdout] test utils::test_contiguity::long_filename_non_contiguous ... ok [INFO] [stdout] test utils::test_contiguity::partial_match_not_sufficient ... ok [INFO] [stdout] test utils::test_contiguity::prefix_longer_than_filename ... ok [INFO] [stdout] test utils::test_contiguity::parts_in_wrong_order ... ok [INFO] [stdout] test utils::test_contiguity::prefix_matches_entire_filename_except_extension ... ok [INFO] [stdout] test utils::test_contiguity::prefix_matches_including_extension_part ... ok [INFO] [stdout] test utils::test_contiguity::prefix_part_not_in_filename ... ok [INFO] [stdout] test utils::test_contiguity::realistic_adult_site_with_date ... ok [INFO] [stdout] test utils::test_contiguity::realistic_adult_site_without_date ... ok [INFO] [stdout] test utils::test_contiguity::realistic_movie_title_contiguous ... ok [INFO] [stdout] test utils::test_contiguity::realistic_movie_with_year ... ok [INFO] [stdout] test utils::test_contiguity::realistic_tv_show_pattern ... ok [INFO] [stdout] test utils::test_contiguity::repeated_single_part ... ok [INFO] [stdout] test utils::test_contiguity::resolution_pattern_as_part ... ok [INFO] [stdout] test utils::test_contiguity::single_concatenated_prefix_matches_three_dotted ... ok [INFO] [stdout] test utils::test_contiguity::single_part_filename ... ok [INFO] [stdout] test utils::test_contiguity::three_parts_with_gap_in_middle ... ok [INFO] [stdout] test utils::test_contiguity::three_variations_of_same_name_concatenated ... ok [INFO] [stdout] test utils::test_contiguity::three_variations_of_same_name_dotted ... ok [INFO] [stdout] test utils::test_contiguity::three_variations_of_same_name_partial_concat ... ok [INFO] [stdout] test utils::test_contiguity::three_variations_reverse_partial_concat ... ok [INFO] [stdout] test utils::test_contiguity::two_parts_separated_by_date ... ok [INFO] [stdout] test utils::test_contiguity::two_parts_separated_by_single_number ... ok [INFO] [stdout] test utils::test_contiguity::two_parts_separated_by_word ... ok [INFO] [stdout] test utils::test_contiguity::very_long_concatenated_name ... ok [INFO] [stdout] test utils::test_contiguity::very_long_dotted_name_matches_concatenated ... ok [INFO] [stdout] test utils::test_file_extension_exclusion::double_extension_only_last_excluded ... ok [INFO] [stdout] test utils::test_file_extension_exclusion::extension_case_insensitive_exclusion ... ok [INFO] [stdout] test utils::test_file_extension_exclusion::extension_not_included_as_candidate ... ok [INFO] [stdout] test utils::test_file_extension_exclusion::extension_not_included_even_when_common ... ok [INFO] [stdout] test utils::test_file_extension_exclusion::extension_not_part_of_multi_part_candidate ... ok [INFO] [stdout] test utils::test_file_extension_exclusion::long_extension_excluded ... ok [INFO] [stdout] test utils::test_file_extension_exclusion::name_that_looks_like_extension_at_non_extension_position ... ok [INFO] [stdout] test utils::test_filtering::all_numeric_except_extension ... ok [INFO] [stdout] test utils::test_file_extension_exclusion::valid_candidates_still_found_without_extension ... ok [INFO] [stdout] test utils::test_filtering::case_insensitive_resolution ... ok [INFO] [stdout] test utils::test_filtering::complex_filtering_year_resolution_glue ... ok [INFO] [stdout] test utils::test_filtering::consecutive_dots ... ok [INFO] [stdout] test utils::test_filtering::empty_string ... ok [INFO] [stdout] test utils::test_filtering::generic_movie_name ... ok [INFO] [stdout] test utils::test_filtering::generic_tv_show ... ok [INFO] [stdout] test utils::test_filtering::glue_words_case_insensitive ... ok [INFO] [stdout] test utils::test_filtering::keeps_4k_not_matched_by_resolution_regex ... ok [INFO] [stdout] test utils::test_filtering::multiple_resolutions ... ok [INFO] [stdout] test utils::test_filtering::no_numeric_parts ... ok [INFO] [stdout] test utils::test_filtering::only_extension_left ... ok [INFO] [stdout] test utils::test_filtering::preserves_episode_codes ... ok [INFO] [stdout] test utils::test_filtering::removes_1080p ... ok [INFO] [stdout] test utils::test_filtering::removes_2160p ... ok [INFO] [stdout] test utils::test_filtering::removes_720p ... ok [INFO] [stdout] test utils::test_filtering::removes_all_glue_words ... ok [INFO] [stdout] test utils::test_filtering::removes_and_glue_word ... ok [INFO] [stdout] test utils::test_filtering::removes_multiple_glue_words ... ok [INFO] [stdout] test utils::test_filtering::removes_dimension_format ... ok [INFO] [stdout] test utils::test_filtering::removes_multiple_numeric ... ok [INFO] [stdout] test utils::test_filtering::removes_smaller_dimension ... ok [INFO] [stdout] test utils::test_filtering::keeps_mixed_alphanumeric ... ok [INFO] [stdout] test utils::test_filtering::no_dots_in_name ... ok [INFO] [stdout] test utils::test_filtering::removes_the_glue_word ... ok [INFO] [stdout] test utils::test_filtering::removes_year ... ok [INFO] [stdout] test utils::test_filtering::single_part ... ok [INFO] [stdout] test utils::test_get_all_n_part_sequences::four_part_sequences_exact_length ... ok [INFO] [stdout] test utils::test_get_all_n_part_sequences::no_dots_multi_part_returns_empty ... ok [INFO] [stdout] test utils::test_get_all_n_part_sequences::no_dots_single_part ... ok [INFO] [stdout] test utils::test_get_all_n_part_sequences::realistic_filename ... ok [INFO] [stdout] test utils::test_get_all_n_part_sequences::realistic_filename_three_parts ... ok [INFO] [stdout] test utils::test_get_all_n_part_sequences::single_part_sequences ... ok [INFO] [stdout] test utils::test_get_all_n_part_sequences::three_part_sequences ... ok [INFO] [stdout] test utils::test_get_all_n_part_sequences::two_part_sequences ... ok [INFO] [stdout] test utils::test_get_all_n_part_sequences::too_few_parts ... ok [INFO] [stdout] test utils::test_get_all_n_part_sequences::zero_parts_returns_empty ... ok [INFO] [stdout] test utils::test_normalize_name::normalize_name_function ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::matches_original_case_insensitive ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::empty_prefix_always_matches ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::matches_original_concatenated_form ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::matches_original_exact_single_part ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::matches_original_exact_two_parts ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::matches_original_extended_starts_with ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::middle_position_match ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::matches_original_reverse_split ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::no_match_returns_false ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::matches_original_non_contiguous_rejected ... ok [INFO] [stdout] test utils::test_parts_are_contiguous_precomputed::three_part_contiguous ... ok [INFO] [stdout] test utils::test_position_agnostic_matching::concatenated_and_dotted_at_various_positions ... ok [INFO] [stdout] test utils::test_position_agnostic_matching::group_name_at_various_positions ... ok [INFO] [stdout] test utils::test_position_agnostic_matching::dotted_group_name_in_middle ... ok [INFO] [stdout] test utils::test_position_agnostic_matching::group_name_in_middle_of_filename ... ok [INFO] [stdout] test utils::test_position_agnostic_matching::mixed_prefix_and_middle_positions ... ok [INFO] [stdout] test utils::test_position_agnostic_matching::prefix_matches_normalized_three_part_anywhere ... ok [INFO] [stdout] test utils::test_prefix_candidates::case_insensitive_prefix_matching ... ok [INFO] [stdout] test utils::test_position_agnostic_matching::prefix_matches_normalized_two_part_anywhere ... ok [INFO] [stdout] test utils::test_prefix_candidates::dot_separated_three_parts_matches_concatenated ... ok [INFO] [stdout] test utils::test_prefix_candidates::dot_separated_matches_concatenated ... ok [INFO] [stdout] test utils::test_position_agnostic_matching::prefix_matches_normalized_finds_anywhere ... ok [INFO] [stdout] test utils::test_prefix_candidates::dot_separated_with_mixed_case ... ok [INFO] [stdout] test utils::test_prefix_candidates::dot_separated_two_parts_match_single_word ... ok [INFO] [stdout] test utils::test_prefix_candidates::file_not_in_list ... ok [INFO] [stdout] test utils::test_position_agnostic_matching::realistic_scenario_with_dates_in_middle ... ok [INFO] [stdout] test utils::test_prefix_candidates::empty_file_list ... ok [INFO] [stdout] test utils::test_prefix_candidates::high_min_group_size_filters_all ... ok [INFO] [stdout] test utils::test_prefix_candidates::fallback_to_two_part_when_no_three_part_matches ... ok [INFO] [stdout] test utils::test_prefix_candidates::identical_single_word_prefix_grouped ... ok [INFO] [stdout] test utils::test_prefix_candidates::long_name_decade_in_title ... ok [INFO] [stdout] test utils::test_prefix_candidates::long_name_documentary_with_regions ... ok [INFO] [stdout] test utils::test_prefix_candidates::long_name_franchise_with_year_variations ... ok [INFO] [stdout] test utils::test_prefix_candidates::long_name_with_year_after_prefix ... ok [INFO] [stdout] test utils::test_prefix_candidates::long_name_with_version_and_year ... ok [INFO] [stdout] test utils::test_prefix_candidates::identical_prefix_files_are_grouped ... ok [INFO] [stdout] test utils::test_prefix_candidates::min_group_size_at_exact_threshold ... ok [INFO] [stdout] test utils::test_prefix_candidates::many_files_same_prefix ... ok [INFO] [stdout] test utils::test_prefix_candidates::min_group_size_filters_small_groups ... ok [INFO] [stdout] test utils::test_prefix_candidates::no_matches_below_threshold ... ok [INFO] [stdout] test utils::test_prefix_candidates::long_name_with_date_after_prefix ... ok [INFO] [stdout] test utils::test_prefix_candidates::min_group_size_one_matches_single_file ... ok [INFO] [stdout] test utils::test_prefix_candidates::mixed_years_without_filtering ... ok [INFO] [stdout] test utils::test_prefix_candidates::normalize_name_removes_dots_spaces_and_lowercases ... ok [INFO] [stdout] test utils::test_prefix_candidates::min_group_size_one ... ok [INFO] [stdout] test utils::test_prefix_candidates::numeric_filtering_groups_correctly ... ok [INFO] [stdout] test utils::test_prefix_candidates::long_name_mixed_year_positions ... ok [INFO] [stdout] test utils::test_prefix_candidates::long_name_season_with_year_in_name ... ok [INFO] [stdout] test utils::test_prefix_candidates::mixed_case_variations_all_group_together ... ok [INFO] [stdout] test utils::test_prefix_candidates::prefix_matches_normalized_no_match ... ok [INFO] [stdout] test utils::test_prefix_candidates::prefix_matches_normalized_starts_with ... ok [INFO] [stdout] test utils::test_prefix_candidates::movie_series_with_years ... ok [INFO] [stdout] test utils::test_prefix_candidates::prefix_matches_normalized_two_parts ... ok [INFO] [stdout] test utils::test_prefix_candidates::prefix_matches_normalized_single_part ... ok [INFO] [stdout] test utils::test_prefix_candidates::prioritizes_longer_prefix ... ok [INFO] [stdout] test utils::test_prefix_candidates::respects_min_group_size ... ok [INFO] [stdout] test utils::test_prefix_candidates::short_names_with_extensions ... ok [INFO] [stdout] test utils::test_prefix_candidates::mixed_prefixes_different_third_parts ... ok [INFO] [stdout] test utils::test_prefix_candidates::only_two_files_high_threshold ... ok [INFO] [stdout] test utils::test_prefix_candidates::prefix_matches_normalized_three_parts ... ok [INFO] [stdout] test utils::test_prefix_candidates::prefers_longer_prefix_over_short_with_more_matches ... ok [INFO] [stdout] test utils::test_prefix_candidates::simple_prefix_multiple_files ... ok [INFO] [stdout] test utils::test_prefix_candidates::single_file_no_match ... ok [INFO] [stdout] test utils::test_prefix_candidates::single_word_fallback ... ok [INFO] [stdout] test utils::test_prefix_candidates::three_part_prefix_with_mixed_fourth_parts ... ok [INFO] [stdout] test utils::test_word_boundary::digit_after_digit_is_not_boundary ... ok [INFO] [stdout] test utils::test_prefix_candidates::returns_all_viable_options_for_alternatives ... ok [INFO] [stdout] test utils::test_word_boundary::digit_after_scandic_letter_is_boundary ... ok [INFO] [stdout] test utils::test_word_boundary::lowercase_after_prefix_is_not_boundary ... ok [INFO] [stdout] test utils::test_prefix_candidates::with_filtered_numeric_parts ... ok [INFO] [stdout] test utils::test_prefix_candidates::three_part_dot_separated_match_single_word ... ok [INFO] [stdout] test utils::test_word_boundary::camel_case_multi_word ... ok [INFO] [stdout] test utils::test_word_boundary::lowercase_continuation_rejected ... ok [INFO] [stdout] test utils::test_prefix_candidates::tv_show_season_episodes ... ok [INFO] [stdout] test utils::test_word_boundary::mid_codepoint_position_returns_false ... ok [INFO] [stdout] test utils::test_position_agnostic_matching::group_name_not_found_when_not_contiguous ... ok [INFO] [stdout] test utils::test_prefix_candidates::tv_show_generic_scenario ... ok [INFO] [stdout] test utils::test_prefix_candidates::long_name_with_only_year_after_prefix ... ok [INFO] [stdout] test utils::test_word_boundary::digit_after_letter_is_boundary ... ok [INFO] [stdout] test utils::test_word_boundary::real_world_photolab_pro ... ok [INFO] [stdout] test utils::test_word_boundary::real_world_photolabs ... ok [INFO] [stdout] test utils::test_word_boundary::exact_match_is_boundary ... ok [INFO] [stdout] test utils::test_word_boundary::letter_after_digit_is_boundary ... ok [INFO] [stdout] test utils::test_word_boundary::beyond_string_length_is_boundary ... ok [INFO] [stdout] test utils::test_word_boundary::scandic_uppercase_after_prefix_is_boundary ... ok [INFO] [stdout] test utils::test_word_boundary::uppercase_after_prefix_is_boundary ... ok [INFO] [stdout] test utils::test_word_boundary::uppercase_continuation_accepted ... ok [INFO] [stdout] test utils::test_word_boundary::scandic_lowercase_continuation_not_boundary ... ok [INFO] [stdout] test utils::test_word_boundary::scandic_uppercase_after_scandic_prefix_is_boundary ... ok [INFO] [stdout] test utils::test_word_boundary::scandic_chars_preserve_boundary_logic_in_prefix ... ok [INFO] [stdout] test utils::test_word_boundary::scandic_lowercase_after_prefix_is_not_boundary ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 592 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.39s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/divider.rs (/opt/rustwide/target/debug/deps/div-f0e874e3c80fbd7c) [INFO] [stdout] [INFO] [stdout] running 7 tests [INFO] [stdout] test div_tests::test_aligned_divider_basic ... ok [INFO] [stdout] test div_tests::test_aligned_divider_no_text ... ok [INFO] [stdout] test div_tests::test_aligned_divider_with_padding ... ok [INFO] [stdout] test div_tests::test_centered_divider_basic ... ok [INFO] [stdout] test div_tests::test_centered_divider_empty ... ok [INFO] [stdout] test div_tests::test_centered_divider_no_text ... ok [INFO] [stdout] test div_tests::test_centered_divider_long_text ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/dots/main.rs (/opt/rustwide/target/debug/deps/dots-72a8700bbb3e0768) [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 unittests src/bin/dupe_find/main.rs (/opt/rustwide/target/debug/deps/dupefind-61a777fc91302865) [INFO] [stdout] [INFO] [stdout] running 83 tests [INFO] [stdout] test cli_args_tests::empty_by_default ... ok [INFO] [stdout] test cli_args_tests::parses_combined_flags ... ok [INFO] [stdout] test cli_args_tests::parses_complex_regex_pattern ... ok [INFO] [stdout] test cli_args_tests::parses_long_form_extension ... ok [INFO] [stdout] test cli_args_tests::parses_default_paths_flag ... ok [INFO] [stdout] test cli_args_tests::parses_multiple_extension_args ... ok [INFO] [stdout] test cli_args_tests::parses_multiple_paths ... ok [INFO] [stdout] test config::dupe_config_tests::from_toml_str_ignores_other_sections ... ok [INFO] [stdout] test config::dupe_config_tests::from_toml_str_parses_dupefind_section ... ok [INFO] [stdout] test config::dupe_config_tests::from_toml_str_invalid_toml_returns_error ... ok [INFO] [stdout] test cli_args_tests::parses_multiple_pattern_args ... ok [INFO] [stdout] test config::dupe_config_tests::from_toml_str_parses_empty_config ... ok [INFO] [stdout] test config::dupe_config_tests::from_toml_str_parses_extensions ... ok [INFO] [stdout] test cli_args_tests::parses_move_flag ... ok [INFO] [stdout] test config::dupe_config_tests::from_toml_str_parses_ignore_matches ... ok [INFO] [stdout] test cli_args_tests::parses_long_form_pattern ... ok [INFO] [stdout] test config::dupe_config_tests::from_toml_str_parses_patterns ... ok [INFO] [stdout] test cli_args_tests::parses_paths_with_patterns_and_extensions ... ok [INFO] [stdout] test config_from_args_tests::config_debug_flag_enables_debug ... ok [INFO] [stdout] test config::dupe_config_tests::from_toml_str_parses_paths ... ok [INFO] [stdout] test dupe_find::test_display_name::falls_back_to_key_for_empty_group ... ok [INFO] [stdout] test dupe_find::test_display_name::falls_back_to_key_when_only_some_files_match ... ok [INFO] [stdout] test cli_args_tests::parses_debug_flag ... ok [INFO] [stdout] test config_from_args_tests::config_verbose_flag_enables_verbose ... ok [INFO] [stdout] test config_from_args_tests::config_rejects_invalid_regex ... ok [INFO] [stdout] test config_from_args_tests::config_includes_cli_extensions_normalized ... ok [INFO] [stdout] test config_from_args_tests::config_print_enables_dryrun ... ok [INFO] [stdout] test config_from_args_tests::config_move_flag_enables_move_files ... ok [INFO] [stdout] test config_from_args_tests::config_has_extensions ... ok [INFO] [stdout] test dupe_find::test_display_name::matches_numeric_only_identifier ... ok [INFO] [stdout] test dupe_find::test_display_name::matches_pattern_with_mixed_separators ... ok [INFO] [stdout] test dupe_find::test_display_name::matches_short_alphanumeric_code ... ok [INFO] [stdout] test dupe_find::test_display_name::uses_common_pattern_text_when_all_files_match ... ok [INFO] [stdout] test config_from_args_tests::config_includes_cli_regex_patterns ... ok [INFO] [stdout] test dupe_find::test_display_name::uses_pattern_text_for_single_file_with_match ... ok [INFO] [stdout] test dupe_find::test_display_name::matches_alphabetic_only_identifier ... ok [INFO] [stdout] test dupe_find::test_display_name::uses_pattern_text_with_different_casing ... ok [INFO] [stdout] test dupe_find::test_filter_ignored_groups::comparison_is_case_insensitive ... ok [INFO] [stdout] test config_from_args_tests::config_recurse_flag_enables_recurse ... ok [INFO] [stdout] test dupe_find::test_display_name::matches_episode_pattern_with_letters_and_numbers ... ok [INFO] [stdout] test dupe_find::test_display_name::falls_back_to_key_when_pattern_texts_differ ... ok [INFO] [stdout] test dupe_find::test_display_name::falls_back_to_key_when_no_pattern_matches ... ok [INFO] [stdout] test dupe_find::test_filter_ignored_groups::does_not_filter_partial_matches ... ok [INFO] [stdout] test dupe_find::test_filter_ignored_groups::filters_group_by_key_match ... ok [INFO] [stdout] test dupe_find::test_filter_ignored_groups::filters_multiple_ignored_patterns ... ok [INFO] [stdout] test dupe_find::test_filter_ignored_groups::filters_group_by_pattern_match_display_name ... ok [INFO] [stdout] test dupe_find::test_filter_ignored_groups::keeps_all_groups_when_no_ignores_configured ... ok [INFO] [stdout] test dupe_find::test_video_info_resolution_string::formats_resolution ... ok [INFO] [stdout] test dupe_find::test_display_name::matches_pattern_at_different_positions_in_filenames ... ok [INFO] [stdout] test dupe_find::test_filter_ignored_groups::filters_by_numeric_pattern_display_name ... ok [INFO] [stdout] test dupe_find::test_video_info_resolution_string::returns_none_when_resolution_missing ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_empty_input ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_first_pattern_takes_priority ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_by_normalized_name ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_pattern_same_identifier_different_case_in_name ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_pattern_at_different_positions ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_pattern_with_special_chars_in_path ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_by_pattern ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_multiple_patterns ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_single_file ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_pattern_multiple_roots ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_get_unique_path_no_extension ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_pattern_overlapping_with_resolution ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_get_unique_path_no_conflict ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_by_exact_filename ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_with_resolution_variants ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_normalize_stem_case_insensitive ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_format_filename_with_highlight_no_match ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_no_duplicates ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_pattern_same_root ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_normalize_stem_fallback_to_original ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_pattern_nested_subdirs ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_normalize_stem_cleans_multiple_spaces ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_normalize_stem_removes_codec ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_normalize_stem_removes_both ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_normalize_stem_cleans_multiple_dots ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_normalize_stem_removes_resolution ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_merges_groups ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_normalize_stem_same_base ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_normalize_stem_trims_separators ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_normalize_stem_preserves_content ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_pattern_varied_naming_styles ... ok [INFO] [stdout] test dupe_find::tests_dupe_find::test_find_duplicates_many_patterns_many_files ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 83 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/flip_date/main.rs (/opt/rustwide/target/debug/deps/flipdate-c1b3ca6d5ebde510) [INFO] [stdout] [INFO] [stdout] running 25 tests [INFO] [stdout] test config::config_from_args_tests::from_args_cli_overrides_defaults ... ok [INFO] [stdout] test config::config_from_args_tests::from_args_uses_cli_extensions ... ok [INFO] [stdout] test config::config_from_args_tests::from_args_uses_default_extensions ... ok [INFO] [stdout] test config::date_config_tests::from_toml_str_ignores_other_sections ... ok [INFO] [stdout] test config::date_config_tests::from_toml_str_parses_empty_config ... ok [INFO] [stdout] test config::date_config_tests::from_toml_str_invalid_toml_returns_error ... ok [INFO] [stdout] test config::date_config_tests::from_toml_str_parses_file_extensions ... ok [INFO] [stdout] test config::date_config_tests::default_values_are_correct ... ok [INFO] [stdout] test config::date_config_tests::from_toml_str_parses_flip_date_section ... ok [INFO] [stdout] test config::date_config_tests::from_toml_str_parses_overwrite_and_swap ... ok [INFO] [stdout] test flip_date::tests::test_default_file_extensions ... ok [INFO] [stdout] test flip_date::tests::test_files_to_rename_empty_directory ... ok [INFO] [stdout] test flip_date::tests::test_rename_item_creation ... ok [INFO] [stdout] test flip_date::tests::test_files_to_rename_no_matching_extensions ... ok [INFO] [stdout] test flip_date::tests::test_files_to_rename_returns_sorted ... ok [INFO] [stdout] test flip_date::tests::test_files_to_rename_single_file ... ok [INFO] [stdout] test flip_date::tests::test_files_to_rename_filters_by_extension ... ok [INFO] [stdout] test flip_date::tests::test_files_to_rename_recursive ... ok [INFO] [stdout] test flip_date::tests::test_files_to_rename_non_recursive ... ok [INFO] [stdout] test flip_date::tests::test_directories_to_rename_recursive ... ok [INFO] [stdout] test flip_date::tests::test_directories_to_rename_sorted_case_insensitive ... ok [INFO] [stdout] test flip_date::tests::test_directories_to_rename_non_recursive ... ok [INFO] [stdout] test flip_date::tests::test_directories_to_rename_already_correct_format ... ok [INFO] [stdout] test flip_date::tests::test_directories_to_rename_no_dates ... ok [INFO] [stdout] test flip_date::tests::test_directories_to_rename_with_date ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/qtorrent/main.rs (/opt/rustwide/target/debug/deps/qtorrent-4f60f2338c7a605f) [INFO] [stdout] [INFO] [stdout] running 244 tests [INFO] [stdout] test add::normalize_rename_options::no_internal_returns_suggested_only ... ok [INFO] [stdout] test add::test_check_existing_torrent::matches_case_insensitively ... ok [INFO] [stdout] test add::test_check_existing_torrent::returns_name_when_hash_matches ... ok [INFO] [stdout] test add::test_check_existing_torrent::returns_none_when_hash_not_found ... ok [INFO] [stdout] test add::test_check_existing_torrent::finds_among_multiple_torrents ... ok [INFO] [stdout] test add::test_excluded_file_priorities::all_excluded_indices_have_matching_priority ... ok [INFO] [stdout] test add::test_excluded_file_priorities::all_excluded_indices_present_with_non_contiguous_ids ... ok [INFO] [stdout] test add::test_excluded_file_priorities::empty_excluded_indices_always_exist ... ok [INFO] [stdout] test add::test_excluded_file_priorities::empty_excluded_indices_always_have_priority ... ok [INFO] [stdout] test add::test_excluded_file_priorities::priority_check_fails_when_index_does_not_exist ... ok [INFO] [stdout] test add::test_excluded_file_priorities::priority_check_fails_when_one_index_has_wrong_priority ... ok [INFO] [stdout] test add::test_excluded_file_priorities::priority_check_with_single_file ... ok [INFO] [stdout] test add::test_excluded_file_priorities::empty_api_files_means_no_indices_exist ... ok [INFO] [stdout] test add::test_excluded_file_priorities::returns_false_when_any_excluded_index_missing ... ok [INFO] [stdout] test add::test_excluded_file_priorities::single_excluded_index_missing ... ok [INFO] [stdout] test add::test_check_existing_torrent::returns_none_when_map_is_empty ... ok [INFO] [stdout] test add::normalize_rename_options::both_without_extension_different_names ... ok [INFO] [stdout] test add::normalize_rename_options::non_extension_dots_not_treated_as_extension ... ok [INFO] [stdout] test add::test_excluded_file_priorities::single_excluded_index_present ... ok [INFO] [stdout] test add::normalize_rename_options::date_added_to_suggested_when_missing ... ok [INFO] [stdout] test add::normalize_rename_options::directory_names_without_extension ... ok [INFO] [stdout] test add::normalize_rename_options::extension_added_when_names_differ ... ok [INFO] [stdout] test add::normalize_rename_options::different_dates_remain_different ... ok [INFO] [stdout] test add::normalize_rename_options::different_extensions_remain_different ... ok [INFO] [stdout] test add::normalize_rename_options::extension_added_to_internal_when_missing ... ok [INFO] [stdout] test add::normalize_rename_options::extension_added_to_suggested_when_missing ... ok [INFO] [stdout] test cli_args_tests::parses_comma_delimited_skip_extensions ... ok [INFO] [stdout] test cli_args_tests::global_args_before_subcommand ... ok [INFO] [stdout] test add::normalize_rename_options::both_same_returns_equal ... ok [INFO] [stdout] test add::normalize_rename_options::both_date_and_extension_added ... ok [INFO] [stdout] test cli_args_tests::info_defaults_to_name_sort_no_list ... ok [INFO] [stdout] test cli_args_tests::parses_combined_boolean_flags ... ok [INFO] [stdout] test cli_args_tests::parses_completion_subcommand ... ok [INFO] [stdout] test cli_args_tests::parses_comma_delimited_skip_directories ... ok [INFO] [stdout] test cli_args_tests::empty_by_default ... ok [INFO] [stdout] test add::normalize_rename_options::date_added_to_internal_when_missing ... ok [INFO] [stdout] test cli_args_tests::parses_complex_combination ... ok [INFO] [stdout] test cli_args_tests::parses_credentials ... ok [INFO] [stdout] test cli_args_tests::parses_completion_with_install ... ok [INFO] [stdout] test cli_args_tests::parses_host_and_port ... ok [INFO] [stdout] test cli_args_tests::parses_info_list_with_sort_and_verbose ... ok [INFO] [stdout] test cli_args_tests::parses_info_sort_by_path ... ok [INFO] [stdout] test cli_args_tests::parses_info_sort_by_size ... ok [INFO] [stdout] test cli_args_tests::parses_info_subcommand ... ok [INFO] [stdout] test cli_args_tests::parses_info_list_mode ... ok [INFO] [stdout] test cli_args_tests::parses_info_with_global_connection_args ... ok [INFO] [stdout] test cli_args_tests::parses_info_with_global_verbose ... ok [INFO] [stdout] test cli_args_tests::parses_long_form_flags ... ok [INFO] [stdout] test cli_args_tests::parses_long_form_min_size ... ok [INFO] [stdout] test cli_args_tests::parses_long_form_skip_ext ... ok [INFO] [stdout] test cli_args_tests::parses_long_form_skip_dir ... ok [INFO] [stdout] test cli_args_tests::parses_min_file_size ... ok [INFO] [stdout] test cli_args_tests::parses_min_image_size ... ok [INFO] [stdout] test cli_args_tests::parses_min_image_size_short_flag ... ok [INFO] [stdout] test cli_args_tests::parses_multiple_paths ... ok [INFO] [stdout] test cli_args_tests::parses_offline_flag ... ok [INFO] [stdout] test cli_args_tests::parses_tags ... ok [INFO] [stdout] test cli_args_tests::parses_offline_short_flag ... ok [INFO] [stdout] test cli_args_tests::parses_save_path_and_category ... ok [INFO] [stdout] test cli_args_tests::rejects_invalid_min_size ... ok [INFO] [stdout] test cli_args_tests::rejects_invalid_port ... ok [INFO] [stdout] test config::qtorrent_config_tests::excludes_undersized_images_with_lowercase_extensions ... ok [INFO] [stdout] test config::qtorrent_config_tests::excludes_undersized_images_with_titlecase_extensions ... ok [INFO] [stdout] test cli_args_tests::parses_include_images ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_ignores_other_sections ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_invalid_toml_returns_error ... ok [INFO] [stdout] test config::qtorrent_config_tests::excludes_undersized_images_with_uppercase_extensions ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_defaults_tag_overwrite_prefixes_to_empty ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_empty_config ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_empty_tag_overwrite_prefixes ... ok [INFO] [stdout] test cli_args_tests::parses_include_images_short_flag ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_file_filtering_options ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_integer_file_filtering_options ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_offline ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_qtorrent_section ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_recurse_and_skip_existing ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_save_path_and_category ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_tag_overwrite_prefixes ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_tags_and_tag_overwrite_prefixes_together ... ok [INFO] [stdout] test config::qtorrent_config_tests::image_size_limit_does_not_apply_to_non_image_files ... ok [INFO] [stdout] test config::qtorrent_config_tests::images_excluded_entirely_when_include_images_disabled ... ok [INFO] [stdout] test config::qtorrent_config_tests::keeps_images_at_or_above_size_limit ... ok [INFO] [stdout] test config::test_resolve_tags::handles_path_with_directories ... ok [INFO] [stdout] test config::test_resolve_tags::longer_prefix_matches_first ... ok [INFO] [stdout] test config::test_resolve_tags::matches_case_insensitively ... ok [INFO] [stdout] test config::test_resolve_tags::returns_associated_tag_on_prefix_match ... ok [INFO] [stdout] test config::test_resolve_tags::returns_default_tags_when_no_prefixes_configured ... ok [INFO] [stdout] test config::test_resolve_tags::returns_default_tags_when_no_prefix_matches ... ok [INFO] [stdout] test config::qtorrent_config_tests::skip_extensions_exclude_regardless_of_case ... ok [INFO] [stdout] test config::test_resolve_tags::returns_none_when_no_tags_and_no_prefix_match ... ok [INFO] [stdout] test config::test_resolve_tags::shorter_prefix_matches_when_longer_does_not ... ok [INFO] [stdout] test config_from_args_tests::config_cli_image_min_size_converts_to_bytes ... ok [INFO] [stdout] test config_from_args_tests::config_cli_boolean_flags_enable_options ... ok [INFO] [stdout] test config::test_resolve_tags::uses_file_stem_without_torrent_extension ... ok [INFO] [stdout] test config::qtorrent_config_tests::mixed_files_with_image_size_and_skip_extensions ... ok [INFO] [stdout] test config::test_resolve_tags::prefixes_sorted_by_length_descending_in_config ... ok [INFO] [stdout] test config_from_args_tests::config_cli_directories_enable_file_filters ... ok [INFO] [stdout] test config_from_args_tests::config_cli_extensions_enable_file_filters ... ok [INFO] [stdout] test config_from_args_tests::config_cli_min_size_converts_to_bytes ... ok [INFO] [stdout] test config_from_args_tests::config_cli_min_size_enables_file_filters ... ok [INFO] [stdout] test stats::tests::starts_with_zero_counters ... ok [INFO] [stdout] test config_from_args_tests::config_includes_cli_skip_extensions_normalized ... ok [INFO] [stdout] test config_from_args_tests::config_dryrun_without_offline ... ok [INFO] [stdout] test config_from_args_tests::config_offline_implies_dryrun ... ok [INFO] [stdout] test config_from_args_tests::config_cli_overrides_host_and_port ... ok [INFO] [stdout] test stats::tests::increments_counters ... ok [INFO] [stdout] test config_from_args_tests::config_includes_cli_skip_directories_normalized ... ok [INFO] [stdout] test config_from_args_tests::config_zero_sizes_disable_size_filters ... ok [INFO] [stdout] test torrent::test_bencode_value_length::dict_nested ... ok [INFO] [stdout] test torrent::test_bencode_value_length::dict_with_items ... ok [INFO] [stdout] test torrent::test_bencode_value_length::error_on_empty ... ok [INFO] [stdout] test torrent::test_bencode_value_length::error_on_unknown_type ... ok [INFO] [stdout] test config_from_args_tests::config_cli_includes_images ... ok [INFO] [stdout] test config_from_args_tests::config_offline_short_flag_implies_dryrun ... ok [INFO] [stdout] test torrent::test_bencode_value_length::integer_positive ... ok [INFO] [stdout] test torrent::test_bencode_value_length::integer_zero ... ok [INFO] [stdout] test torrent::test_bencode_value_length::list_nested ... ok [INFO] [stdout] test torrent::test_bencode_value_length::list_empty ... ok [INFO] [stdout] test torrent::test_bencode_value_length::string_empty ... ok [INFO] [stdout] test torrent::test_bencode_value_length::string_simple ... ok [INFO] [stdout] test torrent::test_bencode_value_length::string_longer ... ok [INFO] [stdout] test torrent::test_file_filter::applies_image_size_limit_when_enabled ... ok [INFO] [stdout] test torrent::test_extract_info_dict_bytes::extracts_info_dict_from_valid_torrent ... ok [INFO] [stdout] test torrent::test_bencode_value_length::integer_negative ... ok [INFO] [stdout] test torrent::test_file_filter::excludes_by_directory_name ... ok [INFO] [stdout] test torrent::test_bencode_value_length::list_with_items ... ok [INFO] [stdout] test torrent::test_file_filter::excludes_by_extension ... ok [INFO] [stdout] test torrent::test_file_filter::excludes_by_size ... ok [INFO] [stdout] test torrent::test_extract_info_dict_bytes::fails_on_missing_info_key ... ok [INFO] [stdout] test torrent::test_bencode_value_length::dict_empty ... ok [INFO] [stdout] test stats::tests::starts_with_correct_total ... ok [INFO] [stdout] test torrent::test_filtered_files::handles_empty_lists ... ok [INFO] [stdout] test torrent::test_find_subsequence::empty_haystack ... ok [INFO] [stdout] test torrent::test_file_filter::excludes_images_when_disabled ... ok [INFO] [stdout] test torrent::test_file_filter::includes_images_when_enabled ... ok [INFO] [stdout] test torrent::test_file_filter::includes_when_no_filter_matches ... ok [INFO] [stdout] test torrent::test_file_filter::is_empty_returns_false_when_images_are_disabled ... ok [INFO] [stdout] test torrent::test_file_filter::is_empty_returns_false_with_extension_filter ... ok [INFO] [stdout] test torrent::test_find_subsequence::finds_at_end ... ok [INFO] [stdout] test torrent::test_file_filter::is_empty_returns_false_with_size_filter ... ok [INFO] [stdout] test torrent::test_file_filter::is_empty_returns_true_for_no_filters ... ok [INFO] [stdout] test config_from_args_tests::config_has_credentials_when_cli_sets_them ... ok [INFO] [stdout] test torrent::test_filtered_files::calculates_excluded_size ... ok [INFO] [stdout] test torrent::test_filtered_files::calculates_included_size ... ok [INFO] [stdout] test torrent::test_find_subsequence::finds_at_start ... ok [INFO] [stdout] test torrent::test_find_subsequence::finds_bencode_info_key ... ok [INFO] [stdout] test torrent::test_find_subsequence::finds_in_middle ... ok [INFO] [stdout] test config_from_args_tests::config_has_host_and_port ... ok [INFO] [stdout] test torrent::test_find_subsequence::not_found ... ok [INFO] [stdout] test torrent::test_parse_torrent::calculates_info_hash ... ok [INFO] [stdout] test torrent::test_parse_torrent::no_excluded_indices_without_filter ... ok [INFO] [stdout] test torrent::test_parse_torrent::sets_original_name ... ok [INFO] [stdout] test torrent::test_parse_torrent::single_included_file_is_none_for_single_file_torrent ... ok [INFO] [stdout] test torrent::test_parse_torrent::filter_excludes_by_extension ... ok [INFO] [stdout] test torrent::test_parse_torrent::single_file_torrent_not_multi_file ... ok [INFO] [stdout] test torrent::test_parse_torrent::sets_path_correctly ... ok [INFO] [stdout] test torrent::test_parse_torrent_all_files_excluded::all_files_excluded_by_extension ... ok [INFO] [stdout] test torrent::test_to_hex::multiple_bytes ... ok [INFO] [stdout] test torrent::test_parse_torrent_all_files_excluded::not_all_excluded_when_some_files_remain ... ok [INFO] [stdout] test torrent::test_parse_torrent::rename_to_is_none_initially ... ok [INFO] [stdout] test torrent::test_parse_torrent::stores_raw_bytes ... ok [INFO] [stdout] test torrent::test_parse_torrent::filter_by_size_on_single_file ... ok [INFO] [stdout] test torrent::test_parse_torrent::calculates_included_size ... ok [INFO] [stdout] test torrent::test_parse_torrent::fails_on_nonexistent_file ... ok [INFO] [stdout] test torrent::test_parse_torrent::fails_on_invalid_torrent_data ... ok [INFO] [stdout] test torrent::test_to_hex::empty_bytes ... ok [INFO] [stdout] test config::qtorrent_config_tests::from_toml_str_parses_name_processing_options ... ok [INFO] [stdout] test config::test_resolve_tags::returns_none_when_no_tags_and_no_prefixes ... ok [INFO] [stdout] test torrent::test_to_hex::single_byte_max ... ok [INFO] [stdout] test torrent::test_to_hex::sha1_hash_length ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::calculates_info_hash ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::calculates_info_hash_hex ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::calculates_total_size ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::filter_files_excludes_by_size ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::filter_files_excludes_by_extension ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::extracts_announce_list ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::extracts_piece_length ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::extracts_announce_url ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::extracts_comment ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::extracts_file_length ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::extracts_private_flag ... ok [INFO] [stdout] test utils::test_all_files_excluded::returns_false_when_some_files_remain ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::gets_files_list_for_single_file ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::parses_dummy_torrent_file ... ok [INFO] [stdout] test utils::test_display_name::returns_internal_name_when_no_rename ... ok [INFO] [stdout] test utils::test_all_files_excluded::returns_true_when_all_files_excluded ... ok [INFO] [stdout] test utils::test_display_name::returns_rename_to_when_set ... ok [INFO] [stdout] test torrent::test_to_hex::single_byte_zero ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::is_single_file_torrent ... ok [INFO] [stdout] test utils::test_display_name::returns_unknown_when_no_name ... ok [INFO] [stdout] test utils::test_extract_file_extension::extracts_known_archive_extension ... ok [INFO] [stdout] test utils::test_extract_file_extension::extracts_known_audio_extension ... ok [INFO] [stdout] test utils::test_extract_file_extension::extracts_known_document_extension ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::extracts_created_by ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::extracts_creation_date ... ok [INFO] [stdout] test torrent::test_torrent_struct_methods::from_buffer_fails_on_invalid_data ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::filter_files_with_no_filters ... ok [INFO] [stdout] test torrent::test_torrent_struct_methods::info_hash_from_bytes_fails_without_info_dict ... ok [INFO] [stdout] test utils::test_extract_file_extension::extracts_known_video_extension ... ok [INFO] [stdout] test utils::test_extract_file_extension::handles_case_insensitive_extensions ... ok [INFO] [stdout] test utils::test_extract_file_extension::handles_multiple_dots ... ok [INFO] [stdout] test utils::test_extract_file_extension::returns_none_for_no_extension ... ok [INFO] [stdout] test utils::test_extract_file_extension::extracts_known_image_extension ... ok [INFO] [stdout] test utils::test_all_files_excluded::returns_false_for_single_file_torrent ... ok [INFO] [stdout] test utils::test_extract_file_extension::returns_none_for_unknown_extension ... ok [INFO] [stdout] test utils::test_extract_file_extension::returns_none_for_numeric_extension ... ok [INFO] [stdout] test utils::test_insert_date_before_extension::appends_date_when_no_extension ... ok [INFO] [stdout] test utils::test_insert_date_before_extension::inserts_date_before_extension ... ok [INFO] [stdout] test utils::test_restore_file_extension::does_not_duplicate_same_extension ... ok [INFO] [stdout] test utils::test_restore_file_extension::handles_dotted_custom_name_without_known_extension ... ok [INFO] [stdout] test utils::test_restore_file_extension::appends_extension_when_missing ... ok [INFO] [stdout] test utils::test_restore_file_extension::no_extension_in_reference ... ok [INFO] [stdout] test utils::test_restore_file_extension::appends_mkv_extension ... ok [INFO] [stdout] test torrent::test_parse_torrent::parses_valid_torrent_file ... ok [INFO] [stdout] test torrent::test_parse_torrent_all_files_excluded::all_files_excluded_by_size ... ok [INFO] [stdout] test utils::test_insert_date_before_extension::handles_multiple_dots_in_name ... ok [INFO] [stdout] test utils::test_skipped_directory_summary::default_values ... ok [INFO] [stdout] test utils::test_restore_file_extension::preserves_different_known_extension ... ok [INFO] [stdout] test utils::test_skipped_directory_summary::files_word_plural_multiple ... ok [INFO] [stdout] test utils::test_restore_file_extension::handles_numeric_extension_in_reference ... ok [INFO] [stdout] test utils::test_restore_file_extension::unknown_extension_in_reference_ignored ... ok [INFO] [stdout] test utils::test_skipped_directory_summary::add_file_increments_count_and_size ... ok [INFO] [stdout] test utils::test_skipped_directory_summary::add_multiple_files ... ok [INFO] [stdout] test torrent::test_parse_torrent_all_files_excluded::not_all_excluded_without_filters ... ok [INFO] [stdout] test torrent::test_torrent_parsing_from_file::gets_torrent_name ... ok [INFO] [stdout] test utils::test_all_files_excluded::returns_false_when_no_files_excluded ... ok [INFO] [stdout] test utils::test_skipped_directory_summary::files_word_plural_zero ... ok [INFO] [stdout] test utils::test_suggested_name_raw_multi_file::falls_back_to_internal_name_when_no_filename ... ok [INFO] [stdout] test utils::test_suggested_name_raw_multi_file::ignores_filename_matching_pattern ... ok [INFO] [stdout] test utils::test_suggested_name_raw_multi_file::prefers_filename_over_internal_name ... ok [INFO] [stdout] test utils::test_suggested_name_raw_multi_file::returns_unknown_when_no_names_available ... ok [INFO] [stdout] test utils::test_suggested_name_raw_single_file::does_not_duplicate_extension ... ok [INFO] [stdout] test utils::test_suggested_name_raw_single_file::falls_back_to_single_included_file ... ok [INFO] [stdout] test utils::test_suggested_name_raw_single_file::falls_back_to_internal_name ... ok [INFO] [stdout] test utils::test_suggested_name_raw_single_file::returns_unknown_when_no_names_available ... ok [INFO] [stdout] test utils::test_suggested_name_raw_single_file::adds_extension_from_internal_name ... ok [INFO] [stdout] test utils::test_suggested_name_raw_single_file::case_insensitive_extension_check ... ok [INFO] [stdout] test utils::test_skipped_directory_summary::files_word_singular ... ok [INFO] [stdout] test utils::test_suggested_name_raw_single_file::uses_single_included_file_extension_for_filtered_multi ... ok [INFO] [stdout] test utils::test_format_single_file_name::preserves_extension_case ... ok [INFO] [stdout] test utils::test_format_single_file_name::handles_multiple_spaces ... ok [INFO] [stdout] test utils::test_format_single_file_name::formats_name_with_extension ... ok [INFO] [stdout] test utils::test_format_single_file_name::formats_name_without_extension ... ok [INFO] [stdout] test utils::test_format_single_file_name::handles_underscores ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 244 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.23s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/rx_rename.rs (/opt/rustwide/target/debug/deps/rx_rename-63d91c572429f776) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/thumbnail/main.rs (/opt/rustwide/target/debug/deps/thumbs-70203bf0c3928866) [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 7 tests [INFO] [stdout] test config::thumbnail_config_tests::from_toml_str_ignores_other_sections ... ok [INFO] [stdout] test config::thumbnail_config_tests::from_toml_str_invalid_toml_returns_error ... ok [INFO] [stdout] test config::thumbnail_config_tests::from_toml_str_parses_grid_settings ... ok [INFO] [stdout] test config::thumbnail_config_tests::from_toml_str_parses_thumbnail_section ... ok [INFO] [stdout] test config::thumbnail_config_tests::from_toml_str_parses_empty_config ... ok [INFO] [stdout] test config::thumbnail_config_tests::from_toml_str_parses_padding_settings ... ok [INFO] [stdout] test config::thumbnail_config_tests::from_toml_str_parses_display_settings ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/video_convert/main.rs (/opt/rustwide/target/debug/deps/vconvert-d54f78f39d3099d3) [INFO] [stdout] [INFO] [stdout] running 162 tests [INFO] [stdout] test cli::database_mode_tests::database_mode_debug ... ok [INFO] [stdout] test cli::database_mode_tests::database_mode_equality ... ok [INFO] [stdout] test cli::sort_order_tests::default_is_bitrate ... ok [INFO] [stdout] test cli::sort_order_tests::from_str_parses_impact ... ok [INFO] [stdout] test cli::sort_order_tests::display_formats_correctly ... ok [INFO] [stdout] test cli::sort_order_tests::from_str_parses_bitrate ... ok [INFO] [stdout] test cli::sort_order_tests::from_str_parses_duration ... ok [INFO] [stdout] test cli::sort_order_tests::from_str_parses_resolution ... ok [INFO] [stdout] test cli::sort_order_tests::from_str_parses_name ... ok [INFO] [stdout] test config::config_lowercase_vec_tests::handles_empty_slice ... ok [INFO] [stdout] test config::config_lowercase_vec_tests::converts_to_lowercase ... ok [INFO] [stdout] test cli::sort_order_tests::from_str_parses_size ... ok [INFO] [stdout] test cli::sort_order_tests::from_str_returns_error_for_unknown ... ok [INFO] [stdout] test cli::sort_order_tests::sql_order_clause_returns_valid_sql ... ok [INFO] [stdout] test config::config_lowercase_vec_tests::handles_mixed_case ... ok [INFO] [stdout] test config::config_lowercase_vec_tests::handles_string_slice ... ok [INFO] [stdout] test config::video_convert_config_tests::default_values_are_correct ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_ignores_other_sections ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_invalid_toml_returns_error ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_parses_bitrate_settings ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_parses_count_and_display_limit ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_parses_duration_settings ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_parses_empty_config ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_parses_extensions ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_parses_include_exclude_lists ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_parses_sort_order ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_parses_sort_order_size ... ok [INFO] [stdout] test config::video_convert_config_tests::from_toml_str_parses_video_convert_section ... ok [INFO] [stdout] test convert::test_classify_bitrate_filtering::above_max_bitrate_is_skipped ... ok [INFO] [stdout] test convert::test_classify_bitrate_filtering::below_min_bitrate_is_skipped ... ok [INFO] [stdout] test convert::test_classify_duration_filtering::above_max_duration_is_skipped ... ok [INFO] [stdout] test convert::test_classify_combined_filters::first_failing_filter_wins_bitrate_before_duration ... ok [INFO] [stdout] test convert::test_classify_duration_filtering::below_min_duration_is_skipped ... ok [INFO] [stdout] test convert::test_classify_already_converted::hevc_mp4_with_x265_suffix_is_already_converted ... ok [INFO] [stdout] test convert::test_classify_already_converted::hevc_mp4_with_x265_suffix_uppercase_is_already_converted ... ok [INFO] [stdout] test convert::test_classify_already_converted::av1_mp4_with_av1_suffix_is_already_converted ... ok [INFO] [stdout] test convert::test_classify_output_exists::rename_proceeds_when_output_exists_with_overwrite ... ok [INFO] [stdout] test convert::test_classify_output_exists::rename_skipped_when_output_exists_no_overwrite ... ok [INFO] [stdout] test convert::test_classify_needs_remux::av1_mkv_needs_remux ... ok [INFO] [stdout] test convert::test_classify_combined_filters::passes_all_filters_gets_converted ... ok [INFO] [stdout] test convert::test_classify_needs_conversion::h264_mp4_needs_conversion ... ok [INFO] [stdout] test convert::test_classify_bitrate_filtering::bitrate_at_min_threshold_is_not_skipped ... ok [INFO] [stdout] test convert::test_classify_needs_rename::av1_mp4_without_suffix_needs_rename ... ok [INFO] [stdout] test convert::test_classify_needs_rename::hevc_mp4_without_suffix_needs_rename ... ok [INFO] [stdout] test convert::test_classify_needs_conversion::h264_mkv_needs_conversion ... ok [INFO] [stdout] test convert::test_classify_needs_remux::hevc_avi_needs_remux ... ok [INFO] [stdout] test convert::test_classify_needs_conversion::mpeg4_avi_needs_conversion ... ok [INFO] [stdout] test convert::test_classify_bitrate_filtering::bitrate_filter_does_not_apply_to_remux ... ok [INFO] [stdout] test convert::test_classify_duration_filtering::duration_filter_does_not_apply_to_remux ... ok [INFO] [stdout] test convert::test_classify_resolution_filtering::below_min_resolution_is_skipped ... ok [INFO] [stdout] test convert::test_classify_resolution_filtering::at_min_resolution_is_not_skipped ... ok [INFO] [stdout] test database::test_drive_key::unix_path ... ok [INFO] [stdout] test convert::test_classify_resolution_filtering::resolution_filter_does_not_apply_to_remux ... ok [INFO] [stdout] test database::test_drive_key::windows_drive_letter_lowercase ... ok [INFO] [stdout] test convert::test_classify_resolution_filtering::vertical_video_uses_smaller_dimension ... ok [INFO] [stdout] test database::test_drive_key::windows_drive_letter ... ok [INFO] [stdout] test convert::test_classify_needs_remux::hevc_mkv_needs_remux ... ok [INFO] [stdout] test database::test_drive_key::windows_unc_path ... ok [INFO] [stdout] test database::test_group_paths_by_drive::groups_empty_input ... ok [INFO] [stdout] test convert::test_classify_bitrate_filtering::bitrate_at_max_threshold_is_not_skipped ... ok [INFO] [stdout] test convert::test_classify_output_exists::skips_when_output_exists_no_overwrite ... ok [INFO] [stdout] test database::test_drive_key::relative_path ... ok [INFO] [stdout] test database::test_group_paths_by_drive::groups_single_drive ... ok [INFO] [stdout] test database::test_group_paths_by_drive::groups_multiple_drives ... ok [INFO] [stdout] test database::test_group_paths_by_drive::groups_unix_paths_into_single_group ... ok [INFO] [stdout] test database::test_drive_key::windows_unc_path_server_only ... ok [INFO] [stdout] test database::test_group_paths_by_drive::groups_mixed_unc_and_drive_paths ... ok [INFO] [stdout] test convert::test_classify_output_exists::remux_skipped_when_output_exists_no_overwrite ... ok [INFO] [stdout] test convert::test_classify_output_exists::converts_when_output_exists_with_overwrite ... ok [INFO] [stdout] test database::tests::test_filter_by_bitrate ... ok [INFO] [stdout] test database::tests::test_batch_upsert_pending_files_writes_all_entries ... ok [INFO] [stdout] test database::tests::test_batch_upsert_pending_files_returns_zero_for_empty_input ... ok [INFO] [stdout] test database::tests::test_batch_upsert_scanned_files_writes_all_entries ... ok [INFO] [stdout] test database::tests::test_batch_upsert_pending_files_updates_existing_entries ... ok [INFO] [stdout] test database::tests::test_batch_upsert_scanned_files_updates_existing_entries ... ok [INFO] [stdout] test database::tests::test_clear_database ... ok [INFO] [stdout] test database::tests::test_filter_by_duration ... ok [INFO] [stdout] test database::tests::test_bitrate_filter_does_not_exclude_remux_files ... ok [INFO] [stdout] test database::tests::test_pending_action_display ... ok [INFO] [stdout] test database::tests::test_combined_filters ... ok [INFO] [stdout] test database::tests::test_pending_action_from_str ... ok [INFO] [stdout] test database::tests::test_filter_by_extension ... ok [INFO] [stdout] test database::tests::test_find_scanned_file_returns_none_for_unknown_path ... ok [INFO] [stdout] test database::tests::test_batch_upsert_scanned_files_returns_zero_for_empty_input ... ok [INFO] [stdout] test database::tests::test_filter_by_action ... ok [INFO] [stdout] test database::tests::test_get_extension_stats ... ok [INFO] [stdout] test database::tests::test_find_scanned_file_returns_none_when_size_differs ... ok [INFO] [stdout] test database::tests::test_duration_filter_does_not_exclude_remux_files ... ok [INFO] [stdout] test database::tests::test_get_all_scanned_files_returns_empty_map_when_no_entries ... ok [INFO] [stdout] test database::tests::test_filter_with_limit ... ok [INFO] [stdout] test database::tests::test_scanned_file_count_empty ... ok [INFO] [stdout] test database::tests::test_to_video_info ... ok [INFO] [stdout] test database::tests::test_open_in_memory ... ok [INFO] [stdout] test database::tests::test_remove_pending_file ... ok [INFO] [stdout] test stats::analysis_stats_tests::default_values_are_zero ... ok [INFO] [stdout] test database::tests::test_get_all_scanned_files_returns_all_entries ... ok [INFO] [stdout] test stats::analysis_stats_tests::total_skipped_excludes_analysis_failed ... ok [INFO] [stdout] test stats::analysis_stats_tests::total_skipped_sums_all_skip_reasons ... ok [INFO] [stdout] test database::tests::test_remove_missing_scanned_files_returns_zero_when_empty ... ok [INFO] [stdout] test database::tests::test_remove_missing_scanned_files_removes_nonexistent ... ok [INFO] [stdout] test database::tests::test_get_extensions ... ok [INFO] [stdout] test database::tests::test_get_stats ... ok [INFO] [stdout] test database::tests::test_scanned_file_count_after_inserts ... ok [INFO] [stdout] test database::tests::test_sort_by_name ... ok [INFO] [stdout] test stats::conversion_stats_tests::change_percentage_zero_when_original_zero ... ok [INFO] [stdout] test stats::conversion_stats_tests::new_creates_stats_with_values ... ok [INFO] [stdout] test stats::conversion_stats_tests::size_difference_negative_when_smaller ... ok [INFO] [stdout] test stats::conversion_stats_tests::display_formats_correctly ... ok [INFO] [stdout] test stats::run_stats_tests::add_assign_conversion_stats ... ok [INFO] [stdout] test stats::run_stats_tests::add_assign_run_stats ... ok [INFO] [stdout] test stats::run_stats_tests::add_assign_run_stats_ref ... ok [INFO] [stdout] test stats::conversion_stats_tests::change_percentage_calculates_increase ... ok [INFO] [stdout] test database::tests::test_remove_missing_scanned_files_keeps_existing ... ok [INFO] [stdout] test stats::run_stats_tests::add_result_increments_converted ... ok [INFO] [stdout] test stats::conversion_stats_tests::change_percentage_zero_when_converted_zero ... ok [INFO] [stdout] test stats::conversion_stats_tests::change_percentage_calculates_reduction ... ok [INFO] [stdout] test stats::run_stats_tests::add_result_increments_remuxed ... ok [INFO] [stdout] test stats::run_stats_tests::default_values_are_zero ... ok [INFO] [stdout] test stats::run_stats_tests::space_saved_negative_when_larger ... ok [INFO] [stdout] test stats::run_stats_tests::space_saved_positive_when_smaller ... ok [INFO] [stdout] test stats::run_stats_tests::add_result_increments_failed ... ok [INFO] [stdout] test types::analysis_filter_tests::filter_debug_format ... ok [INFO] [stdout] test database::tests::test_upsert_scanned_file_updates_existing_entry ... ok [INFO] [stdout] test types::process_result_tests::converted_creates_stats ... ok [INFO] [stdout] test types::skip_reason_tests::display_already_converted ... ok [INFO] [stdout] test types::skip_reason_tests::display_bitrate_above_threshold ... ok [INFO] [stdout] test types::skip_reason_tests::display_duration_above_threshold ... ok [INFO] [stdout] test types::skip_reason_tests::display_duration_below_threshold ... ok [INFO] [stdout] test types::skip_reason_tests::display_file_missing ... ok [INFO] [stdout] test types::skip_reason_tests::display_analysis_failed ... ok [INFO] [stdout] test types::skip_reason_tests::display_output_exists ... ok [INFO] [stdout] test database::tests::test_sort_by_impact ... ok [INFO] [stdout] test database::tests::test_sort_by_bitrate ... ok [INFO] [stdout] test types::skip_reason_tests::display_bitrate_below_threshold ... ok [INFO] [stdout] test types::skip_reason_tests::display_resolution_below_limit ... ok [INFO] [stdout] test types::video_file_tests::display_shows_path ... ok [INFO] [stdout] test database::tests::test_insert_and_get_pending_file ... ok [INFO] [stdout] test types::video_file_tests::new_extracts_name_and_extension ... ok [INFO] [stdout] test types::video_file_tests::new_handles_no_extension ... ok [INFO] [stdout] test types::video_file_tests::output_path_adds_x265_suffix ... ok [INFO] [stdout] test types::video_file_tests::output_path_adds_av1_suffix ... ok [INFO] [stdout] test database::tests::test_upsert_updates_existing ... ok [INFO] [stdout] test types::video_file_tests::output_path_preserves_existing_av1 ... ok [INFO] [stdout] test types::video_file_tests::output_path_preserves_existing_x265 ... ok [INFO] [stdout] test types::video_info_tests::display_formats_correctly ... ok [INFO] [stdout] test database::tests::test_upsert_and_find_scanned_file ... ok [INFO] [stdout] test types::video_info_tests::from_ffprobe_output_captures_warning ... ok [INFO] [stdout] test types::video_info_tests::from_ffprobe_output_fails_without_bitrate ... ok [INFO] [stdout] test types::video_info_tests::from_ffprobe_output_parses_correctly ... ok [INFO] [stdout] test types::video_info_tests::from_ffprobe_output_parses_fractional_framerate ... ok [INFO] [stdout] test types::video_info_tests::from_ffprobe_output_fails_without_codec ... ok [INFO] [stdout] test types::video_info_tests::from_ffprobe_output_skips_bogus_takes_valid_framerate ... ok [INFO] [stdout] test types::video_info_tests::from_ffprobe_output_takes_first_valid_framerate ... ok [INFO] [stdout] test types::video_info_tests::from_ffprobe_output_rejects_zero_framerate ... ok [INFO] [stdout] test types::video_info_tests::quality_level_1080p_low_bitrate ... ok [INFO] [stdout] test types::video_info_tests::quality_level_1080p_high_bitrate ... ok [INFO] [stdout] test stats::conversion_stats_tests::size_difference_positive_when_larger ... ok [INFO] [stdout] test types::video_info_tests::from_ffprobe_output_fails_without_duration ... ok [INFO] [stdout] test types::video_info_tests::quality_level_4k_high_bitrate ... ok [INFO] [stdout] test types::video_info_tests::quality_level_4k_medium_bitrate ... ok [INFO] [stdout] test types::video_info_tests::quality_level_4k_low_bitrate ... ok [INFO] [stdout] test types::video_info_tests::from_ffprobe_output_rejects_timebase_framerate ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 162 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/visa_parse/main.rs (/opt/rustwide/target/debug/deps/visaparse-a2ca93918d2e2d5a) [INFO] [stdout] [INFO] [stdout] running 173 tests [INFO] [stdout] test config::test_config_cli_parsing::defaults_when_no_args ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_combined_flags ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_number_flag_short ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_all_options ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_number_flag_long ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_output_flag_short ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_output_flag_long ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_print_flag_short ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_print_flag_long ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_path_positional ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_verbose_flag_long ... ok [INFO] [stdout] test config::test_config_cli_parsing::parses_verbose_flag_short ... ok [INFO] [stdout] test config::test_config_from_args_and_config::all_options_combined ... ok [INFO] [stdout] test config::test_config_cli_parsing::rejects_negative_number ... ok [INFO] [stdout] test config::test_config_from_args_and_config::both_cli_and_config_false_results_in_false ... ok [INFO] [stdout] test config::test_config_from_args_and_config::cli_verbose_true_overrides_config_verbose_false ... ok [INFO] [stdout] test config::test_config_from_args_and_config::cli_number_overrides_config_number ... ok [INFO] [stdout] test config::test_config_from_args_and_config::config_verbose_true_enables_verbose_when_cli_false ... ok [INFO] [stdout] test config::test_config_from_args_and_config::config_from_default_user_config ... ok [INFO] [stdout] test config::test_config_from_args_and_config::config_number_used_when_cli_not_provided ... ok [INFO] [stdout] test config::test_config_integration::cli_args_with_toml_config_merges_correctly ... ok [INFO] [stdout] test config::test_config_integration::full_toml_config_no_cli_overrides ... ok [INFO] [stdout] test config::test_config_integration::cli_zero_number_is_valid_override ... ok [INFO] [stdout] test config::test_visa_parse_config::from_toml_str_ignores_other_sections ... ok [INFO] [stdout] test config::test_visa_parse_config::from_toml_str_parses_empty_config ... ok [INFO] [stdout] test config::test_config_from_args_and_config::config_print_true_enables_print_when_cli_false ... ok [INFO] [stdout] test config::test_config_from_args_and_config::default_number_used_when_neither_provided ... ok [INFO] [stdout] test config::test_config_integration::empty_toml_uses_defaults ... ok [INFO] [stdout] test config::test_visa_parse_config::default_config_has_expected_values ... ok [INFO] [stdout] test config::test_config_from_args_and_config::input_path_is_resolved ... ok [INFO] [stdout] test config::test_visa_parse_config::from_toml_str_parses_partial_config ... ok [INFO] [stdout] test config::test_visa_parse_config::from_toml_str_parses_visaparse_section ... ok [INFO] [stdout] test parse::test_calculate_totals::groups_by_name_and_sums ... ok [INFO] [stdout] test parse::test_calculate_totals::handles_empty_input ... ok [INFO] [stdout] test parse::test_calculate_totals::handles_single_item ... ok [INFO] [stdout] test parse::test_calculate_totals::sorts_by_sum_descending ... ok [INFO] [stdout] test config::test_visa_parse_config::from_toml_str_wrong_type_returns_error ... ok [INFO] [stdout] test config::test_config_from_args_and_config::both_cli_and_config_verbose_true_results_in_verbose ... ok [INFO] [stdout] test parse::test_clean_whitespaces::handles_empty_string ... ok [INFO] [stdout] test config::test_visa_parse_config::from_toml_str_invalid_toml_returns_error ... ok [INFO] [stdout] test config::test_config_from_args_and_config::cli_print_true_overrides_config_print_false ... ok [INFO] [stdout] test parse::test_clean_whitespaces_comprehensive::collapses_multiple_whitespaces ... ok [INFO] [stdout] test parse::test_clean_whitespaces_comprehensive::handles_mixed_whitespace ... ok [INFO] [stdout] test parse::test_clean_whitespaces::removes_tabs_and_newlines ... ok [INFO] [stdout] test parse::test_clean_whitespaces::removes_multiple_spaces ... ok [INFO] [stdout] test parse::test_clean_whitespaces_comprehensive::preserves_single_spaces ... ok [INFO] [stdout] test config::test_config_cli_parsing::rejects_invalid_number ... ok [INFO] [stdout] test parse::test_clean_whitespaces_comprehensive::replaces_carriage_returns ... ok [INFO] [stdout] test parse::test_clean_whitespaces_comprehensive::replaces_tabs ... ok [INFO] [stdout] test parse::test_clean_whitespaces_comprehensive::replaces_newlines ... ok [INFO] [stdout] test parse::test_clean_whitespaces::handles_mixed_whitespace ... ok [INFO] [stdout] test parse::test_extract_items::handles_empty_lines ... ok [INFO] [stdout] test parse::test_clean_whitespaces::preserves_single_spaces ... ok [INFO] [stdout] test parse::test_extract_items::extracts_items_from_raw_lines ... ok [INFO] [stdout] test parse::test_extract_items::no_year_transition_when_all_same_year ... ok [INFO] [stdout] test parse::test_extract_items::handles_year_transition_december_to_january ... ok [INFO] [stdout] test parse::test_extract_items_edge_cases::handles_double_digit_day_and_month ... ok [INFO] [stdout] test parse::test_extract_items_edge_cases::handles_single_digit_day_and_month ... ok [INFO] [stdout] test parse::test_filter_prefixes::filter_prefixes_contains_common_items ... ok [INFO] [stdout] test parse::test_filter_prefixes::filter_prefixes_is_not_empty ... ok [INFO] [stdout] test parse::test_extract_items_edge_cases::returns_error_for_invalid_sum ... ok [INFO] [stdout] test parse::test_format_name::converts_to_uppercase ... ok [INFO] [stdout] test parse::test_format_name::handles_mobilepay ... ok [INFO] [stdout] test parse::test_format_name::handles_itunes ... ok [INFO] [stdout] test parse::test_format_name::handles_wolt ... ok [INFO] [stdout] test parse::test_format_name::removes_brackets ... ok [INFO] [stdout] test parse::test_format_name::removes_osto_prefix ... ok [INFO] [stdout] test parse::test_format_name::removes_tc_prefix ... ok [INFO] [stdout] test parse::test_format_name::removes_www_prefix ... ok [INFO] [stdout] test parse::test_format_name::replaces_html_ampersand ... ok [INFO] [stdout] test parse::test_format_name::replaces_known_patterns ... ok [INFO] [stdout] test parse::test_format_name::replaces_special_characters_with_spaces ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::collapses_multiple_spaces ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::converts_to_uppercase ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::removes_curly_braces ... ok [INFO] [stdout] test parse::test_extract_items_edge_cases::returns_error_for_invalid_date_format ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::removes_osto_prefix_with_space ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::removes_tc_star_prefix ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::removes_square_brackets ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_chatgpt_subscription ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_contains_itunes ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::removes_parentheses ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_contains_k_citymarket ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_contains_finnair ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_dotcomfi ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_dri_pattern ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_known_pattern_35314369001 ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_html_ampersand ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_known_pattern_4029357733 ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_k_market ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_slash_with_space ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_paypal_beatport ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_paypal_bandcamp ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_star_with_space ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_levistrauss ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_alepa ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_beamhill ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_paypal_djcity ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_contains_epassi ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_paypal_dropbox ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_stockmann ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_hertz ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_www ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_chf_space ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_vfi_pattern ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::trims_whitespace ... ok [INFO] [stdout] test parse::test_format_sum::test_negative_number ... ok [INFO] [stdout] test parse::test_format_sum::test_invalid_format ... ok [INFO] [stdout] test parse::test_format_sum::test_large_number ... ok [INFO] [stdout] test parse::test_format_sum::test_normal_value ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_mobpay ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_start_paypal_patreon ... ok [INFO] [stdout] test parse::test_format_sum::test_number_with_many_decimal_places ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_contains_verkkokauppa ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_underscore_with_space ... ok [INFO] [stdout] test parse::test_format_name_comprehensive::replaces_contains_wolt ... ok [INFO] [stdout] test parse::test_format_sum::test_number_with_thousand_space ... ok [INFO] [stdout] test parse::test_format_sum::test_small_number ... ok [INFO] [stdout] test parse::test_format_sum::test_zero_value ... ok [INFO] [stdout] test parse::test_format_sum::test_number_without_decimal ... ok [INFO] [stdout] test parse::test_format_sum::test_value_with_whitespace ... ok [INFO] [stdout] test parse::test_get_xml_file_list::handles_single_xml_file ... ok [INFO] [stdout] test parse::test_get_xml_file_list::rejects_non_xml_file ... ok [INFO] [stdout] test parse::test_get_xml_file_list::handles_directory ... ok [INFO] [stdout] test parse::test_get_xml_files::finds_xml_files_in_fixtures_directory ... ok [INFO] [stdout] test parse::test_get_xml_files::returns_empty_for_nonexistent_directory ... ok [INFO] [stdout] test parse::test_get_xml_files::returns_sorted_files ... ok [INFO] [stdout] test parse::test_regex_patterns::re_brackets_matches_curly_braces ... ok [INFO] [stdout] test parse::test_regex_patterns::re_brackets_matches_parentheses ... ok [INFO] [stdout] test parse::test_regex_patterns::re_separators_matches_carriage_return ... ok [INFO] [stdout] test parse::test_regex_patterns::re_separators_matches_newline ... ok [INFO] [stdout] test parse::test_regex_patterns::re_separators_matches_tab ... ok [INFO] [stdout] test parse::test_regex_patterns::re_brackets_matches_square_brackets ... ok [INFO] [stdout] test parse::test_regex_patterns::re_html_and_matches_ampersand ... ok [INFO] [stdout] test parse::test_regex_patterns::re_whitespace_does_not_match_single_space ... ok [INFO] [stdout] test parse::test_item_parse::test_split_item_text ... ok [INFO] [stdout] test parse::test_read_xml_file::handles_nonexistent_file ... ok [INFO] [stdout] test parse::test_regex_patterns::re_specification_free_text_extracts_content ... ok [INFO] [stdout] test parse::test_regex_patterns::re_whitespace_matches_multiple_spaces ... ok [INFO] [stdout] test parse::test_replace_pairs::replace_contains_has_expected_entries ... ok [INFO] [stdout] test parse::test_regex_patterns::re_item_date_matches_date_format ... ok [INFO] [stdout] test parse::test_replace_pairs::replace_pairs_has_expected_entries ... ok [INFO] [stdout] test parse::test_replace_pairs::replace_start_has_expected_entries ... ok [INFO] [stdout] test parse::test_regex_patterns::re_item_date_does_not_match_without_date ... ok [INFO] [stdout] test parse::test_split_from_last_whitespaces::handles_empty_string ... ok [INFO] [stdout] test parse::test_replace_pairs::replace_start_pairs_has_expected_entries ... ok [INFO] [stdout] test parse::test_split_from_last_whitespaces::handles_multiple_double_spaces ... ok [INFO] [stdout] test parse::test_split_from_last_whitespaces::handles_trailing_double_space ... ok [INFO] [stdout] test parse::test_split_from_last_whitespaces::handles_no_double_space ... ok [INFO] [stdout] test parse::test_split_from_last_whitespaces::splits_on_double_space ... ok [INFO] [stdout] test parse::test_split_from_last_whitespaces::trims_whitespace_from_parts ... ok [INFO] [stdout] test parse::test_split_item_text::handles_empty_string ... ok [INFO] [stdout] test parse::test_split_item_text::handles_no_double_space ... ok [INFO] [stdout] test parse::test_split_item_text::splits_standard_format ... ok [INFO] [stdout] test parse::test_visa_item::display_formats_correctly ... ok [INFO] [stdout] test parse::test_visa_item::finnish_date_formats_correctly ... ok [INFO] [stdout] test parse::test_visa_item::finnish_sum_formats_correctly ... ok [INFO] [stdout] test parse::test_visa_item::finnish_sum_handles_whole_numbers ... ok [INFO] [stdout] test parse::test_visa_item::ordering_by_date_then_name ... ok [INFO] [stdout] test parse::test_visa_item::partial_ord_matches_ord ... ok [INFO] [stdout] test parse::test_split_item_text::handles_large_sum ... ok [INFO] [stdout] test parse::test_split_item_text::handles_single_digit_day ... ok [INFO] [stdout] test parse::test_visa_item_ordering_comprehensive::equal_items_are_equal ... ok [INFO] [stdout] test parse::test_visa_item_ordering_comprehensive::orders_by_date_first ... ok [INFO] [stdout] test parse::test_visa_item_ordering_comprehensive::orders_by_name_when_date_equal ... ok [INFO] [stdout] test parse::test_visa_item_ordering_comprehensive::orders_by_sum_when_date_and_name_equal ... ok [INFO] [stdout] test parse::test_visa_item_serialize::serializes_to_correct_json ... ok [INFO] [stdout] test parse::test_regex_patterns::re_start_date_extracts_year ... ok [INFO] [stdout] test parse::test_read_xml_file::reads_year_transition_xml_file ... ok [INFO] [stdout] test parse::test_integration_xml_parsing::calculates_correct_totals_from_sample ... ok [INFO] [stdout] test parse::test_integration_xml_parsing::parses_year_transition_xml_end_to_end ... ok [INFO] [stdout] test parse::test_integration_xml_parsing::parses_sample_xml_end_to_end ... ok [INFO] [stdout] test parse::test_read_xml_file::reads_sample_xml_file ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 173 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/video_resolution/main.rs (/opt/rustwide/target/debug/deps/vres-7f14646495750f4b) [INFO] [stdout] [INFO] [stdout] running 117 tests [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_1080p ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_1440p ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_4k ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_empty ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_empty_width_value ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_empty_height_value ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_float_width ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_extra_fields_after ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_malformed_height ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_large_resolution ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_malformed_width ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_missing_height ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_mixed_crlf_lf ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_negative_height ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_720p ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_large_values ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_no_trailing_newline ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_square ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_swapped_order ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_very_small ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_vertical ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_whitespace_in_width ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_ultrawide ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_480p ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_sd_resolution ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_windows_crlf ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_only_newlines ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_single_digit ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_negative_width ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_zero_dimensions ... ok [INFO] [stdout] test cli::regex_tests::regex_high_resolutions_case_insensitive ... ok [INFO] [stdout] test cli::ffpprobe_tests::parse_ffprobe_output_missing_width ... ok [INFO] [stdout] test cli::regex_tests::regex_high_resolutions_matches ... ok [INFO] [stdout] test cli::regex_tests::regex_high_resolutions_no_match_low_res ... ok [INFO] [stdout] test cli::regex_tests::regex_high_resolutions_no_match_544p ... ok [INFO] [stdout] test cli::regex_tests::regex_high_resolutions_empty_string ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_embedded_in_word_matches ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_no_match_8k ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_matches_600p ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_matches_544p ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_in_middle_of_filename ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_case_insensitive ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_matches_standard ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_at_end_of_filename ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_no_match_partial ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_no_match_without_p_suffix ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_mixed_case ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_at_start_of_filename ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_no_match ... ok [INFO] [stdout] test cli::regex_tests::regex_resolutions_only_resolution ... ok [INFO] [stdout] test config::resolution_config_tests::from_toml_str_invalid_toml_returns_error ... ok [INFO] [stdout] test config::resolution_config_tests::from_toml_str_parses_empty_config ... ok [INFO] [stdout] test config::resolution_config_tests::from_toml_str_parses_delete_limit ... ok [INFO] [stdout] test config::resolution_config_tests::from_toml_str_parses_resolution_section ... ok [INFO] [stdout] test config::resolution_config_tests::from_toml_str_ignores_other_sections ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::debug_format ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::inequality_different_file ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::inequality_different_resolution ... ok [INFO] [stdout] test cli::regex_tests::regex_full_resolution_matches_with_label_present ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::delete_dryrun ... ok [INFO] [stdout] test cli::regex_tests::regex_full_resolution_word_boundaries ... ok [INFO] [stdout] test cli::regex_tests::regex_full_resolution_no_match_label_only ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::delete_actual ... ok [INFO] [stdout] test cli::regex_tests::regex_full_resolution_matches_standard_patterns ... ok [INFO] [stdout] test cli::regex_tests::regex_full_resolution_no_match_small_numbers ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::equality ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_fixes_duplicate_720x480_480p ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_fixes_duplicate_960x540_540p ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_720p ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_4k ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_does_not_remove_other_resolutions ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_already_has_720p ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_already_has_label ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_no_partial_digit_match_trailing ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_no_label ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_fixes_duplicate_vertical_prefix_and_label ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_720p_does_not_remove_2560x1440 ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_replaces_720x480_with_480p ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_nonstandard_vertical_resolution_already_labeled ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_replaces_swapped_dimensions ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_replaces_capitalized_vertical_prefix ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_removes_both_orientations ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_replaces_full_resolution ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_960x540_replaces_with_540p ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_replaces_720x540_with_540p ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_fixes_duplicate_1920x1080_1080p ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_no_partial_digit_match ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_nonstandard_resolution_already_labeled ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_replaces_vertical_bare_resolution ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_replaces_vertical_540x720_with_vertical_540p ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_with_dots_in_name ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_vertical ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_replaces_swapped_dimensions_vertical ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_inserts_resolution_before_av1_codec ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_replaces_vertical_no_dot_prefix_resolution ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_inserts_resolution_before_hevc_codec ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_replaces_vertical_dot_prefix_resolution ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_unknown_resolution ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_inserts_resolution_before_x265_codec ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_inserts_resolution_before_x264_codec ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_multiple_codec_occurrences ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_with_codec_in_middle_of_name ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_with_existing_resolution_and_codec ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_with_full_resolution_and_codec ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_with_codec_case_insensitive ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::ordering_same_resolution_by_file ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::rename_actual ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_vertical_full_resolution_with_codec ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::rename_no_overwrite ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::rename_dryrun ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_with_weird_resolution_and_codec ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::rename_with_overwrite ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_with_vertical_resolution_and_codec ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::ordering_by_resolution ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::ordering_multiple_results ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_if_needed_fixes_duplicate_vertical_with_full_resolution_and_label ... ok [INFO] [stdout] test resolution::ffprobe_result_tests::new_path_with_duplicate_resolution_and_codec ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 117 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/video_stats/main.rs (/opt/rustwide/target/debug/deps/vstats-d5edfdb6f31f7165) [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 unittests src/bin/version_tag.rs (/opt/rustwide/target/debug/deps/vtag-4ff6c465e712dcac) [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/config_integration_tests.rs (/opt/rustwide/target/debug/deps/config_integration_tests-1fb55b0eff507b1f) [INFO] [stdout] [INFO] [stdout] running 13 tests [INFO] [stdout] test config_values_have_correct_types ... ok [INFO] [stdout] test dirmove_section_has_expected_structure ... ok [INFO] [stdout] test dots_section_has_expected_structure ... ok [INFO] [stdout] test sample_config_file_exists ... ok [INFO] [stdout] test dupefind_section_has_expected_structure ... ok [INFO] [stdout] test qtorrent_section_has_expected_structure ... ok [INFO] [stdout] test flip_date_section_has_expected_structure ... ok [INFO] [stdout] test sample_config_has_all_sections ... ok [INFO] [stdout] test video_convert_section_has_expected_structure ... ok [INFO] [stdout] test resolution_section_has_expected_structure ... ok [INFO] [stdout] test thumbnail_section_has_expected_structure ... ok [INFO] [stdout] test video_stats_section_has_expected_structure ... ok [INFO] [stdout] test sample_config_is_valid_toml ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stderr] Doc-tests cli_tools [INFO] [stdout] [INFO] [stdout] running 10 tests [INFO] [stdout] test src/lib.rs - resolve_input_path_str (line 566) ... ok [INFO] [stdout] test src/lib.rs - resolve_input_path (line 541) ... ok [INFO] [stdout] test src/lib.rs - get_relative_path_or_filename (line 701) ... ok [INFO] [stdout] test src/lib.rs - get_unique_path (line 760) ... ok [INFO] [stdout] test src/lib.rs - resolve_required_input_path (line 608) ... ok [INFO] [stdout] test src/lib.rs - insert_suffix_before_extension (line 498) ... ok [INFO] [stdout] test src/lib.rs - resolve_required_input_path_str (line 631) ... ok [INFO] [stdout] test src/resolution.rs - resolution::Resolution::p_label_regex (line 207) ... ok [INFO] [stdout] test src/resolution.rs - resolution::Resolution::full_resolution_regex (line 183) ... ok [INFO] [stdout] test src/resolution.rs - resolution::Resolution::dimension_regex (line 231) ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s [INFO] [stdout] [INFO] [stdout] all doctests ran in 1.07s; merged doctests compilation took 0.86s [INFO] running `Command { std: "docker" "inspect" "cd07d886dae2c5bb75b52f1915298f702c6efd0c381d8a1f6821f1d245cca56b", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "cd07d886dae2c5bb75b52f1915298f702c6efd0c381d8a1f6821f1d245cca56b", kill_on_drop: false }` [INFO] [stdout] cd07d886dae2c5bb75b52f1915298f702c6efd0c381d8a1f6821f1d245cca56b