@testable import PureXML
import Testing
/// Every QName a schema names (a `type`/`base`/`itemType`/`memberTypes` type, an
/// element/attribute/group/attributeGroup `ref`, an element `substitutionGroup`)
/// must resolve to a declared component or a built-in. An undeclared reference
/// was previously accepted at compile time and only surfaced (if at all) lazily
/// during instance validation. The check is skipped when the document pulls in
/// external definitions through `import`/`include`/`redefine`, which the default
/// compile does not load.
@Suite("Schema reference resolution")
struct SchemaReferenceTests {
private func compile(_ body: String) throws {
_ = try PureXML.Schema.Document("""
\(body)
""")
}
private func rejects(_ body: String) -> Bool {
do { try compile(body)
return false
} catch { return true }
}
@Test("a reference to a declared component or a built-in resolves")
func test_resolves() throws {
try compile(#""#)
try compile(#""#)
try compile(#""#)
}
@Test("an undeclared reference is rejected")
func test_undeclared() {
#expect(rejects(#""#))
#expect(rejects(#""#))
#expect(rejects(#""#))
#expect(rejects(#""#))
}
@Test("a reference value tolerates surrounding whitespace (whiteSpace collapse)")
func test_whitespacePadded() throws {
try compile("")
}
@Test("references are not checked when an import may supply them")
func test_importSkipsCheck() throws {
// A dangling reference into an imported namespace is tolerated: the default
// compile does not load the import, so the reference cannot be verified.
try compile(#"""
"""#)
}
@Test("references are checked strictly against the targetNamespace")
func test_referenceNamespaceChecking() throws {
// Without targetNamespace, unprefixed ref resolves to no namespace and is accepted
_ = try PureXML.Schema.Document("""
""")
// With targetNamespace, unprefixed ref without default namespace resolves to no namespace but declaration is in targetNamespace -> rejected
#expect(throws: Error.self) {
_ = try PureXML.Schema.Document("""
""")
}
// With targetNamespace, prefix matching targetNamespace is accepted
_ = try PureXML.Schema.Document("""
""")
// With targetNamespace, default namespace matching targetNamespace is accepted
_ = try PureXML.Schema.Document("""
""")
}
}