Skip to content
128 changes: 128 additions & 0 deletions modules/packages/UnitTest.chpl
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,27 @@ module UnitTest {
throw new owned AssertionError("assertTrue failed. Given expression is False");
}

/*
Assert that ``test`` is `true`. If it is false, adds the ``args`` to
the thrown error's ``message`` as if those args were printed using
:proc:`~IO.write()`.

:arg test: the boolean condition
:type test: `bool`
:arg args: additional values to print on failure
:throws: AssertionError if the assertion fails
*/
pragma "insert line file info"
pragma "always propagate line file info"
pragma "insert line file info"
pragma "always propagate line file info"
proc assertTrue(test: bool, args...?n) throws {
Comment thread
jabraham17 marked this conversation as resolved.
if !test {
var msg = "assertTrue failed. Given expression is False - " + chpl_stringify_wrapper((...args));
throw new owned AssertionError(msg);
}
}

/*
Assert that ``test`` is `false`.

Expand All @@ -260,6 +281,25 @@ module UnitTest {
throw new owned AssertionError("assertFalse failed. Given expression is True");
}

/*
Assert that ``test`` is `false`. If it is true, adds the ``args`` to
the thrown error's ``message`` as if those args were printed using
:proc:`~IO.write()`.

:arg test: the boolean condition
:type test: `bool`
:arg args: additional values to print on failure
:throws: AssertionError if the assertion fails
*/
pragma "insert line file info"
pragma "always propagate line file info"
proc assertFalse(test: bool, args...?n) throws {
if test {
var msg = "assertFalse failed. Given expression is True - " + chpl_stringify_wrapper((...args));
throw new owned AssertionError(msg);
}
}

pragma "insert line file info"
pragma "always propagate line file info"
@chpldoc.nodoc
Expand Down Expand Up @@ -474,6 +514,25 @@ module UnitTest {
checkAssertEquality(first, second);
}

/*
Assert that ``first == second``. If they are not equal, adds the ``args``
to the thrown error's ``message`` as if those args were printed using
:proc:`~IO.write()`.

:arg first: The first object to compare
:arg second: The second object to compare
:arg args: additional values to print on failure
:throws: AssertionError if the assertion fails
*/
proc assertEqual(first, second, args...?n) throws {
try {
checkAssertEquality(first, second);
} catch e: AssertionError {
var msg = e.message() + " - " + chpl_stringify_wrapper((...args));
throw new owned AssertionError(msg);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is still not indented right

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noting this is not resolved, the indentation is still wrong

}

/*
Assert that x matches the regular expression pattern.

Expand Down Expand Up @@ -562,6 +621,26 @@ module UnitTest {
}
}

/*
Assert that ``first != second``. If they are equal, adds the ``args``
to the thrown error's ``message`` as if those args were printed using
:proc:`~IO.write()`.

:arg first: The first object to compare
:arg second: The second object to compare
:arg args: additional values to print on failure
:throws: AssertionError if the assertion fails
*/
proc assertNotEqual(first, second, args...?n) throws {
if canResolve("!=", first, second) {
if !checkAssertInequality(first, second) {
throw new owned AssertionError("assert failed -\n'%?'\n==\n'%?' - ".format(first, second) +
chpl_stringify_wrapper((...args)));
}
}
}


/*
Assert that ``first > second``.

Expand All @@ -581,6 +660,31 @@ module UnitTest {
}
}

/*
Assert that ``first > second``. If ``first <= second``, adds the ``args``
to the thrown error's ``message`` as if those args were printed using
:proc:`~IO.write()`.

:arg first: The first object to compare
:arg second: The second object to compare
:arg args: additional values to print on failure
:throws: AssertionError if the assertion fails
*/
proc assertGreaterThan(first, second, args...?n) throws {
if canResolve(">=", first, second) {
try {
checkGreater(first, second);
} catch e: AssertionError {
throw new owned AssertionError(e.message() + " - " + chpl_stringify_wrapper((...args)));
}
}
else {
throw new owned AssertionError("assert failed - First element is of type %? and Second is of type %? - ".format(first.type:string, second.type:string) +
chpl_stringify_wrapper((...args)));
}
}


pragma "insert line file info"
pragma "always propagate line file info"
@chpldoc.nodoc
Expand Down Expand Up @@ -801,6 +905,30 @@ module UnitTest {
}
}

/*
Assert that ``first < second``. If ``first >= second``, adds the ``args``
to the thrown error's ``message`` as if those args were printed using
:proc:`~IO.write()`.

:arg first: The first object to compare
:arg second: The second object to compare
:arg args: additional values to print on failure
:throws: AssertionError if the assertion fails
*/
proc assertLessThan(first, second, args...?n) throws {
if canResolve("<=", first, second) {
try {
checkLessThan(first, second);
} catch e: AssertionError {
throw new owned AssertionError(e.message() + " - " + chpl_stringify_wrapper((...args)));
}
}
else {
throw new owned AssertionError("assert failed - First element is of type %? and Second is of type %? - ".format(first.type:string, second.type:string) +
chpl_stringify_wrapper((...args)));
}
}

pragma "insert line file info"
pragma "always propagate line file info"
@chpldoc.nodoc
Expand Down
99 changes: 99 additions & 0 deletions test/library/packages/UnitTest/assertWithArgs.chpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
// assertWithArgs.chpl
use UnitTest;

// Test assertTrue with extra args
proc testTrueWithArgs(test: borrowed Test) throws {
var x = 5;
test.assertTrue(true, "This should pass with extra args:", x);

// This should fail and show the message
try {
test.assertTrue(false, "Expected value:", x, "to be true");
test.assertTrue(false, "Should not reach here");
} catch e: AssertionError {
// Expected to fail - check message contains our args
test.assertTrue(e.message().find("Expected value:") >= 0);
}
}

// Test assertFalse with extra args
proc testFalseWithArgs(test: borrowed Test) throws {
var y = 10;
test.assertFalse(false, "This should pass with extra args:", y);

try {
test.assertFalse(true, "Expected false but got true, value:", y);
test.assertTrue(false, "Should not reach here");
} catch e: AssertionError {
test.assertTrue(e.message().find("value:") >= 0);
}
}

// Test assertEqual with extra args
proc testEqualWithArgs(test: borrowed Test) throws {
var a = 5, b = 5, c = 10;
test.assertEqual(a, b, "Values match:", a, "and", b);

try {
test.assertEqual(a, c, "Expected a=", a, "to equal c=", c);
test.assertTrue(false, "Should not reach here");
} catch e: AssertionError {
test.assertTrue(e.message().find("Expected a=") >= 0);
}
}

// Test assertNotEqual with extra args
proc testNotEqualWithArgs(test: borrowed Test) throws {
var x = 5, y = 10;
test.assertNotEqual(x, y, "Values differ:", x, "and", y);

try {
test.assertNotEqual(x, x, "Expected different values, got:", x);
test.assertTrue(false, "Should not reach here");
} catch e: AssertionError {
test.assertTrue(e.message().find("Expected different") >= 0);
}
}

// Test assertGreaterThan with extra args
proc testGreaterThanWithArgs(test: borrowed Test) throws {
var x = 10, y = 5;
test.assertGreaterThan(x, y, "x=", x, "is greater than y=", y);

try {
test.assertGreaterThan(y, x, "Expected y=", y, "> x=", x);
test.assertTrue(false, "Should not reach here");
} catch e: AssertionError {
test.assertTrue(e.message().find("Expected y=") >= 0);
}
}

// Test assertLessThan with extra args
proc testLessThanWithArgs(test: borrowed Test) throws {
var x = 5, y = 10;
test.assertLessThan(x, y, "x=", x, "is less than y=", y);

try {
test.assertLessThan(y, x, "Expected y=", y, "< x=", x);
test.assertTrue(false, "Should not reach here");
} catch e: AssertionError {
test.assertTrue(e.message().find("Expected y=") >= 0);
}
}

// Test with multiple types
proc testMixedTypes(test: borrowed Test) throws {
var i = 42;
var s = "hello";
var r = 3.14;

test.assertTrue(true, "Mixed types:", i, s, r);

try {
test.assertEqual(i, 100, "int:", i, "string:", s, "real:", r);
} catch e: AssertionError {
test.assertTrue(e.message().find("string:") >= 0);
}
}

UnitTest.main();
25 changes: 25 additions & 0 deletions test/library/packages/UnitTest/assertWithArgs.good

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have you tested this with start_test test/library/packages/UnitTest/assertWithArgs.chpl? It doesn't look as if this good file will pass?

regardless, while these tests are fine and should be kept, I think you should also expand tests in test/library/packages/UnitTest/Assert*/*.chpl tests to include your new overloads, as those are more exhaustive in terms of types passed.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I re-did the good file, compiled and ran the test, and it showed a pass.

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
testTrueWithArgs()
Flavour: OK
======================================================================
----------------------------------------------------------------------
testFalseWithArgs()
Flavour: OK
======================================================================
----------------------------------------------------------------------
testEqualWithArgs()
Flavour: OK
======================================================================
----------------------------------------------------------------------
testNotEqualWithArgs()
Flavour: OK
======================================================================
----------------------------------------------------------------------
testGreaterThanWithArgs()
Flavour: OK
======================================================================
----------------------------------------------------------------------
testLessThanWithArgs()
Flavour: OK
======================================================================
----------------------------------------------------------------------
EOF
9 changes: 9 additions & 0 deletions test/library/packages/UnitTest/assertWithArgsFailure.chpl
Comment thread
stoutes marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
use UnitTest;

proc testFailureMessage(test: borrowed Test) throws {
var x = 5, y = 10;
// This will fail and show our custom message
test.assertEqual(x, y, "Expected x=", x, "to equal y=", y);
}

UnitTest.main();
5 changes: 5 additions & 0 deletions test/library/packages/UnitTest/assertWithArgsFailure.good
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
testFailureMessage()
Flavour: FAIL
======================================================================
AssertionError: in assertWithArgsFailure.chpl:6 - in assertWithArgsFailure.chpl:6 - assert failed - '5' != '10' - Expected x=5to equal y=10
----------------------------------------------------------------------
Loading