@testable import PureXML import Testing @Suite("XSLT xsl:decimal-format") struct XSLTDecimalFormatTests { private let xsl = "xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"" private func transform(_ stylesheet: String, _ source: String) throws -> String { try PureXML.XSLT.transform(stylesheet: stylesheet, source: source) } private func formatNumber(_ select: String, decimalFormats: String = "") -> String { """ \(decimalFormats) """ } @Test("The default format still works") func test_default() throws { #expect(try transform(formatNumber("format-number(1234.5, '#,##0.00')"), "") == "1,234.50") } @Test("A named European format swaps the decimal and grouping separators") func test_european() throws { let style = formatNumber( "format-number(1234.5, '#.##0,00', 'eu')", decimalFormats: "", ) #expect(try transform(style, "") == "1.234,50") } @Test("A custom percent and minus sign are honored") func test_percentMinus() throws { let style = formatNumber( "format-number(-0.25, '0%', 'p')", decimalFormats: "", ) #expect(try transform(style, "") == "!25%") } @Test("A custom NaN string is used for non-numbers") func test_nan() throws { let style = formatNumber( "format-number(number('abc'), '0', 'n')", decimalFormats: "", ) #expect(try transform(style, "") == "not-a-number") } @Test("The unnamed decimal-format overrides the global default") func test_unnamedDefault() throws { let style = formatNumber( "format-number(5, '0')", decimalFormats: "", ) // 5 formats plainly; a negative shows the overridden minus sign. #expect(try transform(style, "") == "5") let neg = formatNumber("format-number(-5, '0')", decimalFormats: "") #expect(try transform(neg, "") == "~5") } }