field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

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 }