import Testing
@testable import PureXML
@Suite("RELAX NG")
struct RelaxNGTests {
private func valid(_ rng: String, _ xml: String) throws -> Bool {
try PureXML.Schema.RelaxNG(rng).validate(xml)
}
private let rngNamespace = "xmlns=\"http://relaxng.org/ns/structure/1.0\" datatypeLibrary=\"http://www.w3.org/2001/XMLSchema-datatypes\""
@Test("An element with text content")
func test_elementText() throws {
let rng = ""
#expect(try valid(rng, "hello"))
#expect(try !valid(rng, "hello"))
#expect(try !valid(rng, ""))
}
@Test("A sequence of child elements in order")
func test_sequence() throws {
let rng = """
"""
#expect(try valid(rng, "TA"))
#expect(try !valid(rng, "AT"))
#expect(try !valid(rng, "T"))
}
@Test("choice, optional, and zeroOrMore")
func test_combinators() throws {
let rng = """
"""
#expect(try valid(rng, "1"))
#expect(try valid(rng, ""))
#expect(try !valid(rng, ""))
}
@Test("oneOrMore requires at least one")
func test_oneOrMore() throws {
let rng = """
"""
#expect(try valid(rng, "- a
- b
"))
#expect(try !valid(rng, "
"))
}
@Test("Attributes are validated and required")
func test_attributes() throws {
let rng = """
"""
#expect(try valid(rng, ""))
#expect(try !valid(rng, ""))
}
@Test("interleave allows children in any order")
func test_interleave() throws {
let rng = """
"""
#expect(try valid(rng, ""))
#expect(try valid(rng, ""))
#expect(try !valid(rng, ""))
}
@Test("data types validate text content")
func test_data() throws {
let rng = ""
#expect(try valid(rng, "42"))
#expect(try !valid(rng, "x"))
}
@Test("value matches a literal")
func test_value() throws {
let rng = "yes"
#expect(try valid(rng, "yes"))
#expect(try !valid(rng, "no"))
}
@Test("A grammar with define and ref validates recursive structures")
func test_recursiveGrammar() throws {
let rng = """
"""
#expect(try valid(rng, ""))
#expect(try valid(rng, ""))
#expect(try !valid(rng, ""))
}
}