From 9039716f18b146ddb8b1785a504a5878dc0c75a5 Mon Sep 17 00:00:00 2001 From: z1lk Date: Wed, 6 Aug 2025 21:09:43 -0500 Subject: [PATCH] Improve message from `refute` on failure The previous implementation was to `assert(!value)` which led to confusing failure messages when using `refute` directly. For custom failure messages, `!value` is always `false` on failure, so `false` is passed to the custom message block where the caller might instead expect the value that caused the failure. Similarly, the default failure message is always "expected false to be truthy" when really the expectation is that something truthy is falsy. --- lib/quickdraw/test.rb | 12 ++++++++++-- test/quickdraw.test.rb | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/quickdraw/test.rb b/lib/quickdraw/test.rb index 94ba6c4..0c7720f 100644 --- a/lib/quickdraw/test.rb +++ b/lib/quickdraw/test.rb @@ -49,8 +49,16 @@ def assert(value) nil end - def refute(value, ...) - assert(!value, ...) + def refute(value) + if !value + success! + elsif block_given? + failure! { yield(value) } + else + failure! { "expected #{value.inspect} to be falsy" } + end + + nil end # Indicate that an assertion passed successfully. diff --git a/test/quickdraw.test.rb b/test/quickdraw.test.rb index af68a27..08470ce 100644 --- a/test/quickdraw.test.rb +++ b/test/quickdraw.test.rb @@ -15,3 +15,17 @@ test "refute", skip: true do refute true end + +test "refute custom message" do + runner = assert_test(failures: 1) do + refute(32) { |val| "#{val} not falsy" } + end + assert_equal runner.failures.last["message"], "32 not falsy" +end + +test "refute default message" do + runner = assert_test(failures: 1) do + refute 32 + end + assert_equal runner.failures.last["message"], "expected 32 to be falsy" +end