From bbe7c0bc0190ae9d742a930110f56c81ce72a8f8 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Sat, 9 Mar 2024 01:21:13 +0100 Subject: [PATCH] report prop test coverage labels on success. --- CHANGELOG.md | 2 +- crates/aiken-project/src/telemetry.rs | 32 ++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bb20b58..03c1ce44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ - **aiken-lang**: Data now has a generic argument that can be used to specify the blueprint type. @KtorZ - **aiken-lang**: New types `PRNG` and `Fuzzer` in the prelude. @KtorZ - **aiken-lang**: Test definitions now accept an (optional) argument alongside a new keyword `via` to specify fuzzers. @KtorZ -- **aiken-project**: Property-based testing framework with integrated shrinking. @KtorZ +- **aiken-project**: Property-based testing framework with integrated shrinking and case labelling. @KtorZ - **aiken-project**: Unit tests now show assertion operands as Aiken expression instead of raw UPLC . @KtorZ - **aiken**: The `check` command now accept an extra arg `--seed` to provide an initial seed for the pseudo-random generator of properties. @KtorZ - **uplc**: add `integerToByteString` and `byteStringToInteger` builtins. @rvcas @Microproofs diff --git a/crates/aiken-project/src/telemetry.rs b/crates/aiken-project/src/telemetry.rs index 01e966cd..b3c1f117 100644 --- a/crates/aiken-project/src/telemetry.rs +++ b/crates/aiken-project/src/telemetry.rs @@ -379,8 +379,38 @@ fn fmt_test( ); } + // Labels + if let TestResult::PropertyTestResult(PropertyTestResult { labels, .. }) = result { + if !labels.is_empty() { + test = format!( + "{test}\n{title}", + title = "· with coverage".if_supports_color(Stderr, |s| s.bold()) + ); + let mut total = 0; + let mut pad = 0; + for (k, v) in labels { + total += v; + if k.len() > pad { + pad = k.len(); + } + } + + let mut labels = labels.iter().collect::>(); + labels.sort_by(|a, b| b.1.cmp(a.1)); + + for (k, v) in labels { + test = format!( + "{test}\n| {} {:>5.1}%", + pretty::pad_right(k.to_owned(), pad, " ") + .if_supports_color(Stderr, |s| s.bold()), + 100.0 * (*v as f64) / (total as f64), + ); + } + } + } + // Traces - if !result.logs().is_empty() { + if !result.logs().is_empty() && result.is_success() { test = format!( "{test}\n{title}\n{logs}\n", title = "· with traces".if_supports_color(Stderr, |s| s.bold()),