Skip to content

Commit 02b007d

Browse files
committed
chore: unify parsing and validation
1 parent 1663e61 commit 02b007d

17 files changed

Lines changed: 282 additions & 295 deletions

File tree

src/align/read_align.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,12 +1474,11 @@ mod tests {
14741474
use crate::index::packed_array::PackedArray;
14751475
use crate::index::sa_index::SaIndex;
14761476
use crate::index::suffix_array::SuffixArray;
1477-
use clap::Parser;
14781477
use noodles::sam::alignment::record::cigar;
14791478

1480-
fn make_test_params() -> Parameters {
1479+
fn default_params() -> Parameters {
14811480
// Parse empty args to get default parameters
1482-
Parameters::try_parse_from(vec!["rustar-aligner"]).unwrap()
1481+
Parameters::parse_from(["rustar-aligner", "--readFilesIn", "test.fq"])
14831482
}
14841483

14851484
fn make_test_index() -> GenomeIndex {
@@ -1578,7 +1577,7 @@ mod tests {
15781577
#[test]
15791578
fn test_align_read_no_seeds() {
15801579
let index = make_test_index();
1581-
let params = make_test_params();
1580+
let params = default_params();
15821581

15831582
// Read with all N's (no seeds possible)
15841583
let read_seq = vec![4, 4, 4, 4, 4, 4, 4, 4, 4, 4];
@@ -1596,7 +1595,7 @@ mod tests {
15961595
#[test]
15971596
fn test_transcript_filtering_score() {
15981597
let index = make_test_index();
1599-
let mut params = make_test_params();
1598+
let mut params = default_params();
16001599
params.out_filter_score_min = 50;
16011600

16021601
// Would need actual seeds and alignment to test this properly
@@ -1609,7 +1608,7 @@ mod tests {
16091608
#[test]
16101609
fn test_transcript_filtering_mismatch() {
16111610
let index = make_test_index();
1612-
let mut params = make_test_params();
1611+
let mut params = default_params();
16131612
params.out_filter_mismatch_nmax = 2;
16141613

16151614
let read_seq = vec![0, 1, 2, 3]; // ACGT
@@ -1620,7 +1619,7 @@ mod tests {
16201619
#[test]
16211620
fn test_transcript_multimap_limit() {
16221621
let index = make_test_index();
1623-
let mut params = make_test_params();
1622+
let mut params = default_params();
16241623
params.out_filter_multimap_nmax = 5;
16251624

16261625
let read_seq = vec![0, 1, 2, 3]; // ACGT
@@ -1634,7 +1633,7 @@ mod tests {
16341633
#[test]
16351634
fn test_align_paired_read_no_seeds() {
16361635
let index = make_test_index();
1637-
let params = make_test_params();
1636+
let params = default_params();
16381637

16391638
// Both mates with all N's
16401639
let mate1 = vec![4, 4, 4, 4, 4, 4, 4, 4];
@@ -1653,7 +1652,7 @@ mod tests {
16531652
use crate::align::transcript::Exon;
16541653
use cigar::op::{Kind, Op};
16551654

1656-
let params = make_test_params();
1655+
let params = default_params();
16571656

16581657
// Create two transcripts on same chromosome
16591658
let t1 = Transcript {
@@ -1709,7 +1708,7 @@ mod tests {
17091708
use crate::align::transcript::Exon;
17101709
use cigar::op::{Kind, Op};
17111710

1712-
let mut params = make_test_params();
1711+
let mut params = default_params();
17131712
params.align_mates_gap_max = 100;
17141713

17151714
let t1 = Transcript {
@@ -2055,7 +2054,7 @@ mod tests {
20552054
fn test_align_paired_both_unmapped() {
20562055
// Both mates are all N's → both unmapped → empty Vec
20572056
let index = make_test_index();
2058-
let params = make_test_params();
2057+
let params = default_params();
20592058

20602059
let mate1 = vec![4, 4, 4, 4, 4, 4, 4, 4];
20612060
let mate2 = vec![4, 4, 4, 4, 4, 4, 4, 4];

src/align/score.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,8 @@ pub enum GapType {
621621

622622
#[cfg(test)]
623623
mod tests {
624+
use crate::params::Parameters;
625+
624626
use super::*;
625627

626628
fn make_test_genome(seq: &[u8]) -> Genome {
@@ -1051,8 +1053,7 @@ mod tests {
10511053
// When alignIntronMax=0 (default), scorer uses u32::MAX (no limit) — STAR-faithful.
10521054
// STAR's stitchAlignToTranscript.cpp: `if (Del>alignIntronMax && alignIntronMax>0)`
10531055
// meaning alignIntronMax=0 disables the check entirely.
1054-
use clap::Parser;
1055-
let params = crate::params::Parameters::try_parse_from(vec!["rustar-aligner"]).unwrap();
1056+
let params = Parameters::parse_from(["rustar-aligner", "--readFilesIn", "reads.fq"]);
10561057
assert_eq!(params.align_intron_max, 0);
10571058
let scorer = AlignmentScorer::from_params(&params);
10581059
assert_eq!(scorer.align_intron_max, u32::MAX);
@@ -1061,13 +1062,13 @@ mod tests {
10611062
#[test]
10621063
fn test_align_intron_max_custom() {
10631064
// Custom alignIntronMax should be passed through directly
1064-
use clap::Parser;
1065-
let params = crate::params::Parameters::try_parse_from(vec![
1065+
let params = Parameters::parse_from([
10661066
"rustar-aligner",
1067+
"--readFilesIn",
1068+
"reads.fq",
10671069
"--alignIntronMax",
10681070
"100000",
1069-
])
1070-
.unwrap();
1071+
]);
10711072
assert_eq!(params.align_intron_max, 100_000);
10721073
let scorer = AlignmentScorer::from_params(&params);
10731074
assert_eq!(scorer.align_intron_max, 100_000);

src/align/seed.rs

Lines changed: 18 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,6 @@ fn find_mult_range(
662662
mod tests {
663663
use super::*;
664664
use crate::params::Parameters;
665-
use clap::Parser;
666665
use std::io::Write;
667666
use tempfile::NamedTempFile;
668667

@@ -703,13 +702,17 @@ mod tests {
703702
.collect()
704703
}
705704

705+
fn params(args: &[&str]) -> Parameters {
706+
let mut full_args = vec!["rustar-aligner", "--readFilesIn", "reads.fq"];
707+
full_args.extend_from_slice(args);
708+
Parameters::parse_from(full_args)
709+
}
710+
706711
#[test]
707712
fn find_exact_match() {
708713
let index = make_test_index("ACGTACGT");
709714
let read = encode_sequence("ACGT");
710-
711-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
712-
let params = Parameters::parse_from(args);
715+
let params = params(&["--runMode", "alignReads"]);
713716

714717
let seeds = Seed::find_seeds(&read, &index, 4, &params, "").unwrap();
715718

@@ -725,9 +728,7 @@ mod tests {
725728
fn min_seed_length_filter() {
726729
let index = make_test_index("AAAAAAAA");
727730
let read = encode_sequence("AAA");
728-
729-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
730-
let params = Parameters::parse_from(args);
731+
let params = params(&[]);
731732

732733
// With min_seed_length=4, should find nothing (read is only 3bp)
733734
let seeds = Seed::find_seeds(&read, &index, 4, &params, "").unwrap();
@@ -742,9 +743,7 @@ mod tests {
742743
fn no_match() {
743744
let index = make_test_index("ACAC");
744745
let read = encode_sequence("GGGG");
745-
746-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
747-
let params = Parameters::parse_from(args);
746+
let params = params(&[]);
748747

749748
let seeds = Seed::find_seeds(&read, &index, 2, &params, "").unwrap();
750749

@@ -756,9 +755,7 @@ mod tests {
756755
fn get_genome_positions() {
757756
let index = make_test_index("ACGTACGT");
758757
let read = encode_sequence("ACGT");
759-
760-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
761-
let params = Parameters::parse_from(args);
758+
let params = params(&[]);
762759

763760
let seeds = Seed::find_seeds(&read, &index, 4, &params, "").unwrap();
764761
assert!(!seeds.is_empty());
@@ -777,9 +774,7 @@ mod tests {
777774
fn test_single_end_mate_id() {
778775
let index = make_test_index("ACGTACGT");
779776
let read = encode_sequence("ACGT");
780-
781-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
782-
let params = Parameters::parse_from(args);
777+
let params = params(&[]);
783778

784779
let seeds = Seed::find_seeds(&read, &index, 4, &params, "").unwrap();
785780
assert!(!seeds.is_empty());
@@ -795,9 +790,7 @@ mod tests {
795790
let index = make_test_index("ACGTACGTTTGGCCAA");
796791
let mate1 = encode_sequence("ACGT");
797792
let mate2 = encode_sequence("TTGG");
798-
799-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
800-
let params = Parameters::parse_from(args);
793+
let params = params(&[]);
801794

802795
let seeds = Seed::find_paired_seeds(&mate1, &mate2, &index, 4, &params).unwrap();
803796

@@ -824,9 +817,7 @@ mod tests {
824817
let index = make_test_index("ACGTACGT");
825818
let mate1 = encode_sequence("ACGT");
826819
let mate2 = encode_sequence("ACGT");
827-
828-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
829-
let params = Parameters::parse_from(args);
820+
let params = params(&[]);
830821

831822
let seeds = Seed::find_paired_seeds(&mate1, &mate2, &index, 4, &params).unwrap();
832823

@@ -875,9 +866,7 @@ mod tests {
875866
let index = make_test_index("AACCTTGG");
876867
// Read is RC of genome: CCAAGGTT
877868
let read = encode_sequence("CCAAGGTT");
878-
879-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
880-
let params = Parameters::parse_from(args);
869+
let params = params(&[]);
881870

882871
let seeds = Seed::find_seeds(&read, &index, 4, &params, "").unwrap();
883872

@@ -916,15 +905,7 @@ mod tests {
916905
// Test that combined L→R + R→L respects seedPerReadNmax
917906
let index = make_test_index("ACGTACGTACGTACGT");
918907
let read = encode_sequence("ACGTACGT");
919-
920-
let args = vec![
921-
"rustar-aligner",
922-
"--runMode",
923-
"alignReads",
924-
"--seedPerReadNmax",
925-
"3",
926-
];
927-
let params = Parameters::parse_from(args);
908+
let params = params(&["--seedPerReadNmax", "3"]);
928909

929910
let seeds = Seed::find_seeds(&read, &index, 4, &params, "").unwrap();
930911
assert!(
@@ -976,9 +957,7 @@ mod tests {
976957
// original read coordinates: read_pos = original_read_len - rc_pos - length
977958
let index = make_test_index("AACCTTGG");
978959
let read = encode_sequence("CCAAGGTT");
979-
980-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
981-
let params = Parameters::parse_from(args);
960+
let params = params(&[]);
982961

983962
let seeds = Seed::find_seeds(&read, &index, 4, &params, "").unwrap();
984963

@@ -1008,12 +987,9 @@ mod tests {
1008987
// than the old dense (every-position) search
1009988
let genome_seq = "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT";
1010989
let index = make_test_index(genome_seq);
1011-
1012990
// Use a read that's long enough for multiple start positions
1013991
let read = encode_sequence("ACGTACGTACGTACGTACGTACGT"); // 24bp
1014-
1015-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
1016-
let params = Parameters::parse_from(args);
992+
let params = params(&[]);
1017993

1018994
let sparse_seeds = Seed::find_seeds(&read, &index, 4, &params, "").unwrap();
1019995

@@ -1048,9 +1024,7 @@ mod tests {
10481024
// RC(read) = AACCTTGG matches forward genome
10491025
let index = make_test_index("AACCTTGG");
10501026
let read = encode_sequence("CCAAGGTT");
1051-
1052-
let args = vec!["rustar-aligner", "--runMode", "alignReads"];
1053-
let params = Parameters::parse_from(args);
1027+
let params = params(&[]);
10541028

10551029
let seeds = Seed::find_seeds(&read, &index, 4, &params, "").unwrap();
10561030

src/align/stitch.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3019,10 +3019,8 @@ mod tests {
30193019
];
30203020

30213021
// Bin-based windowing with default parameters
3022-
let params = {
3023-
use clap::Parser;
3024-
crate::params::Parameters::parse_from(vec!["rustar-aligner"])
3025-
};
3022+
let params =
3023+
crate::params::Parameters::parse_from(["rustar-aligner", "--readFilesIn", "reads.fq"]);
30263024
let clusters = cluster_seeds(&seeds, &index, &params, 150, false);
30273025

30283026
// With empty SA ranges, no clusters will be created

0 commit comments

Comments
 (0)