@@ -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\t 0.071023874\t 0.06777273\n 73.20120700_S3D.12\t 0\t 0\n 73.20120700_S3D.15\t 0\t 0\n 73.20120700_S3D.16\t 0\t 0\n 73.20120700_S3D.34\t 0.06653676\t 0.0630154\n 73.20120700_S3D.3\t 0\t 0\n 73.20120700_S3D.5\t 0.1341526\t 0.123165175\n 73.20120700_S3D.7\t 0.100108385\t 0.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\t 0.071023874\t 0.06777273\n 73.20120700_S3D.12\t 0\t 0\n 73.20120700_S3D.15\t 0\t 0\n 73.20120700_S3D.16\t 0\t 0\n 73.20120700_S3D.3\t 0\t 0\n 73.20120700_S3D.34\t 0.06653676\t 0.0630154\n 73.20120700_S3D.5\t 0.1341526\t 0.123165175\n 73.20120700_S3D.7\t 0.100108385\t 0.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\t 0.071023874\t 0.06777273\n 73.20120700_S3D.34\t 0.06653676\t 0.0630154\n 73.20120700_S3D.5\t 0.1341526\t 0.123165175\n 73.20120700_S3D.7\t 0.100108385\t 0.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\t 0.071023874\t 0.06777273\n 73.20120700_S3D.15\t 0.03561887\t 0.034370355\n 73.20120700_S3D.16\t 0.032864396\t 0.031665392\n 73.20120700_S3D.3\t 0.036180563\t 0.03499215\n 73.20120700_S3D.34\t 0.06653676\t 0.0630154\n 73.20120700_S3D.5\t 0.1341526\t 0.123165175\n 73.20120700_S3D.7\t 0.100108385\t 0.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\t 0.071023874\t 0.06777273\n 73.20120700_S3D.12\t 0\t 0\n 73.20120700_S3D.15\t 0.03561887\t 0.034370355\n 73.20120700_S3D.16\t 0.032864396\t 0.031665392\n 73.20120700_S3D.3\t 0.036180563\t 0.03499215\n 73.20120700_S3D.34\t 0.06653676\t 0.0630154\n 73.20120700_S3D.5\t 0.1341526\t 0.123165175\n 73.20120700_S3D.7\t 0.100108385\t 0.093486056\n \
24952563 ",
0 commit comments