Skip to content

Commit 8464ae4

Browse files
committed
[enhancement] allow more use-cases of test:fail
Just be re-ordering arguments test:fail can be used for some other use-cases. When the expected and actual values are not needed for some reason these can now be omitted. - `test:fail#0`: just fail with default type and message - `test:fail#1`: fail with a custom failure type - `test:fail#3`: fail with custom **message**, expected and actual value - `test:fail#4`: allows to set all values: type, message, expected and actual The tests in custom-assertion.xqm were adapted and enhanced.
1 parent 95238ad commit 8464ae4

File tree

2 files changed

+109
-36
lines changed

2 files changed

+109
-36
lines changed

exist-core/src/main/resources/org/exist/xquery/lib/xqsuite/xqsuite.xql

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ declare variable $test:TEST_NAMESPACE := "http://exist-db.org/xquery/xqsuite";
5757
declare variable $test:UNKNOWN_ASSERTION := QName($test:TEST_NAMESPACE, "no-such-assertion");
5858
declare variable $test:WRONG_ARG_COUNT := QName($test:TEST_NAMESPACE, "wrong-number-of-arguments");
5959
declare variable $test:TYPE_ERROR := QName($test:TEST_NAMESPACE, "type-error");
60+
declare variable $test:CUSTOM_ASSERTION_FAILURE_TYPE := "custom-assertion-failure";
6061

6162
(:~
6263
: Main entry point into the module. Takes a sequence of function items.
@@ -138,20 +139,34 @@ declare function test:suite(
138139
</testsuites>
139140
};
140141

141-
declare function test:fail ($expected as item()*, $actual as item()*, $message as xs:string) as empty-sequence() {
142-
test:fail($expected, $actual, $message, "custom-assertion-failure")
142+
declare function test:fail () as empty-sequence() {
143+
test:fail(
144+
$test:CUSTOM_ASSERTION_FAILURE_TYPE, "A custom assertion failed", true(), false())
145+
};
146+
147+
declare function test:fail ($type as xs:string) as empty-sequence() {
148+
test:fail(
149+
$type, "The custom assertion of type """ || $type || """ failed", true(), false())
150+
};
151+
152+
declare function test:fail ($type as xs:string, $message as xs:string) as empty-sequence() {
153+
test:fail($type, $message, true(), false())
154+
};
155+
156+
declare function test:fail ($message as xs:string, $expected as item()*, $actual as item()*) as empty-sequence() {
157+
test:fail($test:CUSTOM_ASSERTION_FAILURE_TYPE, $message, $expected, $actual)
143158
};
144159

145160
declare function test:fail (
146-
$expected as item()*,
147-
$actual as item()*,
161+
$type as xs:string,
148162
$message as xs:string,
149-
$type as xs:string
163+
$expected as item()*,
164+
$actual as item()*
150165
) as empty-sequence() {
151166
error(xs:QName("test:failure"), $message, map {
167+
"type": $type,
152168
"expected": $expected,
153-
"actual": $actual,
154-
"type": $type
169+
"actual": $actual
155170
})
156171
};
157172

exist-core/src/test/xquery/xqsuite/custom-assertion.xqm

Lines changed: 87 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -32,79 +32,137 @@ import module namespace test="http://exist-db.org/xquery/xqsuite"
3232
declare variable $ca:var := map {"a": 1, "b": 2};
3333

3434
declare
35-
%test:assertEquals("expected", "actual", "Custom message", "custom-assertion-failure")
36-
function ca:test-fail-3() as item()* {
35+
%test:assertEquals("A custom assertion failed", "custom-assertion-failure", "true", "false")
36+
function ca:test-fail-0() as item()* {
3737
try {
38-
test:fail("expected", "actual", "Custom message")
38+
test:fail()
3939
}
4040
catch test:failure {
41-
$err:value?expected, $err:value?actual, $err:description, $err:value?type
41+
$err:description, $err:value?type, $err:value?expected, $err:value?actual
4242
}
4343
};
4444

4545
declare
46-
%test:assertEquals("expected", "actual", "Custom message", "custom-type")
46+
%test:assertEquals("The custom assertion of type ""custom-type"" failed", "custom-type", "true", "false")
47+
function ca:test-fail-1() as item()* {
48+
try {
49+
test:fail("custom-type")
50+
}
51+
catch test:failure {
52+
$err:description, $err:value?type, $err:value?expected, $err:value?actual
53+
}
54+
};
55+
56+
declare
57+
%test:assertEquals("Custom message", "custom-type", "true", "false")
58+
function ca:test-fail-2() as item()* {
59+
try {
60+
test:fail("custom-type", "Custom message")
61+
}
62+
catch test:failure {
63+
$err:description, $err:value?type, $err:value?expected, $err:value?actual
64+
}
65+
};
66+
67+
declare
68+
%test:assertEquals("Custom message", "custom-type", "expected", "actual")
4769
function ca:test-fail-4() as item()* {
4870
try {
49-
test:fail("expected", "actual", "Custom message", "custom-type")
71+
test:fail("custom-type", "Custom message", "expected", "actual")
5072
}
5173
catch test:failure {
52-
$err:value?expected, $err:value?actual, $err:description, $err:value?type
74+
$err:description, $err:value?type, $err:value?expected, $err:value?actual
5375
}
5476
};
5577

5678
declare
5779
%test:assertTrue
58-
function ca:pass() as item()* {
80+
function ca:map-assertion-pass() as item()* {
5981
ca:map-assertion($ca:var, map {"b": 2, "a": 1})
6082
};
6183

6284
declare
63-
%test:assertEquals("Key 'b' is missing", "map-assertion-failure")
64-
function ca:missing-key-default-type() as item()* {
85+
%test:assertEquals("Key 'b' is missing", "map-assertion-failure", "{""a"":1}")
86+
function ca:map-assertion-missing-key() as item()* {
6587
try {
66-
ca:map-assertion($ca:var, map {"a": 1, "c": 3})
88+
ca:map-assertion($ca:var, map {"a": 1})
6789
}
6890
catch test:failure {
69-
$err:description, $err:value?type
91+
$err:description, $err:value?type,
92+
fn:serialize($err:value?actual, map{"method":"json"})
7093
}
7194
};
7295

7396
declare
74-
%test:assertEquals("Value mismatch for key 'b'", "custom-assertion-failure")
75-
function ca:wrong-value-custom-type() as item()* {
97+
%test:assertEquals("Value mismatch for key 'b'", "map-assertion-failure", "{""a"":1,""b"":3}")
98+
function ca:map-assertion-wrong-value() as item()* {
7699
try {
77100
ca:map-assertion($ca:var, map {"a": 1, "b": 3})
78101
}
79102
catch test:failure {
80-
$err:description, $err:value?type
103+
$err:description, $err:value?type,
104+
fn:serialize($err:value?actual, map{"method":"json"})
81105
}
82106
};
83107

84108
declare
85-
%test:assertEquals("Type mismatch", "type-mismatch")
86-
function ca:type-mismatch-custom-type() as item()* {
109+
%test:assertEquals("Additional keys found: (23, o)", "map-assertion-failure", "{""a"":1,""23"":3,""o"":""o""}")
110+
function ca:map-assertion-additional-key() as item()* {
111+
try {
112+
ca:map-assertion($ca:var, map {"a": 1, 23: 3, "o": "o"})
113+
}
114+
catch test:failure {
115+
$err:description, $err:value?type,
116+
fn:serialize($err:value?actual, map{"method":"json"})
117+
}
118+
};
119+
120+
declare
121+
%test:assertEquals("Type mismatch", "type-mismatch", "[1,2]")
122+
function ca:map-assertion-type-mismatch() as item()* {
87123
try {
88124
ca:map-assertion($ca:var, [1,2])
89125
}
90126
catch test:failure {
91-
$err:description, $err:value?type
127+
$err:description, $err:value?type,
128+
fn:serialize($err:value?actual, map{"method":"json"})
92129
}
93130
};
94131

132+
(:
133+
: custom assertion, which could also be imported from a library module
134+
:)
135+
136+
declare %private variable $ca:MAP_ASSERTION_TYPE := "map-assertion-failure";
137+
95138
declare %private
96139
function ca:map-assertion ($expected as map(*), $actual as item()*) as item()* {
97-
if (exists($actual) and count($actual) eq 1 and $actual instance of map(*))
98-
then (
99-
for-each(map:keys($expected), function ($key as xs:anyAtomicType) {
100-
if (not(map:contains($actual, $key)))
101-
then test:fail($expected, $actual, "Key '" || $key || "' is missing", "map-assertion-failure")
102-
else if ($expected($key) ne $actual($key))
103-
then test:fail($expected, $actual, "Value mismatch for key '" || $key || "'")
104-
else ()
105-
})
106-
,
140+
if (not(exists($actual)))
141+
then test:fail("type-mismatch", "Actual is empty")
142+
else if (count($actual) gt 1)
143+
then test:fail("type-mismatch", "Actual is a sequence with more than one item", $expected, $actual)
144+
else if (not($actual instance of map(*)))
145+
then test:fail("type-mismatch", "Type mismatch", $expected, $actual)
146+
else if (not(empty(
147+
map:keys(map:remove($actual, map:keys($expected))))))
148+
then test:fail(
149+
$ca:MAP_ASSERTION_TYPE,
150+
"Additional keys found: (" || string-join(
151+
map:keys(map:remove($actual, map:keys($expected))), ', ') || ")",
152+
$expected,
153+
$actual
154+
)
155+
else (
156+
for-each(map:keys($expected), ca:map-assert-key(?, $expected, $actual)),
107157
true()
108158
)
109-
else test:fail($expected, $actual, "Type mismatch", "type-mismatch")
159+
};
160+
161+
declare %private
162+
function ca:map-assert-key ($key as xs:anyAtomicType, $expected as map(*), $actual as map(*)) as item()* {
163+
if (not(map:contains($actual, $key)))
164+
then test:fail($ca:MAP_ASSERTION_TYPE, "Key '" || $key || "' is missing", $expected, $actual)
165+
else if ($expected($key) ne $actual($key))
166+
then test:fail($ca:MAP_ASSERTION_TYPE, "Value mismatch for key '" || $key || "'", $expected, $actual)
167+
else ()
110168
};

0 commit comments

Comments
 (0)