import Testing
@testable import PureXML
@Suite("RELAX NG compact syntax and references")
struct RelaxNGCompactTests {
private func validCompact(
_ rnc: String,
_ xml: String,
loader: @escaping (String) -> String? = { _ in nil },
) throws -> Bool {
try PureXML.Schema.RelaxNG(compact: rnc, schemaLoader: loader).validate(xml)
}
@Test("A compact element with text content")
func test_elementText() throws {
let rnc = "element greeting { text }"
#expect(try validCompact(rnc, "hello"))
#expect(try !validCompact(rnc, "hello"))
#expect(try !validCompact(rnc, ""))
}
@Test("A compact sequence of children in order")
func test_sequence() throws {
let rnc = """
element book {
element title { text },
element author { text }
}
"""
#expect(try validCompact(rnc, "TA"))
#expect(try !validCompact(rnc, "AT"))
}
@Test("Compact choice and cardinality")
func test_choiceAndCardinality() throws {
let rnc = """
element list {
(element a { text } | element b { text })*
}
"""
#expect(try validCompact(rnc, "123
"))
#expect(try validCompact(rnc, "
"))
#expect(try !validCompact(rnc, "x
"))
}
@Test("Compact attributes and grammar definitions")
func test_grammarAndAttributes() throws {
let rnc = """
start = element root { item+ }
item = element item { attribute id { text }, text }
"""
#expect(try validCompact(rnc, "- a
- b
"))
#expect(try !validCompact(rnc, "- a
"))
#expect(try !validCompact(rnc, ""))
}
@Test("Compact include merges an external grammar's definitions")
func test_include() throws {
let library = "shared = element shared { text }"
let main = """
include "lib.rnc"
start = element root { shared }
"""
let loader: (String) -> String? = { $0 == "lib.rnc" ? library : nil }
#expect(try validCompact(main, "x", loader: loader))
#expect(try !validCompact(main, "x", loader: loader))
}
@Test("XML-syntax externalRef pulls in an external pattern")
func test_externalRef() throws {
let rng = "xmlns=\"http://relaxng.org/ns/structure/1.0\""
let external = ""
let main = ""
let schema = try PureXML.Schema.RelaxNG(main, schemaLoader: { $0 == "note.rng" ? external : nil })
#expect(try schema.validate("hi"))
#expect(try !schema.validate("hi"))
}
}