[INFO] cloning repository https://github.com/umbgtt10/dry4rust [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/umbgtt10/dry4rust" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fumbgtt10%2Fdry4rust", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fumbgtt10%2Fdry4rust'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] b413e2b1b4f9a2fab3c42d8c0bcd5d3bbe99ee58 [INFO] testing umbgtt10/dry4rust against 1.99.0-beta.8 for beta-1.100-4 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fumbgtt10%2Fdry4rust" "/workspace/builds/worker-4-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-4-tc1/source'... [INFO] [stderr] done. [INFO] removed /workspace/builds/worker-4-tc1/source/.cargo/config.toml [INFO] started tweaking git repo https://github.com/umbgtt10/dry4rust [INFO] finished tweaking git repo https://github.com/umbgtt10/dry4rust [INFO] tweaked toml for git repo https://github.com/umbgtt10/dry4rust written to /workspace/builds/worker-4-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/umbgtt10/dry4rust on toolchain 1.99.0-beta.8 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.99.0-beta.8" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/umbgtt10/dry4rust already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.99.0-beta.8" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded zmij v1.0.20 [INFO] [stderr] Downloaded tempfile v3.25.0 [INFO] [stderr] Downloaded difflib v0.4.0 [INFO] [stderr] Downloaded predicates-core v1.0.9 [INFO] [stderr] Downloaded colorchoice v1.0.4 [INFO] [stderr] Downloaded wait-timeout v0.2.1 [INFO] [stderr] Downloaded termtree v0.5.1 [INFO] [stderr] Downloaded normalize-line-endings v0.3.0 [INFO] [stderr] Downloaded float-cmp v0.10.0 [INFO] [stderr] Downloaded predicates v3.1.3 [INFO] [stderr] Downloaded anstyle v1.0.13 [INFO] [stderr] Downloaded anstyle-parse v0.2.7 [INFO] [stderr] Downloaded predicates-tree v1.0.12 [INFO] [stderr] Downloaded clap v4.5.57 [INFO] [stderr] Downloaded clap_derive v4.5.55 [INFO] [stderr] Downloaded anstream v0.6.21 [INFO] [stderr] Downloaded assert_cmd v2.1.2 [INFO] [stderr] Downloaded anyhow v1.0.101 [INFO] [stderr] Downloaded clap_lex v0.7.7 [INFO] [stderr] Downloaded winnow v0.7.14 [INFO] [stderr] Downloaded getrandom v0.4.1 [INFO] [stderr] Downloaded regex v1.12.3 [INFO] [stderr] Downloaded aho-corasick v1.1.4 [INFO] [stderr] Downloaded clap_builder v4.5.57 [INFO] [stderr] Downloaded syn v2.0.114 [INFO] [stderr] Downloaded bstr v1.12.1 [INFO] [stderr] Downloaded rustix v1.1.3 [INFO] [stderr] Downloaded regex-syntax v0.8.9 [INFO] [stderr] Downloaded regex-automata v0.4.14 [INFO] [stderr] Downloaded libc v0.2.181 [INFO] [stderr] Downloaded linux-raw-sys v0.11.0 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:77db811e55d90add9212f6832c23229e3de5f1c1f9905e8cb07319ea15df73ac" "sleep" "infinity", kill_on_drop: false }` [INFO] [stdout] e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531 [INFO] running `Command { std: "docker" "start" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stderr] Compiling unicode-ident v1.0.23 [INFO] [stderr] Compiling proc-macro2 v1.0.106 [INFO] [stderr] Compiling quote v1.0.44 [INFO] [stderr] Compiling serde_core v1.0.228 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling anstyle v1.0.13 [INFO] [stderr] Compiling zmij v1.0.20 [INFO] [stderr] Compiling memchr v2.8.0 [INFO] [stderr] Compiling utf8parse v0.2.2 [INFO] [stderr] Compiling libc v0.2.181 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling hashbrown v0.16.1 [INFO] [stderr] Compiling itoa v1.0.17 [INFO] [stderr] Compiling is_terminal_polyfill v1.70.2 [INFO] [stderr] Compiling colorchoice v1.0.4 [INFO] [stderr] Compiling anstyle-parse v0.2.7 [INFO] [stderr] Compiling anstyle-query v1.1.5 [INFO] [stderr] Compiling winnow v0.7.14 [INFO] [stderr] Compiling toml_write v0.1.2 [INFO] [stderr] Compiling heck v0.5.0 [INFO] [stderr] Compiling strsim v0.11.1 [INFO] [stderr] Compiling clap_lex v0.7.7 [INFO] [stderr] Compiling getrandom v0.4.1 [INFO] [stderr] Compiling anstream v0.6.21 [INFO] [stderr] Compiling same-file v1.0.6 [INFO] [stderr] Compiling rustix v1.1.3 [INFO] [stderr] Compiling predicates-core v1.0.9 [INFO] [stderr] Compiling walkdir v2.5.0 [INFO] [stderr] Compiling bitflags v2.10.0 [INFO] [stderr] Compiling linux-raw-sys v0.11.0 [INFO] [stderr] Compiling clap_builder v4.5.57 [INFO] [stderr] Compiling assert_cmd v2.1.2 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling difflib v0.4.0 [INFO] [stderr] Compiling termtree v0.5.1 [INFO] [stderr] Compiling once_cell v1.21.3 [INFO] [stderr] Compiling fastrand v2.3.0 [INFO] [stderr] Compiling predicates-tree v1.0.12 [INFO] [stderr] Compiling predicates v3.1.3 [INFO] [stderr] Compiling syn v2.0.114 [INFO] [stderr] Compiling indexmap v2.13.0 [INFO] [stderr] Compiling bstr v1.12.1 [INFO] [stderr] Compiling wait-timeout v0.2.1 [INFO] [stderr] Compiling tempfile v3.25.0 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling clap_derive v4.5.55 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling clap v4.5.57 [INFO] [stderr] Compiling serde_spanned v0.6.9 [INFO] [stderr] Compiling toml_datetime v0.6.11 [INFO] [stderr] Compiling xtask v0.4.0 (/opt/rustwide/workdir/xtask) [INFO] [stderr] Compiling toml_edit v0.22.27 [INFO] [stderr] Compiling toml v0.8.23 [INFO] [stderr] Compiling cargo-dry4rust v0.4.0 (/opt/rustwide/workdir/core) [INFO] [stderr] Compiling validation v0.4.0 (/opt/rustwide/workdir/validation) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 27.48s [INFO] running `Command { std: "docker" "inspect" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Compiling aho-corasick v1.1.4 [INFO] [stderr] Compiling regex-syntax v0.8.9 [INFO] [stderr] Compiling normalize-line-endings v0.3.0 [INFO] [stderr] Compiling xtask v0.4.0 (/opt/rustwide/workdir/xtask) [INFO] [stderr] Compiling float-cmp v0.10.0 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling bstr v1.12.1 [INFO] [stderr] Compiling predicates v3.1.3 [INFO] [stderr] Compiling assert_cmd v2.1.2 [INFO] [stderr] Compiling validation v0.4.0 (/opt/rustwide/workdir/validation) [INFO] [stderr] Compiling cargo-dry4rust v0.4.0 (/opt/rustwide/workdir/core) [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 13.93s [INFO] running `Command { std: "docker" "inspect" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "test" "--frozen", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.11s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/dry4rust-b44de1e0842f029c) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/debug/deps/cargo_dry4rust-45643f93aef82320) [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 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/all_tests.rs (/opt/rustwide/target/debug/deps/all_tests-8468977f2c9baefe) [INFO] [stdout] [INFO] [stdout] running 477 tests [INFO] [stdout] test analysis_tests::analyze_units_over_no_units_reports_nothing_duplicated ... ok [INFO] [stdout] test analysis_tests::compute_stats_counts_units_and_duplicate_lines ... ok [INFO] [stdout] test analysis_config_tests::analysis_config_carries_only_the_two_floors_a_parser_needs ... ok [INFO] [stdout] test analysis_tests::extracts_if_branches ... ok [INFO] [stdout] test analysis_tests::extracts_bare_loop_bodies ... ok [INFO] [stdout] test analysis_tests::exact_duplicates_grouped ... ok [INFO] [stdout] test analysis_tests::duplicate_group_has_fingerprint ... ok [INFO] [stdout] test analysis_tests::extracts_while_loop_bodies ... ok [INFO] [stdout] test analysis_tests::exact_groups_sorted_by_size ... ok [INFO] [stdout] test analysis_tests::extracts_closure_bodies ... ok [INFO] [stdout] test analysis_tests::fingerprint_discriminates_operators ... ok [INFO] [stdout] test analysis_tests::extracts_loop_bodies ... ok [INFO] [stdout] test analysis_tests::if_vs_match_low_similarity ... ok [INFO] [stdout] test analysis_tests::different_functions_different_fingerprint ... ok [INFO] [stdout] test analysis_tests::completely_different_trees_score_low ... ok [INFO] [stdout] test analysis_tests::fingerprint_from_node ... ok [INFO] [stdout] test analysis_tests::identical_functions_same_fingerprint ... ok [INFO] [stdout] test analysis_tests::identical_branches_from_different_functions_match ... ok [INFO] [stdout] test analysis_tests::empty_trees_score_one ... ok [INFO] [stdout] test analysis_tests::different_macro_names_score_zero ... ok [INFO] [stdout] test analysis_tests::fingerprint_of_the_same_function_is_stable ... ok [INFO] [stdout] test analysis_tests::fingerprint_ignores_variable_names ... ok [INFO] [stdout] test analysis_tests::extracts_match_arms ... ok [INFO] [stdout] test analysis_tests::let_else_diverge_blocks_differ ... ok [INFO] [stdout] test analysis_config_tests::eq_distinguishes_two_configs_that_differ_in_either_floor ... ok [INFO] [stdout] test analysis_tests::let_else_same_diverge_blocks_match ... ok [INFO] [stdout] test analysis_tests::method_call_similarity ... ok [INFO] [stdout] test analysis_tests::simple_expr_different_op ... ok [INFO] [stdout] test analysis_tests::same_macro_different_arg_count_partial_similarity ... ok [INFO] [stdout] test analysis_tests::respects_min_node_count ... ok [INFO] [stdout] test analysis_tests::near_duplicates_found ... ok [INFO] [stdout] test analysis_tests::near_duplicate_complex_fn ... ok [INFO] [stdout] test analysis_tests::similarity_score_for_alpha_equivalent_closures_is_one ... ok [INFO] [stdout] test analysis_tests::no_duplicates_no_groups ... ok [INFO] [stdout] test analysis_tests::nested_structures_extracted_recursively ... ok [INFO] [stdout] test analysis_tests::simple_expr_identical ... ok [INFO] [stdout] test analysis_tests::same_macro_same_args_score_one ... ok [INFO] [stdout] test analysis_tests::near_duplicates_exclude_exact ... ok [INFO] [stdout] test analysis_tests::multiple_exact_groups ... ok [INFO] [stdout] test analysis_tests::similarity_is_symmetric ... ok [INFO] [stdout] test analysis_tests::identical_trees_score_one ... ok [INFO] [stdout] test analysis_tests::structural_difference_low_score ... ok [INFO] [stdout] test analysis_tests::single_expression_difference_high_score ... ok [INFO] [stdout] test analysis_tests::stats_total_lines_computed ... ok [INFO] [stdout] test analysis_tests::single_unit_no_groups ... ok [INFO] [stdout] test analysis_tests::sub_units_are_reindexed ... ok [INFO] [stdout] test analysis_tests::stats_with_near_duplicates ... ok [INFO] [stdout] test analysis_tests::stats_includes_line_counts ... ok [INFO] [stdout] test analysis_tests::analyze_over_a_written_crate_reports_the_duplication_in_it ... ok [INFO] [stdout] test cli::check_command_tests::run_with_a_ceiling_above_the_findings_passes ... ok [INFO] [stdout] test cli::check_command_tests::run_without_thresholds_passes_however_much_it_finds ... ok [INFO] [stdout] test cli::baseline_command_tests::run_outside_dry_run_writes_a_baseline_that_loads_back ... ok [INFO] [stdout] test cli::baseline_command_tests::run_over_a_clean_result_records_nothing_and_says_so ... ok [INFO] [stdout] test cli::checking::ceiling_tests::breach_of_a_count_over_its_limit_names_both_numbers ... ok [INFO] [stdout] test cli::checking::ceiling_tests::breach_of_a_percentage_with_no_limit_reports_nothing ... ok [INFO] [stdout] test cli::checking::ceiling_tests::breach_of_a_count_under_its_limit_reports_nothing ... ok [INFO] [stdout] test cli::checking::check_thresholds_tests::default_sets_no_ceiling_at_all ... ok [INFO] [stdout] test cli::checking::check_thresholds_tests::is_unbounded_of_a_default_reports_a_check_that_cannot_fail ... ok [INFO] [stdout] test cli::baseline_command_tests::run_with_an_unwritable_baseline_keeps_the_entries_it_listed_and_fails ... ok [INFO] [stdout] test cli::check_command_tests::run_with_a_zero_ceiling_fails_on_any_group ... ok [INFO] [stdout] test cli::checking::stale_report_tests::entries_come_back_in_the_order_they_were_given ... ok [INFO] [stdout] test cli::checking::stale_report_tests::heading_distinguishes_a_dry_run_from_a_removal ... ok [INFO] [stdout] test cli::checking::stale_report_tests::is_empty_reports_an_ignore_file_with_nothing_stale_in_it ... ok [INFO] [stdout] test cli::checking::stale_report_tests::summary_of_a_dry_run_speaks_of_what_would_happen ... ok [INFO] [stdout] test cli::checking::ceiling_tests::breach_of_a_percentage_over_its_limit_reports_one_decimal_place ... ok [INFO] [stdout] test cli::checking::check_thresholds_tests::is_unbounded_is_false_once_a_count_ceiling_is_set ... ok [INFO] [stdout] test cli::analysis_output_tests::produce_over_a_root_with_no_source_files_names_the_root_it_looked_in ... ok [INFO] [stdout] test cli::checking::ceiling_tests::breach_of_a_zero_percentage_limit_reports_any_duplication_at_all ... ok [INFO] [stdout] test cli::checking::stale_report_tests::summary_of_a_removal_speaks_of_what_did ... ok [INFO] [stdout] test cli::checking::ceiling_tests::breach_of_a_count_with_no_limit_reports_nothing_however_large ... ok [INFO] [stdout] test cli::checking::check_thresholds_tests::is_unbounded_is_false_once_a_percentage_ceiling_is_set ... ok [INFO] [stdout] test cli::baseline_command_tests::run_in_dry_run_names_what_it_would_record_without_writing_it ... ok [INFO] [stdout] test cli::check_command_tests::run_over_a_clean_result_passes_with_a_ceiling_of_zero ... ok [INFO] [stdout] test cli::cleanup_command_tests::run_in_dry_run_names_the_stale_entry_and_leaves_the_file_alone ... ok [INFO] [stdout] test cli::checking::ceiling_tests::breach_of_a_count_exactly_on_its_limit_reports_nothing ... ok [INFO] [stdout] test cli::checking::ceiling_tests::count_and_percent_format_the_same_number_differently ... ok [INFO] [stdout] test cli::checking::stale_report_tests::is_empty_reports_false_once_something_is_stale ... ok [INFO] [stdout] test cli::cli_error_tests::exit_code_distinguishes_a_failed_check_from_an_internal_error ... ok [INFO] [stdout] test cli::cli_error_tests::fmt_of_ambiguous_language_lists_every_candidate ... ok [INFO] [stdout] test cli::cli_error_tests::fmt_of_invalid_config_is_the_message_it_was_given_and_nothing_more ... ok [INFO] [stdout] test cli::cli_error_tests::fmt_of_invalid_fingerprint_quotes_what_was_offered ... ok [INFO] [stdout] test cli::cli_error_tests::from_an_io_error_keeps_it_as_the_source ... ok [INFO] [stdout] test cli::cli_error_tests::source_of_a_failed_check_is_absent_because_nothing_caused_it ... ok [INFO] [stdout] test cli::cli_error_tests::from_an_analysis_error_keeps_it_as_the_source ... ok [INFO] [stdout] test cli::command_tests::augment_subcommands_rejects_a_subcommand_that_does_not_exist ... ok [INFO] [stdout] test cli::command_outcome_tests::succeeded_carries_the_text_with_an_ok_result ... ok [INFO] [stdout] test cli::cleanup_command_tests::run_with_nothing_stale_says_so_and_writes_no_file ... ok [INFO] [stdout] test cli::cleanup_command_tests::run_outside_dry_run_prunes_the_entry_that_matches_nothing ... ok [INFO] [stderr] error: unexpected argument '--no-such-flag' found [INFO] [stdout] test cli::analysis_output_tests::produce_ignoring_baseline_reports_what_produce_would_have_suppressed ... ok [INFO] [stderr] [INFO] [stdout] test cli::cli_error_tests::exit_code_of_invalid_config_is_an_internal_error_rather_than_a_breach ... ok [INFO] [stderr] tip: to pass '--no-such-flag' as a value, use '-- --no-such-flag' [INFO] [stdout] test cli::cli_error_tests::fmt_of_no_source_files_names_the_path_it_looked_in ... ok [INFO] [stderr] [INFO] [stdout] test cli::command_tests::from_arg_matches_reads_baseline_with_its_dry_run_flag ... ok [INFO] [stderr] Usage: cargo-dry4rust [OPTIONS] [COMMAND] [INFO] [stdout] test cli::cli_error_tests::fmt_of_no_recognized_files_says_which_flag_would_resolve_it ... ok [INFO] [stderr] [INFO] [stdout] test cli::cli_overrides_tests::apply_to_appends_excludes_rather_than_replacing_the_configured_ones ... ok [INFO] [stderr] For more information, try '--help'. [INFO] [stdout] test cli::command_tests::from_arg_matches_leaves_every_ceiling_unset_when_check_is_given_none ... ok [INFO] [stdout] test cli::command_tests::from_arg_matches_reads_check_with_all_four_ceilings ... ok [INFO] [stdout] test cli::entry_point_tests::format_reads_the_flag_when_it_is_given ... ok [INFO] [stdout] test cli::command_tests::from_arg_matches_reads_ignore_with_its_fingerprint_and_reason ... ok [INFO] [stdout] Detect duplicate code in Rust codebases [INFO] [stdout] [INFO] [stdout] Usage: cargo-dry4rust [OPTIONS] [COMMAND] [INFO] [stdout] [INFO] [stdout] Commands: [INFO] [stdout] stats Show duplication statistics only [INFO] [stdout] report Show full duplication report (default) [INFO] [stdout] check Check for duplicates and exit with non-zero if thresholds exceeded [INFO] [stdout] ignore Add a fingerprint to the ignore list [INFO] [stdout] ignored List all ignored fingerprints [INFO] [stdout] cleanup Remove stale entries from the ignore file [INFO] [stdout] baseline Record the duplication that is already there, so `check` fails on what is added rather than on what was inherited [INFO] [stdout] help Print this message or the help of the given subcommand(s) [INFO] [stdout] [INFO] [stdout] Options: [INFO] [stdout] -p, --path Path to analyze (defaults to current directory) [INFO] [stdout] --min-nodes Minimum AST node count for analysis [INFO] [stdout] --min-lines Minimum source line count for analysis [INFO] [stdout] --threshold Similarity threshold (0.0-1.0) [INFO] [stdout] --format Output format [default: text] [possible values: text, json] [INFO] [stdout] --exclude Exclude patterns (can be repeated) [INFO] [stdout] --exclude-tests Exclude test code (#[test] functions and #[cfg(test)] modules) [INFO] [stdout] -s, --sub-function Enable sub-function duplicate detection (if branches, match arms, loop bodies) [INFO] [stdout] --min-sub-nodes Minimum AST node count for sub-function units [INFO] [stdout] --baseline Baseline of inherited duplication: groups it records are not reported and do not fail a check. Record one with the `baseline` subcommand [INFO] [stdout] -h, --help Print help [INFO] [stdout] -V, --version Print version [INFO] [stdout] test cli::entry_point_tests::root_falls_back_to_the_working_directory_when_no_path_is_given ... ok [INFO] [stdout] test cli::entry_point_tests::command_returns_the_subcommand_that_was_named ... ok [INFO] [stdout] test cli::entry_point_tests::overrides_leaves_a_flag_that_was_not_passed_with_no_opinion ... ok [INFO] [stdout] test cli::entry_point_tests::format_defaults_to_text ... ok [INFO] [stdout] test cli::ignore_command_tests::run_records_the_fingerprint_with_the_reason_it_was_given ... ok [INFO] [stdout] test cli::cli_overrides_tests::apply_to_replaces_only_the_values_that_were_given ... ok [INFO] [stdout] test cli::entry_point_tests::run_over_a_root_with_no_sources_reports_the_error_and_exits_two ... ok [INFO] [stdout] test cli::entry_point_tests::run_over_a_request_for_help_exits_zero ... ok [INFO] [stdout] test cli::entry_point_tests::overrides_carries_every_flag_that_was_passed ... ok [INFO] [stdout] test cli::ignore_command_tests::run_over_the_same_fingerprint_twice_records_it_once ... ok [INFO] [stdout] test cli::ignore_entry_line_tests::fmt_of_an_entry_with_a_reason_names_the_reason ... ok [INFO] [stdout] test cli::cli_overrides_tests::apply_to_with_nothing_set_leaves_every_field_as_it_was ... ok [INFO] [stdout] test cli::command_outcome_tests::new_pairs_the_text_with_the_result_it_was_given ... ok [INFO] [stdout] test cli::ignore_command_tests::run_with_a_malformed_fingerprint_is_rejected ... ok [INFO] [stdout] test cli::ignore_entry_line_tests::fmt_never_ends_the_line_itself_so_the_caller_decides_the_newline ... ok [INFO] [stdout] test cli::ignore_entry_line_tests::fmt_of_a_bare_entry_is_the_indented_fingerprint_alone ... ok [INFO] [stdout] test cli::ignore_entry_line_tests::fmt_of_an_entry_with_both_puts_the_reason_before_the_members ... ok [INFO] [stdout] test cli::ignored_command_tests::run_after_ignore_lists_what_was_added ... ok [INFO] [stdout] test cli::output_format_tests::reporter_in_text_mode_writes_the_headed_summary ... ok [INFO] [stdout] test cli::entry_point_tests::run_over_arguments_it_cannot_parse_exits_two ... ok [INFO] [stdout] test cli::output_format_tests::reporter_in_json_mode_writes_parseable_json ... ok [INFO] [stdout] test cli::report_command_tests::run_writes_the_near_section_when_there_is_one ... ok [INFO] [stdout] test cli::stats_command_tests::run_over_a_clean_result_reports_nothing_duplicated ... ok [INFO] [stdout] test cli::ignore_entry_line_tests::fmt_of_an_entry_with_members_lists_them_comma_separated ... ok [INFO] [stdout] test code_unit_tests::code_unit_kind_debug_names_the_variant ... ok [INFO] [stdout] test code_unit_tests::code_unit_kind_distinguishes_functions_from_closures ... ok [INFO] [stdout] test cli::stats_command_tests::run_counts_the_groups_it_was_given ... ok [INFO] [stdout] test cli::output_format_tests::default_is_text_so_a_run_without_the_flag_is_readable ... ok [INFO] [stdout] test command_dispatcher_tests::dispatch_with_ignore_records_the_fingerprint_without_analysing ... ok [INFO] [stdout] test cli::report_command_tests::run_over_a_clean_result_says_so_rather_than_printing_an_empty_section ... ok [INFO] [stdout] test cli::report_command_tests::run_writes_both_the_stats_and_the_groups ... ok [INFO] [stdout] test cli::stats_command_tests::run_writes_the_summary_and_nothing_else ... ok [INFO] [stdout] test cli::ignored_command_tests::run_without_an_ignore_file_says_there_is_nothing_ignored ... ok [INFO] [stdout] test config_tests::default_returns_the_documented_thresholds ... ok [INFO] [stdout] test config_tests::config_with_percentage_thresholds ... ok [INFO] [stdout] test cli::entry_point_tests::command_defaults_to_report_when_none_is_named ... ok [INFO] [stdout] test command_dispatcher_tests::dispatch_with_ignored_lists_what_ignore_recorded ... ok [INFO] [stdout] test config_tests::config_with_thresholds ... ok [INFO] [stdout] test config_tests::config_with_exclude_tests ... ok [INFO] [stdout] test config_tests::config_with_min_lines ... ok [INFO] [stdout] test code_unit_tests::display_names_every_kind_the_way_a_report_should_read ... ok [INFO] [stdout] test code_unit_tests::display_gives_no_two_kinds_the_same_name ... ok [INFO] [stdout] test cli::command_tests::augment_subcommands_declares_every_command_the_tool_serves ... ok [INFO] [stdout] test cli::entry_point_tests::root_returns_the_path_that_was_given ... ok [INFO] [stdout] test config_tests::load_over_an_unparseable_file_falls_back_to_the_defaults ... ok [INFO] [stdout] test config_tests::load_over_a_negative_percentage_ceiling_is_rejected ... ok [INFO] [stdout] test config_tests::load_from_dry4rust_toml ... ok [INFO] [stdout] test extractor_tests::extract_sub_units_from_a_leaf_returns_nothing ... ok [INFO] [stdout] test file_config_tests::apply_to_of_an_empty_file_changes_nothing ... ok [INFO] [stdout] test fingerprint_tests::fmt_pads_the_hash_to_sixteen_hex_digits ... ok [INFO] [stdout] test file_config_tests::apply_to_replaces_the_excludes_rather_than_appending_to_them ... ok [INFO] [stdout] test config_tests::dry4rust_toml_overrides_cargo_toml ... ok [INFO] [stdout] test fingerprint_tests::composite_fingerprint_different_sets_differ ... ok [INFO] [stdout] test file_config_tests::apply_to_changes_only_the_fields_the_file_states ... ok [INFO] [stdout] test config_tests::load_from_cargo_toml_metadata ... ok [INFO] [stdout] test fingerprint_tests::composite_fingerprint_order_independent ... ok [INFO] [stdout] test extractor_tests::extract_sub_units_with_a_high_minimum_returns_nothing ... ok [INFO] [stdout] test config_tests::load_over_a_similarity_threshold_above_one_names_the_field_and_the_value ... ok [INFO] [stdout] test file_config_tests::apply_to_rejects_a_percentage_outside_a_hundred ... ok [INFO] [stdout] test file_config_tests::apply_to_takes_a_percentage_as_a_share_of_a_hundred ... ok [INFO] [stdout] test fingerprint_tests::composite_fingerprint_deterministic ... ok [INFO] [stdout] test file_config_tests::apply_to_reads_a_baseline_path_as_written ... ok [INFO] [stdout] test fingerprint_tests::from_hex_invalid ... ok [INFO] [stdout] test fingerprint_tests::to_hex_round_trips_back_through_from_hex ... ok [INFO] [stdout] test grouper_tests::empty_input_no_groups ... ok [INFO] [stdout] test fingerprint_tests::parse_file_gives_the_golden_sample_a_stable_fingerprint ... ok [INFO] [stdout] test grouper_tests::duplication_stats_percentages_match_their_counts ... ok [INFO] [stdout] test grouper_tests::find_near_duplicates_with_a_single_candidate_returns_early ... ok [INFO] [stdout] test grouper_tests::compute_stats_with_sub_records_the_sub_function_group_counts ... ok [INFO] [stdout] test config_tests::load_no_config_files ... ok [INFO] [stdout] test grouper_tests::find_near_duplicates_groups_two_similar_but_not_identical_functions ... ok [INFO] [stdout] test grouper_tests::find_near_duplicates_with_a_threshold_of_one_demands_exactness ... ok [INFO] [stdout] test fingerprint_tests::parse_file_gives_a_structurally_different_function_a_different_fingerprint ... ok [INFO] [stdout] test grouper_tests::find_near_duplicates_skips_units_already_matched_exactly ... ok [INFO] [stdout] test fingerprint_tests::parse_file_gives_a_renamed_copy_of_the_golden_sample_the_same_fingerprint ... ok [INFO] [stdout] test file_config_tests::apply_to_rejects_a_similarity_threshold_outside_one ... ok [INFO] [stdout] test grouper_tests::find_near_duplicates_with_no_units_finds_nothing ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_groups_a_pair_whose_sizes_straddle_a_power_of_two ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_keeps_a_pair_whose_ceiling_lands_exactly_on_the_threshold ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_over_a_single_unit_returns_nothing ... ok [INFO] [stdout] test grouper_tests::find_near_duplicates_below_the_threshold_reports_no_group ... ok [INFO] [stdout] test grouper_tests::percentage_helpers_zero_total ... ok [INFO] [stdout] test grouper_tests::with_baseline_suppressed_distinguishes_none_suppressed_from_no_baseline ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_excluding_every_fingerprint_returns_nothing ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_over_no_units_returns_nothing ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::new_records_the_threshold_that_find_then_applies ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_skips_a_pair_too_far_apart_in_size_to_reach_the_threshold ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_reports_a_similarity_no_higher_than_the_weakest_pair ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_run_twice_over_the_same_units_returns_the_same_groups ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_with_an_unreachable_threshold_returns_nothing ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::could_reach_threshold_for_a_pair_straddling_a_power_of_two_is_true ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::could_reach_threshold_on_the_exact_boundary_is_true ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::could_reach_threshold_for_two_empty_trees_is_true ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_with_a_threshold_of_one_groups_only_what_is_identical ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::could_reach_threshold_for_a_pair_too_far_apart_is_false ... ok [INFO] [stdout] test near_duplicate::near_duplicate_finder_tests::find_with_a_permissive_threshold_groups_the_two_similar_functions ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::could_reach_threshold_with_equal_sizes_is_always_true ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::could_reach_threshold_one_node_past_the_boundary_is_false ... ok [INFO] [stdout] test near_duplicate::similarity_pair_tests::new_keeps_the_indices_in_the_order_they_were_given ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::new_records_the_threshold_that_could_reach_threshold_then_applies ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::scan_pairs_sub_function_units_of_different_kinds ... ok [INFO] [stdout] test near_duplicate::similarity_tests::both_none_sentinels_score_one ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::scan_pairs_a_function_with_a_method_whose_body_matches ... ok [INFO] [stdout] test near_duplicate::similarity_pair_tests::key_is_the_same_whichever_way_round_the_pair_was_built ... ok [INFO] [stdout] test near_duplicate::similarity_pair_tests::key_of_a_pair_with_equal_indices_returns_that_index_twice ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::scan_over_a_single_candidate_finds_no_pairs ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::scan_stops_at_the_first_partner_too_large_rather_than_the_last ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::scan_pairs_units_whose_sizes_straddle_a_power_of_two ... ok [INFO] [stdout] test near_duplicate::similarity_tests::completely_different_kinds_score_zero ... ok [INFO] [stdout] test near_duplicate::similarity_pair_tests::key_puts_the_lower_index_first ... ok [INFO] [stdout] test near_duplicate::pair_scanner_tests::scan_skips_units_too_far_apart_in_size ... ok [INFO] [stdout] test near_duplicate::similarity_tests::different_child_counts_uses_shared_prefix ... ok [INFO] [stdout] test near_duplicate::similarity_tests::similarity_score_between_blocks_differing_by_one_inserted_statement_stays_high ... ok [INFO] [stdout] test near_duplicate::similarity_tests::similarity_score_never_matches_a_then_branch_against_an_else_branch ... ok [INFO] [stdout] test near_duplicate::union_find_tests::groups_on_a_fresh_forest_returns_one_singleton_each ... ok [INFO] [stdout] test near_duplicate::similarity_tests::if_with_else_vs_if_without_else ... ok [INFO] [stdout] test near_duplicate::similarity_tests::macro_call_same_name_different_args_partial ... ok [INFO] [stdout] test near_duplicate::similarity_tests::same_discriminant_different_data_no_self_match ... ok [INFO] [stdout] test near_duplicate::similarity_tests::similarity_is_symmetric ... ok [INFO] [stdout] test near_duplicate::similarity_tests::similarity_score_between_tuples_differing_by_one_inserted_element_stays_high ... ok [INFO] [stdout] test near_duplicate::union_find_tests::find_on_a_fresh_forest_returns_the_element_itself ... ok [INFO] [stdout] test near_duplicate::similarity_tests::none_vs_real_node_score_zero ... ok [INFO] [stdout] test near_duplicate::similarity_tests::return_with_vs_without_value ... ok [INFO] [stdout] test near_duplicate::similarity_tests::similarity_score_between_blocks_with_a_statement_removed_stays_high ... ok [INFO] [stdout] test near_duplicate::union_find_tests::new_creates_a_forest_in_which_nothing_is_joined ... ok [INFO] [stdout] test near_duplicate::similarity_tests::identical_leaves_score_one ... ok [INFO] [stdout] test near_duplicate::union_find_tests::find_after_a_chain_of_unions_reports_one_root_for_the_whole_chain ... ok [INFO] [stdout] test near_duplicate::union_find_tests::len_reports_the_size_the_forest_was_built_with ... ok [INFO] [stdout] test node_encoder_tests::encode_gives_equal_trees_equal_fingerprints ... ok [INFO] [stdout] test node_encoder_tests::encode_distinguishes_trees_that_differ_only_in_where_the_nesting_falls ... ok [INFO] [stdout] test near_duplicate::union_find_tests::union_repeated_over_the_same_pair_is_idempotent ... ok [INFO] [stdout] test node_encoder_tests::encode_distinguishes_two_literals_of_different_type ... ok [INFO] [stdout] test near_duplicate::similarity_tests::macro_call_different_names_score_zero ... ok [INFO] [stdout] test node_encoder_tests::finish_without_encoding_anything_matches_a_fresh_hasher ... ok [INFO] [stdout] test node_tests::context_per_kind_counters_are_independent ... ok [INFO] [stdout] test node_encoder_tests::new_starts_every_encoder_from_the_same_state ... ok [INFO] [stdout] test node_encoder_tests::encode_gives_every_node_kind_a_distinct_fingerprint ... ok [INFO] [stdout] test node_encoder_tests::encode_distinguishes_the_same_placeholder_in_three_different_positions ... ok [INFO] [stdout] test node_encoder_tests::encode_distinguishes_a_macro_call_from_one_with_another_name ... ok [INFO] [stdout] test node_tests::count_nodes_skips_none_sentinels ... ok [INFO] [stdout] test node_encoder_tests::encode_distinguishes_a_mutable_reference_from_a_shared_one ... ok [INFO] [stdout] test node_encoder_tests::encode_distinguishes_placeholders_by_index ... ok [INFO] [stdout] test node_tests::opt_without_a_value_returns_the_none_sentinel ... ok [INFO] [stdout] test node_tests::context_assigns_sequential_indices ... ok [INFO] [stdout] test node_tests::context_returns_same_index_for_same_name ... ok [INFO] [stdout] test node_encoder_tests::encode_ignores_the_order_of_nothing_and_reflects_the_order_of_children ... ok [INFO] [stdout] test node_encoder_tests::encode_distinguishes_placeholders_by_kind ... ok [INFO] [stdout] test near_duplicate::union_find_tests::groups_orders_members_ascending_and_groups_by_lowest_member ... ok [INFO] [stdout] test near_duplicate::union_find_tests::is_empty_distinguishes_a_zero_sized_forest_from_a_populated_one ... ok [INFO] [stdout] test near_duplicate::union_find_tests::union_of_an_element_with_itself_leaves_the_groups_unchanged ... ok [INFO] [stdout] test node_tests::context_same_name_different_kind_are_distinct ... ok [INFO] [stdout] test node_tests::count_nodes_basic ... ok [INFO] [stdout] test node_tests::opt_with_a_value_returns_that_value ... ok [INFO] [stdout] test normalization_context_tests::placeholder_for_distinct_identifiers_returns_rising_indices ... ok [INFO] [stdout] test near_duplicate::union_find_tests::groups_over_an_empty_forest_returns_nothing ... ok [INFO] [stdout] test normalization_context_tests::placeholder_for_the_same_identifier_twice_returns_the_same_index ... ok [INFO] [stdout] test output::check_breach_tests::groups_returns_the_groups_the_breach_was_built_over ... ok [INFO] [stdout] test node_tests::reindex_remaps_from_zero ... ok [INFO] [stdout] test node_tests::reindex_makes_equivalent_subtrees_equal ... ok [INFO] [stdout] test output::check_breach_tests::is_of_exact_distinguishes_which_set_the_groups_came_from ... ok [INFO] [stdout] test output::group_section_tests::write_shows_a_member_path_relative_to_the_base_it_is_given ... ok [INFO] [stdout] test output::json_tests::json_is_valid ... ok [INFO] [stdout] test output::json_tests::json_relative_paths ... ok [INFO] [stdout] test output::json_tests::json_report_exact_empty ... ok [INFO] [stdout] test output::json_tests::json_report_exact_with_groups ... ok [INFO] [stdout] test output::json_tests::json_report_stats ... ok [INFO] [stdout] test normalization_context_tests::placeholder_counts_each_kind_from_zero_independently ... ok [INFO] [stdout] test output::group_section_tests::write_numbers_the_groups_from_one ... ok [INFO] [stdout] test node_tests::reindex_handles_multiple_placeholder_kinds ... ok [INFO] [stdout] test output::group_section_tests::write_over_an_empty_exact_section_says_none_were_found ... ok [INFO] [stdout] test node_tests::reindex_preserves_same_placeholder_identity ... ok [INFO] [stdout] test output::group_section_tests::write_over_an_empty_near_section_says_none_were_found ... ok [INFO] [stdout] test output::report_tests::report_in_json_keeps_exact_and_near_even_when_empty ... ok [INFO] [stdout] test output::group_section_tests::write_over_an_empty_sub_section_says_nothing_at_all ... ok [INFO] [stdout] test output::group_section_tests::write_underlines_the_title_to_its_own_length ... ok [INFO] [stdout] test output::report_tests::report_in_text_writes_every_section_that_has_something_in_it ... ok [INFO] [stdout] test output::json_tests::json_report_check_gathers_the_groups_rather_than_repeating_them ... ok [INFO] [stdout] test output::report_tests::report_in_json_is_one_document_with_the_sections_named ... ok [INFO] [stdout] test output::json_tests::json_report_sub_exact_with_groups ... ok [INFO] [stdout] test output::json_tests::json_report_sub_near_with_groups ... ok [INFO] [stdout] test output::group_section_tests::write_states_the_similarity_only_where_the_section_is_scored ... ok [INFO] [stdout] test output::report_tests::report_in_text_leaves_out_the_sections_with_nothing_in_them ... ok [INFO] [stdout] test output::text_tests::text_report_check_with_no_breaches_says_it_passed ... ok [INFO] [stdout] test output::json_tests::json_report_near_with_groups ... ok [INFO] [stdout] test output::text_tests::text_report_exact_with_groups ... ok [INFO] [stdout] test output::text_tests::text_report_near_empty ... ok [INFO] [stdout] test output::reporter_tests::display_path_outside_its_base_falls_back_to_the_whole_path ... ok [INFO] [stdout] test output::text_tests::text_report_near_with_groups ... ok [INFO] [stdout] test output::reporter_tests::display_path_under_its_base_returns_the_relative_part ... ok [INFO] [stdout] test placeholder_order_collector_tests::into_order_over_a_node_without_placeholders_is_empty ... ok [INFO] [stdout] test output::text_tests::text_report_stats ... ok [INFO] [stdout] test output::check_breach_tests::message_returns_the_sentence_it_was_given ... ok [INFO] [stdout] test output::text_tests::text_report_sub_exact_heads_its_own_section_and_names_the_parent ... ok [INFO] [stdout] test placeholder_order_collector_tests::collect_visits_children_depth_first ... ok [INFO] [stdout] test rust::normalizer::expr_tests::normalize_block_keeps_blocks_of_different_shape_apart ... ok [INFO] [stdout] test output::reporter_tests::display_path_without_a_base_returns_the_path_unchanged ... ok [INFO] [stdout] test output::text_tests::relative_path_stripping ... ok [INFO] [stdout] test output::text_tests::text_report_check_puts_each_breach_before_the_groups_behind_it ... ok [INFO] [stdout] test output::text_tests::text_report_exact_empty ... ok [INFO] [stdout] test output::text_tests::text_report_sub_near_with_nothing_to_report_writes_nothing_at_all ... ok [INFO] [stdout] test rust::normalizer::helpers_tests::normalize_macro_gives_the_same_macro_the_same_node ... ok [INFO] [stdout] test rust::normalizer::helpers_tests::normalize_un_op_maps_different_operators_to_different_kinds ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::array_expression_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::await_expression_normalized ... ok [INFO] [stdout] test output::group_section_tests::write_names_the_parent_only_where_the_section_is_sub_function ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::empty_block_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::assign_expression_normalized ... ok [INFO] [stdout] test rust::normalizer::helpers_tests::normalize_bin_op_maps_different_operators_to_different_kinds ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::cast_expression_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::field_access_normalized ... ok [INFO] [stdout] test rust::normalizer::expr_tests::normalize_stmt_gives_alpha_equivalent_lets_the_same_node ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::if_vs_if_else_different ... ok [INFO] [stdout] test rust::normalizer::helpers_tests::member_to_string_for_a_tuple_index_returns_the_index ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::bool_literals_normalize_as_placeholders ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::impl_block_methods_normalized ... ok [INFO] [stdout] test rust::normalizer::helpers_tests::member_to_string_for_a_named_field_returns_the_name ... ok [INFO] [stdout] test rust::normalizer::helpers_tests::normalize_lit_erases_the_value_but_keeps_the_type ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::for_loops_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::complex_function_normalization ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::binary_ops_preserved ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::different_macro_names_produce_different_nodes ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::macro_call_node_count ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::if_else_structure_preserved ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::literal_kind_preserved_but_value_erased ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::normalize_impl_item_fn_splits_a_method_into_signature_and_body ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::index_expression_normalized ... ok [INFO] [stdout] test placeholder_order_collector_tests::collect_records_each_placeholder_once_in_first_occurrence_order ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::macro_invocations_produce_macro_call ... ok [INFO] [stdout] test output::text_tests::text_report_sub_near_heads_its_own_section_and_states_the_similarity ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::method_calls_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::reference_expressions_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::node_counting_works ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::normalize_closures_ignores_the_parameter_names ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::normalize_closure_expr_ignores_the_parameter_names ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::return_expression_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::reindex_from_real_function_subtrees ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::same_macro_different_arg_count_are_different ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::normalize_loop_produces_a_loop_node ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::normalize_signature_gives_alpha_equivalent_signatures_the_same_node ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::type_position_macro_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::match_arms_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::structural_changes_produce_different_trees ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::multi_segment_macro_path_uses_last_segment ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::same_macro_different_literal_values_are_equal ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::try_expression_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::tuple_pattern_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::range_expression_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::tuple_expression_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::pat_macro_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::unary_ops_preserved ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::renamed_variables_produce_identical_trees ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::string_literals_are_equal ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::struct_init_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::unparseable_macro_args_produce_opaque ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::unparseable_macro_differs_from_no_args ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::vec_macro_normalized ... ok [INFO] [stdout] test rust::normalizer::normalize_tests::while_loop_normalized ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_pat_over_a_mutable_reference_records_the_mutability ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_pat_gives_differently_named_bindings_the_same_node ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_pat_gives_a_tuple_struct_the_same_kind_as_a_braced_struct ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_pat_keeps_a_literal_pattern_apart_from_a_wildcard ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_pat_over_a_rest_pattern_yields_a_rest_node ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_pat_over_a_struct_pattern_yields_a_struct_node ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_pat_over_a_range_pattern_yields_a_range_node ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_gives_the_same_type_the_same_node ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_gives_distinct_types_distinct_placeholders_in_one_context ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_keeps_never_and_infer_apart ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_over_a_never_type_yields_a_never_node ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_over_an_impl_trait_yields_an_impl_trait_node ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_over_a_slice_and_an_array_keeps_them_apart ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_over_the_unit_type_yields_a_unit_node ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_sees_through_parentheses_to_the_inner_type ... ok [INFO] [stdout] test rust::parser_tests::code_unit_kind_display ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_handles_every_type_form_it_claims_to ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_over_a_parenthesised_type_unwraps_the_parentheses ... ok [INFO] [stdout] test rust::parser_tests::duplicate_functions_same_fingerprint ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_type_over_an_inferred_type_yields_an_infer_node ... ok [INFO] [stdout] test rust::parser_tests::different_functions_different_fingerprint ... ok [INFO] [stdout] test rust::parser_tests::extracts_top_level_functions ... ok [INFO] [stdout] test rust::parser_tests::cfg_test_impl_blocks_tagged_as_test ... ok [INFO] [stdout] test rust::parser_tests::cfg_test_module_functions_tagged_as_test ... ok [INFO] [stdout] test rust::parser_tests::parse_files_collects_warnings ... ok [INFO] [stdout] test rust::parser_tests::extracts_trait_impl_methods ... ok [INFO] [stdout] test rust::parser_tests::min_line_count_filters_short_functions ... ok [INFO] [stdout] test rust::parser_tests::extracts_methods_from_impl ... ok [INFO] [stdout] test rust::parser_tests::handles_parse_errors_gracefully ... ok [INFO] [stdout] test rust::parser_tests::parse_source_works ... ok [INFO] [stdout] test rust::parser_tests::test_has_cfg_test_attr ... ok [INFO] [stdout] test rust::parser_tests::parse_source_extracts_closures_as_their_own_units ... ok [INFO] [stdout] test rust::parser_tests::test_functions_tagged_as_test ... ok [INFO] [stdout] test scanner_tests::with_extensions_replaces_the_default_and_keeps_the_root ... ok [INFO] [stdout] test stable_hasher_tests::new_and_default_start_from_the_same_state ... ok [INFO] [stdout] test rust::parser_tests::respects_min_node_count ... ok [INFO] [stdout] test stable_hasher_tests::finish_on_an_untouched_hasher_returns_the_fnv_offset_basis ... ok [INFO] [stdout] test rust::parser_tests::test_has_test_attr ... ok [INFO] [stdout] test rust::rust_analyzer_tests::rust_analyzer_through_trait ... ok [INFO] [stdout] test scanner_tests::is_excluded_works ... ok [INFO] [stdout] test scanner_tests::scan_empty_directory ... ok [INFO] [stdout] test scanner_tests::scan_skips_target_directory ... ok [INFO] [stdout] test scanner_tests::scan_respects_exclude_patterns ... ok [INFO] [stdout] test scanner_tests::scan_finds_rust_files ... ok [INFO] [stdout] test scanner_tests::scan_skips_hidden_directories ... ok [INFO] [stdout] test stable_hasher_tests::write_bytes_matches_the_published_fnv_1a_vector_for_foobar ... ok [INFO] [stdout] test stable_hasher_tests::write_str_distinguishes_inputs_that_concatenate_to_the_same_bytes ... ok [INFO] [stdout] test stable_hasher_tests::write_u64_is_eight_bytes_big_endian_regardless_of_the_platform ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_from_a_closure_takes_the_first_child_as_the_body ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_from_a_match_skips_an_arm_that_has_no_body ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_from_a_for_loop_takes_the_third_child_as_the_body ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_from_an_if_without_an_else_returns_only_the_then_branch ... ok [INFO] [stdout] test stable_hasher_tests::write_bytes_matches_the_published_fnv_1a_vector_for_a ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_from_a_match_numbers_its_arms_from_one ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_from_a_while_takes_the_second_child_as_the_body ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_from_a_loop_takes_the_first_child_as_the_body ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_pat_over_a_slice_pattern_yields_a_slice_node ... ok [INFO] [stdout] test rust::normalizer::pat_tests::normalize_pat_over_an_alternation_yields_an_or_node ... ok [INFO] [stdout] test rust::parser_tests::code_unit_has_line_numbers ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_from_an_if_with_a_real_else_returns_both_branches_in_order ... ok [INFO] [stdout] test rust::parser_tests::non_test_code_not_tagged ... ok [INFO] [stdout] test rust::normalizer::expr_tests::normalize_block_erases_the_names_its_statements_bind ... ok [INFO] [stdout] test suppression::baseline_entry_tests::admits_nothing_once_the_group_has_grown ... ok [INFO] [stdout] test suppression::baseline_entry_tests::of_records_the_fingerprint_the_count_and_the_names ... ok [INFO] [stdout] test suppression::baseline_file_tests::baseline_path_leaves_an_absolute_name_alone ... ok [INFO] [stdout] test suppression::baseline_file_tests::baseline_path_without_a_name_uses_the_family_default ... ok [INFO] [stdout] test suppression::baseline_file_tests::record_orders_entries_by_kind_then_fingerprint ... ok [INFO] [stdout] test suppression::baseline_entry_tests::admits_nothing_of_another_fingerprint ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_with_a_floor_above_the_body_size_returns_nothing ... ok [INFO] [stdout] test sub_unit_extractor_tests::new_records_the_floor_that_extract_then_applies ... ok [INFO] [stdout] test suppression::baseline_file_tests::baseline_path_joins_a_relative_name_to_the_analysed_root ... ok [INFO] [stdout] test suppression::baseline_filter_tests::is_in_effect_is_false_when_no_baseline_is_configured ... ok [INFO] [stdout] test suppression::baseline_file_tests::load_of_a_directory_reports_what_the_filesystem_said_rather_than_absence ... ok [INFO] [stdout] test suppression::baseline_file_tests::save_where_the_parent_is_a_file_reports_the_failure ... ok [INFO] [stdout] test suppression::baseline_entry_tests::admits_a_group_it_recorded_unchanged ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_over_a_nested_tree_reports_the_outer_body_before_the_inner_one ... ok [INFO] [stdout] test suppression::baseline_entry_tests::admits_nothing_of_another_kind_at_the_same_fingerprint ... ok [INFO] [stdout] test suppression::baseline_filter_tests::load_of_a_baseline_that_is_not_there_fails_rather_than_suppressing_nothing ... ok [INFO] [stdout] test suppression::baseline_kind_tests::serialize_writes_a_name_rather_than_a_position ... ok [INFO] [stdout] test suppression::ignore_entry_tests::deserialize_defaults_the_two_optional_fields_when_the_file_omits_them ... ok [INFO] [stdout] test suppression::baseline_filter_tests::is_in_effect_is_true_once_one_is_loaded ... ok [INFO] [stdout] test sub_unit_extractor_tests::extract_with_a_kind_that_carries_no_body_returns_nothing_for_that_node ... ok [INFO] [stdout] test suppression::baseline_filter_tests::retain_new_keeps_a_recorded_group_that_has_since_grown ... ok [INFO] [stdout] test suppression::ignore_entry_tests::serialize_then_deserialize_returns_what_was_recorded ... ok [INFO] [stdout] test suppression::ignore_file_tests::contains_reports_whether_the_fingerprint_is_suppressed ... ok [INFO] [stdout] test suppression::ignore_file_tests::load_over_a_root_with_no_ignore_file_returns_an_empty_one ... ok [INFO] [stdout] test suppression::ignore_file_tests::path_in_names_the_file_beside_the_project_root ... ok [INFO] [stdout] test suppression::baseline_file_tests::load_of_a_malformed_baseline_is_an_error_rather_than_an_empty_one ... ok [INFO] [stdout] test suppression::ignore_file_tests::remove_from_a_root_with_no_ignore_file_is_not_an_error ... ok [INFO] [stdout] test suppression::baseline_file_tests::load_of_a_missing_baseline_names_the_command_that_would_record_one ... ok [INFO] [stdout] test suppression::ignore_file_tests::retain_unsuppressed_keeps_a_near_group_with_no_matching_entry ... ok [INFO] [stdout] test suppression::ignore_file_tests::retain_unsuppressed_removes_a_near_group_whose_fingerprint_matches ... ok [INFO] [stdout] test suppression::ignore_file_tests::retain_unsuppressed_removes_the_group_whose_fingerprint_matches ... ok [INFO] [stdout] test suppression::baseline_filter_tests::none_suppresses_nothing_and_says_it_is_not_in_effect ... ok [INFO] [stdout] test suppression::baseline_entry_tests::admits_a_group_that_has_shrunk_since_it_was_recorded ... ok [INFO] [stdout] test suppression::baseline_kind_tests::deserialize_reads_back_every_kind_it_writes ... ok [INFO] [stdout] test suppression::baseline_kind_tests::fmt_names_each_kind_as_the_report_does ... ok [INFO] [stdout] test suppression::ignore_file_tests::with_ignored_over_the_same_fingerprint_twice_records_it_once ... ok [INFO] [stdout] test suppression::ignore_file_tests::without_an_entry_that_is_not_there_says_so ... ok [INFO] [stdout] test suppression::ignore_file_tests::without_removes_the_entry_and_says_it_did ... ok [INFO] [stdout] test suppression::baseline_filter_tests::retain_new_keeps_a_group_recorded_under_another_kind ... ok [INFO] [stdout] test suppression::baseline_filter_tests::retain_new_drops_a_group_the_baseline_recorded ... ok [INFO] [stdout] test suppression::ignore_entry_tests::serialize_omits_a_reason_that_was_never_given ... ok [INFO] [stdout] test suppression::ignore_file_tests::save_of_an_emptied_file_takes_it_away_rather_than_writing_an_empty_list ... ok [INFO] [stdout] test threshold_tests::fraction_and_percent_of_the_same_proportion_are_equal ... ok [INFO] [stdout] test suppression::baseline_filter_tests::retain_new_keeps_a_group_the_baseline_never_saw ... ok [INFO] [stdout] test threshold_tests::fraction_at_either_end_of_its_range_is_accepted ... ok [INFO] [stdout] test threshold_tests::fraction_of_a_negative_value_names_the_field_it_came_from ... ok [INFO] [stdout] test threshold_tests::fraction_of_a_value_above_one_is_rejected ... ok [INFO] [stdout] test threshold_tests::percent_at_either_end_of_its_range_is_accepted ... ok [INFO] [stdout] test threshold_tests::percent_of_a_value_above_a_hundred_is_rejected ... ok [INFO] [stdout] test threshold_tests::as_fraction_returns_what_fraction_was_given ... ok [INFO] [stdout] test threshold_tests::fraction_of_nan_is_rejected ... ok [INFO] [stdout] test suppression::ignore_file_tests::save_then_load_returns_what_was_recorded ... ok [INFO] [stdout] test threshold_tests::percent_of_a_whole_hundred_is_the_whole_fraction ... ok [INFO] [stdout] test threshold_tests::as_percent_of_a_fraction_scales_it_by_a_hundred ... ok [INFO] [stdout] test stable_hasher_tests::write_bytes_over_two_calls_matches_one_call_with_the_whole_input ... ok [INFO] [stdout] test suppression::ignore_file_tests::without_stale_keeps_the_live_entries_and_hands_back_the_rest ... ok [INFO] [stdout] test threshold_tests::default_similarity_is_the_documented_nine_tenths ... ok [INFO] [stdout] test stable_hasher_tests::write_u8_absorbs_exactly_one_byte ... ok [INFO] [stdout] test suppression::ignore_file_tests::stale_separates_the_entries_that_no_longer_match_anything ... ok [INFO] [stdout] test suppression::baseline_file_tests::load_of_a_baseline_from_a_later_format_says_to_re_record_it ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 477 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.19s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/validation-9629b8cdb41cad6e) [INFO] [stderr] Running tests/all_tests.rs (/opt/rustwide/target/debug/deps/all_tests-443de9d6795c448a) [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] [stdout] [INFO] [stdout] running 109 tests [INFO] [stdout] test baseline_scenario_tests::run_over_a_clean_codebase_records_nothing_and_says_so ... ok [INFO] [stdout] test baseline_scenario_tests::record_takes_every_group_the_result_holds ... ok [INFO] [stdout] test baseline_scenario_tests::run_outside_dry_run_writes_a_baseline_that_loads_back ... ok [INFO] [stdout] test baseline_scenario_tests::admits_nothing_a_group_it_never_saw ... ok [INFO] [stdout] test baseline_scenario_tests::record_orders_entries_so_an_unchanged_codebase_writes_an_unchanged_file ... ok [INFO] [stdout] test baseline_scenario_tests::admits_a_group_some_entry_recorded ... ok [INFO] [stdout] test baseline_scenario_tests::run_in_dry_run_names_what_it_would_record_without_writing_it ... ok [INFO] [stdout] test baseline_scenario_tests::save_then_load_returns_what_was_recorded ... ok [INFO] [stdout] test check_scenario_tests::check_absolute_passes_percentage_fails ... ok [INFO] [stdout] test baseline_scenario_tests::main_dispatches_the_baseline_subcommand_in_dry_run ... ok [INFO] [stdout] test baseline_scenario_tests::is_empty_reports_a_recording_of_a_clean_codebase ... ok [INFO] [stdout] test check_scenario_tests::check_in_json_says_it_passed_when_nothing_is_breached ... ok [INFO] [stdout] test check_scenario_tests::run_over_a_clean_fixture_passes_with_every_ceiling_at_zero ... ok [INFO] [stdout] test check_scenario_tests::run_with_a_generous_percentage_ceiling_passes ... ok [INFO] [stdout] test check_scenario_tests::check_in_json_is_one_document_carrying_the_verdict ... ok [INFO] [stdout] test check_scenario_tests::run_with_a_percentage_ceiling_of_zero_fails_on_any_duplication ... ok [INFO] [stdout] test check_scenario_tests::run_with_a_zero_threshold_fails_on_duplicates ... ok [INFO] [stdout] test check_scenario_tests::check_fails_with_percentage_threshold_exceeded ... ok [INFO] [stdout] test check_scenario_tests::check_no_thresholds_passes_with_duplicates ... ok [INFO] [stdout] test check_scenario_tests::check_no_dupes_passes ... ok [INFO] [stdout] test check_scenario_tests::run_with_a_near_duplicate_ceiling_fails_when_it_is_exceeded ... ok [INFO] [stdout] test check_scenario_tests::run_with_a_near_percentage_ceiling_of_zero_fails_on_near_duplication ... ok [INFO] [stdout] test check_scenario_tests::run_with_every_ceiling_set_reports_each_breach_it_finds ... ok [INFO] [stdout] test check_scenario_tests::run_with_an_exact_count_ceiling_above_the_findings_passes ... ok [INFO] [stdout] test check_scenario_tests::check_fails_with_duplicates ... ok [INFO] [stdout] test check_scenario_tests::main_dispatches_the_check_subcommand_and_succeeds_on_a_clean_fixture ... ok [INFO] [stdout] test cleanup_scenario_tests::run_outside_dry_run_takes_away_a_file_it_emptied ... ok [INFO] [stdout] test cleanup_scenario_tests::run_with_nothing_stale_says_so_and_writes_no_file ... ok [INFO] [stdout] test check_scenario_tests::main_dispatches_the_check_subcommand_and_exits_one_when_a_ceiling_is_breached ... ok [INFO] [stdout] test dispatch_scenario_tests::dispatch_over_a_missing_root_returns_an_error ... ok [INFO] [stdout] test baseline_scenario_tests::run_twice_records_the_same_groups_rather_than_emptying_the_file ... ok [INFO] [stdout] test check_scenario_tests::check_with_a_percentage_ceiling_above_a_hundred_is_rejected ... ok [INFO] [stdout] test cleanup_scenario_tests::cleanup_dry_run ... ok [INFO] [stdout] test check_scenario_tests::check_passes_with_generous_percentage_threshold ... ok [INFO] [stdout] test dispatch_scenario_tests::dispatch_with_check_breaching_its_ceiling_returns_check_failed ... ok [INFO] [stdout] test dispatch_scenario_tests::dispatch_with_check_within_its_ceiling_succeeds ... ok [INFO] [stdout] test dispatch_scenario_tests::dispatch_with_stats_writes_a_summary ... ok [INFO] [stdout] test duplicate_group_fixture_tests::of_a_fingerprint_gives_it_to_the_group_and_to_every_member ... ok [INFO] [stdout] test duplicate_group_fixture_tests::of_any_members_is_an_exact_group ... ok [INFO] [stdout] test dispatch_scenario_tests::dispatch_with_cleanup_in_dry_run_succeeds_and_writes_a_report ... ok [INFO] [stdout] test dispatch_scenario_tests::new_stores_the_overrides_it_is_given_and_applies_them_to_the_analysis ... ok [INFO] [stdout] test duplicate_group_fixture_tests::of_names_holds_one_member_per_name_in_the_order_given ... ok [INFO] [stdout] test fixture_tests::duplicated_crate_in_a_temp_dir_makes_the_duplicated_fixture_its_crate_root ... ok [INFO] [stdout] test dispatch_scenario_tests::dispatch_with_report_writes_the_full_report ... ok [INFO] [stdout] test fixture_tests::analysed_roots_its_configuration_at_the_fixture ... ok [INFO] [stdout] test fixture_tests::path_of_a_corpus_crate_names_a_directory_under_fixture ... ok [INFO] [stdout] test format_scenario_tests::default_is_text_so_a_run_without_the_flag_is_readable ... ok [INFO] [stdout] test check_scenario_tests::check_passes_with_high_threshold ... ok [INFO] [stdout] test fixture_tests::analysed_leaves_sub_function_analysis_off ... ok [INFO] [stdout] test fixture_tests::analysed_over_a_duplicated_fixture_finds_its_one_exact_group ... ok [INFO] [stdout] test fixture_tests::analysed_with_sub_function_turns_sub_function_analysis_on ... ok [INFO] [stdout] test dry_binary_tests::command_in_a_fixture_analyses_that_fixture ... ok [INFO] [stdout] test format_scenario_tests::reporter_in_text_mode_writes_the_headed_summary ... ok [INFO] [stdout] test format_scenario_tests::reporter_in_json_mode_writes_parseable_json ... ok [INFO] [stdout] test options_scenario_tests::error_on_nonexistent_path ... ok [INFO] [stdout] test options_scenario_tests::exclude_option_leaves_the_files_it_does_not_name ... ok [INFO] [stdout] test dry_binary_tests::command_finds_the_built_binary_beside_the_test_binary ... ok [INFO] [stdout] test cleanup_scenario_tests::run_in_dry_run_leaves_the_ignore_file_alone ... ok [INFO] [stdout] test ignore_scenario_tests::main_dispatches_the_ignored_subcommand_without_an_ignore_file ... ok [INFO] [stdout] test cleanup_scenario_tests::main_dispatches_the_cleanup_subcommand_in_dry_run ... ok [INFO] [stdout] test ignore_scenario_tests::main_dispatches_the_ignore_subcommand_and_records_the_fingerprint ... ok [INFO] [stdout] test options_scenario_tests::min_lines_option ... ok [INFO] [stdout] test options_scenario_tests::default_command_is_report ... ok [INFO] [stdout] test options_scenario_tests::main_over_a_path_that_does_not_exist_reports_the_error_and_exits_non_zero ... ok [INFO] [stdout] test pipeline_scenario_tests::produce_applies_the_overrides_before_scanning ... ok [INFO] [stdout] test pipeline_scenario_tests::analyze_over_a_duplicated_fixture_reports_exact_groups ... ok [INFO] [stdout] test pipeline_scenario_tests::produce_over_a_fixture_returns_config_and_result_together ... ok [INFO] [stdout] test dry_binary_tests::command_in_a_root_without_sources_names_that_root ... ok [INFO] [stdout] test options_scenario_tests::exclude_tests_flag_reduces_duplicates ... ok [INFO] [stdout] test ignore_scenario_tests::ignore_near_duplicate_workflow ... ok [INFO] [stdout] test options_scenario_tests::threshold_above_one_is_rejected_rather_than_silently_finding_nothing ... ok [INFO] [stdout] test options_scenario_tests::help_flag_lists_every_subcommand_the_enum_declares ... ok [INFO] [stdout] test pipeline_scenario_tests::produce_ignoring_baseline_reports_what_produce_would_have_suppressed ... ok [INFO] [stdout] test report_scenario_tests::report_exact_dupes_fixture ... ok [INFO] [stdout] test baseline_scenario_tests::baseline_then_check_passes_on_what_was_inherited_and_fails_on_what_is_added ... ok [INFO] [stdout] test report_scenario_tests::json_format_report ... ok [INFO] [stdout] test cleanup_scenario_tests::cleanup_removes_stale_entries ... ok [INFO] [stdout] test report_scenario_tests::run_writes_the_sub_function_sections_when_there_are_any ... ok [INFO] [stdout] test check_scenario_tests::run_without_thresholds_passes_even_with_duplicates ... ok [INFO] [stdout] test baseline_scenario_tests::baseline_reads_its_path_from_dry4rust_toml ... ok [INFO] [stdout] test options_scenario_tests::help_flag_prints_usage_and_exits_success ... ok [INFO] [stdout] test report_scenario_tests::sub_function_shows_parent_names ... ok [INFO] [stdout] test report_scenario_tests::run_over_a_clean_fixture_says_so_rather_than_printing_an_empty_section ... ok [INFO] [stdout] test report_scenario_tests::run_writes_both_the_stats_and_the_groups ... ok [INFO] [stdout] test stats_scenario_tests::json_stats_includes_line_counts ... ok [INFO] [stdout] test ignore_scenario_tests::ignore_add_then_report_suppresses_the_group ... ok [INFO] [stdout] test stats_scenario_tests::main_dispatches_the_stats_subcommand_to_a_successful_summary ... ok [INFO] [stdout] test options_scenario_tests::exclude_tests_text_report ... ok [INFO] [stdout] test stats_scenario_tests::json_format_stats ... ok [INFO] [stdout] test options_scenario_tests::exclude_option_drops_the_named_paths_from_the_report ... ok [INFO] [stdout] test stats_scenario_tests::run_over_a_clean_fixture_still_writes_the_summary ... ok [INFO] [stdout] test stats_scenario_tests::run_writes_the_summary_and_nothing_else ... ok [INFO] [stdout] test stats_scenario_tests::stats_shows_summary ... ok [INFO] [stdout] test stats_scenario_tests::without_sub_function_json_no_sub_fields ... ok [INFO] [stdout] test stats_scenario_tests::sub_function_stats_shown ... ok [INFO] [stdout] test report_scenario_tests::report_no_dupes_fixture ... ok [INFO] [stdout] test stats_scenario_tests::sub_function_min_sub_nodes_filters ... ok [INFO] [stdout] test report_scenario_tests::sub_function_json_report_carries_the_sub_near_section ... ok [INFO] [stdout] test report_scenario_tests::near_dupes_detected ... ok [INFO] [stdout] test stats_scenario_tests::stats_shows_duplicate_lines ... ok [INFO] [stdout] test options_scenario_tests::min_nodes_option ... ok [INFO] [stdout] test text_report_tests::fingerprint_in_the_report_the_binary_prints_returns_sixteen_hex_digits ... ok [INFO] [stdout] test text_report_tests::fingerprint_in_a_report_returns_the_first_fingerprint_it_names ... ok [INFO] [stdout] test stats_scenario_tests::sub_function_json_stats ... ok [INFO] [stdout] test report_scenario_tests::report_mixed_fixture ... ok [INFO] [stdout] test report_scenario_tests::sub_function_near_duplicates_are_reported_under_their_own_heading ... ok [INFO] [stdout] test report_scenario_tests::without_sub_function_flag_no_sub_sections ... ok [INFO] [stdout] test report_scenario_tests::sub_function_detects_duplicate_branches ... ok [INFO] [stdout] test text_report_tests::fingerprint_in_a_report_naming_none_panics - should panic ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 109 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.31s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/xtask-e0586fe726c15bd9) [INFO] [stdout] [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/debug/deps/xtask-25c50158c234a9aa) [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/all_tests.rs (/opt/rustwide/target/debug/deps/all_tests-479bb0e9ce7b44ba) [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] [stdout] [INFO] [stdout] running 71 tests [INFO] [stdout] test crap::crap_function_tests::is_clean_for_a_clean_verdict_returns_true ... ok [INFO] [stdout] test crap::crap_report_tests::is_clean_with_a_crappy_function_returns_false ... ok [INFO] [stdout] test gates::crap_gate_tests::label_names_the_crap_gate ... ok [INFO] [stdout] test crap::crap_report_tests::offenders_with_every_function_clean_returns_empty ... ok [INFO] [stdout] test crap::crap_report_tests::summary_names_the_crappy_count_against_the_total ... ok [INFO] [stdout] test gates::crap_gate_tests::run_asks_for_json_so_the_verdict_never_depends_on_parsing_prose ... ok [INFO] [stdout] test crap::crap_report_parser_tests::parse_empty_output_returns_a_not_found_error ... ok [INFO] [stdout] test gates::crap_gate_tests::run_with_a_clean_report_returns_ok ... ok [INFO] [stdout] test crap::crap_report_tests::offenders_returns_only_the_functions_that_are_not_clean ... ok [INFO] [stdout] test crap::crap_function_tests::describe_renders_coverage_as_a_percentage_and_carries_the_verdict ... ok [INFO] [stdout] test crap::crap_report_parser_tests::parse_a_report_behind_test_output_still_finds_the_report ... ok [INFO] [stdout] test gates::crap_gate_tests::run_with_a_clean_report_and_a_non_zero_exit_code_still_returns_ok ... ok [INFO] [stdout] test gates::crap_gate_tests::run_with_no_report_in_the_output_also_reports_the_exit_code ... ok [INFO] [stdout] test crap::crap_report_parser_tests::parse_a_bare_report_returns_its_totals ... ok [INFO] [stdout] test gates::crap_gate_tests::run_with_the_tool_missing_returns_an_install_hint ... ok [INFO] [stdout] test gates::crap_gate_tests::run_with_no_report_in_the_output_surfaces_the_tools_own_message ... ok [INFO] [stdout] test gates::dry_self_gate_tests::run_with_no_exit_code_reports_the_exit_code ... ok [INFO] [stdout] test gates::dry_self_gate_tests::run_with_the_tool_not_installed_still_builds_it_from_source ... ok [INFO] [stdout] test gates::dry_self_gate_tests::run_with_exit_code_two_reports_the_exit_code ... ok [INFO] [stdout] test gates::dry_self_gate_tests::run_with_exit_code_one_reports_duplication_beyond_the_baseline ... ok [INFO] [stdout] test gates::dry_self_gate_tests::label_names_the_duplication_gate ... ok [INFO] [stdout] test gates::dry_self_gate_tests::run_builds_the_tool_from_source_rather_than_an_install ... ok [INFO] [stdout] test gates::dry_self_gate_tests::run_checks_the_path_above_the_floor_against_the_baseline_with_zero_ceilings ... ok [INFO] [stdout] test gates::dry_self_gate_tests::run_with_a_zero_exit_code_returns_ok ... ok [INFO] [stdout] test gates::gate_tests::label_through_a_trait_object_returns_the_given_label ... ok [INFO] [stdout] test gates::gate_tests::run_on_a_passing_gate_returns_ok_and_marks_it_run ... ok [INFO] [stdout] test gates::iceberg_gate_tests::run_passes_the_threshold_through_unchanged ... ok [INFO] [stdout] test gates::iceberg_gate_tests::run_with_exit_code_two_names_the_ceiling_it_breached ... ok [INFO] [stdout] test gates::iceberg_gate_tests::run_with_the_tool_missing_returns_an_install_hint ... ok [INFO] [stdout] test gates::stage2_tests::run_reports_the_failing_gates_label_and_reason ... ok [INFO] [stdout] test gates::stage2_tests::run_with_a_failing_first_gate_does_not_run_the_later_ones ... ok [INFO] [stdout] test gates::stage2_tests::run_with_a_failing_second_gate_still_runs_the_first ... ok [INFO] [stdout] test gates::stage2_tests::run_with_no_gates_returns_ok ... ok [INFO] [stdout] test gates::stern_gate_tests::label_names_the_house_rules_gate ... ok [INFO] [stdout] test gates::stern_gate_tests::run_passes_the_manifest_path_and_package_to_the_tool ... ok [INFO] [stdout] test gates::stern_gate_tests::run_with_a_zero_exit_code_returns_ok ... ok [INFO] [stdout] test gates::stern_gate_tests::run_with_exit_code_one_reports_a_failure_to_run ... ok [INFO] [stdout] test gates::stern_gate_tests::run_with_exit_code_two_reports_a_broken_rule ... ok [INFO] [stdout] test gates::stern_gate_tests::run_with_the_tool_missing_returns_an_install_hint ... ok [INFO] [stdout] test gates::gate_tests::run_on_a_failing_gate_returns_its_reason ... ok [INFO] [stdout] test gates::twin_gate_tests::label_names_the_mirrored_tests_gate ... ok [INFO] [stdout] test gates::iceberg_gate_tests::label_names_the_file_risk_gate ... ok [INFO] [stdout] test gates::twin_gate_tests::run_passes_the_manifest_path_and_package_to_the_tool ... ok [INFO] [stdout] test gates::twin_gate_tests::run_with_a_non_zero_exit_code_reports_a_missing_mirrored_test ... ok [INFO] [stdout] test gates::twin_gate_tests::run_with_a_zero_exit_code_returns_ok ... ok [INFO] [stdout] test gates::twin_gate_tests::run_with_the_tool_missing_returns_an_install_hint ... ok [INFO] [stdout] test process::command_outcome_tests::is_success_with_a_non_zero_exit_code_returns_false ... ok [INFO] [stdout] test process::command_outcome_tests::is_success_with_a_zero_exit_code_returns_true ... ok [INFO] [stdout] test process::command_outcome_tests::is_success_with_no_exit_code_returns_false ... ok [INFO] [stdout] test process::command_outcome_tests::new_holds_the_values_it_was_given ... ok [INFO] [stdout] test gates::iceberg_gate_tests::run_with_a_zero_exit_code_returns_ok ... ok [INFO] [stdout] test process::command_outcome_tests::new_with_no_exit_code_holds_none ... ok [INFO] [stdout] test gates::iceberg_gate_tests::run_with_exit_code_one_reports_the_exit_code ... ok [INFO] [stdout] test gates::stage2_tests::run_with_every_gate_passing_returns_ok ... ok [INFO] [stdout] test process::command_runner_tests::is_available_reports_what_the_implementation_was_given ... ok [INFO] [stdout] test process::command_runner_tests::run_streaming_records_the_arguments_it_was_called_with ... ok [INFO] [stdout] test process::command_runner_tests::run_streaming_through_a_trait_object_returns_the_canned_code ... ok [INFO] [stdout] test process::command_runner_tests::run_capturing_returns_the_canned_stdout ... ok [INFO] [stdout] test process::system_command_runner_tests::is_available_for_a_binary_on_the_path_returns_true ... ok [INFO] [stdout] test crap::crap_function_tests::describe_names_the_file_line_and_function ... ok [INFO] [stdout] test crap::crap_report_parser_tests::parse_output_carrying_no_report_returns_a_not_found_error ... ok [INFO] [stdout] test crap::crap_report_tests::is_clean_with_no_crappy_functions_returns_true ... ok [INFO] [stdout] test process::system_command_runner_tests::is_available_for_a_binary_that_does_not_exist_returns_false ... ok [INFO] [stdout] test crap::crap_report_parser_tests::parse_a_report_holding_nested_objects_anchors_on_the_outermost_brace ... ok [INFO] [stdout] test crap::crap_report_parser_tests::parse_a_truncated_report_returns_a_parse_error ... ok [INFO] [stdout] test gates::crap_gate_tests::run_with_a_crappy_report_names_how_many_were_found ... ok [INFO] [stdout] test gates::crap_gate_tests::run_with_a_long_unparseable_output_keeps_the_last_thirty_lines_in_order ... ok [INFO] [stdout] test process::system_command_runner_tests::run_capturing_a_program_that_does_not_exist_returns_a_launch_error ... ok [INFO] [stdout] cargo 1.99.0-beta.8 (5f94df478 2026-08-27) [INFO] [stdout] test crap::crap_function_tests::is_clean_for_any_other_verdict_returns_false ... ok [INFO] [stdout] test process::system_command_runner_tests::run_streaming_a_succeeding_command_returns_zero ... ok [INFO] [stderr] Doc-tests dry4rust [INFO] [stdout] test process::system_command_runner_tests::run_capturing_a_succeeding_command_returns_its_stdout_and_zero ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 71 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s [INFO] [stdout] [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] Doc-tests validation [INFO] [stderr] Doc-tests xtask [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] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] running `Command { std: "docker" "inspect" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531", kill_on_drop: false }` [INFO] [stdout] e48ed3ea854e20a272773e45f6f3f2ddd2587a19229405bc987197877bf60531