@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")
}
}