TeraExactDecimalPresentationTests.swift (4623B)
1 import Foundation 2 import SwiftUI 3 @testable import TeraApp 4 import XCTest 5 6 final class TeraExactDecimalPresentationTests: XCTestCase { 7 func testAllAdmittedDigitsSurviveLocaleGroupingWithoutRounding() { 8 let raw = "12345678901234567890.12345678" 9 for (locale, expected) in [ 10 ("en_US", "12,345,678,901,234,567,890.12345678"), 11 ("de_DE", "12.345.678.901.234.567.890,12345678"), 12 ("fr_FR", "12\u{202F}345\u{202F}678\u{202F}901\u{202F}234\u{202F}567\u{202F}890,12345678"), 13 ("ar_EG", "١٢٬٣٤٥٬٦٧٨٬٩٠١٬٢٣٤٬٥٦٧٬٨٩٠٫١٢٣٤٥٦٧٨"), 14 ("en_IN", "1,23,45,67,89,01,23,45,67,890.12345678"), 15 ] { 16 XCTAssertEqual(TeraExactDecimalPresentation(locale: Locale(identifier: locale)).string(raw), expected, locale) 17 } 18 XCTAssertEqual(raw, "12345678901234567890.12345678") 19 } 20 21 func testTinyFractionsAndLargestIntegersRetainEveryDigit() { 22 let format = TeraExactDecimalPresentation(locale: Locale(identifier: "de_DE")) 23 XCTAssertEqual(format.string("0.000000000000000000000000001"), "0,000000000000000000000000001") 24 XCTAssertEqual(format.string("9999999999999999999999999999"), "9.999.999.999.999.999.999.999.999.999") 25 XCTAssertEqual(format.string("0"), "0") 26 for raw in ["", "1.", ".1", "1e3", "1,5", "-1", "١", "1.2.3", String(repeating: "9", count: 29)] { 27 XCTAssertNil(format.string(raw), raw) 28 } 29 } 30 31 func testVisibleAndAccessibleFoodValuesUseTheSameExactLocalePresentation() { 32 let card = foodCard() 33 let original = card 34 let locale = Locale(identifier: "de_DE") 35 let format = TeraFoodPresentation(locale: locale) 36 XCTAssertEqual(format.price(card), "12.345,67890123456789 ZZZ/bag") 37 XCTAssertEqual(format.quantity(card), "0,000000000000000000000000001 bag available") 38 for mode: TeraTodayCardPresentation in [.feed, .detail] { 39 let summary = mode.accessibility(card, locale: locale, timeZone: .gmt) 40 XCTAssertTrue(summary.contains("12.345,67890123456789 ZZZ/bag")) 41 XCTAssertTrue(summary.contains("0,000000000000000000000000001 bag available")) 42 } 43 XCTAssertEqual(card, original) 44 XCTAssertEqual(card.priceAmount, "12345.67890123456789") 45 XCTAssertEqual(card.priceCurrency, "ZZZ") 46 XCTAssertEqual(card.priceUnit, "bag") 47 } 48 49 func testAuthoredInstantChecksTheNativeDomainAndLocalYearBeforeConversion() throws { 50 let format = TeraCalendarPresentation(locale: Locale(identifier: "en_US"), timeZone: .gmt) 51 XCTAssertTrue(format.authoredSummary(0).hasPrefix("Posted: Jan 1, 1970")) 52 XCTAssertEqual(format.authoredDate(0), Date(timeIntervalSince1970: 0)) 53 for seconds: UInt64 in [253_402_300_800, (1 << 53) + 1, .max] { 54 XCTAssertEqual(format.authoredSummary(seconds), "Date unavailable") 55 } 56 let east = try XCTUnwrap(TimeZone(identifier: "Pacific/Kiritimati")) 57 XCTAssertEqual(TeraCalendarPresentation(timeZone: east).authoredSummary(253_402_300_799), "Date unavailable") 58 XCTAssertNil(TeraCalendarPresentation(timeZone: east).authoredDate(253_402_300_799)) 59 } 60 61 @MainActor 62 func testProductionFoodCardRendersLocalizedValuesAtAccessibleSize() async throws { 63 let client = try await TeraScopeFixtures.client(TeraScopeBackend()) 64 let store = TeraMediaStore(runtimeClient: client) 65 let view = TeraTodayCardView(card: foodCard(), context: nil, mediaStore: store, presentation: .detail) 66 .environment(\.locale, Locale(identifier: "de_DE")) 67 .environment(\.dynamicTypeSize, .accessibility5).padding(16).frame(width: 390) 68 let renderer = ImageRenderer(content: view) 69 let image = try XCTUnwrap(renderer.uiImage) 70 XCTAssertGreaterThan(image.size.height, 100) 71 let attachment = XCTAttachment(image: image) 72 attachment.name = "c122-exact-food-de-DE-accessibility5" 73 attachment.lifetime = .keepAlways 74 add(attachment) 75 _ = try await client.stop() 76 } 77 78 private func foodCard() -> TeraTodayCard { 79 TeraTodayCard( 80 id: "food", type: .foodAvailability, sourceEventID: "event", sourceAddress: nil, 81 authorPublicKey: String(repeating: "a", count: 64), contractID: "test.food", 82 title: nil, content: "Seasonal food", authoredAtUnixSeconds: 0, effectiveAtUnixSeconds: 0, 83 calendarTiming: nil, location: nil, priceAmount: "12345.67890123456789", priceCurrency: "ZZZ", 84 priceUnit: "bag", quantity: "0.000000000000000000000000001", foodSummary: nil, 85 foodPublishedAtUnixSeconds: nil, foodStatus: nil, contextRank: 1, inclusionReason: "local", 86 media: [], lifecycle: .active, rankDigest: nil, authorProfile: nil, thread: [], 87 localOperationID: nil, localOperationState: nil 88 ) 89 } 90 }