From 2fc2355fc3d72cbf1ffdc982a42090ada901d21f Mon Sep 17 00:00:00 2001 From: antlilja Date: Tue, 23 Jun 2020 18:05:32 +0200 Subject: [PATCH 1/2] Add expectWithinMargin and test --- lib/std/testing.zig | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/std/testing.zig b/lib/std/testing.zig index 2d136d56c9..9dca969f45 100644 --- a/lib/std/testing.zig +++ b/lib/std/testing.zig @@ -168,6 +168,32 @@ test "expectEqual.union(enum)" { expectEqual(a10, a10); } +/// This function is intended to be used only in tests. When the actual value is not +/// within the margin of the expected value, +/// prints diagnostics to stderr to show exactly how they are not equal, then aborts. +/// The types must be floating point +pub fn expectWithinMargin(expected: var, actual: @TypeOf(expected), margin: @TypeOf(expected)) void { + std.debug.assert(margin >= 0.0); + + switch (@typeInfo(@TypeOf(actual))) { + .Float, + .ComptimeFloat, + => { + if (@fabs(expected - actual) > margin) { + std.debug.panic("actual {}, not within margin {} of expected {}", .{ actual, margin, expected }); + } + }, + else => @compileError("Unable to compare non floating point values"), + } +} + +test "expectWithinMargin.f32" { + const x: f32 = 12.0; + const y: f32 = 12.06; + + expectWithinMargin(x, y, 0.1); +} + /// This function is intended to be used only in tests. When the two slices are not /// equal, prints diagnostics to stderr to show exactly how they are not equal, /// then aborts. From 46106b018cc5c870648cf26d4e7413e8a60ad1e4 Mon Sep 17 00:00:00 2001 From: antlilja Date: Tue, 23 Jun 2020 18:08:15 +0200 Subject: [PATCH 2/2] Add expectWithinEpsilon + test --- lib/std/testing.zig | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/std/testing.zig b/lib/std/testing.zig index 9dca969f45..9f7601b19e 100644 --- a/lib/std/testing.zig +++ b/lib/std/testing.zig @@ -194,6 +194,33 @@ test "expectWithinMargin.f32" { expectWithinMargin(x, y, 0.1); } +/// This function is intended to be used only in tests. When the actual value is not +/// within the epsilon of the expected value, +/// prints diagnostics to stderr to show exactly how they are not equal, then aborts. +/// The types must be floating point +pub fn expectWithinEpsilon(expected: var, actual: @TypeOf(expected), epsilon: @TypeOf(expected)) void { + std.debug.assert(epsilon >= 0.0 and epsilon <= 1.0); + + const margin = epsilon * expected; + switch (@typeInfo(@TypeOf(actual))) { + .Float, + .ComptimeFloat, + => { + if (@fabs(expected - actual) > margin) { + std.debug.panic("actual {}, not within epsilon {}, of expected {}", .{ actual, epsilon, expected }); + } + }, + else => @compileError("Unable to compare non floating point values"), + } +} + +test "expectWithinEpsilon.f32" { + const x: f32 = 12.0; + const y: f32 = 13.2; + + expectWithinEpsilon(x, y, 0.1); +} + /// This function is intended to be used only in tests. When the two slices are not /// equal, prints diagnostics to stderr to show exactly how they are not equal, /// then aborts.