Skip to content

Commit b81edde

Browse files
authored
feat(harness): Give users control over sort order (#96)
2 parents 5595873 + b9036a3 commit b81edde

12 files changed

Lines changed: 1110 additions & 319 deletions

File tree

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

DESIGN.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,10 @@ support for multi-character shorts is something people may want to opt-in to (it
149149
Performance isn't the top priority, so remoing `&str` -> `char` conversions isn't necessarily viewed as a benefit.
150150
This also makes `match` need to work off of `&str` instead of `char`.
151151
Unsure which of those would be slower and how the different characteristics match up.
152+
153+
## Harness
154+
155+
### Decision: report and run tests in filter order
156+
157+
Rather than build into every harness shuffle, sharding, and any other specific logic like that,
158+
we can instead give the user direct control over the test order by the order they are specified on the command line.

crates/libtest2-harness/src/harness.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,6 @@ fn discover(
161161
notifier.notify(notify::Event::DiscoverStart)?;
162162
let timer = std::time::Instant::now();
163163

164-
// Do this first so it applies to both discover and running
165-
cases.sort_unstable_by_key(|case| case.name().to_owned());
166-
167164
let matches_filter = |case: &dyn Case, filter: &str| {
168165
let test_name = case.name();
169166

@@ -172,6 +169,20 @@ fn discover(
172169
false => test_name.contains(filter),
173170
}
174171
};
172+
173+
// Do this first so it applies to both discover and running
174+
cases.sort_unstable_by_key(|case| {
175+
let priority = if opts.filters.is_empty() {
176+
Some(0)
177+
} else {
178+
opts.filters
179+
.iter()
180+
.position(|filter| matches_filter(case.as_ref(), filter))
181+
};
182+
let name = case.name().to_owned();
183+
(priority, name)
184+
});
185+
175186
let mut retain_cases = Vec::with_capacity(cases.len());
176187
for case in cases.iter() {
177188
let filtered_in = opts.filters.is_empty()

crates/libtest2-mimic/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ dunce = "1.0.4"
3737
escargot = "0.5.8"
3838
once_cell_polyfill = "1.56.0"
3939
pathdiff = "0.2.1"
40-
snapbox = "0.6.0"
40+
snapbox = { version = "0.6.0", features = ["json"] }
4141

4242
[lints]
4343
workspace = true
Lines changed: 76 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
use snapbox::prelude::*;
2+
use snapbox::str;
3+
14
fn test_cmd() -> snapbox::cmd::Command {
25
static BIN: once_cell_polyfill::sync::OnceLock<(std::path::PathBuf, std::path::PathBuf)> =
36
once_cell_polyfill::sync::OnceLock::new();
@@ -23,7 +26,7 @@ fn main() {
2326
snapbox::cmd::Command::new(bin).current_dir(current_dir)
2427
}
2528

26-
fn check(args: &[&str], single: &str, parallel: &str) {
29+
fn check(args: &[&str], single: impl IntoData, parallel: impl IntoData) {
2730
test_cmd()
2831
.args(args)
2932
.args(["--test-threads", "1"])
@@ -37,191 +40,227 @@ fn check(args: &[&str], single: &str, parallel: &str) {
3740
fn normal() {
3841
check(
3942
&[],
40-
r#"
43+
str![[r#"
44+
4145
running 3 tests
4246
test bar ... ok
4347
test barro ... ok
4448
test foo ... ok
4549
4650
test result: ok. 3 passed; 0 failed; 0 ignored; 0 filtered out; finished in [..]s
4751
48-
"#,
49-
r#"
52+
53+
"#]],
54+
str![[r#"
55+
5056
running 3 tests
5157
...
5258
5359
test result: ok. 3 passed; 0 failed; 0 ignored; 0 filtered out; finished in [..]s
5460
55-
"#,
61+
62+
"#]],
5663
);
5764
}
5865

5966
#[test]
6067
fn filter_one() {
6168
check(
6269
&["foo"],
63-
r#"
70+
str![[r#"
71+
6472
running 1 test
6573
test foo ... ok
6674
6775
test result: ok. 1 passed; 0 failed; 0 ignored; 2 filtered out; finished in [..]s
6876
69-
"#,
70-
r#"
77+
78+
"#]],
79+
str![[r#"
80+
7181
running 1 test
7282
test foo ... ok
7383
7484
test result: ok. 1 passed; 0 failed; 0 ignored; 2 filtered out; finished in [..]s
7585
76-
"#,
86+
87+
"#]],
7788
);
7889
}
7990

8091
#[test]
8192
fn filter_two() {
8293
check(
8394
&["bar"],
84-
r#"
95+
str![[r#"
96+
8597
running 2 tests
8698
test bar ... ok
8799
test barro ... ok
88100
89101
test result: ok. 2 passed; 0 failed; 0 ignored; 1 filtered out; finished in [..]s
90102
91-
"#,
92-
r#"
103+
104+
"#]],
105+
str![[r#"
106+
93107
running 2 tests
94108
...
95109
96110
test result: ok. 2 passed; 0 failed; 0 ignored; 1 filtered out; finished in [..]s
97111
98-
"#,
112+
113+
"#]],
99114
);
100115
}
101116

102117
#[test]
103118
fn filter_exact() {
104119
check(
105120
&["bar", "--exact"],
106-
r#"
121+
str![[r#"
122+
107123
running 1 test
108124
test bar ... ok
109125
110126
test result: ok. 1 passed; 0 failed; 0 ignored; 2 filtered out; finished in [..]s
111127
112-
"#,
113-
r#"
128+
129+
"#]],
130+
str![[r#"
131+
114132
running 1 test
115133
test bar ... ok
116134
117135
test result: ok. 1 passed; 0 failed; 0 ignored; 2 filtered out; finished in [..]s
118136
119-
"#,
137+
138+
"#]],
120139
);
121140
}
122141

123142
#[test]
124143
fn filter_two_and_skip() {
125144
check(
126145
&["--skip", "barro", "bar"],
127-
r#"
146+
str![[r#"
147+
128148
running 1 test
129149
test bar ... ok
130150
131151
test result: ok. 1 passed; 0 failed; 0 ignored; 2 filtered out; finished in [..]s
132152
133-
"#,
134-
r#"
153+
154+
"#]],
155+
str![[r#"
156+
135157
running 1 test
136158
test bar ... ok
137159
138160
test result: ok. 1 passed; 0 failed; 0 ignored; 2 filtered out; finished in [..]s
139161
140-
"#,
162+
163+
"#]],
141164
);
142165
}
143166

144167
#[test]
145168
fn skip_nothing() {
146169
check(
147170
&["--skip", "peter"],
148-
r#"
171+
str![[r#"
172+
149173
running 3 tests
150174
test bar ... ok
151175
test barro ... ok
152176
test foo ... ok
153177
154178
test result: ok. 3 passed; 0 failed; 0 ignored; 0 filtered out; finished in [..]s
155179
156-
"#,
157-
r#"
180+
181+
"#]],
182+
str![[r#"
183+
158184
running 3 tests
159185
...
160186
161187
test result: ok. 3 passed; 0 failed; 0 ignored; 0 filtered out; finished in [..]s
162188
163-
"#,
189+
190+
"#]],
164191
);
165192
}
166193

167194
#[test]
168195
fn skip_two() {
169196
check(
170197
&["--skip", "bar"],
171-
r#"
198+
str![[r#"
199+
172200
running 1 test
173201
test foo ... ok
174202
175203
test result: ok. 1 passed; 0 failed; 0 ignored; 2 filtered out; finished in [..]s
176204
177-
"#,
178-
r#"
205+
206+
"#]],
207+
str![[r#"
208+
179209
running 1 test
180210
test foo ... ok
181211
182212
test result: ok. 1 passed; 0 failed; 0 ignored; 2 filtered out; finished in [..]s
183213
184-
"#,
214+
215+
"#]],
185216
);
186217
}
187218

188219
#[test]
189220
fn skip_exact() {
190221
check(
191222
&["--exact", "--skip", "bar"],
192-
r#"
223+
str![[r#"
224+
193225
running 2 tests
194226
test barro ... ok
195227
test foo ... ok
196228
197229
test result: ok. 2 passed; 0 failed; 0 ignored; 1 filtered out; finished in [..]s
198230
199-
"#,
200-
r#"
231+
232+
"#]],
233+
str![[r#"
234+
201235
running 2 tests
202236
...
203237
204238
test result: ok. 2 passed; 0 failed; 0 ignored; 1 filtered out; finished in [..]s
205239
206-
"#,
240+
241+
"#]],
207242
);
208243
}
209244

210245
#[test]
211246
fn terse_output() {
212247
check(
213248
&["--quiet", "--skip", "foo"],
214-
r#"
249+
str![[r#"
250+
215251
running 2 tests
216252
..
217253
test result: ok. 2 passed; 0 failed; 0 ignored; 1 filtered out; finished in [..]s
218254
219-
"#,
220-
r#"
255+
256+
"#]],
257+
str![[r#"
258+
221259
running 2 tests
222260
..
223261
test result: ok. 2 passed; 0 failed; 0 ignored; 1 filtered out; finished in [..]s
224262
225-
"#,
263+
264+
"#]],
226265
);
227266
}

crates/libtest2-mimic/tests/testsuite/main_thread.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use snapbox::str;
2+
13
#[test]
24
fn check_test_on_main_thread() {
35
let package_root = crate::util::new_test(
@@ -22,9 +24,10 @@ fn main() {
2224
.current_dir(package_root)
2325
.assert()
2426
.success()
25-
.stdout_eq(
26-
"
27+
.stdout_eq(str![[r#"
28+
2729
running 1 test
28-
...",
29-
);
30+
...
31+
32+
"#]]);
3033
}

0 commit comments

Comments
 (0)