import Testing @testable import PureXML @Suite("Parity edges: C14N 2.0, catalog delegation, XPath number formatting") struct ParityEdgeTests { // MARK: XPath number formatting @Test("XPath formats numbers as plain decimals without an exponent") func test_numberFormatting() { #expect(PureXML.XPath.Value.format(0.000015) == "0.000015") #expect(PureXML.XPath.Value.format(1.23e21) == "1230000000000000000000") #expect(PureXML.XPath.Value.format(-0.5) == "-0.5") #expect(PureXML.XPath.Value.format(3) == "3") #expect(PureXML.XPath.Value.format(Double.nan) == "NaN") } @Test("A small fractional XPath result avoids scientific notation") func test_numberFromQuery() throws { let result = try PureXML.XPath.Query("1 div 100000").number(over: .text("")) #expect(PureXML.XPath.Value.format(result) == "0.00001") } // MARK: Catalog delegation and nextCatalog @Test("delegateSystem resolves through the delegated catalog") func test_delegateSystem() throws { let delegated = """ """ let main = """ """ let resolver = try PureXML.Catalog.Resolver(main) let loader: (String) -> String? = { $0 == "sub.xml" ? delegated : nil } #expect(resolver.resolveSystem("http://example.com/a.dtd", loadingCatalog: loader) == "local/a.dtd") #expect(resolver.resolveSystem("http://other.com/a.dtd", loadingCatalog: loader) == nil) } @Test("nextCatalog chains to a following catalog") func test_nextCatalog() throws { let next = """ """ let main = """ """ let resolver = try PureXML.Catalog.Resolver(main) let loader: (String) -> String? = { $0 == "next.xml" ? next : nil } #expect(resolver.resolvePublic("-//Example//DTD//EN", loadingCatalog: loader) == "example.dtd") } // MARK: Canonical XML 2.0 text trimming @Test("C14N 2.0 TrimTextNodes strips text-node whitespace") func test_canonical2Trim() throws { let node = try PureXML.parse(" spaced \n x\n ") let trimmed = PureXML.Canonical.canonicalize(node, options: .canonical2) #expect(trimmed == "spacedx") let untrimmed = PureXML.Canonical.canonicalize(node, options: .inclusive) #expect(untrimmed == " spaced \n x\n ") } }