Skip to content

Commit ba6ac07

Browse files
Make tests more idiomatic (#212)
* Reduce `ok().expect()` to equivalent `.expect()` * Drop redundant imports in tests * Use bytes * Drop unused references and mutable variables * Drop unused lifetimes * Use arrays over vectors * Safe type conversion * Fix float comparison Co-authored-by: Roman Valls Guimera <brainstorm@users.noreply.github.com>
1 parent 605eed7 commit ba6ac07

File tree

5 files changed

+94
-192
lines changed

5 files changed

+94
-192
lines changed

src/bam/ext.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4304,10 +4304,10 @@ mod tests {
43044304

43054305
//
43064306
//for the rest, we just verify that they have the expected amount of None in each position
4307-
fn some_count(pairs: &Vec<[Option<i64>; 2]>, pos: usize) -> i64 {
4307+
fn some_count(pairs: &[[Option<i64>; 2]], pos: usize) -> i64 {
43084308
pairs.iter().filter(|x| x[pos].is_some()).count() as i64
43094309
}
4310-
fn none_count(pairs: &Vec<[Option<i64>; 2]>, pos: usize) -> i64 {
4310+
fn none_count(pairs: &[[Option<i64>; 2]], pos: usize) -> i64 {
43114311
pairs.iter().filter(|x| x[pos].is_none()).count() as i64
43124312
}
43134313

@@ -9132,7 +9132,7 @@ mod tests {
91329132
}
91339133

91349134
let mut read = bam::Record::new();
9135-
for (input_cigar, supposed_length_wo_hard_clip, supposed_length_with_hard_clip) in vec![
9135+
for (input_cigar, supposed_length_wo_hard_clip, supposed_length_with_hard_clip) in &[
91369136
("40M", 40, 40),
91379137
("40=", 40, 40),
91389138
("40X", 40, 40),
@@ -9146,13 +9146,16 @@ mod tests {
91469146
] {
91479147
read.set(
91489148
b"test",
9149-
Some(&CigarString::try_from(input_cigar).unwrap()),
9149+
Some(&CigarString::try_from(*input_cigar).unwrap()),
91509150
b"agtc",
91519151
b"BBBB",
91529152
);
9153-
assert_eq!(read.seq_len_from_cigar(false), supposed_length_wo_hard_clip);
91549153
assert_eq!(
9155-
read.seq_len_from_cigar(true),
9154+
&read.seq_len_from_cigar(false),
9155+
supposed_length_wo_hard_clip
9156+
);
9157+
assert_eq!(
9158+
&read.seq_len_from_cigar(true),
91569159
supposed_length_with_hard_clip
91579160
);
91589161
}

src/bam/mod.rs

Lines changed: 31 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -946,7 +946,6 @@ mod tests {
946946
use std::fs;
947947
use std::path::Path;
948948
use std::str;
949-
use tempdir;
950949

951950
fn gold() -> (
952951
[&'static [u8]; 6],
@@ -1003,7 +1002,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
10031002
(names, flags, seqs, quals, cigars)
10041003
}
10051004

1006-
fn compare_inner_bam_cram_records(cram_records: &Vec<Record>, bam_records: &Vec<Record>) {
1005+
fn compare_inner_bam_cram_records(cram_records: &[Record], bam_records: &[Record]) {
10071006
// Selectively compares bam1_t struct fields from BAM and CRAM
10081007
for (c1, b1) in cram_records.iter().zip(bam_records.iter()) {
10091008
// CRAM vs BAM l_data is off by 3, see: https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590133544
@@ -1033,7 +1032,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
10331032

10341033
for (i, record) in bam.records().enumerate() {
10351034
let rec = record.expect("Expected valid record");
1036-
println!("{}", str::from_utf8(rec.qname()).ok().unwrap());
1035+
println!("{}", str::from_utf8(rec.qname()).unwrap());
10371036
assert_eq!(rec.qname(), names[i]);
10381037
assert_eq!(rec.flags(), flags[i]);
10391038
assert_eq!(rec.seq().as_bytes(), seqs[i]);
@@ -1066,9 +1065,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
10661065

10671066
#[test]
10681067
fn test_seek() {
1069-
let mut bam = Reader::from_path(&Path::new("test/test.bam"))
1070-
.ok()
1071-
.expect("Error opening file.");
1068+
let mut bam = Reader::from_path(&Path::new("test/test.bam")).expect("Error opening file.");
10721069

10731070
let mut names_by_voffset = HashMap::new();
10741071

@@ -1088,16 +1085,14 @@ CCCCCCCCCCCCCCCCCCC"[..],
10881085
println!("{} {}", offset, qname);
10891086
bam.seek(*offset).unwrap();
10901087
bam.read(&mut rec).unwrap();
1091-
let rec_qname = str::from_utf8(rec.qname()).ok().unwrap().to_string();
1088+
let rec_qname = str::from_utf8(rec.qname()).unwrap().to_string();
10921089
assert_eq!(qname, &rec_qname);
10931090
}
10941091
}
10951092

10961093
#[test]
10971094
fn test_read_sam_header() {
1098-
let bam = Reader::from_path(&"test/test.bam")
1099-
.ok()
1100-
.expect("Error opening file.");
1095+
let bam = Reader::from_path(&"test/test.bam").expect("Error opening file.");
11011096

11021097
let true_header = "@SQ\tSN:CHROMOSOME_I\tLN:15072423\n@SQ\tSN:CHROMOSOME_II\tLN:15279345\
11031098
\n@SQ\tSN:CHROMOSOME_III\tLN:13783700\n@SQ\tSN:CHROMOSOME_IV\tLN:17493793\n@SQ\t\
@@ -1116,19 +1111,15 @@ CCCCCCCCCCCCCCCCCCC"[..],
11161111
assert!(bam.header.target_len(tid_1).expect("Expected target len.") == 15072423);
11171112

11181113
// fetch to position containing reads
1119-
bam.fetch(tid_1, 0, 2)
1120-
.ok()
1121-
.expect("Expected successful fetch.");
1114+
bam.fetch(tid_1, 0, 2).expect("Expected successful fetch.");
11221115
assert!(bam.records().count() == 6);
11231116

11241117
// compare reads
1125-
bam.fetch(tid_1, 0, 2)
1126-
.ok()
1127-
.expect("Expected successful fetch.");
1118+
bam.fetch(tid_1, 0, 2).expect("Expected successful fetch.");
11281119
for (i, record) in bam.records().enumerate() {
11291120
let rec = record.expect("Expected valid record");
11301121

1131-
println!("{}", str::from_utf8(rec.qname()).ok().unwrap());
1122+
println!("{}", str::from_utf8(rec.qname()).unwrap());
11321123
assert_eq!(rec.qname(), names[i]);
11331124
assert_eq!(rec.flags(), flags[i]);
11341125
assert_eq!(rec.seq().as_bytes(), seqs[i]);
@@ -1147,18 +1138,16 @@ CCCCCCCCCCCCCCCCCCC"[..],
11471138

11481139
// fetch to position containing reads
11491140
bam.fetch_str(format!("{}:{}-{}", str::from_utf8(sq_1).unwrap(), 0, 2).as_bytes())
1150-
.ok()
11511141
.expect("Expected successful fetch.");
11521142
assert!(bam.records().count() == 6);
11531143

11541144
// compare reads
11551145
bam.fetch_str(format!("{}:{}-{}", str::from_utf8(sq_1).unwrap(), 0, 2).as_bytes())
1156-
.ok()
11571146
.expect("Expected successful fetch.");
11581147
for (i, record) in bam.records().enumerate() {
11591148
let rec = record.expect("Expected valid record");
11601149

1161-
println!("{}", str::from_utf8(rec.qname()).ok().unwrap());
1150+
println!("{}", str::from_utf8(rec.qname()).unwrap());
11621151
assert_eq!(rec.qname(), names[i]);
11631152
assert_eq!(rec.flags(), flags[i]);
11641153
assert_eq!(rec.seq().as_bytes(), seqs[i]);
@@ -1177,9 +1166,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
11771166

11781167
#[test]
11791168
fn test_read_indexed() {
1180-
let bam = IndexedReader::from_path(&"test/test.bam")
1181-
.ok()
1182-
.expect("Expected valid index.");
1169+
let bam = IndexedReader::from_path(&"test/test.bam").expect("Expected valid index.");
11831170
_test_read_indexed_common(bam);
11841171
}
11851172
#[test]
@@ -1188,7 +1175,6 @@ CCCCCCCCCCCCCCCCCCC"[..],
11881175
&"test/test_different_index_name.bam",
11891176
&"test/test.bam.bai",
11901177
)
1191-
.ok()
11921178
.expect("Expected valid index.");
11931179
_test_read_indexed_common(bam);
11941180
}
@@ -1268,7 +1254,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
12681254
assert_eq!(rec.aux(b"NM").unwrap(), Aux::Integer(15));
12691255

12701256
// Equal length qname
1271-
assert!(rec.qname()[0] != 'X' as u8);
1257+
assert!(rec.qname()[0] != b'X');
12721258
rec.set_qname(b"X");
12731259
assert_eq!(rec.qname(), b"X");
12741260

@@ -1313,22 +1299,20 @@ CCCCCCCCCCCCCCCCCCC"[..],
13131299
.push_tag(b"SN", &"1")
13141300
.push_tag(b"LN", &10000000),
13151301
);
1316-
let mut header = HeaderView::from_header(&_header);
1302+
let header = HeaderView::from_header(&_header);
13171303

13181304
let line =
13191305
b"blah1 0 1 1 255 1M * 0 0 A F CB:Z:AAAA-1 UR:Z:AAAA UB:Z:AAAA GX:Z:G1 xf:i:1 fx:Z:G1\tli:i:0\ttf:Z:cC";
13201306

1321-
let mut rec = Record::from_sam(&mut header, line).unwrap();
1307+
let mut rec = Record::from_sam(&header, line).unwrap();
13221308
assert_eq!(rec.qname(), b"blah1");
13231309
rec.set_qname(b"r0");
13241310
assert_eq!(rec.qname(), b"r0");
13251311
}
13261312

13271313
#[test]
13281314
fn test_remove_aux() {
1329-
let mut bam = Reader::from_path(&Path::new("test/test.bam"))
1330-
.ok()
1331-
.expect("Error opening file.");
1315+
let mut bam = Reader::from_path(&Path::new("test/test.bam")).expect("Error opening file.");
13321316

13331317
for record in bam.records() {
13341318
let mut rec = record.expect("Expected valid record");
@@ -1352,9 +1336,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
13521336
fn test_write() {
13531337
let (names, _, seqs, quals, cigars) = gold();
13541338

1355-
let tmp = tempdir::TempDir::new("rust-htslib")
1356-
.ok()
1357-
.expect("Cannot create temp dir");
1339+
let tmp = tempdir::TempDir::new("rust-htslib").expect("Cannot create temp dir");
13581340
let bampath = tmp.path().join("test.bam");
13591341
println!("{:?}", bampath);
13601342
{
@@ -1367,22 +1349,19 @@ CCCCCCCCCCCCCCCCCCC"[..],
13671349
),
13681350
Format::BAM,
13691351
)
1370-
.ok()
13711352
.expect("Error opening file.");
13721353

13731354
for i in 0..names.len() {
13741355
let mut rec = record::Record::new();
13751356
rec.set(names[i], Some(&cigars[i]), seqs[i], quals[i]);
13761357
rec.push_aux(b"NM", &Aux::Integer(15));
13771358

1378-
bam.write(&mut rec).expect("Failed to write record.");
1359+
bam.write(&rec).expect("Failed to write record.");
13791360
}
13801361
}
13811362

13821363
{
1383-
let mut bam = Reader::from_path(&bampath)
1384-
.ok()
1385-
.expect("Error opening file.");
1364+
let mut bam = Reader::from_path(&bampath).expect("Error opening file.");
13861365

13871366
for i in 0..names.len() {
13881367
let mut rec = record::Record::new();
@@ -1403,9 +1382,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
14031382
fn test_write_threaded() {
14041383
let (names, _, seqs, quals, cigars) = gold();
14051384

1406-
let tmp = tempdir::TempDir::new("rust-htslib")
1407-
.ok()
1408-
.expect("Cannot create temp dir");
1385+
let tmp = tempdir::TempDir::new("rust-htslib").expect("Cannot create temp dir");
14091386
let bampath = tmp.path().join("test.bam");
14101387
println!("{:?}", bampath);
14111388
{
@@ -1418,7 +1395,6 @@ CCCCCCCCCCCCCCCCCCC"[..],
14181395
),
14191396
Format::BAM,
14201397
)
1421-
.ok()
14221398
.expect("Error opening file.");
14231399
bam.set_threads(4).unwrap();
14241400

@@ -1429,14 +1405,12 @@ CCCCCCCCCCCCCCCCCCC"[..],
14291405
rec.push_aux(b"NM", &Aux::Integer(15));
14301406
rec.set_pos(i as i64);
14311407

1432-
bam.write(&mut rec).expect("Failed to write record.");
1408+
bam.write(&rec).expect("Failed to write record.");
14331409
}
14341410
}
14351411

14361412
{
1437-
let mut bam = Reader::from_path(&bampath)
1438-
.ok()
1439-
.expect("Error opening file.");
1413+
let mut bam = Reader::from_path(&bampath).expect("Error opening file.");
14401414

14411415
for (i, _rec) in bam.records().enumerate() {
14421416
let idx = i % names.len();
@@ -1460,36 +1434,27 @@ CCCCCCCCCCCCCCCCCCC"[..],
14601434
// Verify that BAM headers are transmitted correctly when using an existing BAM as a
14611435
// template for headers.
14621436

1463-
let tmp = tempdir::TempDir::new("rust-htslib")
1464-
.ok()
1465-
.expect("Cannot create temp dir");
1437+
let tmp = tempdir::TempDir::new("rust-htslib").expect("Cannot create temp dir");
14661438
let bampath = tmp.path().join("test.bam");
14671439
println!("{:?}", bampath);
14681440

1469-
let mut input_bam = Reader::from_path(&"test/test.bam")
1470-
.ok()
1471-
.expect("Error opening file.");
1441+
let mut input_bam = Reader::from_path(&"test/test.bam").expect("Error opening file.");
14721442

14731443
{
14741444
let mut bam = Writer::from_path(
14751445
&bampath,
14761446
&Header::from_template(&input_bam.header()),
14771447
Format::BAM,
14781448
)
1479-
.ok()
14801449
.expect("Error opening file.");
14811450

14821451
for rec in input_bam.records() {
1483-
bam.write(&rec.unwrap())
1484-
.ok()
1485-
.expect("Failed to write record.");
1452+
bam.write(&rec.unwrap()).expect("Failed to write record.");
14861453
}
14871454
}
14881455

14891456
{
1490-
let copy_bam = Reader::from_path(&bampath)
1491-
.ok()
1492-
.expect("Error opening file.");
1457+
let copy_bam = Reader::from_path(&bampath).expect("Error opening file.");
14931458

14941459
// Verify that the header came across correctly
14951460
assert_eq!(input_bam.header().as_bytes(), copy_bam.header().as_bytes());
@@ -1502,9 +1467,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
15021467
fn test_pileup() {
15031468
let (_, _, seqs, quals, _) = gold();
15041469

1505-
let mut bam = Reader::from_path(&"test/test.bam")
1506-
.ok()
1507-
.expect("Error opening file.");
1470+
let mut bam = Reader::from_path(&"test/test.bam").expect("Error opening file.");
15081471
let pileups = bam.pileup();
15091472
for pileup in pileups.take(26) {
15101473
let _pileup = pileup.expect("Expected successful pileup.");
@@ -1523,9 +1486,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
15231486

15241487
#[test]
15251488
fn test_idx_pileup() {
1526-
let mut bam = IndexedReader::from_path(&"test/test.bam")
1527-
.ok()
1528-
.expect("Error opening file.");
1489+
let mut bam = IndexedReader::from_path(&"test/test.bam").expect("Error opening file.");
15291490
// read without fetch
15301491
for pileup in bam.pileup() {
15311492
pileup.unwrap();
@@ -1555,7 +1516,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
15551516

15561517
let sam_recs: Vec<Record> = sam
15571518
.split(|x| *x == b'\n')
1558-
.filter(|x| x.len() > 0 && x[0] != b'@')
1519+
.filter(|x| !x.is_empty() && x[0] != b'@')
15591520
.map(|line| Record::from_sam(rdr.header(), line).unwrap())
15601521
.collect();
15611522

@@ -1569,9 +1530,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
15691530
// test the cached and uncached ways of getting the cigar string.
15701531

15711532
let (_, _, _, _, cigars) = gold();
1572-
let mut bam = Reader::from_path(&Path::new("test/test.bam"))
1573-
.ok()
1574-
.expect("Error opening file.");
1533+
let mut bam = Reader::from_path(&Path::new("test/test.bam")).expect("Error opening file.");
15751534

15761535
for (i, record) in bam.records().enumerate() {
15771536
let rec = record.expect("Expected valid record");
@@ -1619,9 +1578,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
16191578
let bam_records: Vec<Record> = bam_reader.records().map(|v| v.unwrap()).collect();
16201579

16211580
// New CRAM file
1622-
let tmp = tempdir::TempDir::new("rust-htslib")
1623-
.ok()
1624-
.expect("Cannot create temp dir");
1581+
let tmp = tempdir::TempDir::new("rust-htslib").expect("Cannot create temp dir");
16251582
let cram_path = tmp.path().join("test.cram");
16261583

16271584
// Write BAM records to new CRAM file
@@ -1655,15 +1612,13 @@ CCCCCCCCCCCCCCCCCCC"[..],
16551612
);
16561613

16571614
let mut cram_writer = Writer::from_path(&cram_path, &header, Format::CRAM)
1658-
.ok()
16591615
.expect("Error opening CRAM file.");
16601616
cram_writer.set_reference(ref_path).unwrap();
16611617

16621618
// Write BAM records to CRAM file
16631619
for rec in bam_records.iter() {
16641620
cram_writer
16651621
.write(&rec)
1666-
.ok()
16671622
.expect("Faied to write record to CRAM.");
16681623
}
16691624
}
@@ -1766,7 +1721,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
17661721

17671722
#[test]
17681723
fn test_sam_writer_example() {
1769-
fn from_bam_with_filter<'a, 'b, F>(bamfile: &'a str, samfile: &'b str, f: F) -> bool
1724+
fn from_bam_with_filter<F>(bamfile: &str, samfile: &str, f: F) -> bool
17701725
where
17711726
F: Fn(&record::Record) -> Option<bool>,
17721727
{
@@ -1782,7 +1737,7 @@ CCCCCCCCCCCCCCCCCCC"[..],
17821737
None => return true,
17831738
Some(false) => {}
17841739
Some(true) => {
1785-
if let Err(_) = sam_writer.write(&parsed) {
1740+
if sam_writer.write(&parsed).is_err() {
17861741
return false;
17871742
}
17881743
}

0 commit comments

Comments
 (0)