import Testing
@testable import PureXML
@Suite("Schematron abstract rules and extends")
struct SchematronAbstractTests {
private func validate(_ schema: String, _ xml: String) throws -> [PureXML.Validation.ValidationError] {
try PureXML.Validation.Schematron(schema: schema).validate(xml)
}
@Test("A concrete rule extends an abstract rule's assertions")
func test_extends() throws {
let schema = """
element needs an id
item needs a name
"""
// Both the inherited and the own assertion hold.
#expect(try validate(schema, "- ").isEmpty)
// The inherited assertion fails (no id).
#expect(try validate(schema, "
- ").count == 1)
// Both fail.
#expect(try validate(schema, "
").count == 2)
}
@Test("An abstract rule does not fire on its own")
func test_abstractDoesNotFire() throws {
let schema = """
should never run
"""
// No concrete rule extends it, so nothing fires even on a matching element.
#expect(try validate(schema, "").isEmpty)
}
@Test("An extends pulls in the abstract rule's let bindings")
func test_extendsLet() throws {
let schema = """
over the limit
"""
#expect(try validate(schema, "5").isEmpty)
#expect(try !validate(schema, "50").isEmpty)
}
}