@@ -21,16 +21,29 @@ declare variable $root as xs:string := xdmp:modules-root();
2121 : Returns a list of the available tests. This list is magically computed based on the modules
2222 :)
2323declare function list ()
24+ {
25+ list (fn:false ())
26+ };
27+ (:
28+ : Returns a list of the available tests. This list is magically computed based on the modules
29+ :)
30+ declare function list ($include-suite-setup-teardown as xs:boolean)
2431{
2532 let $directories-to-ignore := map:new ((
2633 ".svn" , "CVS" , ".DS_Store" , "Thumbs.db" , "thumbs.db" , "test-data" , "lib"
2734 ) ! map:entry (., .))
2835
29- let $files-to-ignore := map:new ((
30- "setup.xqy" , "teardown.xqy" , "setup.sjs" , "teardown.sjs" ,
31- "suite-setup.xqy" , "suite-teardown.xqy" , "suiteSetup.sjs" , "suiteTeardown.sjs"
32- ) ! map:entry (., .))
33-
36+ let $files-to-ignore-check := function ($file-name) {
37+ is-setup-module ($file-name)
38+ or
39+ is-teardown-module ($file-name)
40+ or
41+ (
42+ fn:not ($include-suite-setup-teardown)
43+ and
44+ (is-suite-setup-module ($file-name) or is-suite-teardown-module ($file-name))
45+ )
46+ }
3447 let $suites := map:map ()
3548
3649 let $_ :=
@@ -47,16 +60,16 @@ declare function list()
4760 let $test-is-valid :=
4861 $test-name
4962 and fn:not (fn:contains ($test-name, "(\\|/)" ))
50- and fn:empty ( map:get ( $files-to-ignore, $test-name))
51- and fn:matches ($test-name, "(\.sjs|\.xqy)$ " )
63+ and fn:not ( $files-to-ignore-check( $test-name))
64+ and xdmp:uri-content-type ($test-name) = ( "application/xquery" , "application/vnd.marklogic-xdmp" , "application/javascript" , "application/vnd.marklogic-javascript" , "application/vnd.marklogic-js-module " )
5265
5366 where $suite-is-valid and $test-is-valid
5467 return map:put ($suites, $suite-path, (map:get ($suites, $suite-path), $test-name))
5568
5669 let $main-formats as xs:string* := fn:distinct-values (
5770 for $uri in test:list-from-database ($db-id, $root || "test/formats/" )
5871 let $path := fn:replace ($uri, fn:concat ($root, "test/formats/" ), "" )
59- where $path ne "" and fn:not (fn:contains ($path, "/" )) and fn:empty ( map:get ( $files-to-ignore, $path)) and (fn:matches ($path, $XSL-PATTERN))
72+ where $path ne "" and fn:not (fn:contains ($path, "/" )) and fn:not ( $files-to-ignore-check( $path)) and (fn:matches ($path, $XSL-PATTERN))
6073 return $path
6174 )
6275 return
@@ -138,28 +151,28 @@ declare function run-suite(
138151 let $coverage :=
139152 if ($calculate-coverage) then
140153 (
141- run-setup-teardown (fn:true (), $suite),
154+ run-suite- setup-or -teardown (fn:true (), $suite),
142155 let $coverage-modules := cover:list-coverage-modules ()[fn:not (fn:starts-with (., $TEST-SUITES-ROOT))]
143156 let $test-modules := $tests ! fn:concat ($TEST-SUITES-ROOT, $suite, "/" , .)
144157 return cover:prepare ($coverage-modules, $test-modules),
145158 if ($run-suite-teardown eq fn:true ()) then
146- run-setup-teardown (fn:false (), $suite)
159+ run-suite- setup-or -teardown (fn:false (), $suite)
147160 else ()
148161 )
149162 else ()
150163 let $results :=
151164 element test:run {
152165 test:log (" " ),
153166 test:log (text {"SUITE:" , $suite}),
154- run-setup-teardown (fn:true (), $suite),
167+ run-suite- setup-or -teardown (fn:true (), $suite),
155168
156169 test:log (" - invoking tests" ),
157170 for $test in $tests
158171 return
159172 run ($suite, $test, fn:concat ($TEST-SUITES-ROOT, $suite, "/" , $test), $run-teardown, $coverage),
160173
161174 if ($run-suite-teardown eq fn:true ()) then
162- run-setup-teardown (fn:false (), $suite)
175+ run-suite- setup-or -teardown (fn:false (), $suite)
163176 else test:log (" - not running suite teardown" ),
164177 test:log (" " )
165178 }
@@ -289,92 +302,70 @@ declare private function format-result($result as element(), $tab as xs:string?)
289302 )
290303};
291304
292- declare private function run-setup-or-teardown ($setup as xs:boolean, $suite as xs:string)
305+ declare private function run-setup-or-teardown ($is- setup as xs:boolean, $suite as xs:string)
293306{
294- let $stage := if ($setup) then "setup" else "teardown"
295- let $xquery-script := $stage || ".xqy"
296- let $sjs-script := $stage || ".sjs"
307+ let $start-time := xdmp:elapsed-time ()
308+ let $suite-modules := test:list-from-database ($db-id, $TEST-SUITES-ROOT || $suite || "/" )
309+ let $stage := if ($is-setup) then "setup" else "teardown"
310+ let $module := fn:head (if ($is-setup) then $suite-modules[is-setup-module (.)] else $suite-modules[is-teardown-module (.)])
311+ where fn:exists ($module)
297312 return
298- try {
299- (: We don't want the return value, so return () :)
300- let $_ := test:log (" ...invoking " || $stage)
301- let $_ := xdmp:invoke ($TEST-SUITES-ROOT || $suite || "/" || $xquery-script)
302- return ()
303- }
304- catch ($ex) {
305- if (($ex/error:code = "XDMP-MODNOTFOUND" and
306- fn:matches ($ex/error:stack/error:frame[1 ]/error:uri/fn:string (), "/" || $xquery-script || "$" )) or
307- ($ex/error:code = "SVC-FILOPN" and
308- fn:matches ($ex/error:expr, $xquery-script))) then
309- try {
310- xdmp:invoke ($TEST-SUITES-ROOT || $suite || "/" || $sjs-script)
311- }
312- catch ($ex) {
313- if (($ex/error:code = "XDMP-MODNOTFOUND" and
314- fn:matches ($ex/error:stack/error:frame[1 ]/error:uri/fn:string (), "/" || $sjs-script || "$" )) or
315- ($ex/error:code = "SVC-FILOPN" and
316- fn:matches ($ex/error:expr, $sjs-script))) then
317- ()
318- else
319- element test:result {
320- attribute type {"fail" },
321- $ex
322- }
323- }
324- else
325- element test:result {
326- attribute type {"fail" },
327- $ex
328- }
329- }
313+ (: We don't want the return value, so only return if element(test:test) for failures :)
314+ let $result := invoke-setup-teardown-module ($start-time, $stage, $module)
315+ where $result instance of element (test:test)
316+ return $result
330317};
331318
332- declare private function run-setup-teardown (
319+ declare private function run-suite- setup-or -teardown (
333320 $is-setup as xs:boolean,
334321 $suite as xs:string
335322)
336323{
337324 let $start-time := xdmp:elapsed-time ()
338- let $stage := if ($is-setup) then "setup" else "teardown"
339- let $xquery-script := "suite-" || $stage || ".xqy"
340- let $sjs-script := "suite" || xdmp:initcap ($stage) || ".sjs"
325+ let $suite-modules := test:list-from-database ($db-id, $TEST-SUITES-ROOT || $suite || "/" )
326+ let $stage := "suite " || (if ($is-setup) then "setup" else "teardown" )
327+ let $module := fn:head (if ($is-setup) then $suite-modules[is-suite-setup-module (.)] else $suite-modules[is-suite-teardown-module (.)])
328+ where fn:exists ($module)
341329 return
342- try {
343- test:log (" - invoking suite " || $stage),
344- xdmp:invoke ($TEST-SUITES-ROOT || $suite || "/" || $xquery-script)
345- }
346- catch ($ex) {
347- if (($ex/error:code = "XDMP-MODNOTFOUND" and
348- fn:matches ($ex/error:stack/error:frame[1 ]/error:uri/fn:string (), "/" || $xquery-script || "$" )) or
349- ($ex/error:code = "SVC-FILOPN" and
350- fn:matches ($ex/error:expr, $xquery-script))) then
351- try {
352- xdmp:invoke ($TEST-SUITES-ROOT || $suite || "/" || $sjs-script)
353- }
354- catch ($ex) {
355- if (($ex/error:code = "XDMP-MODNOTFOUND" and
356- fn:matches ($ex/error:stack/error:frame[1 ]/error:uri/fn:string (), "/" || $sjs-script || "$" )) or
357- ($ex/error:code = "SVC-FILOPN" and
358- fn:matches ($ex/error:expr, $sjs-script))) then
359- ()
360- else
361- element test:test {
362- attribute name { $sjs-script },
363- attribute time { functx:total-seconds-from-duration (xdmp:elapsed-time () - $start-time) },
364- element test:result {
365- attribute type {"fail" },
366- $ex
367- }
368- }
369- }
370- else
371- element test:test {
372- attribute name { $xquery-script },
373- attribute time { functx:total-seconds-from-duration (xdmp:elapsed-time () - $start-time) },
374- element test:result {
375- attribute type {"fail" },
376- $ex
377- }
378- }
379- }
330+ invoke-setup-teardown-module ($start-time, $stage, $module)
331+ };
332+
333+ declare function invoke-setup-teardown-module ($start-time as xs:dayTimeDuration, $stage as xs:string, $module as xs:string) {
334+ try {
335+ test:log (" - invoking " || $stage),
336+ xdmp:invoke ($module)
337+ }
338+ catch ($ex) {
339+ if (($ex/error:code = "XDMP-MODNOTFOUND" and
340+ $ex/error:stack/error:frame[1 ]/error:uri/fn:string () = $module) or
341+ ($ex/error:code = "SVC-FILOPN" and
342+ fn:contains ($ex/error:expr, $module))) then
343+ ()
344+ else
345+ element test:test {
346+ attribute name { $module },
347+ attribute time { functx:total-seconds-from-duration (xdmp:elapsed-time () - $start-time) },
348+ element test:result {
349+ attribute type {"fail" },
350+ $ex
351+ }
352+ }
353+ }
354+ };
355+
356+ (: setup/teardown checks :)
357+ declare function is-setup-module ($file-name as xs:string) {
358+ fn:matches ($file-name, "(^|/)setup\." )
359+ };
360+
361+ declare function is-teardown-module ($file-name as xs:string) {
362+ fn:matches ($file-name, "(^|/)teardown\." )
363+ };
364+
365+ declare function is-suite-setup-module ($file-name as xs:string) {
366+ fn:matches ($file-name, "(^|/)suite(-s|S)etup\." )
367+ };
368+
369+ declare function is-suite-teardown-module ($file-name as xs:string) {
370+ fn:matches ($file-name, "(^|/)suite(-t|T)eardown\." )
380371};
0 commit comments