Skip to content

Commit 1c3906d

Browse files
committed
Integration tests now automatically test with parallel feature
1 parent e7380ba commit 1c3906d

File tree

13 files changed

+566
-46
lines changed

13 files changed

+566
-46
lines changed

src/main.rs

Lines changed: 50 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -26,113 +26,117 @@ fn main() {
2626
runner.start();
2727
}
2828

29-
/// TODO: These tests should run for multiple feature flags
3029
#[cfg(test)]
3130
mod tests {
3231
use std::process::Command;
3332

34-
struct Cleanup<'a> {
33+
/// Create a temporary directory for testing and clean it up after the test
34+
struct TmpDir<'a> {
3535
dir: &'a str,
3636
}
3737

38-
impl<'a> Drop for Cleanup<'a> {
38+
impl<'a> TmpDir<'a> {
39+
fn new(dir: &'a str) -> Self {
40+
std::fs::create_dir(dir).unwrap();
41+
TmpDir { dir }
42+
}
43+
}
44+
45+
impl<'a> Drop for TmpDir<'a> {
3946
fn drop(&mut self) {
4047
std::fs::remove_dir_all(self.dir).unwrap();
4148
}
4249
}
4350

51+
#[cfg(feature = "parallel")]
52+
static RUN_CMD: [&str; 4] = ["run", "--features", "parallel", "--"];
53+
54+
#[cfg(not(feature = "parallel"))]
55+
static RUN_CMD: [&str; 2] = ["run", "--"];
56+
57+
static DEFAULT_ARGS: [&str; 5] = [
58+
"--disable-progress-bar",
59+
"--n-compartments",
60+
"2",
61+
"--generations",
62+
"1",
63+
];
64+
4465
/// Test invocation of program for singlehost setup with 1 generation
4566
#[test]
4667
fn test_singlehost() {
47-
let tmp_dir = ".tmp_singlehost";
48-
let _cleanup = Cleanup { dir: tmp_dir };
68+
let tmp = TmpDir::new(".tmp_singlehost");
4969
let output = Command::new("cargo")
70+
.args(RUN_CMD)
71+
.args(DEFAULT_ARGS)
5072
.args([
51-
"run",
52-
"--",
53-
"--disable-progress-bar",
5473
"--settings",
55-
"test/singlehost/singlehost.yaml",
74+
"tests/singlehost/singlehost.yaml",
5675
"--sequence",
57-
"test/singlehost/ref.fasta",
58-
"--generations",
59-
"1",
60-
"--n-compartments",
61-
"2",
76+
"tests/singlehost/ref.fasta",
6277
"--outdir",
63-
tmp_dir,
78+
tmp.dir,
6479
])
6580
.output()
6681
.expect("Failed to execute command");
6782

6883
assert!(output.status.success());
6984

7085
// Check if output files are created
71-
assert!(std::path::Path::new(&format!("{}/fitness_table_0.npy", tmp_dir)).exists());
72-
assert!(std::path::Path::new(&format!("{}/virolution.log", tmp_dir)).exists());
86+
assert!(std::path::Path::new(&format!("{}/fitness_table_0.npy", tmp.dir)).exists());
87+
assert!(std::path::Path::new(&format!("{}/virolution.log", tmp.dir)).exists());
7388
}
7489

7590
/// Test invocation of program for multihost setup with 1 generation
7691
#[test]
7792
fn test_multihost() {
78-
let tmp_dir = ".tmp_multihost";
79-
let _cleanup = Cleanup { dir: tmp_dir };
93+
let tmp = TmpDir::new(".tmp_multihost");
8094

8195
let output = Command::new("cargo")
96+
.args(RUN_CMD)
97+
.args(DEFAULT_ARGS)
8298
.args([
83-
"run",
84-
"--",
85-
"--disable-progress-bar",
8699
"--settings",
87-
"test/multihost/multihost.yaml",
100+
"tests/multihost/multihost.yaml",
88101
"--sequence",
89-
"test/multihost/ref.fasta",
90-
"--generations",
91-
"1",
92-
"--n-compartments",
93-
"2",
102+
"tests/multihost/ref.fasta",
94103
"--outdir",
95-
tmp_dir,
104+
tmp.dir,
96105
])
97106
.output()
98107
.expect("Failed to execute command");
99108

100109
assert!(output.status.success());
101110

102111
// Check if output files are created
103-
assert!(std::path::Path::new(&format!("{}/fitness_table_0.npy", tmp_dir)).exists());
104-
assert!(std::path::Path::new(&format!("{}/fitness_table_1.npy", tmp_dir)).exists());
105-
assert!(std::path::Path::new(&format!("{}/virolution.log", tmp_dir)).exists());
112+
assert!(std::path::Path::new(&format!("{}/fitness_table_0.npy", tmp.dir)).exists());
113+
assert!(std::path::Path::new(&format!("{}/fitness_table_1.npy", tmp.dir)).exists());
114+
assert!(std::path::Path::new(&format!("{}/virolution.log", tmp.dir)).exists());
106115
}
107116

108117
/// Test invocation of program for epistasis setup with 1 generation
109118
#[test]
110119
fn test_epistasis() {
111-
let tmp_dir = ".tmp_epistasis";
120+
let tmp = TmpDir::new(".tmp_epistasis");
112121
let output = Command::new("cargo")
122+
.args(RUN_CMD)
123+
.args(DEFAULT_ARGS)
113124
.args([
114-
"run",
115-
"--",
116-
"--disable-progress-bar",
117125
"--settings",
118-
"test/epistasis/epistasis.yaml",
126+
"tests/epistasis/epistasis.yaml",
119127
"--sequence",
120-
"test/epistasis/ref.fasta",
121-
"--generations",
122-
"1",
123-
"--n-compartments",
124-
"2",
128+
"tests/epistasis/ref.fasta",
125129
"--outdir",
126-
tmp_dir,
130+
tmp.dir,
127131
])
128132
.output()
129133
.expect("Failed to execute command");
130134

131135
assert!(output.status.success());
132136

133137
// Check if output files are created
134-
assert!(std::path::Path::new(&format!("{}/fitness_table_0.npy", tmp_dir)).exists());
135-
assert!(std::path::Path::new(&format!("{}/epistasis_table_0.npy", tmp_dir)).exists());
136-
assert!(std::path::Path::new(&format!("{}/virolution.log", tmp_dir)).exists());
138+
assert!(std::path::Path::new(&format!("{}/fitness_table_0.npy", tmp.dir)).exists());
139+
assert!(std::path::Path::new(&format!("{}/epistasis_table_0.npy", tmp.dir)).exists());
140+
assert!(std::path::Path::new(&format!("{}/virolution.log", tmp.dir)).exists());
137141
}
138142
}

tests/epistasis/epistasis.yaml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
parameters:
2+
- mutation_rate: 1e-6
3+
recombination_rate: 0
4+
host_population_size: 100000
5+
infection_fraction: 0.7
6+
basic_reproductive_number: 100.0
7+
max_population: 100000
8+
dilution: 0.02
9+
substitution_matrix:
10+
- - 0.0
11+
- 1.0
12+
- 1.0
13+
- 1.0
14+
- - 1.0
15+
- 0.0
16+
- 1.0
17+
- 1.0
18+
- - 1.0
19+
- 1.0
20+
- 0.0
21+
- 1.0
22+
- - 1.0
23+
- 1.0
24+
- 1.0
25+
- 0.0
26+
fitness_model: !SingleHost
27+
distribution: !Epistatic
28+
path: fitness_table.npy
29+
epi_path: epistasis_table.npy
30+
utility: !Algebraic
31+
upper: 1.5
32+
schedule:
33+
- generation: "{} % 1"
34+
event: transmission
35+
value: "[[0.9, 0.1], [0.1, 0.9]]"
36+
- generation: "{} % 200"
37+
event: sample
38+
value: 1000

tests/epistasis/epistasis_table.npy

244 Bytes
Binary file not shown.

tests/epistasis/fitness_table.npy

168 KB
Binary file not shown.

tests/epistasis/ref.fasta

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
>NC_001422.1 Enterobacteria phage phiX174 sensu lato, complete genome
2+
GAGTTTTATCGCTTCCATGACGCAGAAGTTAACACTTTCGGATATTTCTGATGAGTCGAAAAATTATCTT
3+
GATAAAGCAGGAATTACTACTGCTTGTTTACGAATTAAATCGAAGTGGACTGCTGGCGGAAAATGAGAAA
4+
ATTCGACCTATCCTTGCGCAGCTCGAGAAGCTCTTACTTTGCGACCTTTCGCCATCAACTAACGATTCTG
5+
TCAAAAACTGACGCGTTGGATGAGGAGAAGTGGCTTAATATGCTTGGCACGTTCGTCAAGGACTGGTTTA
6+
GATATGAGTCACATTTTGTTCATGGTAGAGATTCTCTTGTTGACATTTTAAAAGAGCGTGGATTACTATC
7+
TGAGTCCGATGCTGTTCAACCACTAATAGGTAAGAAATCATGAGTCAAGTTACTGAACAATCCGTACGTT
8+
TCCAGACCGCTTTGGCCTCTATTAAGCTCATTCAGGCTTCTGCCGTTTTGGATTTAACCGAAGATGATTT
9+
CGATTTTCTGACGAGTAACAAAGTTTGGATTGCTACTGACCGCTCTCGTGCTCGTCGCTGCGTTGAGGCT
10+
TGCGTTTATGGTACGCTGGACTTTGTGGGATACCCTCGCTTTCCTGCTCCTGTTGAGTTTATTGCTGCCG
11+
TCATTGCTTATTATGTTCATCCCGTCAACATTCAAACGGCCTGTCTCATCATGGAAGGCGCTGAATTTAC
12+
GGAAAACATTATTAATGGCGTCGAGCGTCCGGTTAAAGCCGCTGAATTGTTCGCGTTTACCTTGCGTGTA
13+
CGCGCAGGAAACACTGACGTTCTTACTGACGCAGAAGAAAACGTGCGTCAAAAATTACGTGCGGAAGGAG
14+
TGATGTAATGTCTAAAGGTAAAAAACGTTCTGGCGCTCGCCCTGGTCGTCCGCAGCCGTTGCGAGGTACT
15+
AAAGGCAAGCGTAAAGGCGCTCGTCTTTGGTATGTAGGTGGTCAACAATTTTAATTGCAGGGGCTTCGGC
16+
CCCTTACTTGAGGATAAATTATGTCTAATATTCAAACTGGCGCCGAGCGTATGCCGCATGACCTTTCCCA
17+
TCTTGGCTTCCTTGCTGGTCAGATTGGTCGTCTTATTACCATTTCAACTACTCCGGTTATCGCTGGCGAC
18+
TCCTTCGAGATGGACGCCGTTGGCGCTCTCCGTCTTTCTCCATTGCGTCGTGGCCTTGCTATTGACTCTA
19+
CTGTAGACATTTTTACTTTTTATGTCCCTCATCGTCACGTTTATGGTGAACAGTGGATTAAGTTCATGAA
20+
GGATGGTGTTAATGCCACTCCTCTCCCGACTGTTAACACTACTGGTTATATTGACCATGCCGCTTTTCTT
21+
GGCACGATTAACCCTGATACCAATAAAATCCCTAAGCATTTGTTTCAGGGTTATTTGAATATCTATAACA
22+
ACTATTTTAAAGCGCCGTGGATGCCTGACCGTACCGAGGCTAACCCTAATGAGCTTAATCAAGATGATGC
23+
TCGTTATGGTTTCCGTTGCTGCCATCTCAAAAACATTTGGACTGCTCCGCTTCCTCCTGAGACTGAGCTT
24+
TCTCGCCAAATGACGACTTCTACCACATCTATTGACATTATGGGTCTGCAAGCTGCTTATGCTAATTTGC
25+
ATACTGACCAAGAACGTGATTACTTCATGCAGCGTTACCATGATGTTATTTCTTCATTTGGAGGTAAAAC
26+
CTCTTATGACGCTGACAACCGTCCTTTACTTGTCATGCGCTCTAATCTCTGGGCATCTGGCTATGATGTT
27+
GATGGAACTGACCAAACGTCGTTAGGCCAGTTTTCTGGTCGTGTTCAACAGACCTATAAACATTCTGTGC
28+
CGCGTTTCTTTGTTCCTGAGCATGGCACTATGTTTACTCTTGCGCTTGTTCGTTTTCCGCCTACTGCGAC
29+
TAAAGAGATTCAGTACCTTAACGCTAAAGGTGCTTTGACTTATACCGATATTGCTGGCGACCCTGTTTTG
30+
TATGGCAACTTGCCGCCGCGTGAAATTTCTATGAAGGATGTTTTCCGTTCTGGTGATTCGTCTAAGAAGT
31+
TTAAGATTGCTGAGGGTCAGTGGTATCGTTATGCGCCTTCGTATGTTTCTCCTGCTTATCACCTTCTTGA
32+
AGGCTTCCCATTCATTCAGGAACCGCCTTCTGGTGATTTGCAAGAACGCGTACTTATTCGCCACCATGAT
33+
TATGACCAGTGTTTCCAGTCCGTTCAGTTGTTGCAGTGGAATAGTCAGGTTAAATTTAATGTGACCGTTT
34+
ATCGCAATCTGCCGACCACTCGCGATTCAATCATGACTTCGTGATAAAAGATTGAGTGTGAGGTTATAAC
35+
GCCGAAGCGGTAAAAATTTTAATTTTTGCCGCTGAGGGGTTGACCAAGCGAAGCGCGGTAGGTTTTCTGC
36+
TTAGGAGTTTAATCATGTTTCAGACTTTTATTTCTCGCCATAATTCAAACTTTTTTTCTGATAAGCTGGT
37+
TCTCACTTCTGTTACTCCAGCTTCTTCGGCACCTGTTTTACAGACACCTAAAGCTACATCGTCAACGTTA
38+
TATTTTGATAGTTTGACGGTTAATGCTGGTAATGGTGGTTTTCTTCATTGCATTCAGATGGATACATCTG
39+
TCAACGCCGCTAATCAGGTTGTTTCTGTTGGTGCTGATATTGCTTTTGATGCCGACCCTAAATTTTTTGC
40+
CTGTTTGGTTCGCTTTGAGTCTTCTTCGGTTCCGACTACCCTCCCGACTGCCTATGATGTTTATCCTTTG
41+
AATGGTCGCCATGATGGTGGTTATTATACCGTCAAGGACTGTGTGACTATTGACGTCCTTCCCCGTACGC
42+
CGGGCAATAACGTTTATGTTGGTTTCATGGTTTGGTCTAACTTTACCGCTACTAAATGCCGCGGATTGGT
43+
TTCGCTGAATCAGGTTATTAAAGAGATTATTTGTCTCCAGCCACTTAAGTGAGGTGATTTATGTTTGGTG
44+
CTATTGCTGGCGGTATTGCTTCTGCTCTTGCTGGTGGCGCCATGTCTAAATTGTTTGGAGGCGGTCAAAA
45+
AGCCGCCTCCGGTGGCATTCAAGGTGATGTGCTTGCTACCGATAACAATACTGTAGGCATGGGTGATGCT
46+
GGTATTAAATCTGCCATTCAAGGCTCTAATGTTCCTAACCCTGATGAGGCCGCCCCTAGTTTTGTTTCTG
47+
GTGCTATGGCTAAAGCTGGTAAAGGACTTCTTGAAGGTACGTTGCAGGCTGGCACTTCTGCCGTTTCTGA
48+
TAAGTTGCTTGATTTGGTTGGACTTGGTGGCAAGTCTGCCGCTGATAAAGGAAAGGATACTCGTGATTAT
49+
CTTGCTGCTGCATTTCCTGAGCTTAATGCTTGGGAGCGTGCTGGTGCTGATGCTTCCTCTGCTGGTATGG
50+
TTGACGCCGGATTTGAGAATCAAAAAGAGCTTACTAAAATGCAACTGGACAATCAGAAAGAGATTGCCGA
51+
GATGCAAAATGAGACTCAAAAAGAGATTGCTGGCATTCAGTCGGCGACTTCACGCCAGAATACGAAAGAC
52+
CAGGTATATGCACAAAATGAGATGCTTGCTTATCAACAGAAGGAGTCTACTGCTCGCGTTGCGTCTATTA
53+
TGGAAAACACCAATCTTTCCAAGCAACAGCAGGTTTCCGAGATTATGCGCCAAATGCTTACTCAAGCTCA
54+
AACGGCTGGTCAGTATTTTACCAATGACCAAATCAAAGAAATGACTCGCAAGGTTAGTGCTGAGGTTGAC
55+
TTAGTTCATCAGCAAACGCAGAATCAGCGGTATGGCTCTTCTCATATTGGCGCTACTGCAAAGGATATTT
56+
CTAATGTCGTCACTGATGCTGCTTCTGGTGTGGTTGATATTTTTCATGGTATTGATAAAGCTGTTGCCGA
57+
TACTTGGAACAATTTCTGGAAAGACGGTAAAGCTGATGGTATTGGCTCTAATTTGTCTAGGAAATAACCG
58+
TCAGGATTGACACCCTCCCAATTGTATGTTTTCATGCCTCCAAATCTTGGAGGCTTTTTTATGGTTCGTT
59+
CTTATTACCCTTCTGAATGTCACGCTGATTATTTTGACTTTGAGCGTATCGAGGCTCTTAAACCTGCTAT
60+
TGAGGCTTGTGGCATTTCTACTCTTTCTCAATCCCCAATGCTTGGCTTCCATAAGCAGATGGATAACCGC
61+
ATCAAGCTCTTGGAAGAGATTCTGTCTTTTCGTATGCAGGGCGTTGAGTTCGATAATGGTGATATGTATG
62+
TTGACGGCCATAAGGCTGCTTCTGACGTTCGTGATGAGTTTGTATCTGTTACTGAGAAGTTAATGGATGA
63+
ATTGGCACAATGCTACAATGTGCTCCCCCAACTTGATATTAATAACACTATAGACCACCGCCCCGAAGGG
64+
GACGAAAAATGGTTTTTAGAGAACGAGAAGACGGTTACGCAGTTTTGCCGCAAGCTGGCTGCTGAACGCC
65+
CTCTTAAGGATATTCGCGATGAGTATAATTACCCCAAAAAGAAAGGTATTAAGGATGAGTGTTCAAGATT
66+
GCTGGAGGCCTCCACTATGAAATCGCGTAGAGGCTTTGCTATTCAGCGTTTGATGAATGCAATGCGACAG
67+
GCTCATGCTGATGGTTGGTTTATCGTTTTTGACACTCTCACGTTGGCTGACGACCGATTAGAGGCGTTTT
68+
ATGATAATCCCAATGCTTTGCGTGACTATTTTCGTGATATTGGTCGTATGGTTCTTGCTGCCGAGGGTCG
69+
CAAGGCTAATGATTCACACGCCGACTGCTATCAGTATTTTTGTGTGCCTGAGTATGGTACAGCTAATGGC
70+
CGTCTTCATTTCCATGCGGTGCACTTTATGCGGACACTTCCTACAGGTAGCGTTGACCCTAATTTTGGTC
71+
GTCGGGTACGCAATCGCCGCCAGTTAAATAGCTTGCAAAATACGTGGCCTTATGGTTACAGTATGCCCAT
72+
CGCAGTTCGCTACACGCAGGACGCTTTTTCACGTTCTGGTTGGTTGTGGCCTGTTGATGCTAAAGGTGAG
73+
CCGCTTAAAGCTACCAGTTATATGGCTGTTGGTTTCTATGTGGCTAAATACGTTAACAAAAAGTCAGATA
74+
TGGACCTTGCTGCTAAAGGTCTAGGAGCTAAAGAATGGAACAACTCACTAAAAACCAAGCTGTCGCTACT
75+
TCCCAAGAAGCTGTTCAGAATCAGAATGAGCCGCAACTTCGGGATGAAAATGCTCACAATGACAAATCTG
76+
TCCACGGAGTGCTTAATCCAACTTACCAAGCTGGGTTACGACGCGACGCCGTTCAACCAGATATTGAAGC
77+
AGAACGCAAAAAGAGAGATGAGATTGAGGCTGGGAAAAGTTACTGTAGCCGACGTTTTGGCGGCGCAACC
78+
TGTGACGACAAATCTGCTCAAATTTATGCGCGCTTCGATAAAAATGATTGGCGTATCCAACCTGCA

tests/multihost/fitness_table_0.npy

31.4 KB
Binary file not shown.

tests/multihost/fitness_table_1.npy

31.4 KB
Binary file not shown.

tests/multihost/make_tables.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/env python
2+
3+
import numpy as np
4+
5+
rdist = np.array(
6+
[
7+
["++", 0.1],
8+
["+-", 0.1],
9+
["+x", 0.1],
10+
["-+", 0.1],
11+
["--", 0.1],
12+
["-x", 0.1],
13+
["x+", 0.1],
14+
["x-", 0.1],
15+
["xx", 0.2],
16+
]
17+
)
18+
19+
rdist = [
20+
rdist[:, 0],
21+
rdist[:, 1].astype(float),
22+
]
23+
24+
dist = {
25+
"+": lambda: 1 + np.random.exponential(scale=0.03),
26+
"-": lambda: max(0, 1 - np.random.exponential(scale=0.21)),
27+
"x": lambda: 0,
28+
}
29+
30+
c = np.random.choice(rdist[0], p=rdist[1], size=(1000, 4))
31+
32+
33+
def apply_dist(x: str, axis: int) -> float:
34+
return dist[x[axis]]()
35+
36+
37+
f = np.vectorize(apply_dist, otypes=[np.float64])
38+
39+
tables = [f(c, axis=axis) for axis in range(2)]
40+
41+
for i, table in enumerate(tables):
42+
np.save(f"fitness_table_{i}", table)
43+
44+
print(tables)

0 commit comments

Comments
 (0)