Skip to content

Commit 4d823c6

Browse files
committed
add tolerance to no zeros tests
1 parent 86ce10d commit 4d823c6

File tree

2 files changed

+74
-6
lines changed

2 files changed

+74
-6
lines changed

pixi.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ platforms = [
1616
[dependencies]
1717
samtools = ">=1.9"
1818
coreutils = "*"
19-
minimap2 = ">=2.24,<2.29" # Restrict due to test_no_zeros_bug1_minimap2 failing with slightly different values
19+
minimap2 = ">=2.24"
2020
bwa = ">=0.7.17"
2121
skani = ">=0.2.2"
2222
fastani = ">=1.3"

tests/test_cmdline.rs

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,74 @@ mod tests {
2626
true
2727
}
2828

29+
fn assert_equal_table_approx(expected: &str, observed: &str) -> bool {
30+
let tolerance = 0.001;
31+
// assert the first lines are the same
32+
let mut expected_lines = expected.lines();
33+
let mut observed_lines = observed.lines();
34+
assert_eq!(expected_lines.next(), observed_lines.next());
35+
36+
// collect and sort the remaining lines
37+
let mut expected_contents: Vec<_> = expected_lines.collect();
38+
let mut observed_contents: Vec<_> = observed_lines.collect();
39+
expected_contents.sort();
40+
observed_contents.sort();
41+
42+
assert_eq!(
43+
expected_contents.len(),
44+
observed_contents.len(),
45+
"Different number of data rows",
46+
);
47+
48+
// compare each line with tolerance for numeric values
49+
for (expected_line, observed_line) in expected_contents.iter().zip(observed_contents.iter())
50+
{
51+
let expected_parts: Vec<&str> = expected_line.split('\t').collect();
52+
let observed_parts: Vec<&str> = observed_line.split('\t').collect();
53+
54+
assert_eq!(
55+
expected_parts.len(),
56+
observed_parts.len(),
57+
"Different number of columns in line: expected '{}', observed '{}'",
58+
expected_line,
59+
observed_line,
60+
);
61+
62+
for (i, (expected_part, observed_part)) in
63+
expected_parts.iter().zip(observed_parts.iter()).enumerate()
64+
{
65+
if i == 0 {
66+
// First column is genome name, should be exact match
67+
assert_eq!(
68+
expected_part, observed_part,
69+
"Genome names don't match: expected '{}', observed '{}'",
70+
expected_part, observed_part
71+
);
72+
} else {
73+
// Other columns are numeric, use tolerance
74+
match (expected_part.parse::<f64>(), observed_part.parse::<f64>()) {
75+
(Ok(expected_val), Ok(observed_val)) => {
76+
let diff = (expected_val - observed_val).abs();
77+
assert!(diff <= tolerance,
78+
"Values differ by more than tolerance: expected {}, observed {}, diff {} > {}",
79+
expected_val, observed_val, diff, tolerance);
80+
}
81+
_ => {
82+
// If not numeric, compare as strings
83+
assert_eq!(
84+
expected_part, observed_part,
85+
"Non-numeric values don't match: expected '{}', observed '{}'",
86+
expected_part, observed_part
87+
);
88+
}
89+
}
90+
}
91+
}
92+
}
93+
94+
true
95+
}
96+
2997
#[test]
3098
fn test_filter_all_reads() {
3199
let tf: tempfile::NamedTempFile = tempfile::NamedTempFile::new().unwrap();
@@ -2311,7 +2379,7 @@ genome6~random_sequence_length_11003 0 0 0
23112379
.stdout()
23122380
.satisfies(
23132381
|observed| {
2314-
assert_equal_table(
2382+
assert_equal_table_approx(
23152383
"Genome 20120700_S3D.head100000.1.fq.gz Mean 20120700_S3D.head100000.1.fq.gz Covered Fraction\n\
23162384
73.20120700_S3D.10\t0.071023874\t0.06777273\n73.20120700_S3D.12\t0\t0\n73.20120700_S3D.15\t0\t0\n73.20120700_S3D.16\t0\t0\n73.20120700_S3D.34\t0.06653676\t0.0630154\n73.20120700_S3D.3\t0\t0\n73.20120700_S3D.5\t0.1341526\t0.123165175\n73.20120700_S3D.7\t0.100108385\t0.093486056\n\
23172385
",
@@ -2355,7 +2423,7 @@ genome6~random_sequence_length_11003 0 0 0
23552423
.stdout()
23562424
.satisfies(
23572425
|observed| {
2358-
assert_equal_table(
2426+
assert_equal_table_approx(
23592427
"Genome 20120700_S3D.head100000.1.fq.gz Mean 20120700_S3D.head100000.1.fq.gz Covered Fraction\n\
23602428
73.20120700_S3D.10\t0.071023874\t0.06777273\n73.20120700_S3D.12\t0\t0\n73.20120700_S3D.15\t0\t0\n73.20120700_S3D.16\t0\t0\n73.20120700_S3D.3\t0\t0\n73.20120700_S3D.34\t0.06653676\t0.0630154\n73.20120700_S3D.5\t0.1341526\t0.123165175\n73.20120700_S3D.7\t0.100108385\t0.093486056\n\
23612429
",
@@ -2400,7 +2468,7 @@ genome6~random_sequence_length_11003 0 0 0
24002468
.stdout()
24012469
.satisfies(
24022470
|observed| {
2403-
assert_equal_table(
2471+
assert_equal_table_approx(
24042472
"Genome 20120700_S3D.head100000.1.fq.gz Mean 20120700_S3D.head100000.1.fq.gz Covered Fraction\n\
24052473
73.20120700_S3D.10\t0.071023874\t0.06777273\n73.20120700_S3D.34\t0.06653676\t0.0630154\n73.20120700_S3D.5\t0.1341526\t0.123165175\n73.20120700_S3D.7\t0.100108385\t0.093486056\n",
24062474
observed,
@@ -2444,7 +2512,7 @@ genome6~random_sequence_length_11003 0 0 0
24442512
.stdout()
24452513
.satisfies(
24462514
|observed| {
2447-
assert_equal_table(
2515+
assert_equal_table_approx(
24482516
"Genome 20120700_S3D.head100000.1.fq.gz Mean 20120700_S3D.head100000.1.fq.gz Covered Fraction\n\
24492517
73.20120700_S3D.10\t0.071023874\t0.06777273\n73.20120700_S3D.15\t0.03561887\t0.034370355\n73.20120700_S3D.16\t0.032864396\t0.031665392\n73.20120700_S3D.3\t0.036180563\t0.03499215\n73.20120700_S3D.34\t0.06653676\t0.0630154\n73.20120700_S3D.5\t0.1341526\t0.123165175\n73.20120700_S3D.7\t0.100108385\t0.093486056\n\
24502518
",
@@ -2489,7 +2557,7 @@ genome6~random_sequence_length_11003 0 0 0
24892557
.stdout()
24902558
.satisfies(
24912559
|observed| {
2492-
assert_equal_table(
2560+
assert_equal_table_approx(
24932561
"Genome 20120700_S3D.head100000.1.fq.gz Mean 20120700_S3D.head100000.1.fq.gz Covered Fraction\n\
24942562
73.20120700_S3D.10\t0.071023874\t0.06777273\n73.20120700_S3D.12\t0\t0\n73.20120700_S3D.15\t0.03561887\t0.034370355\n73.20120700_S3D.16\t0.032864396\t0.031665392\n73.20120700_S3D.3\t0.036180563\t0.03499215\n73.20120700_S3D.34\t0.06653676\t0.0630154\n73.20120700_S3D.5\t0.1341526\t0.123165175\n73.20120700_S3D.7\t0.100108385\t0.093486056\n\
24952563
",

0 commit comments

Comments
 (0)