rastrillo / native Public

Clone
git clone https://amadan.net/rastrillo/native

Plain git — no account needed to clone.

Download

Download this file

1import Foundation
2import RastrilloNative
3import XCTest
4@testable import RastrilloApple
5
6final class SyncStringsTests: XCTestCase {
7 static let languages = ["ar", "bn", "en", "es", "ga", "hi", "ja", "pt", "ru", "vi", "yue", "zh-Hans"]
8 static let keys = ["sync.saving", "sync.retrying", "sync.offline", "sync.needsSignIn", "sync.signIn",
9 "sync.failed.cannotSave", "sync.failed.tooManyUnsent", "sync.failed.held",
10 "offline.waiting", "offline.durable", "sync.unsentLost"]
11
12 /// The catalog ships in the same twelve languages as the apps, and no
13 /// language is missing a string: a missing one would show its key.
14 func testEveryLanguageHasEveryString() throws {
15 for language in Self.languages {
16 let strings = try XCTUnwrap(Bundle.module.path(forResource: "Localizable", ofType: "strings", inDirectory: nil, forLocalization: language), language)
17 let table = try XCTUnwrap(NSDictionary(contentsOfFile: strings) as? [String: String], language)
18 XCTAssertEqual(Set(table.keys), Set(Self.keys), language)
19 for (key, value) in table { XCTAssertFalse(value.isEmpty, "\(language) \(key)") }
20 let plurals = try XCTUnwrap(Bundle.module.path(forResource: "Localizable", ofType: "stringsdict", inDirectory: nil, forLocalization: language), language)
21 let rules = try XCTUnwrap(NSDictionary(contentsOfFile: plurals) as? [String: Any], language)
22 XCTAssertEqual(Set(rules.keys), ["sync.offline", "sync.needsSignIn"], language)
23 for key in rules.keys {
24 let rule = try XCTUnwrap((rules[key] as? [String: Any])?["n"] as? [String: String], "\(language) \(key)")
25 XCTAssertNotNil(rule["other"], "\(language) \(key) needs an other form")
26 for (category, text) in rule where !category.hasPrefix("NSString") {
27 XCTAssertTrue(text.contains("%d"), "\(language) \(key) \(category) drops the count")
28 }
29 }
30 }
31 }
32
33 func testEnglishWording() {
34 let strings = NativeSyncStrings.kit(localization: "en")
35 XCTAssertNil(strings.text(for: .saved), "Saved is silent")
36 XCTAssertEqual(strings.text(for: .saving), "Saving…")
37 XCTAssertEqual(strings.text(for: .offline(pending: 1)), "Offline · 1 pending")
38 XCTAssertEqual(strings.text(for: .offline(pending: 3)), "Offline · 3 pending")
39 XCTAssertEqual(strings.text(for: .retrying(pending: 2)), "Trouble saving · Retrying…")
40 XCTAssertEqual(strings.text(for: .needsSignIn(pending: 2)), "Sign in to send 2 pending")
41 XCTAssertEqual(strings.text(for: .failed(pending: 1, reason: .tooManyUnsent)),
42 "Too many unsent changes to keep on this device. Connect to save.")
43 XCTAssertEqual(strings.text(for: .failed(pending: 1, reason: .cannotSaveOnDevice)), "Can’t save on this device.")
44 XCTAssertEqual(strings.offlineDurable,
45 "You’re offline. Changes are saved on this device and will be sent when you reconnect.")
46 XCTAssertEqual(strings.offlineWaiting, "You’re offline. Waiting for a connection.")
47 }
48
49 func testPluralRulesAreApplied() {
50 let russian = NativeSyncStrings.kit(localization: "ru")
51 XCTAssertEqual(russian.text(for: .offline(pending: 1)), "Не в сети · 1 ожидает отправки")
52 XCTAssertEqual(russian.text(for: .offline(pending: 3)), "Не в сети · 3 ожидают отправки")
53 let spanish = NativeSyncStrings.kit(localization: "es")
54 XCTAssertEqual(spanish.text(for: .offline(pending: 1)), "Sin conexión · 1 pendiente")
55 XCTAssertEqual(spanish.text(for: .offline(pending: 2)), "Sin conexión · 2 pendientes")
56 }
57
58 func testAnAppOverridesWithACopy() {
59 var strings = NativeSyncStrings.kit(localization: "en")
60 strings.offline = { "Offline · \($0) cells pending" }
61 XCTAssertEqual(strings.text(for: .offline(pending: 4)), "Offline · 4 cells pending")
62 }
63}
64