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