import Foundation import XCTest @testable import TranslatorPlugin @MainActor final class TranslatorLanguageTests: XCTestCase { func testSupportedLanguageRawValuesAreExact() { XCTAssertEqual( TranslatorLanguage.allCases.map(\.rawValue), ["zh-Hans", "zh-Hant", "en", "ja", "ko", "fr", "de", "es", "pt", "it", "ru"] ) } func testLanguageMetadata() { XCTAssertEqual(TranslatorLanguage.simplifiedChinese.displayName, "็ฎ€ไฝ“ไธญๆ–‡") XCTAssertEqual(TranslatorLanguage.english.promptName, "English") XCTAssertEqual(TranslatorLanguage.japanese.flag, "๐Ÿ‡ฏ๐Ÿ‡ต") } func testLanguageFromLocaleIdentifierMapsChineseVariants() { XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "zh-Hant"), .traditionalChinese) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "zh-TW"), .traditionalChinese) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "zh-HK"), .traditionalChinese) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "zh-CN"), .simplifiedChinese) } func testLanguageFromLocaleIdentifierMapsSupportedPrefixes() { XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "en-US"), .english) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "ja-JP"), .japanese) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "ko-KR"), .korean) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "fr-FR"), .french) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "de-DE"), .german) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "es-ES"), .spanish) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "pt-BR"), .portuguese) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "it-IT"), .italian) XCTAssertEqual(TranslatorLanguage.from(localeIdentifier: "ru-RU"), .russian) } func testDefaultPairFallsBackToChineseAndEnglishForUnknownLocales() { XCTAssertEqual( LanguagePreferenceStore.defaultPair(fromPreferredLanguages: ["ar-SA", "th-TH"]), TranslatorLanguagePair(first: .simplifiedChinese, second: .english) ) } func testDefaultPairUsesUniquePreferredLanguagesWhenTwoSupportedLocalesExist() { XCTAssertEqual( LanguagePreferenceStore.defaultPair(fromPreferredLanguages: ["ja-JP", "en-US", "zh-CN"]), TranslatorLanguagePair(first: .japanese, second: .english) ) } func testDefaultPairPairsOneNonEnglishPreferredLanguageWithEnglish() { XCTAssertEqual( LanguagePreferenceStore.defaultPair(fromPreferredLanguages: ["fr-FR", "fr-CA"]), TranslatorLanguagePair(first: .french, second: .english) ) } func testPreferenceStoreSavesAndLoadsPair() { let storage = TranslatorInMemoryPluginStorage() let store = LanguagePreferenceStore(storage: storage) let pair = TranslatorLanguagePair(first: .japanese, second: .english) store.savePair(pair) XCTAssertEqual(store.loadPair(), pair) XCTAssertEqual(storage.string(forKey: "translator.language.first"), "ja") XCTAssertEqual(storage.string(forKey: "translator.language.second"), "en") } func testPreferenceStoreIgnoresIdenticalStoredPair() { let storage = TranslatorInMemoryPluginStorage() storage.set("en", forKey: "translator.language.first") storage.set("en", forKey: "translator.language.second") let store = LanguagePreferenceStore(storage: storage) XCTAssertEqual( store.loadPair(), LanguagePreferenceStore.defaultPair(fromPreferredLanguages: Locale.preferredLanguages) ) } func testLanguageDetectorDetectsJapaneseKoreanAndEnglish() { let detector = LanguageDetector() XCTAssertEqual(detector.detect("ใ“ใ‚Œใฏๆ—ฅๆœฌ่ชžใฎๆ–‡็ซ ใงใ™ใ€‚"), .japanese) XCTAssertEqual(detector.detect("์•ˆ๋…•ํ•˜์„ธ์š” ๋ฒˆ์—ญ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค."), .korean) XCTAssertEqual(detector.detect("This is an English sentence."), .english) } func testLanguageDetectorReturnsNilForEmptyOrUnsupportedText() { let detector = LanguageDetector() XCTAssertNil(detector.detect(" \n\t ")) XCTAssertNil(detector.detect("12345 !!!")) } }