@testable import PureXML import Testing @Suite("XSD Particle Valid (Restriction)") struct XSDParticleRestrictionTests { private let xsNamespace = "xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" private func schema(base: String, restriction: String) -> String { """ \(base) \(restriction) """ } private func compiles(base: String, restriction: String) -> Bool { (try? PureXML.Schema.Document(schema(base: base, restriction: restriction))) != nil } private func restrictionError(base: String, restriction: String) -> String? { do { _ = try PureXML.Schema.Document(schema(base: base, restriction: restriction)) return nil } catch let error as PureXML.Schema.SchemaError { return String(describing: error) } catch { return String(describing: error) } } @Test("Valid restrictions compile: drop an optional, narrow a choice, keep order") func test_validRestrictions() { // Dropping an optional element. #expect(compiles( base: "", restriction: "", )) // Narrowing a choice to one branch. #expect(compiles( base: "", restriction: "", )) // Narrowing an occurrence range. #expect(compiles( base: "", restriction: "", )) } @Test("A restriction widening the occurrence range is rejected") func test_wideningOccurrenceRejected() { let error = restrictionError( base: "", restriction: "", ) #expect(error?.contains("not a valid restriction") == true, "\(String(describing: error))") } @Test("A restriction introducing a new element name is rejected") func test_newNameRejected() { let error = restrictionError( base: "", restriction: "", ) #expect(error?.contains("not a valid restriction") == true) } @Test("A restriction reordering a sequence is rejected") func test_reorderRejected() { let error = restrictionError( base: "", restriction: "", ) #expect(error?.contains("not a valid restriction") == true) } @Test("Restricting to empty requires an emptiable base") func test_emptyRestriction() { // Emptiable base: fine. #expect(compiles( base: "", restriction: "", )) // Required base content: rejected. let error = restrictionError( base: "", restriction: "", ) #expect(error?.contains("cannot be EMPTY") == true, "\(String(describing: error))") } @Test("An element restricts a wildcard only when its namespace is admitted") func test_wildcardRestriction() { // ##any admits the unqualified element. #expect(compiles( base: "", restriction: "", )) // ##other refuses an unqualified element. let error = restrictionError( base: "", restriction: "", ) #expect(error?.contains("not a valid restriction") == true) } @Test("Conformance: the restriction corpus passes through the harness") func test_conformanceCases() { let valid = compiles( base: "", restriction: "", ) let invalid = compiles( base: "", restriction: "", ) let cases = [ PureXML.Validation.ConformanceCase(name: "faithful-restriction-accepted", actual: valid ? "valid" : "invalid", expected: "valid"), PureXML.Validation.ConformanceCase(name: "additive-restriction-rejected", actual: invalid ? "valid" : "invalid", expected: "invalid"), ] let failures = PureXML.Validation.Conformance.failures(in: cases) #expect(failures.isEmpty, "\(failures.map(\.reason))") } }