@testable import PureXML import Testing @Suite("XSLT document() fragments and base-URI resolution") struct XSLTDocumentFunctionTests { private let xsl = "xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"" private func transform(_ stylesheet: String, _ source: String, baseURI: String = "", loader: @escaping (String) -> String?) throws -> String { try PureXML.XSLT.transform(stylesheet: stylesheet, source: source, documentLoader: loader, baseURI: baseURI) } private let external = "
first
second
" @Test("document() with no fragment loads the whole document") func test_wholeDocument() throws { let style = """ """ let out = try transform(style, "") { $0 == "ext.xml" ? external : nil } #expect(out == "2") } @Test("document() with an xpointer fragment selects a subset") func test_xpointerFragment() throws { let style = """ """ let out = try transform(style, "") { $0 == "ext.xml" ? external : nil } #expect(out == "second") } @Test("A relative document() URI is resolved against the base URI") func test_baseURI() throws { let style = """ """ var requested: [String] = [] let out = try transform(style, "", baseURI: "http://example.org/docs/") { uri in requested.append(uri) return uri == "http://example.org/docs/ext.xml" ? external : nil } #expect(out == "2") #expect(requested.contains("http://example.org/docs/ext.xml")) } @Test("document() with a node-set argument unions the loaded documents") func test_nodeSetArgument() throws { let style = """ """ let source = "a.xmlb.xml" let out = try transform(style, source) { uri in switch uri { case "a.xml": "
1
" case "b.xml": "
2
3
" default: nil } } #expect(out == "3") } }