Я хочу протестировать функцию XQuery eXist-db, которая принимает тип данных Map< /а> аргумент. Согласно руководству по платформе тестирования eXist-db:
Параметры аннотаций XQuery должны быть литеральными значениями, поэтому допускаются только строки и числа. Таким образом, XQSuite применяет преобразование типов к каждому аргументу, а также к значениям, используемым в утверждениях.
Однако я не смог найти, как указать тип данных Map в виде строки. Вот пример кода, который у меня есть:
declare
%test:arg("input", "{p1}?id={id}")
%test:arg("props", "id")
%test:arg("props", "ABC")
%test:assertEquals("{p1}?id=ABC")
function properties:substitute($input as xs:string, $props as map (xs:string, xs:string)) as xs:string {
let $keys := map:keys($props)
let $tokens := $keys ! concat('\{', ., '\}')
let $replacements := $keys ! $props(.)
return functx:replace-multi($input, $tokens, $replacements)
};
Тест завершается со следующей ошибкой:
<testcase name="substitute" class="properties:substitute">
<error type="java:org.exist.xquery.XPathException" message="exerr:ERROR XPTY0004: The actual cardinality for parameter 2 does not match the cardinality declared in the function's signature: properties:substitute($input as xs:string, $props as map) xs:string. Expected cardinality: exactly one, got 3. [at line 7, column 5]
In function:
properties:substitute(xs:string, map) [7:5:/db/apps/ssg/modules/properties.xql]
test:apply(function, item()*) [327:9:jar:file:/C:/Programs/eXist-db/exist.jar!/org/exist/xquery/lib/xqsuite/xqsuite.xql]
test:apply(function, element(), item()*) [234:9:jar:file:/C:/Programs/eXist-db/exist.jar!/org/exist/xquery/lib/xqsuite/xqsuite.xql]
test:call-test(function, element(), element()*) [135:32:jar:file:/C:/Programs/eXist-db/exist.jar!/org/exist/xquery/lib/xqsuite/xqsuite.xql]"/>
</testcase>
Любые идеи, как заставить его работать?