Skip to content

Commit 6e2ee7a

Browse files
authored
Merge pull request swiftlang#1707 from swiftlang/automerge/merge-main-2026-01-31_09-07
Merge `release/6.3` into `main`
2 parents d59ed0a + c819447 commit 6e2ee7a

1 file changed

Lines changed: 79 additions & 163 deletions

File tree

Tests/FoundationInternationalizationTests/LocaleTests.swift

Lines changed: 79 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -936,178 +936,94 @@ extension LocaleTests {
936936
}
937937
}
938938

939-
#endif // FOUNDATION_FRAMEWORK
940-
941-
// MARK: - Disabled Tests
939+
// These tests require bundle language matching to be implemented
942940
extension LocaleTests {
943-
// TODO: Below can use @testable export of _Locale.localeIdentifierForCanonicalizedLocalizations(localizations, preferredLanguages, preferredLocaleID)
944-
/*
945-
#if FIXED_37256779 // The tests here depend on `_CFLocaleCreateLocaleIdentifierForAvailableLocalizations` being exposed for unit testing; however, that is not currently possible.
946-
- (void)testLocaleBundleMatching_modernLproj
947-
{
948-
CFArrayRef localizations = (CFArrayRef)@[ @"fr", @"en", @"de" ];
949-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"pa-IN", @"en-IN" ];
950-
CFStringRef preferredLocaleID = CFSTR("pa_IN");
951-
952-
NSString *expected = @"en_IN";
953-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
954-
XCTAssertEqualObjects((NSString *)actual, expected, @"Since `pa` is not in `localizations`, the locale should be an `en` locale based on `en` being in `localizations`.");
955-
if (actual) { CFRelease(actual); }
956-
}
957-
958-
- (void)testLocaleBundleMatching_en_US
959-
{
960-
CFArrayRef localizations = (CFArrayRef)@[ @"de", @"en", @"es", @"fr", @"zh-Hans" ];
961-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"en-US" ];
962-
CFStringRef preferredLocaleID = CFSTR("en_US");
963-
964-
NSString *expected = (NSString *)preferredLocaleID;
965-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
966-
XCTAssertEqualObjects((NSString *)actual, expected, @"`actual` should be same as `preferredLocaleID`, since the preferred language has a localization.");
967-
if (actual) { CFRelease(actual); }
968-
}
969-
970-
- (void)testLocaleBundleMatching_zh_CN
971-
{
972-
CFArrayRef localizations = (CFArrayRef)@[ @"de", @"en", @"es", @"fr", @"zh-Hans", @"zh-Hant" ];
973-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"zh-Hans-CN" ];
974-
CFStringRef preferredLocaleID = CFSTR("zh_CN");
975-
976-
NSString *expected = (NSString *)preferredLocaleID;
977-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
978-
XCTAssertEqualObjects((NSString *)actual, expected, @"`actual` should be same as `preferredLocaleID`, since the preferred language has a localization.");
979-
if (actual) { CFRelease(actual); }
980-
}
981-
982-
- (void)testLocaleBundleMatching_zh_MO
983-
{
984-
CFArrayRef localizations = (CFArrayRef)@[ @"de", @"en", @"es", @"fr", @"zh-Hans", @"zh-Hant" ];
985-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"zh-Hant-MO" ];
986-
CFStringRef preferredLocaleID = CFSTR("zh_MO");
987-
988-
NSString *expected = (NSString *)preferredLocaleID;
989-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
990-
XCTAssertEqualObjects((NSString *)actual, expected, @"`actual` should be same as `preferredLocaleID`, since the preferred language has a localization.");
991-
if (actual) { CFRelease(actual); }
992-
}
993-
994-
- (void)testLocaleBundleMatching_zh_MO_2
995-
{
996-
CFArrayRef localizations = (CFArrayRef)@[ @"de", @"en", @"es", @"fr", @"zh_CN", @"zh_TW" ];
997-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"zh-Hant-MO" ];
998-
CFStringRef preferredLocaleID = CFSTR("zh_MO");
999-
1000-
NSString *expected = (NSString *)preferredLocaleID;
1001-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
1002-
XCTAssertEqualObjects((NSString *)actual, expected, @"`actual` should be same as `preferredLocaleID`, since the preferred language has a localization.");
1003-
if (actual) { CFRelease(actual); }
1004-
}
1005-
1006-
- (void)testLocaleBundleMatching_th_TH
1007-
{
1008-
CFArrayRef localizations = (CFArrayRef)@[ @"de", @"en", @"es", @"fr", @"zh_CN", @"zh_TW" ];
1009-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"th-TH" ];
1010-
CFStringRef preferredLocaleID = CFSTR("th_TH");
1011-
1012-
NSString *expected = @"en_TH";
1013-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
1014-
XCTAssertEqualObjects((NSString *)actual, expected, @"Since `th` is not in `localizations`, the locale should be an `en` locale based on `en` being in `localizations` and being hard-coded as a default for such cases.");
1015-
if (actual) { CFRelease(actual); }
1016-
}
1017-
1018-
- (void)testLocaleBundleMatching_modernLproj_noOverlap
1019-
{
1020-
CFArrayRef localizations = (CFArrayRef)@[ @"fr", @"en", @"de" ];
1021-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"pa-IN", @"hi-IN" ];
1022-
CFStringRef preferredLocaleID = CFSTR("pa_IN");
1023-
1024-
NSString *expected = @"en_IN";
1025-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
1026-
XCTAssertEqualObjects((NSString *)actual, expected, @"Since neither `pa` nor `hi` are in `localizations`, the locale should be an `en` locale based on `en` being in `localizations` and being hard-coded as a default for such cases.");
1027-
if (actual) { CFRelease(actual); }
1028-
}
1029-
1030-
- (void)testLocaleBundleMatching_modernLproj_noOverlap_noEnglish
1031-
{
1032-
CFArrayRef localizations = (CFArrayRef)@[ @"fr", @"de" ];
1033-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"pa-IN", @"hi-IN" ];
1034-
CFStringRef preferredLocaleID = CFSTR("pa_IN");
1035-
1036-
NSString *expected = @"fr_IN";
1037-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
1038-
XCTAssertEqualObjects((NSString *)actual, expected, @"Since neither `pa` nor `hi` are in `localizations`, the locale should be an `fr` locale based on `fr` being #1 in `localizations` and `en` (the hard-coded default) not being present.");
1039-
if (actual) { CFRelease(actual); }
1040-
}
1041-
1042-
- (void)testLocaleBundleMatching_legacyLproj
1043-
{
1044-
CFArrayRef localizations = (CFArrayRef)@[ @"French", @"English", @"German" ];
1045-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"pa-IN", @"en-IN" ];
1046-
CFStringRef preferredLocaleID = CFSTR("pa_IN");
1047-
1048-
NSString *expected = @"en_IN";
1049-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
1050-
XCTAssertEqualObjects((NSString *)actual, expected, @"Since `pa` is not in `localizations`, the locale should be an `en` locale based on `English` being in `localizations`.");
1051-
if (actual) { CFRelease(actual); }
1052-
}
1053-
1054-
- (void)testLocaleBundleMatching_legacyLproj_noOverlap
1055-
{
1056-
CFArrayRef localizations = (CFArrayRef)@[ @"French", @"English", @"German" ];
1057-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"pa-IN", @"hi-IN" ];
1058-
CFStringRef preferredLocaleID = CFSTR("pa_IN");
941+
@Test func localeBundleMatching_modernLproj() {
942+
let result = Locale.localeIdentifierForCanonicalizedLocalizations(["fr", "en", "de"], preferredLanguages: ["pa-IN", "en-IN"], preferredLocaleID: "pa_IN")
943+
// Since `pa` is not in `localizations`, the locale should be an `en` locale based on `en` being in `localizations`
944+
#expect(result == "en_IN")
945+
}
1059946

1060-
NSString *expected = @"en_IN";
1061-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
1062-
XCTAssertEqualObjects((NSString *)actual, expected, @"Since `pa` is not in `localizations`, the locale should be an `en` locale based on `English` being in `localizations` and being hard-coded as a default for such cases.");
1063-
if (actual) { CFRelease(actual); }
1064-
}
947+
@Test func localeBundleMatching_en_US() {
948+
let actual = Locale.localeIdentifierForCanonicalizedLocalizations(["de", "en", "es", "fr", "zh-Hans"], preferredLanguages: ["en-US", ], preferredLocaleID: "en_US")
949+
#expect(actual == "en_US", "`actual` should be same as `preferredLocaleID`, since the preferred language has a localization.")
950+
}
1065951

1066-
- (void)testLocaleBundleMatching_legacyLproj_noOverlap_noEnglish
1067-
{
1068-
CFArrayRef localizations = (CFArrayRef)@[ @"German", @"French" ];
1069-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"pa-IN", @"hi-IN" ];
1070-
CFStringRef preferredLocaleID = CFSTR("pa_IN");
952+
@Test func localeBundleMatching_zh_CN() {
953+
let actual = Locale.localeIdentifierForCanonicalizedLocalizations(["de", "en", "es", "fr", "zh-Hans", "zh-Hant"], preferredLanguages: ["zh-Hans-CN"], preferredLocaleID: "zh_CN")
954+
#expect(actual == "zh_CN", "`actual` should be same as `preferredLocaleID`, since the preferred language has a localization.")
955+
}
1071956

1072-
NSString *expected = @"de_IN";
1073-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
1074-
XCTAssertEqualObjects((NSString *)actual, expected, @"Since neither `pa` nor `hi` are in `localizations`, the locale should be a `de` locale based on `German` being #1 in `localizations` and `en` (the hard-coded default) not being present.");
1075-
if (actual) { CFRelease(actual); }
1076-
}
957+
@Test func localeBundleMatching_zh_MO() {
958+
let actual = Locale.localeIdentifierForCanonicalizedLocalizations(["de", "en", "es", "fr", "zh-Hans", "zh-Hant"], preferredLanguages: ["zh-Hant-MO"], preferredLocaleID: "zh_MO")
959+
#expect(actual == "zh_MO", "`actual` should be same as `preferredLocaleID`, since the preferred language has a localization.")
960+
}
1077961

1078-
- (void)testLocaleBundleMatching_nullOrEmptyArguments_1
1079-
{
1080-
CFArrayRef localizations = (CFArrayRef)@[ ];
1081-
CFArrayRef preferredLanguages = (CFArrayRef)@[ @"pa-IN", @"en-IN" ];
1082-
CFStringRef preferredLocaleID = CFSTR("pa_IN");
962+
@Test func localeBundleMatching_zh_MO_2() {
963+
let localizations = ["de", "en", "es", "fr", "zh_CN", "zh_TW"]
964+
let preferredLanguages = ["zh-Hant-MO"]
965+
let preferredLocaleID = "zh_MO"
966+
967+
let expected = preferredLocaleID
968+
let actual = Locale.localeIdentifierForCanonicalizedLocalizations(localizations, preferredLanguages: preferredLanguages, preferredLocaleID: preferredLocaleID)
969+
#expect(actual == expected, "`actual` should be same as `preferredLocaleID`, since the preferred language has a localization.")
970+
}
1083971

1084-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
1085-
XCTAssertNil((NSString *)actual);
1086-
if (actual) { CFRelease(actual); }
1087-
}
972+
@Test func localeBundleMatching_th_TH() {
973+
let localizations = ["de", "en", "es", "fr", "zh_CN", "zh_TW"]
974+
let preferredLanguages = ["th-TH"]
975+
let preferredLocaleID = "th_TH"
976+
977+
let expected = "en_TH"
978+
let actual = Locale.localeIdentifierForCanonicalizedLocalizations(localizations, preferredLanguages: preferredLanguages, preferredLocaleID: preferredLocaleID)
979+
#expect(actual == expected, "Since `th` is not in `localizations`, the locale should be an `en` locale based on `en` being in `localizations` and being hard-coded as a default for such cases.")
980+
}
1088981

1089-
- (void)testLocaleBundleMatching_nullOrEmptyArguments_2
1090-
{
1091-
CFArrayRef localizations = (CFArrayRef)@[ ];
1092-
CFArrayRef preferredLanguages = (CFArrayRef)@[ ];
1093-
CFStringRef preferredLocaleID = CFSTR("");
982+
@Test func localeBundleMatching_modernLproj_noOverlap() {
983+
let localizations = ["fr", "en", "de"]
984+
let preferredLanguages = ["pa-IN", "hi-IN"]
985+
let preferredLocaleID = "pa_IN"
986+
987+
let expected = "en_IN"
988+
let actual = Locale.localeIdentifierForCanonicalizedLocalizations(localizations, preferredLanguages: preferredLanguages, preferredLocaleID: preferredLocaleID)
989+
#expect(actual == expected, "Since neither `pa` nor `hi` are in `localizations`, the locale should be an `en` locale based on `en` being in `localizations` and being hard-coded as a default for such cases.")
990+
}
1094991

1095-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
1096-
XCTAssertNil((NSString *)actual);
1097-
if (actual) { CFRelease(actual); }
1098-
}
992+
@Test func localeBundleMatching_modernLproj_noOverlap_noEnglish() {
993+
let localizations = ["fr", "de"]
994+
let preferredLanguages = ["pa-IN", "hi-IN"]
995+
let preferredLocaleID = "pa_IN"
996+
997+
let expected = "fr_IN"
998+
let actual = Locale.localeIdentifierForCanonicalizedLocalizations(localizations, preferredLanguages: preferredLanguages, preferredLocaleID: preferredLocaleID)
999+
#expect(actual == expected, "Since neither `pa` nor `hi` are in `localizations`, the locale should be an `fr` locale based on `fr` being #1 in `localizations` and `en` (the hard-coded default) not being present.")
1000+
}
10991001

1100-
- (void)testLocaleBundleMatching_nullOrEmptyArguments_3
1101-
{
1102-
CFArrayRef localizations = NULL;
1103-
CFArrayRef preferredLanguages = NULL;
1104-
CFStringRef preferredLocaleID = NULL;
1002+
@Test func localeBundleMatching_nullOrEmptyArguments_1() {
1003+
let localizations: [String] = []
1004+
let preferredLanguages = ["pa-IN", "en-IN"]
1005+
let preferredLocaleID = "pa_IN"
1006+
1007+
let actual = Locale.localeIdentifierForCanonicalizedLocalizations(localizations, preferredLanguages: preferredLanguages, preferredLocaleID: preferredLocaleID)
1008+
#expect(actual == nil, "Empty localizations should return nil")
1009+
}
11051010

1106-
CFStringRef actual = _CFLocaleCreateLocaleIdentifierForAvailableLocalizations(localizations, preferredLanguages, preferredLocaleID);
1107-
XCTAssertNil((NSString *)actual);
1108-
if (actual) { CFRelease(actual); }
1109-
}
1011+
@Test func localeBundleMatching_nullOrEmptyArguments_2() {
1012+
let localizations: [String] = []
1013+
let preferredLanguages: [String] = []
1014+
let preferredLocaleID = ""
1015+
1016+
let actual = Locale.localeIdentifierForCanonicalizedLocalizations(localizations, preferredLanguages: preferredLanguages, preferredLocaleID: preferredLocaleID)
1017+
#expect(actual == nil, "Empty arrays should return nil")
1018+
}
11101019

1111-
#endif
1112-
*/
1020+
@Test func localeBundleMatching_emptyPreferredLocaleID() {
1021+
let localizations = ["en", "fr", "de"]
1022+
let preferredLanguages = ["pa-IN", "hi-IN"]
1023+
let preferredLocaleID = ""
1024+
1025+
let actual = Locale.localeIdentifierForCanonicalizedLocalizations(localizations, preferredLanguages: preferredLanguages, preferredLocaleID: preferredLocaleID)
1026+
#expect(actual == nil, "Empty preferred locale ID should return nil")
1027+
}
11131028
}
1029+
#endif // FOUNDATION_FRAMEWORK

0 commit comments

Comments
 (0)