From fddd0e09fd9b0d880201a40314742aebd3160a99 Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Thu, 20 Aug 2020 21:37:00 +0200 Subject: [PATCH 1/2] Run tests with ui testing --- Cargo.toml | 8 +++ examples/basic.stdout | 35 ++++++++++++ examples/stderr.stderr | 110 +++++++++++++++++++++++++++++++++++++ examples/wraparound.stdout | 87 +++++++++++++++++++++++++++++ src/format.rs | 4 +- tests/ui.rs | 22 ++++++++ 6 files changed, 264 insertions(+), 2 deletions(-) create mode 100644 examples/basic.stdout create mode 100644 examples/stderr.stderr create mode 100644 examples/wraparound.stdout create mode 100644 tests/ui.rs diff --git a/Cargo.toml b/Cargo.toml index 7d48218..fcaddf2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,3 +15,11 @@ termcolor = "1.0.5" ansi_term = "0.12.1" chrono = "0.4.10" atty = "0.2.14" + +[dev-dependencies] +glob = "0.3.0" +assert_cmd = "1.0.1" + +[[test]] +name = "ui" +harness = false diff --git a/examples/basic.stdout b/examples/basic.stdout new file mode 100644 index 0000000..7979132 --- /dev/null +++ b/examples/basic.stdout @@ -0,0 +1,35 @@ +1:mainbasic::hierarchical-example{version=0.1} +1:main├┐basic::hierarchical-example{version=0.1} +1:main│└┐basic::server{host="localhost", port=8080} +1:main│ ├─0ms INFO basic starting +1:main│ ├─300ms INFO basic listening +1:main│ ├┐basic::server{host="localhost", port=8080} +1:main│ │└┐basic::conn{peer_addr="82.9.9.9", port=42381} +1:main│ │ ├─0ms DEBUG basic connected +1:main│ │ ├─300ms DEBUG basic message received, length=2 +1:main│ │┌┘basic::conn{peer_addr="82.9.9.9", port=42381} +1:main│ ├┘basic::server{host="localhost", port=8080} +1:main│ ├┐basic::server{host="localhost", port=8080} +1:main│ │└┐basic::conn{peer_addr="8.8.8.8", port=18230} +1:main│ │ ├─300ms DEBUG basic connected +1:main│ │┌┘basic::conn{peer_addr="8.8.8.8", port=18230} +1:main│ ├┘basic::server{host="localhost", port=8080} +1:main│ ├┐basic::server{host="localhost", port=8080} +1:main│ │└┐basic::conn{peer_addr="82.9.9.9", port=42381} +1:main│ │ ├─601ms WARN basic weak encryption requested, algo="xor" +1:main│ │ ├─901ms DEBUG basic response sent, length=8 +1:main│ │ ├─901ms DEBUG basic disconnected +1:main│ │┌┘basic::conn{peer_addr="82.9.9.9", port=42381} +1:main│ ├┘basic::server{host="localhost", port=8080} +1:main│ ├┐basic::server{host="localhost", port=8080} +1:main│ │└┐basic::conn{peer_addr="8.8.8.8", port=18230} +1:main│ │ ├─601ms DEBUG basic message received, length=5 +1:main│ │ ├─901ms DEBUG basic response sent, length=8 +1:main│ │ ├─901ms DEBUG basic disconnected +1:main│ │┌┘basic::conn{peer_addr="8.8.8.8", port=18230} +1:main│ ├┘basic::server{host="localhost", port=8080} +1:main│ ├─1503ms WARN basic internal error +1:main│ ├─1503ms INFO basic exit +1:main│┌┘basic::server{host="localhost", port=8080} +1:main├┘basic::hierarchical-example{version=0.1} +1:mainbasic::hierarchical-example{version=0.1} diff --git a/examples/stderr.stderr b/examples/stderr.stderr new file mode 100644 index 0000000..4e8270b --- /dev/null +++ b/examples/stderr.stderr @@ -0,0 +1,110 @@ +fibonacci_seq{to=5} +├─0ms DEBUG Pushing 0 fibonacci +├┐fibonacci_seq{to=5} +│└┐nth_fibonacci{n=0} +│ ├─0ms DEBUG Base case +├─0ms DEBUG Pushing 1 fibonacci +├┐fibonacci_seq{to=5} +│└┐nth_fibonacci{n=1} +│ ├─0ms DEBUG Base case +├─0ms DEBUG Pushing 2 fibonacci +├┐fibonacci_seq{to=5} +│└┐nth_fibonacci{n=2} +│ ├─0ms DEBUG Recursing +│ ├┐nth_fibonacci{n=2} +│ │└┐nth_fibonacci{n=1} +│ │ ├─0ms DEBUG Base case +│ ├┐nth_fibonacci{n=2} +│ │└┐nth_fibonacci{n=0} +│ │ ├─0ms DEBUG Base case +├─1ms DEBUG Pushing 3 fibonacci +├┐fibonacci_seq{to=5} +│└┐nth_fibonacci{n=3} +│ ├─0ms DEBUG Recursing +│ ├┐nth_fibonacci{n=3} +│ │└┐nth_fibonacci{n=2} +│ │ ├─0ms DEBUG Recursing +│ │ ├┐nth_fibonacci{n=2} +│ │ │└┐nth_fibonacci{n=1} +│ │ │ ├─0ms DEBUG Base case +│ │ ├┐nth_fibonacci{n=2} +│ │ │└┐nth_fibonacci{n=0} +│ │ │ ├─0ms DEBUG Base case +│ ├┐nth_fibonacci{n=3} +│ │└┐nth_fibonacci{n=1} +│ │ ├─0ms DEBUG Base case +├─2ms DEBUG Pushing 4 fibonacci +├┐fibonacci_seq{to=5} +│└┐nth_fibonacci{n=4} +│ ├─0ms DEBUG Recursing +│ ├┐nth_fibonacci{n=4} +│ │└┐nth_fibonacci{n=3} +│ │ ├─0ms DEBUG Recursing +│ │ ├┐nth_fibonacci{n=3} +│ │ │└┐nth_fibonacci{n=2} +│ │ │ ├─0ms DEBUG Recursing +│ │ │ ├┐nth_fibonacci{n=2} +│ │ │ │└┐nth_fibonacci{n=1} +│ │ │ │ ├─0ms DEBUG Base case +│ │ │ ├┐nth_fibonacci{n=2} +│ │ │ │└┐nth_fibonacci{n=0} +│ │ │ │ ├─0ms DEBUG Base case +│ │ ├┐nth_fibonacci{n=3} +│ │ │└┐nth_fibonacci{n=1} +│ │ │ ├─0ms DEBUG Base case +│ ├┐nth_fibonacci{n=4} +│ │└┐nth_fibonacci{n=2} +│ │ ├─0ms DEBUG Recursing +│ │ ├┐nth_fibonacci{n=2} +│ │ │└┐nth_fibonacci{n=1} +│ │ │ ├─0ms DEBUG Base case +│ │ ├┐nth_fibonacci{n=2} +│ │ │└┐nth_fibonacci{n=0} +│ │ │ ├─0ms DEBUG Base case +├─4ms DEBUG Pushing 5 fibonacci +├┐fibonacci_seq{to=5} +│└┐nth_fibonacci{n=5} +│ ├─0ms DEBUG Recursing +│ ├┐nth_fibonacci{n=5} +│ │└┐nth_fibonacci{n=4} +│ │ ├─0ms DEBUG Recursing +│ │ ├┐nth_fibonacci{n=4} +│ │ │└┐nth_fibonacci{n=3} +│ │ │ ├─0ms DEBUG Recursing +│ │ │ ├┐nth_fibonacci{n=3} +│ │ │ │└┐nth_fibonacci{n=2} +│ │ │ │ ├─0ms DEBUG Recursing +│ │ │ │ ├┐nth_fibonacci{n=2} +│ │ │ │ │└┐nth_fibonacci{n=1} +│ │ │ │ │ ├─0ms DEBUG Base case +│ │ │ │ ├┐nth_fibonacci{n=2} +│ │ │ │ │└┐nth_fibonacci{n=0} +│ │ │ │ │ ├─0ms DEBUG Base case +│ │ │ ├┐nth_fibonacci{n=3} +│ │ │ │└┐nth_fibonacci{n=1} +│ │ │ │ ├─0ms DEBUG Base case +│ │ ├┐nth_fibonacci{n=4} +│ │ │└┐nth_fibonacci{n=2} +│ │ │ ├─0ms DEBUG Recursing +│ │ │ ├┐nth_fibonacci{n=2} +│ │ │ │└┐nth_fibonacci{n=1} +│ │ │ │ ├─0ms DEBUG Base case +│ │ │ ├┐nth_fibonacci{n=2} +│ │ │ │└┐nth_fibonacci{n=0} +│ │ │ │ ├─0ms DEBUG Base case +│ ├┐nth_fibonacci{n=5} +│ │└┐nth_fibonacci{n=3} +│ │ ├─0ms DEBUG Recursing +│ │ ├┐nth_fibonacci{n=3} +│ │ │└┐nth_fibonacci{n=2} +│ │ │ ├─0ms DEBUG Recursing +│ │ │ ├┐nth_fibonacci{n=2} +│ │ │ │└┐nth_fibonacci{n=1} +│ │ │ │ ├─0ms DEBUG Base case +│ │ │ ├┐nth_fibonacci{n=2} +│ │ │ │└┐nth_fibonacci{n=0} +│ │ │ │ ├─0ms DEBUG Base case +│ │ ├┐nth_fibonacci{n=3} +│ │ │└┐nth_fibonacci{n=1} +│ │ │ ├─0ms DEBUG Base case +INFO The first 5 fibonacci numbers are [1, 1, 2, 3, 5, 8] diff --git a/examples/wraparound.stdout b/examples/wraparound.stdout new file mode 100644 index 0000000..d0e9508 --- /dev/null +++ b/examples/wraparound.stdout @@ -0,0 +1,87 @@ +1:mainwraparound::recurse{i=0} +1:main├─0ms WARN wraparound boop +1:main├┐wraparound::recurse{i=0} +1:main│└┐wraparound::recurse{i=1} +1:main│ ├─0ms WARN wraparound boop +1:main│ ├┐wraparound::recurse{i=1} +1:main│ │└┐wraparound::recurse{i=2} +1:main│ │ ├─0ms WARN wraparound boop +1:main│ │ ├┐wraparound::recurse{i=2} +1:main│ │ │└┐wraparound::recurse{i=3} +1:main│ │ │ ├─0ms WARN wraparound boop +1:mainwraparound::recurse{i=3} +1:mainwraparound::recurse{i=4} +1:main0ms WARN wraparound boop +1:mainwraparound::recurse{i=4} +1:mainwraparound::recurse{i=5} +1:main├─0ms WARN wraparound boop +1:main├┐wraparound::recurse{i=5} +1:main│└┐wraparound::recurse{i=6} +1:main│ ├─0ms WARN wraparound boop +1:main│ ├┐wraparound::recurse{i=6} +1:main│ │└┐wraparound::recurse{i=7} +1:main│ │ ├─0ms WARN wraparound boop +1:main│ │ ├┐wraparound::recurse{i=7} +1:main│ │ │└┐wraparound::recurse{i=8} +1:main│ │ │ ├─0ms WARN wraparound boop +1:mainwraparound::recurse{i=8} +1:mainwraparound::recurse{i=9} +1:main0ms WARN wraparound boop +1:mainwraparound::recurse{i=9} +1:mainwraparound::recurse{i=10} +1:main├─0ms WARN wraparound boop +1:main├┐wraparound::recurse{i=10} +1:main│└┐wraparound::recurse{i=11} +1:main│ ├─0ms WARN wraparound boop +1:main│ ├┐wraparound::recurse{i=11} +1:main│ │└┐wraparound::recurse{i=12} +1:main│ │ ├─0ms WARN wraparound boop +1:main│ │ ├┐wraparound::recurse{i=12} +1:main│ │ │└┐wraparound::recurse{i=13} +1:main│ │ │ ├─0ms WARN wraparound boop +1:mainwraparound::recurse{i=13} +1:mainwraparound::recurse{i=14} +1:main0ms WARN wraparound boop +1:mainwraparound::recurse{i=14} +1:mainwraparound::recurse{i=15} +1:main├─0ms WARN wraparound boop +1:main├┐wraparound::recurse{i=15} +1:main│└┐wraparound::recurse{i=16} +1:main│ ├─0ms WARN wraparound boop +1:main│ ├┐wraparound::recurse{i=16} +1:main│ │└┐wraparound::recurse{i=17} +1:main│ │ ├─0ms WARN wraparound boop +1:main│ │ ├┐wraparound::recurse{i=17} +1:main│ │ │└┐wraparound::recurse{i=18} +1:main│ │ │ ├─0ms WARN wraparound boop +1:mainwraparound::recurse{i=18} +1:mainwraparound::recurse{i=19} +1:main0ms WARN wraparound boop +1:mainwraparound::recurse{i=19} +1:mainwraparound::recurse{i=20} +1:main├─0ms WARN wraparound boop +1:main├┐wraparound::recurse{i=20} +1:main│└┐wraparound::recurse{i=21} +1:main│ ├─0ms WARN wraparound boop +1:main│ ├─0ms WARN wraparound bop +1:main├─1ms WARN wraparound bop +1:main2ms WARN wraparound bop +1:main│ │ │ ├─2ms WARN wraparound bop +1:main│ │ ├─3ms WARN wraparound bop +1:main│ ├─4ms WARN wraparound bop +1:main├─4ms WARN wraparound bop +1:main5ms WARN wraparound bop +1:main│ │ │ ├─6ms WARN wraparound bop +1:main│ │ ├─6ms WARN wraparound bop +1:main│ ├─7ms WARN wraparound bop +1:main├─7ms WARN wraparound bop +1:main7ms WARN wraparound bop +1:main│ │ │ ├─8ms WARN wraparound bop +1:main│ │ ├─8ms WARN wraparound bop +1:main│ ├─9ms WARN wraparound bop +1:main├─9ms WARN wraparound bop +1:main9ms WARN wraparound bop +1:main│ │ │ ├─10ms WARN wraparound bop +1:main│ │ ├─10ms WARN wraparound bop +1:main│ ├─10ms WARN wraparound bop +1:main├─11ms WARN wraparound bop diff --git a/src/format.rs b/src/format.rs index 490d4a9..2cfd7b9 100644 --- a/src/format.rs +++ b/src/format.rs @@ -215,8 +215,8 @@ fn indent_block_with_lines( style: SpanMode, ) { let indent = match style { - SpanMode::PreOpen => indent - 1, - SpanMode::Open => indent - 1, + SpanMode::PreOpen => indent.saturating_sub(1), + SpanMode::Open => indent.saturating_sub(1), SpanMode::Close => indent, SpanMode::PostClose => indent, SpanMode::Event => indent, diff --git a/tests/ui.rs b/tests/ui.rs new file mode 100644 index 0000000..81c18d4 --- /dev/null +++ b/tests/ui.rs @@ -0,0 +1,22 @@ +use assert_cmd::prelude::*; + +use std::process::Command; + +fn main() { + for entry in glob::glob("examples/*.rs").expect("Failed to read glob pattern") { + let entry = entry.unwrap(); + let mut cmd = Command::cargo_bin(entry.with_extension("").to_str().unwrap()) + .unwrap(); + let output = cmd.unwrap(); + if output.stderr.is_empty() { + let _ = std::fs::remove_file(entry.with_extension("stderr")); + } else { + std::fs::write(entry.with_extension("stderr"), output.stderr).unwrap(); + } + if output.stdout.is_empty() { + let _ = std::fs::remove_file(entry.with_extension("stdout")); + } else { + std::fs::write(entry.with_extension("stdout"), output.stdout).unwrap(); + } + } +} From 96353a24e1ae2a384433efac6eeedceb5d2df682 Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Thu, 20 Aug 2020 23:07:36 +0200 Subject: [PATCH 2/2] Only update the stderr output if tests are run with `--bless` --- examples/basic.stdout | 26 +++++------ examples/stderr.stderr | 80 +++++++++++++++++----------------- examples/wraparound.stdout | 88 +++++++++++++++++++------------------- tests/ui.rs | 77 ++++++++++++++++++++++++++++----- 4 files changed, 164 insertions(+), 107 deletions(-) diff --git a/examples/basic.stdout b/examples/basic.stdout index 7979132..b43c28e 100644 --- a/examples/basic.stdout +++ b/examples/basic.stdout @@ -1,35 +1,35 @@ 1:mainbasic::hierarchical-example{version=0.1} 1:main├┐basic::hierarchical-example{version=0.1} 1:main│└┐basic::server{host="localhost", port=8080} -1:main│ ├─0ms INFO basic starting -1:main│ ├─300ms INFO basic listening +1:main│ ├─ms INFO basic starting +1:main│ ├─ms INFO basic listening 1:main│ ├┐basic::server{host="localhost", port=8080} 1:main│ │└┐basic::conn{peer_addr="82.9.9.9", port=42381} -1:main│ │ ├─0ms DEBUG basic connected -1:main│ │ ├─300ms DEBUG basic message received, length=2 +1:main│ │ ├─ms DEBUG basic connected +1:main│ │ ├─ms DEBUG basic message received, length=2 1:main│ │┌┘basic::conn{peer_addr="82.9.9.9", port=42381} 1:main│ ├┘basic::server{host="localhost", port=8080} 1:main│ ├┐basic::server{host="localhost", port=8080} 1:main│ │└┐basic::conn{peer_addr="8.8.8.8", port=18230} -1:main│ │ ├─300ms DEBUG basic connected +1:main│ │ ├─ms DEBUG basic connected 1:main│ │┌┘basic::conn{peer_addr="8.8.8.8", port=18230} 1:main│ ├┘basic::server{host="localhost", port=8080} 1:main│ ├┐basic::server{host="localhost", port=8080} 1:main│ │└┐basic::conn{peer_addr="82.9.9.9", port=42381} -1:main│ │ ├─601ms WARN basic weak encryption requested, algo="xor" -1:main│ │ ├─901ms DEBUG basic response sent, length=8 -1:main│ │ ├─901ms DEBUG basic disconnected +1:main│ │ ├─ms WARN basic weak encryption requested, algo="xor" +1:main│ │ ├─ms DEBUG basic response sent, length=8 +1:main│ │ ├─ms DEBUG basic disconnected 1:main│ │┌┘basic::conn{peer_addr="82.9.9.9", port=42381} 1:main│ ├┘basic::server{host="localhost", port=8080} 1:main│ ├┐basic::server{host="localhost", port=8080} 1:main│ │└┐basic::conn{peer_addr="8.8.8.8", port=18230} -1:main│ │ ├─601ms DEBUG basic message received, length=5 -1:main│ │ ├─901ms DEBUG basic response sent, length=8 -1:main│ │ ├─901ms DEBUG basic disconnected +1:main│ │ ├─ms DEBUG basic message received, length=5 +1:main│ │ ├─ms DEBUG basic response sent, length=8 +1:main│ │ ├─ms DEBUG basic disconnected 1:main│ │┌┘basic::conn{peer_addr="8.8.8.8", port=18230} 1:main│ ├┘basic::server{host="localhost", port=8080} -1:main│ ├─1503ms WARN basic internal error -1:main│ ├─1503ms INFO basic exit +1:main│ ├─ms WARN basic internal error +1:main│ ├─ms INFO basic exit 1:main│┌┘basic::server{host="localhost", port=8080} 1:main├┘basic::hierarchical-example{version=0.1} 1:mainbasic::hierarchical-example{version=0.1} diff --git a/examples/stderr.stderr b/examples/stderr.stderr index 4e8270b..6fc51bb 100644 --- a/examples/stderr.stderr +++ b/examples/stderr.stderr @@ -1,110 +1,110 @@ fibonacci_seq{to=5} -├─0ms DEBUG Pushing 0 fibonacci +├─ms DEBUG Pushing 0 fibonacci ├┐fibonacci_seq{to=5} │└┐nth_fibonacci{n=0} -│ ├─0ms DEBUG Base case -├─0ms DEBUG Pushing 1 fibonacci +│ ├─ms DEBUG Base case +├─ms DEBUG Pushing 1 fibonacci ├┐fibonacci_seq{to=5} │└┐nth_fibonacci{n=1} -│ ├─0ms DEBUG Base case -├─0ms DEBUG Pushing 2 fibonacci +│ ├─ms DEBUG Base case +├─ms DEBUG Pushing 2 fibonacci ├┐fibonacci_seq{to=5} │└┐nth_fibonacci{n=2} -│ ├─0ms DEBUG Recursing +│ ├─ms DEBUG Recursing │ ├┐nth_fibonacci{n=2} │ │└┐nth_fibonacci{n=1} -│ │ ├─0ms DEBUG Base case +│ │ ├─ms DEBUG Base case │ ├┐nth_fibonacci{n=2} │ │└┐nth_fibonacci{n=0} -│ │ ├─0ms DEBUG Base case -├─1ms DEBUG Pushing 3 fibonacci +│ │ ├─ms DEBUG Base case +├─ms DEBUG Pushing 3 fibonacci ├┐fibonacci_seq{to=5} │└┐nth_fibonacci{n=3} -│ ├─0ms DEBUG Recursing +│ ├─ms DEBUG Recursing │ ├┐nth_fibonacci{n=3} │ │└┐nth_fibonacci{n=2} -│ │ ├─0ms DEBUG Recursing +│ │ ├─ms DEBUG Recursing │ │ ├┐nth_fibonacci{n=2} │ │ │└┐nth_fibonacci{n=1} -│ │ │ ├─0ms DEBUG Base case +│ │ │ ├─ms DEBUG Base case │ │ ├┐nth_fibonacci{n=2} │ │ │└┐nth_fibonacci{n=0} -│ │ │ ├─0ms DEBUG Base case +│ │ │ ├─ms DEBUG Base case │ ├┐nth_fibonacci{n=3} │ │└┐nth_fibonacci{n=1} -│ │ ├─0ms DEBUG Base case -├─2ms DEBUG Pushing 4 fibonacci +│ │ ├─ms DEBUG Base case +├─ms DEBUG Pushing 4 fibonacci ├┐fibonacci_seq{to=5} │└┐nth_fibonacci{n=4} -│ ├─0ms DEBUG Recursing +│ ├─ms DEBUG Recursing │ ├┐nth_fibonacci{n=4} │ │└┐nth_fibonacci{n=3} -│ │ ├─0ms DEBUG Recursing +│ │ ├─ms DEBUG Recursing │ │ ├┐nth_fibonacci{n=3} │ │ │└┐nth_fibonacci{n=2} -│ │ │ ├─0ms DEBUG Recursing +│ │ │ ├─ms DEBUG Recursing │ │ │ ├┐nth_fibonacci{n=2} │ │ │ │└┐nth_fibonacci{n=1} -│ │ │ │ ├─0ms DEBUG Base case +│ │ │ │ ├─ms DEBUG Base case │ │ │ ├┐nth_fibonacci{n=2} │ │ │ │└┐nth_fibonacci{n=0} -│ │ │ │ ├─0ms DEBUG Base case +│ │ │ │ ├─ms DEBUG Base case │ │ ├┐nth_fibonacci{n=3} │ │ │└┐nth_fibonacci{n=1} -│ │ │ ├─0ms DEBUG Base case +│ │ │ ├─ms DEBUG Base case │ ├┐nth_fibonacci{n=4} │ │└┐nth_fibonacci{n=2} -│ │ ├─0ms DEBUG Recursing +│ │ ├─ms DEBUG Recursing │ │ ├┐nth_fibonacci{n=2} │ │ │└┐nth_fibonacci{n=1} -│ │ │ ├─0ms DEBUG Base case +│ │ │ ├─ms DEBUG Base case │ │ ├┐nth_fibonacci{n=2} │ │ │└┐nth_fibonacci{n=0} -│ │ │ ├─0ms DEBUG Base case -├─4ms DEBUG Pushing 5 fibonacci +│ │ │ ├─ms DEBUG Base case +├─ms DEBUG Pushing 5 fibonacci ├┐fibonacci_seq{to=5} │└┐nth_fibonacci{n=5} -│ ├─0ms DEBUG Recursing +│ ├─ms DEBUG Recursing │ ├┐nth_fibonacci{n=5} │ │└┐nth_fibonacci{n=4} -│ │ ├─0ms DEBUG Recursing +│ │ ├─ms DEBUG Recursing │ │ ├┐nth_fibonacci{n=4} │ │ │└┐nth_fibonacci{n=3} -│ │ │ ├─0ms DEBUG Recursing +│ │ │ ├─ms DEBUG Recursing │ │ │ ├┐nth_fibonacci{n=3} │ │ │ │└┐nth_fibonacci{n=2} -│ │ │ │ ├─0ms DEBUG Recursing +│ │ │ │ ├─ms DEBUG Recursing │ │ │ │ ├┐nth_fibonacci{n=2} │ │ │ │ │└┐nth_fibonacci{n=1} -│ │ │ │ │ ├─0ms DEBUG Base case +│ │ │ │ │ ├─ms DEBUG Base case │ │ │ │ ├┐nth_fibonacci{n=2} │ │ │ │ │└┐nth_fibonacci{n=0} -│ │ │ │ │ ├─0ms DEBUG Base case +│ │ │ │ │ ├─ms DEBUG Base case │ │ │ ├┐nth_fibonacci{n=3} │ │ │ │└┐nth_fibonacci{n=1} -│ │ │ │ ├─0ms DEBUG Base case +│ │ │ │ ├─ms DEBUG Base case │ │ ├┐nth_fibonacci{n=4} │ │ │└┐nth_fibonacci{n=2} -│ │ │ ├─0ms DEBUG Recursing +│ │ │ ├─ms DEBUG Recursing │ │ │ ├┐nth_fibonacci{n=2} │ │ │ │└┐nth_fibonacci{n=1} -│ │ │ │ ├─0ms DEBUG Base case +│ │ │ │ ├─ms DEBUG Base case │ │ │ ├┐nth_fibonacci{n=2} │ │ │ │└┐nth_fibonacci{n=0} -│ │ │ │ ├─0ms DEBUG Base case +│ │ │ │ ├─ms DEBUG Base case │ ├┐nth_fibonacci{n=5} │ │└┐nth_fibonacci{n=3} -│ │ ├─0ms DEBUG Recursing +│ │ ├─ms DEBUG Recursing │ │ ├┐nth_fibonacci{n=3} │ │ │└┐nth_fibonacci{n=2} -│ │ │ ├─0ms DEBUG Recursing +│ │ │ ├─ms DEBUG Recursing │ │ │ ├┐nth_fibonacci{n=2} │ │ │ │└┐nth_fibonacci{n=1} -│ │ │ │ ├─0ms DEBUG Base case +│ │ │ │ ├─ms DEBUG Base case │ │ │ ├┐nth_fibonacci{n=2} │ │ │ │└┐nth_fibonacci{n=0} -│ │ │ │ ├─0ms DEBUG Base case +│ │ │ │ ├─ms DEBUG Base case │ │ ├┐nth_fibonacci{n=3} │ │ │└┐nth_fibonacci{n=1} -│ │ │ ├─0ms DEBUG Base case +│ │ │ ├─ms DEBUG Base case INFO The first 5 fibonacci numbers are [1, 1, 2, 3, 5, 8] diff --git a/examples/wraparound.stdout b/examples/wraparound.stdout index d0e9508..6268580 100644 --- a/examples/wraparound.stdout +++ b/examples/wraparound.stdout @@ -1,87 +1,87 @@ 1:mainwraparound::recurse{i=0} -1:main├─0ms WARN wraparound boop +1:main├─ms WARN wraparound boop 1:main├┐wraparound::recurse{i=0} 1:main│└┐wraparound::recurse{i=1} -1:main│ ├─0ms WARN wraparound boop +1:main│ ├─ms WARN wraparound boop 1:main│ ├┐wraparound::recurse{i=1} 1:main│ │└┐wraparound::recurse{i=2} -1:main│ │ ├─0ms WARN wraparound boop +1:main│ │ ├─ms WARN wraparound boop 1:main│ │ ├┐wraparound::recurse{i=2} 1:main│ │ │└┐wraparound::recurse{i=3} -1:main│ │ │ ├─0ms WARN wraparound boop +1:main│ │ │ ├─ms WARN wraparound boop 1:mainwraparound::recurse{i=3} 1:mainwraparound::recurse{i=4} -1:main0ms WARN wraparound boop +1:mainms WARN wraparound boop 1:mainwraparound::recurse{i=4} 1:mainwraparound::recurse{i=5} -1:main├─0ms WARN wraparound boop +1:main├─ms WARN wraparound boop 1:main├┐wraparound::recurse{i=5} 1:main│└┐wraparound::recurse{i=6} -1:main│ ├─0ms WARN wraparound boop +1:main│ ├─ms WARN wraparound boop 1:main│ ├┐wraparound::recurse{i=6} 1:main│ │└┐wraparound::recurse{i=7} -1:main│ │ ├─0ms WARN wraparound boop +1:main│ │ ├─ms WARN wraparound boop 1:main│ │ ├┐wraparound::recurse{i=7} 1:main│ │ │└┐wraparound::recurse{i=8} -1:main│ │ │ ├─0ms WARN wraparound boop +1:main│ │ │ ├─ms WARN wraparound boop 1:mainwraparound::recurse{i=8} 1:mainwraparound::recurse{i=9} -1:main0ms WARN wraparound boop +1:mainms WARN wraparound boop 1:mainwraparound::recurse{i=9} 1:mainwraparound::recurse{i=10} -1:main├─0ms WARN wraparound boop +1:main├─ms WARN wraparound boop 1:main├┐wraparound::recurse{i=10} 1:main│└┐wraparound::recurse{i=11} -1:main│ ├─0ms WARN wraparound boop +1:main│ ├─ms WARN wraparound boop 1:main│ ├┐wraparound::recurse{i=11} 1:main│ │└┐wraparound::recurse{i=12} -1:main│ │ ├─0ms WARN wraparound boop +1:main│ │ ├─ms WARN wraparound boop 1:main│ │ ├┐wraparound::recurse{i=12} 1:main│ │ │└┐wraparound::recurse{i=13} -1:main│ │ │ ├─0ms WARN wraparound boop +1:main│ │ │ ├─ms WARN wraparound boop 1:mainwraparound::recurse{i=13} 1:mainwraparound::recurse{i=14} -1:main0ms WARN wraparound boop +1:mainms WARN wraparound boop 1:mainwraparound::recurse{i=14} 1:mainwraparound::recurse{i=15} -1:main├─0ms WARN wraparound boop +1:main├─ms WARN wraparound boop 1:main├┐wraparound::recurse{i=15} 1:main│└┐wraparound::recurse{i=16} -1:main│ ├─0ms WARN wraparound boop +1:main│ ├─ms WARN wraparound boop 1:main│ ├┐wraparound::recurse{i=16} 1:main│ │└┐wraparound::recurse{i=17} -1:main│ │ ├─0ms WARN wraparound boop +1:main│ │ ├─ms WARN wraparound boop 1:main│ │ ├┐wraparound::recurse{i=17} 1:main│ │ │└┐wraparound::recurse{i=18} -1:main│ │ │ ├─0ms WARN wraparound boop +1:main│ │ │ ├─ms WARN wraparound boop 1:mainwraparound::recurse{i=18} 1:mainwraparound::recurse{i=19} -1:main0ms WARN wraparound boop +1:mainms WARN wraparound boop 1:mainwraparound::recurse{i=19} 1:mainwraparound::recurse{i=20} -1:main├─0ms WARN wraparound boop +1:main├─ms WARN wraparound boop 1:main├┐wraparound::recurse{i=20} 1:main│└┐wraparound::recurse{i=21} -1:main│ ├─0ms WARN wraparound boop -1:main│ ├─0ms WARN wraparound bop -1:main├─1ms WARN wraparound bop -1:main2ms WARN wraparound bop -1:main│ │ │ ├─2ms WARN wraparound bop -1:main│ │ ├─3ms WARN wraparound bop -1:main│ ├─4ms WARN wraparound bop -1:main├─4ms WARN wraparound bop -1:main5ms WARN wraparound bop -1:main│ │ │ ├─6ms WARN wraparound bop -1:main│ │ ├─6ms WARN wraparound bop -1:main│ ├─7ms WARN wraparound bop -1:main├─7ms WARN wraparound bop -1:main7ms WARN wraparound bop -1:main│ │ │ ├─8ms WARN wraparound bop -1:main│ │ ├─8ms WARN wraparound bop -1:main│ ├─9ms WARN wraparound bop -1:main├─9ms WARN wraparound bop -1:main9ms WARN wraparound bop -1:main│ │ │ ├─10ms WARN wraparound bop -1:main│ │ ├─10ms WARN wraparound bop -1:main│ ├─10ms WARN wraparound bop -1:main├─11ms WARN wraparound bop +1:main│ ├─ms WARN wraparound boop +1:main│ ├─ms WARN wraparound bop +1:main├─ms WARN wraparound bop +1:mainms WARN wraparound bop +1:main│ │ │ ├─ms WARN wraparound bop +1:main│ │ ├─ms WARN wraparound bop +1:main│ ├─ms WARN wraparound bop +1:main├─ms WARN wraparound bop +1:mainms WARN wraparound bop +1:main│ │ │ ├─ms WARN wraparound bop +1:main│ │ ├─ms WARN wraparound bop +1:main│ ├─ms WARN wraparound bop +1:main├─ms WARN wraparound bop +1:mainms WARN wraparound bop +1:main│ │ │ ├─ms WARN wraparound bop +1:main│ │ ├─ms WARN wraparound bop +1:main│ ├─ms WARN wraparound bop +1:main├─ms WARN wraparound bop +1:mainms WARN wraparound bop +1:main│ │ │ ├─ms WARN wraparound bop +1:main│ │ ├─ms WARN wraparound bop +1:main│ ├─ms WARN wraparound bop +1:main├─ms WARN wraparound bop diff --git a/tests/ui.rs b/tests/ui.rs index 81c18d4..68c54e6 100644 --- a/tests/ui.rs +++ b/tests/ui.rs @@ -2,21 +2,78 @@ use assert_cmd::prelude::*; use std::process::Command; +// Timings are flaky, so tests would spuriously fail. +// Thus we replace all `/([0-9]+)ms/` with underscores +fn replace_ms(data: &[u8]) -> Vec { + let mut skip = false; + let mut seen_s = false; + let mut v: Vec = data + .iter() + .rev() + .filter_map(|&b| match (b, skip, seen_s) { + (b'0'..=b'9', true, _) => None, + (_, true, _) => { + skip = false; + Some(b) + } + (b's', _, _) => { + seen_s = true; + Some(b) + } + (b'm', _, true) => { + seen_s = false; + skip = true; + Some(b) + } + _ => Some(b), + }) + .collect(); + v.reverse(); + v +} + fn main() { for entry in glob::glob("examples/*.rs").expect("Failed to read glob pattern") { let entry = entry.unwrap(); - let mut cmd = Command::cargo_bin(entry.with_extension("").to_str().unwrap()) - .unwrap(); + let mut cmd = Command::cargo_bin(entry.with_extension("").to_str().unwrap()).unwrap(); let output = cmd.unwrap(); - if output.stderr.is_empty() { - let _ = std::fs::remove_file(entry.with_extension("stderr")); - } else { - std::fs::write(entry.with_extension("stderr"), output.stderr).unwrap(); - } - if output.stdout.is_empty() { - let _ = std::fs::remove_file(entry.with_extension("stdout")); + let stderr = entry.with_extension("stderr"); + let stdout = entry.with_extension("stdout"); + + if std::env::args().any(|arg| arg == "--bless") { + if output.stderr.is_empty() { + let _ = std::fs::remove_file(stderr); + } else { + std::fs::write(stderr, replace_ms(&output.stderr)).unwrap(); + } + if output.stdout.is_empty() { + let _ = std::fs::remove_file(stdout); + } else { + std::fs::write(stdout, replace_ms(&output.stdout)).unwrap(); + } } else { - std::fs::write(entry.with_extension("stdout"), output.stdout).unwrap(); + if output.stderr.is_empty() { + assert!( + !stderr.exists(), + "{} exists but there was no stderr output", + stderr.display() + ); + } else { + assert!( + std::fs::read(&stderr).unwrap() == replace_ms(&output.stderr), + "{} is not the expected output, rerun the test with `cargo test -- -- --bless`", + stderr.display() + ); + } + if output.stdout.is_empty() { + assert!(!stdout.exists()); + } else { + assert!( + std::fs::read(&stdout).unwrap() == replace_ms(&output.stdout), + "{} is not the expected output, rerun the test with `cargo test -- -- --bless`", + stdout.display() + ); + } } } }