import Testing
@testable import PureXML
@Suite("RELAX NG compact datatype parameter blocks")
struct RelaxNGCompactParamTests {
private func valid(_ rnc: String, _ xml: String) throws -> Bool {
try PureXML.Schema.RelaxNG(compact: rnc).validate(xml)
}
@Test("A minLength param block constrains a data value")
func test_minLength() throws {
let rnc = "element code { xsd:string { minLength = \"3\" } }"
#expect(try valid(rnc, "abc"))
#expect(try !valid(rnc, "ab"))
}
@Test("A maxInclusive param block constrains a numeric value")
func test_maxInclusive() throws {
let rnc = "element n { xsd:integer { maxInclusive = \"10\" } }"
#expect(try valid(rnc, "5"))
#expect(try !valid(rnc, "20"))
}
@Test("Multiple params in one block all apply")
func test_multipleParams() throws {
let rnc = "element code { xsd:string { minLength = \"2\" maxLength = \"4\" } }"
#expect(try valid(rnc, "abc"))
#expect(try !valid(rnc, "a"))
#expect(try !valid(rnc, "abcde"))
}
@Test("A datatype with no param block still validates against its base")
func test_noParams() throws {
let rnc = "element n { xsd:integer }"
#expect(try valid(rnc, "42"))
#expect(try !valid(rnc, "x"))
}
}