Skip to content

Commit 5977c7f

Browse files
authored
Add UI Tests (#21)
1 parent c46446b commit 5977c7f

File tree

6 files changed

+321
-2
lines changed

6 files changed

+321
-2
lines changed

Cargo.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,11 @@ termcolor = "1.0.5"
1515
ansi_term = "0.12.1"
1616
chrono = "0.4.10"
1717
atty = "0.2.14"
18+
19+
[dev-dependencies]
20+
glob = "0.3.0"
21+
assert_cmd = "1.0.1"
22+
23+
[[test]]
24+
name = "ui"
25+
harness = false

examples/basic.stdout

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
1:mainbasic::hierarchical-example{version=0.1}
2+
1:main├┐basic::hierarchical-example{version=0.1}
3+
1:main│└┐basic::server{host="localhost", port=8080}
4+
1:main│ ├─ms INFO basic starting
5+
1:main│ ├─ms INFO basic listening
6+
1:main│ ├┐basic::server{host="localhost", port=8080}
7+
1:main│ │└┐basic::conn{peer_addr="82.9.9.9", port=42381}
8+
1:main│ │ ├─ms DEBUG basic connected
9+
1:main│ │ ├─ms DEBUG basic message received, length=2
10+
1:main│ │┌┘basic::conn{peer_addr="82.9.9.9", port=42381}
11+
1:main│ ├┘basic::server{host="localhost", port=8080}
12+
1:main│ ├┐basic::server{host="localhost", port=8080}
13+
1:main│ │└┐basic::conn{peer_addr="8.8.8.8", port=18230}
14+
1:main│ │ ├─ms DEBUG basic connected
15+
1:main│ │┌┘basic::conn{peer_addr="8.8.8.8", port=18230}
16+
1:main│ ├┘basic::server{host="localhost", port=8080}
17+
1:main│ ├┐basic::server{host="localhost", port=8080}
18+
1:main│ │└┐basic::conn{peer_addr="82.9.9.9", port=42381}
19+
1:main│ │ ├─ms WARN basic weak encryption requested, algo="xor"
20+
1:main│ │ ├─ms DEBUG basic response sent, length=8
21+
1:main│ │ ├─ms DEBUG basic disconnected
22+
1:main│ │┌┘basic::conn{peer_addr="82.9.9.9", port=42381}
23+
1:main│ ├┘basic::server{host="localhost", port=8080}
24+
1:main│ ├┐basic::server{host="localhost", port=8080}
25+
1:main│ │└┐basic::conn{peer_addr="8.8.8.8", port=18230}
26+
1:main│ │ ├─ms DEBUG basic message received, length=5
27+
1:main│ │ ├─ms DEBUG basic response sent, length=8
28+
1:main│ │ ├─ms DEBUG basic disconnected
29+
1:main│ │┌┘basic::conn{peer_addr="8.8.8.8", port=18230}
30+
1:main│ ├┘basic::server{host="localhost", port=8080}
31+
1:main│ ├─ms WARN basic internal error
32+
1:main│ ├─ms INFO basic exit
33+
1:main│┌┘basic::server{host="localhost", port=8080}
34+
1:main├┘basic::hierarchical-example{version=0.1}
35+
1:mainbasic::hierarchical-example{version=0.1}

examples/stderr.stderr

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
fibonacci_seq{to=5}
2+
├─ms DEBUG Pushing 0 fibonacci
3+
├┐fibonacci_seq{to=5}
4+
│└┐nth_fibonacci{n=0}
5+
│ ├─ms DEBUG Base case
6+
├─ms DEBUG Pushing 1 fibonacci
7+
├┐fibonacci_seq{to=5}
8+
│└┐nth_fibonacci{n=1}
9+
│ ├─ms DEBUG Base case
10+
├─ms DEBUG Pushing 2 fibonacci
11+
├┐fibonacci_seq{to=5}
12+
│└┐nth_fibonacci{n=2}
13+
│ ├─ms DEBUG Recursing
14+
│ ├┐nth_fibonacci{n=2}
15+
│ │└┐nth_fibonacci{n=1}
16+
│ │ ├─ms DEBUG Base case
17+
│ ├┐nth_fibonacci{n=2}
18+
│ │└┐nth_fibonacci{n=0}
19+
│ │ ├─ms DEBUG Base case
20+
├─ms DEBUG Pushing 3 fibonacci
21+
├┐fibonacci_seq{to=5}
22+
│└┐nth_fibonacci{n=3}
23+
│ ├─ms DEBUG Recursing
24+
│ ├┐nth_fibonacci{n=3}
25+
│ │└┐nth_fibonacci{n=2}
26+
│ │ ├─ms DEBUG Recursing
27+
│ │ ├┐nth_fibonacci{n=2}
28+
│ │ │└┐nth_fibonacci{n=1}
29+
│ │ │ ├─ms DEBUG Base case
30+
│ │ ├┐nth_fibonacci{n=2}
31+
│ │ │└┐nth_fibonacci{n=0}
32+
│ │ │ ├─ms DEBUG Base case
33+
│ ├┐nth_fibonacci{n=3}
34+
│ │└┐nth_fibonacci{n=1}
35+
│ │ ├─ms DEBUG Base case
36+
├─ms DEBUG Pushing 4 fibonacci
37+
├┐fibonacci_seq{to=5}
38+
│└┐nth_fibonacci{n=4}
39+
│ ├─ms DEBUG Recursing
40+
│ ├┐nth_fibonacci{n=4}
41+
│ │└┐nth_fibonacci{n=3}
42+
│ │ ├─ms DEBUG Recursing
43+
│ │ ├┐nth_fibonacci{n=3}
44+
│ │ │└┐nth_fibonacci{n=2}
45+
│ │ │ ├─ms DEBUG Recursing
46+
│ │ │ ├┐nth_fibonacci{n=2}
47+
│ │ │ │└┐nth_fibonacci{n=1}
48+
│ │ │ │ ├─ms DEBUG Base case
49+
│ │ │ ├┐nth_fibonacci{n=2}
50+
│ │ │ │└┐nth_fibonacci{n=0}
51+
│ │ │ │ ├─ms DEBUG Base case
52+
│ │ ├┐nth_fibonacci{n=3}
53+
│ │ │└┐nth_fibonacci{n=1}
54+
│ │ │ ├─ms DEBUG Base case
55+
│ ├┐nth_fibonacci{n=4}
56+
│ │└┐nth_fibonacci{n=2}
57+
│ │ ├─ms DEBUG Recursing
58+
│ │ ├┐nth_fibonacci{n=2}
59+
│ │ │└┐nth_fibonacci{n=1}
60+
│ │ │ ├─ms DEBUG Base case
61+
│ │ ├┐nth_fibonacci{n=2}
62+
│ │ │└┐nth_fibonacci{n=0}
63+
│ │ │ ├─ms DEBUG Base case
64+
├─ms DEBUG Pushing 5 fibonacci
65+
├┐fibonacci_seq{to=5}
66+
│└┐nth_fibonacci{n=5}
67+
│ ├─ms DEBUG Recursing
68+
│ ├┐nth_fibonacci{n=5}
69+
│ │└┐nth_fibonacci{n=4}
70+
│ │ ├─ms DEBUG Recursing
71+
│ │ ├┐nth_fibonacci{n=4}
72+
│ │ │└┐nth_fibonacci{n=3}
73+
│ │ │ ├─ms DEBUG Recursing
74+
│ │ │ ├┐nth_fibonacci{n=3}
75+
│ │ │ │└┐nth_fibonacci{n=2}
76+
│ │ │ │ ├─ms DEBUG Recursing
77+
│ │ │ │ ├┐nth_fibonacci{n=2}
78+
│ │ │ │ │└┐nth_fibonacci{n=1}
79+
│ │ │ │ │ ├─ms DEBUG Base case
80+
│ │ │ │ ├┐nth_fibonacci{n=2}
81+
│ │ │ │ │└┐nth_fibonacci{n=0}
82+
│ │ │ │ │ ├─ms DEBUG Base case
83+
│ │ │ ├┐nth_fibonacci{n=3}
84+
│ │ │ │└┐nth_fibonacci{n=1}
85+
│ │ │ │ ├─ms DEBUG Base case
86+
│ │ ├┐nth_fibonacci{n=4}
87+
│ │ │└┐nth_fibonacci{n=2}
88+
│ │ │ ├─ms DEBUG Recursing
89+
│ │ │ ├┐nth_fibonacci{n=2}
90+
│ │ │ │└┐nth_fibonacci{n=1}
91+
│ │ │ │ ├─ms DEBUG Base case
92+
│ │ │ ├┐nth_fibonacci{n=2}
93+
│ │ │ │└┐nth_fibonacci{n=0}
94+
│ │ │ │ ├─ms DEBUG Base case
95+
│ ├┐nth_fibonacci{n=5}
96+
│ │└┐nth_fibonacci{n=3}
97+
│ │ ├─ms DEBUG Recursing
98+
│ │ ├┐nth_fibonacci{n=3}
99+
│ │ │└┐nth_fibonacci{n=2}
100+
│ │ │ ├─ms DEBUG Recursing
101+
│ │ │ ├┐nth_fibonacci{n=2}
102+
│ │ │ │└┐nth_fibonacci{n=1}
103+
│ │ │ │ ├─ms DEBUG Base case
104+
│ │ │ ├┐nth_fibonacci{n=2}
105+
│ │ │ │└┐nth_fibonacci{n=0}
106+
│ │ │ │ ├─ms DEBUG Base case
107+
│ │ ├┐nth_fibonacci{n=3}
108+
│ │ │└┐nth_fibonacci{n=1}
109+
│ │ │ ├─ms DEBUG Base case
110+
INFO The first 5 fibonacci numbers are [1, 1, 2, 3, 5, 8]

examples/wraparound.stdout

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
1:mainwraparound::recurse{i=0}
2+
1:main├─ms WARN wraparound boop
3+
1:main├┐wraparound::recurse{i=0}
4+
1:main│└┐wraparound::recurse{i=1}
5+
1:main│ ├─ms WARN wraparound boop
6+
1:main│ ├┐wraparound::recurse{i=1}
7+
1:main│ │└┐wraparound::recurse{i=2}
8+
1:main│ │ ├─ms WARN wraparound boop
9+
1:main│ │ ├┐wraparound::recurse{i=2}
10+
1:main│ │ │└┐wraparound::recurse{i=3}
11+
1:main│ │ │ ├─ms WARN wraparound boop
12+
1:mainwraparound::recurse{i=3}
13+
1:mainwraparound::recurse{i=4}
14+
1:mainms WARN wraparound boop
15+
1:mainwraparound::recurse{i=4}
16+
1:mainwraparound::recurse{i=5}
17+
1:main├─ms WARN wraparound boop
18+
1:main├┐wraparound::recurse{i=5}
19+
1:main│└┐wraparound::recurse{i=6}
20+
1:main│ ├─ms WARN wraparound boop
21+
1:main│ ├┐wraparound::recurse{i=6}
22+
1:main│ │└┐wraparound::recurse{i=7}
23+
1:main│ │ ├─ms WARN wraparound boop
24+
1:main│ │ ├┐wraparound::recurse{i=7}
25+
1:main│ │ │└┐wraparound::recurse{i=8}
26+
1:main│ │ │ ├─ms WARN wraparound boop
27+
1:mainwraparound::recurse{i=8}
28+
1:mainwraparound::recurse{i=9}
29+
1:mainms WARN wraparound boop
30+
1:mainwraparound::recurse{i=9}
31+
1:mainwraparound::recurse{i=10}
32+
1:main├─ms WARN wraparound boop
33+
1:main├┐wraparound::recurse{i=10}
34+
1:main│└┐wraparound::recurse{i=11}
35+
1:main│ ├─ms WARN wraparound boop
36+
1:main│ ├┐wraparound::recurse{i=11}
37+
1:main│ │└┐wraparound::recurse{i=12}
38+
1:main│ │ ├─ms WARN wraparound boop
39+
1:main│ │ ├┐wraparound::recurse{i=12}
40+
1:main│ │ │└┐wraparound::recurse{i=13}
41+
1:main│ │ │ ├─ms WARN wraparound boop
42+
1:mainwraparound::recurse{i=13}
43+
1:mainwraparound::recurse{i=14}
44+
1:mainms WARN wraparound boop
45+
1:mainwraparound::recurse{i=14}
46+
1:mainwraparound::recurse{i=15}
47+
1:main├─ms WARN wraparound boop
48+
1:main├┐wraparound::recurse{i=15}
49+
1:main│└┐wraparound::recurse{i=16}
50+
1:main│ ├─ms WARN wraparound boop
51+
1:main│ ├┐wraparound::recurse{i=16}
52+
1:main│ │└┐wraparound::recurse{i=17}
53+
1:main│ │ ├─ms WARN wraparound boop
54+
1:main│ │ ├┐wraparound::recurse{i=17}
55+
1:main│ │ │└┐wraparound::recurse{i=18}
56+
1:main│ │ │ ├─ms WARN wraparound boop
57+
1:mainwraparound::recurse{i=18}
58+
1:mainwraparound::recurse{i=19}
59+
1:mainms WARN wraparound boop
60+
1:mainwraparound::recurse{i=19}
61+
1:mainwraparound::recurse{i=20}
62+
1:main├─ms WARN wraparound boop
63+
1:main├┐wraparound::recurse{i=20}
64+
1:main│└┐wraparound::recurse{i=21}
65+
1:main│ ├─ms WARN wraparound boop
66+
1:main│ ├─ms WARN wraparound bop
67+
1:main├─ms WARN wraparound bop
68+
1:mainms WARN wraparound bop
69+
1:main│ │ │ ├─ms WARN wraparound bop
70+
1:main│ │ ├─ms WARN wraparound bop
71+
1:main│ ├─ms WARN wraparound bop
72+
1:main├─ms WARN wraparound bop
73+
1:mainms WARN wraparound bop
74+
1:main│ │ │ ├─ms WARN wraparound bop
75+
1:main│ │ ├─ms WARN wraparound bop
76+
1:main│ ├─ms WARN wraparound bop
77+
1:main├─ms WARN wraparound bop
78+
1:mainms WARN wraparound bop
79+
1:main│ │ │ ├─ms WARN wraparound bop
80+
1:main│ │ ├─ms WARN wraparound bop
81+
1:main│ ├─ms WARN wraparound bop
82+
1:main├─ms WARN wraparound bop
83+
1:mainms WARN wraparound bop
84+
1:main│ │ │ ├─ms WARN wraparound bop
85+
1:main│ │ ├─ms WARN wraparound bop
86+
1:main│ ├─ms WARN wraparound bop
87+
1:main├─ms WARN wraparound bop

src/format.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,8 @@ fn indent_block_with_lines(
215215
style: SpanMode,
216216
) {
217217
let indent = match style {
218-
SpanMode::PreOpen => indent - 1,
219-
SpanMode::Open => indent - 1,
218+
SpanMode::PreOpen => indent.saturating_sub(1),
219+
SpanMode::Open => indent.saturating_sub(1),
220220
SpanMode::Close => indent,
221221
SpanMode::PostClose => indent,
222222
SpanMode::Event => indent,

tests/ui.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
use assert_cmd::prelude::*;
2+
3+
use std::process::Command;
4+
5+
// Timings are flaky, so tests would spuriously fail.
6+
// Thus we replace all `/([0-9]+)ms/` with underscores
7+
fn replace_ms(data: &[u8]) -> Vec<u8> {
8+
let mut skip = false;
9+
let mut seen_s = false;
10+
let mut v: Vec<u8> = data
11+
.iter()
12+
.rev()
13+
.filter_map(|&b| match (b, skip, seen_s) {
14+
(b'0'..=b'9', true, _) => None,
15+
(_, true, _) => {
16+
skip = false;
17+
Some(b)
18+
}
19+
(b's', _, _) => {
20+
seen_s = true;
21+
Some(b)
22+
}
23+
(b'm', _, true) => {
24+
seen_s = false;
25+
skip = true;
26+
Some(b)
27+
}
28+
_ => Some(b),
29+
})
30+
.collect();
31+
v.reverse();
32+
v
33+
}
34+
35+
fn main() {
36+
for entry in glob::glob("examples/*.rs").expect("Failed to read glob pattern") {
37+
let entry = entry.unwrap();
38+
let mut cmd = Command::cargo_bin(entry.with_extension("").to_str().unwrap()).unwrap();
39+
let output = cmd.unwrap();
40+
let stderr = entry.with_extension("stderr");
41+
let stdout = entry.with_extension("stdout");
42+
43+
if std::env::args().any(|arg| arg == "--bless") {
44+
if output.stderr.is_empty() {
45+
let _ = std::fs::remove_file(stderr);
46+
} else {
47+
std::fs::write(stderr, replace_ms(&output.stderr)).unwrap();
48+
}
49+
if output.stdout.is_empty() {
50+
let _ = std::fs::remove_file(stdout);
51+
} else {
52+
std::fs::write(stdout, replace_ms(&output.stdout)).unwrap();
53+
}
54+
} else {
55+
if output.stderr.is_empty() {
56+
assert!(
57+
!stderr.exists(),
58+
"{} exists but there was no stderr output",
59+
stderr.display()
60+
);
61+
} else {
62+
assert!(
63+
std::fs::read(&stderr).unwrap() == replace_ms(&output.stderr),
64+
"{} is not the expected output, rerun the test with `cargo test -- -- --bless`",
65+
stderr.display()
66+
);
67+
}
68+
if output.stdout.is_empty() {
69+
assert!(!stdout.exists());
70+
} else {
71+
assert!(
72+
std::fs::read(&stdout).unwrap() == replace_ms(&output.stdout),
73+
"{} is not the expected output, rerun the test with `cargo test -- -- --bless`",
74+
stdout.display()
75+
);
76+
}
77+
}
78+
}
79+
}

0 commit comments

Comments
 (0)