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, "ab")) #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")) } }