Skip to content

Commit 4ddb7b8

Browse files
committed
Fixed: default currency fraction limits now matches NumberFormatter for .currency style, and correctness is confirmed by unit tests.
1 parent 209e62b commit 4ddb7b8

File tree

5 files changed

+49
-3
lines changed

5 files changed

+49
-3
lines changed

Sources/DiffableTextStylesXNumeric/Helpers/Lexicon.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,12 @@ extension Lexicon {
5151
// MARK: Initializers
5252
//=------------------------------------------------------------------------=
5353

54+
/// Requires that formatter.numberStyle == .decimal.
5455
@inlinable static func standard(_ formatter: NumberFormatter) -> Lexicon {
5556
Lexicon(signs: .standard(formatter), digits: .standard(formatter), separators: .standard(formatter))
5657
}
5758

59+
/// Requires that formatter.numberStyle == .decimal.
5860
@inlinable static func currency(_ formatter: NumberFormatter) -> Lexicon {
5961
Lexicon(signs: .currency(formatter), digits: .currency(formatter), separators: .currency(formatter))
6062
}

Sources/DiffableTextStylesXNumeric/Models/Scheme+Currency.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,17 @@ import Foundation
3939
// MARK: Instantiate
4040
//=--------------------------------------=
4141
self.identifier = identifier
42-
self.defaults = .init(formatter)
42+
//=--------------------------------------=
43+
// MARK: Instantiate: Style == Decimal
44+
//=--------------------------------------=
4345
self.lexicon = .currency(formatter)
44-
self.label = .currency(identifier.locale,
46+
self.label = .currency(identifier.locale,
4547
code: identifier.code, lexicon: lexicon)
48+
//=--------------------------------------=
49+
// MARK: Instantiate: Style == Currency
50+
//=--------------------------------------=
51+
formatter.numberStyle = .currency
52+
self.defaults = Defaults(formatter)
4653
}
4754

4855
//=------------------------------------------------------------------------=

Sources/DiffableTextStylesXNumeric/Models/Scheme+Standard.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ import Foundation
3636
// MARK: Instantiate
3737
//=--------------------------------------=
3838
self.identifier = identifier
39+
//=--------------------------------------=
40+
// MARK: Instantiate: Style == Decimal
41+
//=--------------------------------------=
3942
self.lexicon = .standard(formatter)
4043
}
4144

Tests/DiffableTextStylesXNumericTests/Styles/StyleTests+Currency.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,39 @@ final class StyleTestsXCurrency: Tests, StyleTests {
2626
func XCTInterpretLocalesXCurrencies<T: Values.Currencyable>(_ value: T) {
2727
XCTInterpretLocalesXCurrencies(value, format: T.FormatStyle.Currency.init)
2828
}
29+
30+
func XCTAssertDefaultFractionLimitsIsSameAs(_ formatter: NumberFormatter) {
31+
let style = NumericTextStyle<Decimal>.Currency(code: formatter.currencyCode, locale: formatter.locale)
32+
let lhs = style.precision.lower.fraction ... style.precision.upper.fraction
33+
let rhs = formatter.minimumFractionDigits ... formatter.minimumFractionDigits
34+
XCTAssertEqual(lhs, rhs)
35+
}
36+
}
37+
38+
//=----------------------------------------------------------------------------=
39+
// MARK: + Defaults
40+
//=----------------------------------------------------------------------------=
41+
42+
extension StyleTestsXCurrency {
43+
44+
//=------------------------------------------------------------------------=
45+
// MARK: Tests
46+
//=------------------------------------------------------------------------=
47+
48+
func testDefaultFractionLimitsIsSameAsCurrencyFormatter() {
49+
let formatter = NumberFormatter()
50+
formatter.numberStyle = .currency
51+
//=--------------------------------------=
52+
// MARK: Locales, Currencies
53+
//=--------------------------------------=
54+
for locale in locales {
55+
formatter.locale = locale
56+
for currencyCode in currencyCodes {
57+
formatter.currencyCode = currencyCode
58+
XCTAssertDefaultFractionLimitsIsSameAs(formatter)
59+
}
60+
}
61+
}
2962
}
3063

3164
//=----------------------------------------------------------------------------=

Tests/DiffableTextStylesXNumericTests/Styles/StyleTests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ extension StyleTests {
3232
XCTAssertEqual(format.precision(.fractionLength(0...)).format(value), result)
3333
}
3434

35+
/// Fraction limits is set to max because a style's default precision depends on context.
3536
func XCTInterpret<F: Format>(_ value: F.Value, format: F, info: @autoclosure () -> Any) {
36-
let commit = _NumericTextStyle(format).interpret(value)
3737
let characters = format.precision(.fractionLength(0...)).format(value)
38+
let commit = _NumericTextStyle(format).precision(Precision(fraction: 0...)).interpret(value)
3839
XCTAssertEqual(commit.value, value, String(describing: info()))
3940
XCTAssertEqual(commit.snapshot.characters, characters, String(describing: info()))
4041
}

0 commit comments

Comments
 (0)