Skip to content

Commit 371a0c7

Browse files
committed
Merge branch 'develop'
2 parents 4cbc1a3 + 1fe1163 commit 371a0c7

File tree

7 files changed

+140
-69
lines changed

7 files changed

+140
-69
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
group=com.marklogic
2-
version=0.11
2+
version=0.11.1

ml-unit-test-client/src/main/java/com/marklogic/test/unit/TestManager.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public List<String> listSuites() {
6767
* @return
6868
*/
6969
public TestSuiteResult run(TestModule testModule) {
70-
return run(testModule, true, true);
70+
return run(testModule, true, true, false);
7171
}
7272

7373
/**
@@ -78,10 +78,11 @@ public TestSuiteResult run(TestModule testModule) {
7878
* @param testModule
7979
* @param runTeardown
8080
* @param runSuiteTeardown
81+
* @param calculateCoverage
8182
* @return
8283
*/
83-
public TestSuiteResult run(TestModule testModule, boolean runTeardown, boolean runSuiteTeardown) {
84-
RequestParameters params = buildRequestParameters(testModule.getSuite(), FORMAT_NONE, runTeardown, runSuiteTeardown);
84+
public TestSuiteResult run(TestModule testModule, boolean runTeardown, boolean runSuiteTeardown, boolean calculateCoverage) {
85+
RequestParameters params = buildRequestParameters(testModule.getSuite(), FORMAT_NONE, runTeardown, runSuiteTeardown, calculateCoverage);
8586

8687
String test = testModule.getTest();
8788
if (test != null) {
@@ -96,20 +97,21 @@ public TestSuiteResult run(TestModule testModule, boolean runTeardown, boolean r
9697
* @return a JUnitTestSuite for every suite found in the modules database
9798
*/
9899
public List<JUnitTestSuite> runAllSuites() {
99-
return runAllSuites(true, true);
100+
return runAllSuites(true, true, false);
100101
}
101102

102103
/**
103104
*
104105
* @param runTeardown
105106
* @param runSuiteTeardown
107+
* @param calculateCoverage
106108
* @return a JUnitTestSuite for every suite found in the modules database
107109
*/
108-
public List<JUnitTestSuite> runAllSuites(boolean runTeardown, boolean runSuiteTeardown) {
110+
public List<JUnitTestSuite> runAllSuites(boolean runTeardown, boolean runSuiteTeardown, boolean calculateCoverage) {
109111
List<String> suiteNames = listSuites();
110112
List<JUnitTestSuite> suites = new ArrayList<>();
111113
for (String suiteName : suiteNames) {
112-
suites.add(runSuite(suiteName, runTeardown, runSuiteTeardown));
114+
suites.add(runSuite(suiteName, runTeardown, runSuiteTeardown, calculateCoverage));
113115
}
114116
return suites;
115117
}
@@ -119,22 +121,31 @@ public List<JUnitTestSuite> runAllSuites(boolean runTeardown, boolean runSuiteTe
119121
* @return a JUnitTestSuite capturing the results of running the given suite name
120122
*/
121123
public JUnitTestSuite runSuite(String suite) {
122-
return runSuite(suite, true, true);
124+
return runSuite(suite, true, true, false);
123125
}
124126

125-
public JUnitTestSuite runSuite(String suite, boolean runTeardown, boolean runSuiteTeardown) {
126-
RequestParameters params = buildRequestParameters(suite, FORMAT_JUNIT, runTeardown, runSuiteTeardown);
127+
/**
128+
*
129+
* @param suite
130+
* @param runTeardown
131+
* @param runSuiteTeardown
132+
* @param calculateCoverage
133+
* @return
134+
*/
135+
public JUnitTestSuite runSuite(String suite, boolean runTeardown, boolean runSuiteTeardown, boolean calculateCoverage) {
136+
RequestParameters params = buildRequestParameters(suite, FORMAT_JUNIT, runTeardown, runSuiteTeardown, calculateCoverage);
127137
String xml = getServices().post(params, (AbstractWriteHandle) null, new StringHandle()).get();
128138
return unitTestXmlParser.parseJUnitTestSuiteResult(xml);
129139
}
130140

131-
protected RequestParameters buildRequestParameters(String suite, String format, boolean runTeardown, boolean runSuiteTeardown) {
141+
protected RequestParameters buildRequestParameters(String suite, String format, boolean runTeardown, boolean runSuiteTeardown, boolean calculateCoverage) {
132142
RequestParameters params = new RequestParameters();
133143
params.add("func", "run");
134144
params.add("suite", suite);
135145
params.add("format", format);
136146
params.add("runsuiteteardown", String.valueOf(runSuiteTeardown));
137147
params.add("runteardown", String.valueOf(runTeardown));
148+
params.add("calculatecoverage", String.valueOf(calculateCoverage));
138149
return params;
139150
}
140151

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import module namespace test="http://marklogic.com/roxy/test-helper" at "/test/test-helper.xqy";
2+
3+
declare option xdmp:mapping "false";
4+
5+
let $j0 := xdmp:to-json(xdmp:from-json-string(
6+
'{"PersonNameType":{"PersonSurName":"SMITH","PersonGivenName":"LINDSEY"}}'
7+
))
8+
9+
let $j1 := xdmp:to-json(xdmp:from-json-string(
10+
'{"PersonNameType":{"PersonSurName":"JONES","PersonGivenName":"LINDSEY"},"charges":[1,true,"a",null]}'
11+
))
12+
13+
let $j2 := xdmp:to-json(xdmp:from-json-string(
14+
'{"PersonNameType":{"PersonSurName":"JONES","PersonGivenName":"LINDSEY"},"charges":[1,true,"a",null]}'
15+
))
16+
17+
let $j3 := xdmp:to-json(xdmp:from-json-string(
18+
'{"PersonNameType":{"PersonGivenName":"LINDSEY", "PersonSurName":"JONES"},"charges":[1,true,"a",null]}'
19+
))
20+
21+
let $j4 :=
22+
let $o := json:object()
23+
let $pnt := json:object()
24+
let $_ := map:put($pnt, "PersonGivenName", "LINDSEY")
25+
let $_ := map:put($pnt, "PersonSurName","JONES")
26+
let $_ := map:put($o, "PersonNameType", $pnt)
27+
let $a := json:array()
28+
let $_ := json:array-push($a, 1)
29+
let $_ := json:array-push($a, fn:true())
30+
let $_ := json:array-push($a, "a")
31+
let $_ := json:array-push($a, ())
32+
let $_ := map:put($o, "charges", $a)
33+
return $o
34+
35+
let $j5 :=
36+
let $o := json:object()
37+
let $pnt := json:object()
38+
let $_ := map:put($pnt, "PersonGivenName", "LINDSEY")
39+
let $_ := map:put($pnt, "PersonSurName","JONES")
40+
let $_ := map:put($o, "PersonNameType", $pnt)
41+
let $a := json:array()
42+
let $_ := json:array-push($a, 1)
43+
let $_ := json:array-push($a, fn:true())
44+
let $_ := json:array-push($a, "a")
45+
let $_ := json:array-push($a, ())
46+
let $_ := map:put($o, "charges", $a)
47+
return $o
48+
49+
return xdmp:eager((
50+
test:assert-equal-json($j1, $j2),
51+
test:assert-equal-json($j1, $j3),
52+
test:assert-equal-json($j2, $j3),
53+
test:assert-equal-json($j4, $j5),
54+
test:assert-equal-json($j2, $j4),
55+
test:assert-equal-json($j2, $j5),
56+
test:assert-throws-error(function() {
57+
test:assert-equal-json($j0, $j5)
58+
}, "ASSERT-EQUAL-JSON-FAILED")
59+
60+
))

ml-unit-test-modules/src/main/ml-modules/root/test/test-controller.xqy

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,15 @@ declare function run-suite(
142142
else list()/t:suite[@path eq $suite]/t:tests/t:test/@path
143143
let $coverage :=
144144
if ($calculate-coverage) then
145-
(: TODO: should we exclude the test modules from what is covered?
146-
i.e. cover:list-coverage-modules()[fn:not(fn:starts-with(., $TEST-SUITES-ROOT))]
147-
:)
148-
cover:prepare(cover:list-coverage-modules(), $tests ! fn:concat($TEST-SUITES-ROOT, $suite, "/", .))
145+
(
146+
run-setup-teardown(fn:true(), $suite),
147+
let $coverage-modules := cover:list-coverage-modules()[fn:not(fn:starts-with(., $TEST-SUITES-ROOT))]
148+
let $test-modules := $tests ! fn:concat($TEST-SUITES-ROOT, $suite, "/", .)
149+
return cover:prepare($coverage-modules, $test-modules),
150+
if ($run-suite-teardown eq fn:true()) then
151+
run-setup-teardown(fn:false(), $suite)
152+
else ()
153+
)
149154
else ()
150155
let $results :=
151156
element t:run {

ml-unit-test-modules/src/main/ml-modules/root/test/test-coverage.xqy

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ declare private function cover:_task-cancel-safe(
6868
$id as xs:unsignedLong)
6969
{
7070
try {
71-
(:TODO is this a good idea, or a bad idea??:)
72-
for $breakpoint in dbg:breakpoints($id) return dbg:clear($id, $breakpoint),
71+
for $breakpoint in dbg:breakpoints($id)
72+
return dbg:clear($id, $breakpoint),
7373
dbg:detach($id),
7474
if (fn:empty(dbg:wait($id, 10))) then
7575
fn:error(xs:QName("FAILED-TO-CANCEL"), "unable to cancel a debugging request")
@@ -220,23 +220,27 @@ declare function cover:results(
220220
let $do :=
221221
(: Populate the coverage maps from the profiler output. :)
222222
for $expr in $results[. instance of element(prof:report)]/prof:histogram/prof:expression[prof:uri = $modules]
223-
let $module := map:get($results-map, $expr/prof:uri)[1]
224-
let $key := $expr/prof:line/fn:string()
225-
where fn:not(map:get($module, $key))
226-
return cover:_put($module, $key)
223+
let $covered := map:get($results-map, $expr/prof:uri)[1]
224+
let $line := $expr/prof:line/fn:string()
225+
return cover:_put-new($covered, $line)
227226

228227
for $uri in $modules
229228
let $seq := map:get($results-map, $uri)
230229
let $covered := $seq[1]
231230
let $wanted := $seq[2]
231+
let $difference := $covered - $wanted
232232
let $assert := (
233-
if (map:count($covered - $wanted) eq 0) then ()
233+
if (map:count($difference) eq 0) then ()
234234
else
235-
helper:log(
236-
fn:string-join(
235+
(
236+
helper:log(
237+
fn:string-join(
237238
('cover:results',
238239
($uri, "more coverage than expected: lines = ",
239-
map:keys($covered - $wanted)), 'warning'), " ")) )
240+
map:keys($difference)), 'warning'), " ")),
241+
map:keys($difference) ! cover:_put($wanted, .)
242+
)
243+
)
240244
order by $uri
241245
return
242246
element t:coverage {

ml-unit-test-modules/src/main/ml-modules/root/test/test-helper.xqy

Lines changed: 33 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -303,50 +303,40 @@ declare function helper:assert-equal-xml($expected, $actual) {
303303
helper:assert-true(fn:false(), ("unsupported type in $actual : ", xdmp:path($actual)))
304304
};
305305

306-
declare function helper:assert-equal-json($expected, $actual) {
307-
typeswitch ($actual)
308-
case document-node() return
309-
typeswitch ($expected)
310-
case document-node() return
311-
helper:assert-equal-json($expected/node(), $actual/node())
312-
default return
313-
helper:assert-equal-json($expected, $actual/node())
314-
case object-node() return
315-
typeswitch ($expected)
316-
case object-node() return
317-
let $_ := helper:assert-equal(fn:count($expected/*), fn:count($actual/*), ("mismatched object key/value count ($expected=", xdmp:path($expected), ", $actual=", xdmp:path($actual), ")"))
318-
return for $item at $i in $actual/* return
319-
let $exp := $expected/*[$i]
320-
let $_ := helper:assert-equal(fn:name($exp), fn:name($item), ("mismatched object key name ($expected=", xdmp:path($expected), ", $actual=", xdmp:path($actual), ")"))
321-
return helper:assert-equal-json($exp, $item)
322-
default return
323-
helper:assert-true(fn:false(), ("type mismatch ($expected=", xdmp:path($expected), ", $actual=", xdmp:path($actual), ")"))
324-
case number-node() return
325-
typeswitch ($expected)
326-
case number-node() return
327-
helper:assert-equal($expected/fn:data(), $actual/fn:data(), ("mismatched number node ($expected=", xdmp:path($expected), ", $actual=", xdmp:path($actual), ")"))
328-
default return
329-
helper:assert-true(fn:false(), ("type mismatch ($expected=", xdmp:path($expected), ", $actual=", xdmp:path($actual), ")"))
330-
case boolean-node() return
331-
typeswitch ($expected)
332-
case boolean-node() return
333-
helper:assert-equal($expected/fn:data(), $actual/fn:data(), ("mismatched boolean node ($expected=", xdmp:path($expected), ", $actual=", xdmp:path($actual), ")"))
334-
default return
335-
helper:assert-true(fn:false(), ("type mismatch ($expected=", xdmp:path($expected), ", $actual=", xdmp:path($actual), ")"))
336-
case null-node() return
337-
typeswitch ($expected)
338-
case null-node() return
339-
helper:assert-true(fn:true()) (: success! :)
340-
default return
341-
helper:assert-true(fn:false(), ("type mismatch ($expected=", xdmp:path($expected), ", $actual=", xdmp:path($actual), ")"))
342-
case text() return
343-
typeswitch ($expected)
344-
case text() return
345-
helper:assert-equal($expected, $actual, ("mismatched text node ($expected=", xdmp:path($expected), ", $actual=", xdmp:path($actual), ")"))
346-
default return
347-
helper:assert-true(fn:false(), ("type mismatch ($expected=", xdmp:path($expected), ", $actual=", xdmp:path($actual), ")"))
306+
declare function helper:assert-equal-json($expected as map:map, $actual as map:map) {
307+
let $equal := helper:assert-equal-json-recursive($expected, $actual)
308+
return
309+
if ($equal) then helper:success()
310+
else
311+
fn:error(xs:QName("ASSERT-EQUAL-JSON-FAILED"), "Assert Equal Json failed", ($expected, $actual))
312+
};
313+
314+
declare function helper:assert-equal-json-recursive($object1, $object2) as xs:boolean
315+
{
316+
typeswitch($object1)
317+
case map:map return
318+
let $k1 := map:keys($object1)
319+
let $k2 := map:keys($object2)
320+
let $counts-equal := fn:count($k1) eq fn:count($k2)
321+
let $maps-equal :=
322+
for $key in map:keys($object1)
323+
let $v1 := map:get($object1, $key)
324+
let $v2 := map:get($object2, $key)
325+
return
326+
helper:assert-equal-json-recursive($v1, $v2)
327+
return $counts-equal and fn:not($maps-equal = fn:false())
328+
case json:array return
329+
let $counts-equal := fn:count($object1) = fn:count($object2)
330+
let $items-equal :=
331+
let $o1 := json:array-values($object1)
332+
let $o2 := json:array-values($object2)
333+
for $item at $i in $o1
334+
return
335+
helper:assert-equal-json-recursive($item, $o2[$i])
336+
return
337+
$counts-equal and fn:not($items-equal = fn:false())
348338
default return
349-
fn:error(xs:QName("INVALID-ARG"), "Unsupported JSON type.")
339+
$object1 = $object2
350340
};
351341

352342
declare function helper:assert-true($supposed-truths as xs:boolean*) {

ml-unit-test-modules/src/main/ml-modules/services/ml-unit-test.xqy

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ declare private function run($params as map:map)
3434
let $run-suite-teardown as xs:boolean := map:get($params, "runsuiteteardown") eq "true"
3535
let $run-teardown as xs:boolean := map:get($params, "runteardown") eq "true"
3636
let $format as xs:string := (map:get($params, "format"), "xml")[1]
37+
let $calculate-coverage as xs:boolean := map:get($params, "calculatecoverage") eq "true"
3738
return
3839
if ($suite) then
39-
let $result := helper:run-suite($suite, $tests, $run-suite-teardown, $run-teardown)
40+
let $result := helper:run-suite($suite, $tests, $run-suite-teardown, $run-teardown, $calculate-coverage)
4041
return
4142
if ($format) then
4243
helper:format($result, $format, $suite)

0 commit comments

Comments
 (0)