PureXML/Tests/SchemaListFacetTests.swift
Mihaela Mihaljevic 83e6e27d12 style(format): adopt --importgrouping testable-bottom from canonical rules-swift
Group @testable imports at the bottom, per public/rules-swift's swiftformat. A
behavior-preserving import-ordering reformat across 252 files (mostly tests).
--trailingclosures was deliberately not adopted (cosmetic, and swiftformat flags
it as caution-worthy).
2026-06-18 20:33:07 +02:00

41 lines
1.9 KiB
Swift

import Testing
@testable import PureXML
/// Length facets on the built-in list datatypes (`NMTOKENS`, `IDREFS`,
/// `ENTITIES`) count list items, not characters (#146). A restriction of one of
/// these built-ins had collapsed to an atomic string, so `length` measured
/// characters and rejected valid instances across the XSTS NIST list sets.
@Suite("List datatype length facets")
struct SchemaListFacetTests {
private func schema(_ base: String, _ facet: String) throws -> PureXML.Schema.Document {
try PureXML.Schema.Document("""
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="v">
<xs:simpleType>
<xs:restriction base="\(base)">\(facet)</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
""")
}
@Test("length on NMTOKENS counts items, not characters")
func test_nmtokensLength() throws {
let doc = try schema("xs:NMTOKENS", #"<xs:length value="3"/>"#)
#expect(try doc.validate("<v>alpha beta gamma</v>").isEmpty) // 3 items: valid
#expect(try !doc.validate("<v>alpha beta</v>").isEmpty) // 2 items: invalid
#expect(try !doc.validate("<v>alpha beta gamma delta</v>").isEmpty) // 4 items: invalid
}
/// ENTITIES would drag in entity declarations and IDREFS in document-scoped
/// reference resolution; NMTOKENS isolates the list length facet itself.
@Test("minLength and maxLength on a built-in list count items")
func test_listMinMax() throws {
let doc = try schema("xs:NMTOKENS", #"<xs:minLength value="2"/><xs:maxLength value="3"/>"#)
#expect(try doc.validate("<v>a b</v>").isEmpty) // 2 items: valid
#expect(try doc.validate("<v>a b c</v>").isEmpty) // 3 items: valid
#expect(try !doc.validate("<v>a</v>").isEmpty) // 1 item: invalid
#expect(try !doc.validate("<v>a b c d</v>").isEmpty) // 4 items: invalid
}
}