diff --git a/Example/TSKitiOSTestApp/TSKitiOSTestApp.xcodeproj/project.pbxproj b/Example/TSKitiOSTestApp/TSKitiOSTestApp.xcodeproj/project.pbxproj index e668183de..7be549331 100644 --- a/Example/TSKitiOSTestApp/TSKitiOSTestApp.xcodeproj/project.pbxproj +++ b/Example/TSKitiOSTestApp/TSKitiOSTestApp.xcodeproj/project.pbxproj @@ -47,6 +47,7 @@ B6273DE11C13A2E500738558 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B6273DE01C13A2E500738558 /* Assets.xcassets */; }; B6273DE41C13A2E500738558 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B6273DE21C13A2E500738558 /* LaunchScreen.storyboard */; }; D2AECE731DE8C3360068CE15 /* ContactSortingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = D2AECE721DE8C3360068CE15 /* ContactSortingTest.m */; }; + E95668321E0964F9002418B1 /* PhoneNumberUtilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E95668311E0964F9002418B1 /* PhoneNumberUtilTest.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -117,6 +118,7 @@ C0DC1A83C39CBC09FB2405A3 /* libPods-TSKitiOSTestAppTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-TSKitiOSTestAppTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; D2AECE721DE8C3360068CE15 /* ContactSortingTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ContactSortingTest.m; path = ../../../tests/Contacts/ContactSortingTest.m; sourceTree = ""; }; D3737F7A041D7147015C02C2 /* Pods-TSKitiOSTestAppTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TSKitiOSTestAppTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-TSKitiOSTestAppTests/Pods-TSKitiOSTestAppTests.release.xcconfig"; sourceTree = ""; }; + E95668311E0964F9002418B1 /* PhoneNumberUtilTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PhoneNumberUtilTest.m; path = ../../../tests/Contacts/PhoneNumberUtilTest.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -210,12 +212,13 @@ 459850BF1D22C6C4006FFEDB /* Contacts */ = { isa = PBXGroup; children = ( + D2AECE721DE8C3360068CE15 /* ContactSortingTest.m */, + 45B700961D9841E400269FFD /* OWSDisappearingMessagesConfigurationTest.m */, 459850C01D22C6F2006FFEDB /* PhoneNumberTest.m */, + E95668311E0964F9002418B1 /* PhoneNumberUtilTest.m */, 452EE6CE1D4A754C00E934BA /* TSThreadTest.m */, - 45B700961D9841E400269FFD /* OWSDisappearingMessagesConfigurationTest.m */, 4516E3E71DD153CC00DC4206 /* TSGroupThreadTest.m */, 4516E3E91DD1542300DC4206 /* TSContactThreadTest.m */, - D2AECE721DE8C3360068CE15 /* ContactSortingTest.m */, ); name = Contacts; sourceTree = ""; @@ -569,6 +572,7 @@ 4516E3EA1DD1542300DC4206 /* TSContactThreadTest.m in Sources */, 45458B771CC342B600A02153 /* TSMessageStorageTests.m in Sources */, 45046FE01D95A6130015EFF2 /* TSMessagesManagerTest.m in Sources */, + E95668321E0964F9002418B1 /* PhoneNumberUtilTest.m in Sources */, 45458B7C1CC342B600A02153 /* MessagePaddingTests.m in Sources */, 45A856AC1D220BFF0056CD4D /* TSAttributesTest.m in Sources */, 45731A6C1DA87AA1007E22AA /* TSOutgoingMessageTest.m in Sources */, diff --git a/src/Contacts/PhoneNumberUtil.h b/src/Contacts/PhoneNumberUtil.h index ff0e24275..ebcb0615a 100644 --- a/src/Contacts/PhoneNumberUtil.h +++ b/src/Contacts/PhoneNumberUtil.h @@ -10,6 +10,8 @@ @property (nonatomic, retain) NBPhoneNumberUtil *nbPhoneNumberUtil; ++ (BOOL)name:(NSString *)nameString matchesQuery:(NSString *)queryString; + + (NSString *)callingCodeFromCountryCode:(NSString *)countryCode; + (NSString *)countryNameFromCountryCode:(NSString *)countryCode; + (NSArray *)countryCodesForSearchTerm:(NSString *)searchTerm; diff --git a/src/Contacts/PhoneNumberUtil.m b/src/Contacts/PhoneNumberUtil.m index 773c71fb2..eabc512f4 100644 --- a/src/Contacts/PhoneNumberUtil.m +++ b/src/Contacts/PhoneNumberUtil.m @@ -5,7 +5,6 @@ #import "PhoneNumberUtil.h" #import "ContactsManagerProtocol.h" #import "FunctionalUtil.h" -#import "TextSecureKitEnv.h" #import "Util.h" @implementation PhoneNumberUtil @@ -97,6 +96,21 @@ return countryCodes; } ++ (BOOL)name:(NSString *)nameString matchesQuery:(NSString *)queryString { + NSCharacterSet *whitespaceSet = NSCharacterSet.whitespaceCharacterSet; + NSArray *queryStrings = [queryString componentsSeparatedByCharactersInSet:whitespaceSet]; + NSArray *nameStrings = [nameString componentsSeparatedByCharactersInSet:whitespaceSet]; + + return [queryStrings all:^int(NSString *query) { + if (query.length == 0) + return YES; + return [nameStrings any:^int(NSString *nameWord) { + NSStringCompareOptions searchOpts = NSCaseInsensitiveSearch | NSAnchoredSearch; + return [nameWord rangeOfString:query options:searchOpts].location != NSNotFound; + }]; + }]; +} + // search term -> country codes + (NSArray *)countryCodesForSearchTerm:(NSString *)searchTerm { searchTerm = [searchTerm stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; @@ -113,10 +127,11 @@ return NO; } - if ([[[TextSecureKitEnv sharedEnv].contactsManager class] name:countryName matchesQuery:searchTerm]) { + if ([self name:countryName matchesQuery:searchTerm]) { return YES; } - if ([[[TextSecureKitEnv sharedEnv].contactsManager class] name:countryCode matchesQuery:searchTerm]) { + + if ([self name:countryCode matchesQuery:searchTerm]) { return YES; } diff --git a/src/Protocols/ContactsManagerProtocol.h b/src/Protocols/ContactsManagerProtocol.h index e55cf9137..64317fa58 100644 --- a/src/Protocols/ContactsManagerProtocol.h +++ b/src/Protocols/ContactsManagerProtocol.h @@ -9,7 +9,6 @@ - (NSString * _Nonnull)displayNameForPhoneIdentifier:(NSString * _Nullable)phoneNumber; - (NSArray * _Nonnull)signalContacts; -+ (BOOL)name:(NSString * _Nonnull)nameString matchesQuery:(NSString * _Nonnull)queryString; #if TARGET_OS_IPHONE - (UIImage * _Nullable)imageForPhoneIdentifier:(NSString * _Nullable)phoneNumber; diff --git a/tests/Contacts/PhoneNumberTest.m b/tests/Contacts/PhoneNumberTest.m index 009afbba4..0206deb64 100644 --- a/tests/Contacts/PhoneNumberTest.m +++ b/tests/Contacts/PhoneNumberTest.m @@ -1,9 +1,5 @@ // -// PhoneNumberTest.m -// Signal -// -// Created by Michael Kirk on 6/28/16. -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. // #import @@ -15,6 +11,22 @@ @implementation PhoneNumberTest +-(void)testE164 { + XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromText:@"+1 (902) 555-5555" fromRegion:@"US"] toE164]); + XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromText:@"1 (902) 555-5555" fromRegion:@"US"] toE164]); + XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromText:@"1-902-555-5555" fromRegion:@"US"] toE164]); + XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromText:@"1-902-555-5555" fromRegion:@"US"] toE164]); + + // Phone numbers missing a calling code. + XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromText:@"9025555555" fromRegion:@"US"] toE164]); + + // Phone numbers with a calling code but without a plus + XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromText:@"19025555555" fromRegion:@"US"] toE164]); + + // Empty input. + XCTAssertEqualObjects(nil, [[PhoneNumber tryParsePhoneNumberFromText:@"" fromRegion:@"US"] toE164]); +} + - (void)testTryParsePhoneNumberFromUserSpecifiedTextAssumesLocalRegion { PhoneNumber *actual = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"3235551234"]; XCTAssertEqualObjects(@"+13235551234", [actual toE164]); diff --git a/tests/Contacts/PhoneNumberUtilTest.m b/tests/Contacts/PhoneNumberUtilTest.m new file mode 100644 index 000000000..188d1c391 --- /dev/null +++ b/tests/Contacts/PhoneNumberUtilTest.m @@ -0,0 +1,205 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +#import "PhoneNumberUtil.h" +#import + +@interface PhoneNumberUtilTest : XCTestCase + +@end + +@implementation PhoneNumberUtilTest + +- (void)testQueryMatching +{ + XCTAssertTrue([PhoneNumberUtil name:@"dave" matchesQuery:@"dave"]); + XCTAssertTrue([PhoneNumberUtil name:@"big dave" matchesQuery:@"big dave"]); + XCTAssertTrue([PhoneNumberUtil name:@"big dave" matchesQuery:@"big dave dave"]); + XCTAssertTrue([PhoneNumberUtil name:@"big big dave" matchesQuery:@"big dave"]); + XCTAssertTrue([PhoneNumberUtil name:@"big dave" matchesQuery:@"dave big"]); + XCTAssertTrue([PhoneNumberUtil name:@"big dave" matchesQuery:@"dave"]); + XCTAssertTrue([PhoneNumberUtil name:@"big dave" matchesQuery:@"big"]); + XCTAssertTrue([PhoneNumberUtil name:@"big dave" matchesQuery:@"big "]); + XCTAssertTrue([PhoneNumberUtil name:@"big dave" matchesQuery:@" big "]); + XCTAssertTrue([PhoneNumberUtil name:@"big dave" matchesQuery:@"dav"]); + XCTAssertTrue([PhoneNumberUtil name:@"big dave" matchesQuery:@"bi dav"]); + XCTAssertTrue([PhoneNumberUtil name:@"big dave" + matchesQuery:@"big big big big big big big big big big dave dave dave dave dave"]); + + XCTAssertFalse([PhoneNumberUtil name:@"big dave" matchesQuery:@"ave"]); + XCTAssertFalse([PhoneNumberUtil name:@"big dave" matchesQuery:@"dare"]); + XCTAssertFalse([PhoneNumberUtil name:@"big dave" matchesQuery:@"mike"]); + XCTAssertFalse([PhoneNumberUtil name:@"dave" matchesQuery:@"big"]); +} + +- (void)testTranslateCursorPosition +{ + XCTAssertThrows([PhoneNumberUtil translateCursorPosition:0 from:nil to:@"" stickingRightward:true]); + XCTAssertThrows([PhoneNumberUtil translateCursorPosition:0 from:@"" to:nil stickingRightward:true]); + XCTAssertThrows([PhoneNumberUtil translateCursorPosition:1 from:@"" to:@"" stickingRightward:true]); + + XCTAssertEqual(0, [PhoneNumberUtil translateCursorPosition:0 from:@"" to:@"" stickingRightward:true]); + XCTAssertEqual(0, [PhoneNumberUtil translateCursorPosition:0 from:@"12" to:@"1" stickingRightward:true]); + XCTAssertEqual(1, [PhoneNumberUtil translateCursorPosition:1 from:@"12" to:@"1" stickingRightward:true]); + XCTAssertEqual(1, [PhoneNumberUtil translateCursorPosition:2 from:@"12" to:@"1" stickingRightward:true]); + + XCTAssertEqual(0, [PhoneNumberUtil translateCursorPosition:0 from:@"1" to:@"12" stickingRightward:false]); + XCTAssertEqual(0, [PhoneNumberUtil translateCursorPosition:0 from:@"1" to:@"12" stickingRightward:true]); + XCTAssertEqual(1, [PhoneNumberUtil translateCursorPosition:1 from:@"1" to:@"12" stickingRightward:false]); + XCTAssertEqual(2, [PhoneNumberUtil translateCursorPosition:1 from:@"1" to:@"12" stickingRightward:true]); + + XCTAssertEqual(0, [PhoneNumberUtil translateCursorPosition:0 from:@"12" to:@"132" stickingRightward:false]); + XCTAssertEqual(0, [PhoneNumberUtil translateCursorPosition:0 from:@"12" to:@"132" stickingRightward:true]); + XCTAssertEqual(1, [PhoneNumberUtil translateCursorPosition:1 from:@"12" to:@"132" stickingRightward:false]); + XCTAssertEqual(2, [PhoneNumberUtil translateCursorPosition:1 from:@"12" to:@"132" stickingRightward:true]); + XCTAssertEqual(3, [PhoneNumberUtil translateCursorPosition:2 from:@"12" to:@"132" stickingRightward:false]); + XCTAssertEqual(3, [PhoneNumberUtil translateCursorPosition:2 from:@"12" to:@"132" stickingRightward:true]); + + XCTAssertEqual(0, + [PhoneNumberUtil translateCursorPosition:0 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:true]); + XCTAssertEqual(1, + [PhoneNumberUtil translateCursorPosition:1 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:true]); + XCTAssertEqual(2, + [PhoneNumberUtil translateCursorPosition:2 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:true]); + XCTAssertEqual(3, + [PhoneNumberUtil translateCursorPosition:3 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:true]); + XCTAssertEqual(3, + [PhoneNumberUtil translateCursorPosition:4 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:true]); + XCTAssertEqual(3, + [PhoneNumberUtil translateCursorPosition:5 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:true]); + XCTAssertEqual(6, + [PhoneNumberUtil translateCursorPosition:6 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:true]); + XCTAssertEqual(7, + [PhoneNumberUtil translateCursorPosition:7 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:true]); + XCTAssertEqual(8, + [PhoneNumberUtil translateCursorPosition:8 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:true]); + XCTAssertEqual(8, + [PhoneNumberUtil translateCursorPosition:9 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:true]); + + XCTAssertEqual(0, + [PhoneNumberUtil translateCursorPosition:0 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:false]); + XCTAssertEqual(1, + [PhoneNumberUtil translateCursorPosition:1 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:false]); + XCTAssertEqual(2, + [PhoneNumberUtil translateCursorPosition:2 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:false]); + XCTAssertEqual(3, + [PhoneNumberUtil translateCursorPosition:3 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:false]); + XCTAssertEqual(3, + [PhoneNumberUtil translateCursorPosition:4 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:false]); + XCTAssertEqual(3, + [PhoneNumberUtil translateCursorPosition:5 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:false]); + XCTAssertEqual(4, + [PhoneNumberUtil translateCursorPosition:6 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:false]); + XCTAssertEqual(7, + [PhoneNumberUtil translateCursorPosition:7 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:false]); + XCTAssertEqual(8, + [PhoneNumberUtil translateCursorPosition:8 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:false]); + XCTAssertEqual(8, + [PhoneNumberUtil translateCursorPosition:9 from:@"(55) 123-4567" to:@"(551) 234-567" stickingRightward:false]); + + XCTAssertEqual(0, + [PhoneNumberUtil translateCursorPosition:0 from:@"(5551) 234-567" to:@"(555) 123-4567" stickingRightward:true]); + XCTAssertEqual(1, + [PhoneNumberUtil translateCursorPosition:1 from:@"(5551) 234-567" to:@"(555) 123-4567" stickingRightward:true]); + XCTAssertEqual(2, + [PhoneNumberUtil translateCursorPosition:2 from:@"(5551) 234-567" to:@"(555) 123-4567" stickingRightward:true]); + XCTAssertEqual(3, + [PhoneNumberUtil translateCursorPosition:3 from:@"(5551) 234-567" to:@"(555) 123-4567" stickingRightward:true]); + XCTAssertEqual(6, + [PhoneNumberUtil translateCursorPosition:4 from:@"(5551) 234-567" to:@"(555) 123-4567" stickingRightward:true]); + XCTAssertEqual(7, + [PhoneNumberUtil translateCursorPosition:5 from:@"(5551) 234-567" to:@"(555) 123-4567" stickingRightward:true]); + + XCTAssertEqual(0, + [PhoneNumberUtil translateCursorPosition:0 + from:@"(5551) 234-567" + to:@"(555) 123-4567" + stickingRightward:false]); + XCTAssertEqual(1, + [PhoneNumberUtil translateCursorPosition:1 + from:@"(5551) 234-567" + to:@"(555) 123-4567" + stickingRightward:false]); + XCTAssertEqual(2, + [PhoneNumberUtil translateCursorPosition:2 + from:@"(5551) 234-567" + to:@"(555) 123-4567" + stickingRightward:false]); + XCTAssertEqual(3, + [PhoneNumberUtil translateCursorPosition:3 + from:@"(5551) 234-567" + to:@"(555) 123-4567" + stickingRightward:false]); + XCTAssertEqual(4, + [PhoneNumberUtil translateCursorPosition:4 + from:@"(5551) 234-567" + to:@"(555) 123-4567" + stickingRightward:false]); + XCTAssertEqual(7, + [PhoneNumberUtil translateCursorPosition:5 + from:@"(5551) 234-567" + to:@"(555) 123-4567" + stickingRightward:false]); +} + +- (void)testCallingCodeFromCountryCode +{ + XCTAssertEqualObjects([PhoneNumberUtil callingCodeFromCountryCode:@"US"], @"+1"); + XCTAssertEqualObjects([PhoneNumberUtil callingCodeFromCountryCode:@"GB"], @"+44"); + // Invalid country code. + XCTAssertEqualObjects([PhoneNumberUtil callingCodeFromCountryCode:@"EK"], @"+0"); + XCTAssertEqualObjects([PhoneNumberUtil callingCodeFromCountryCode:@"ZZZ"], @"+0"); + XCTAssertEqualObjects([PhoneNumberUtil callingCodeFromCountryCode:nil], @"+0"); +} + +- (void)testCountryNameFromCountryCode +{ + XCTAssertEqualObjects([PhoneNumberUtil countryNameFromCountryCode:@"US"], @"United States"); + XCTAssertEqualObjects([PhoneNumberUtil countryNameFromCountryCode:@"GB"], @"United Kingdom"); + // Invalid country code. + XCTAssertEqualObjects([PhoneNumberUtil countryNameFromCountryCode:@"EK"], @"EK"); + XCTAssertEqualObjects([PhoneNumberUtil countryNameFromCountryCode:@"ZZZ"], @"ZZZ"); + XCTAssertThrows([PhoneNumberUtil countryNameFromCountryCode:nil]); +} + +- (void)testCountryCodesForSearchTerm +{ + // Empty search. + XCTAssertGreaterThan([PhoneNumberUtil countryCodesForSearchTerm:nil].count, (NSUInteger)30); + XCTAssertGreaterThan([PhoneNumberUtil countryCodesForSearchTerm:@""].count, (NSUInteger)30); + XCTAssertGreaterThan([PhoneNumberUtil countryCodesForSearchTerm:@" "].count, (NSUInteger)30); + + // Searches with no results. + XCTAssertEqual([PhoneNumberUtil countryCodesForSearchTerm:@" . "].count, (NSUInteger)0); + XCTAssertEqual([PhoneNumberUtil countryCodesForSearchTerm:@" XXXXX "].count, (NSUInteger)0); + XCTAssertEqual([PhoneNumberUtil countryCodesForSearchTerm:@" ! "].count, (NSUInteger)0); + + // Search by country code. + XCTAssertEqualObjects([PhoneNumberUtil countryCodesForSearchTerm:@"GB"], (@[ @"GB" ])); + XCTAssertEqualObjects([PhoneNumberUtil countryCodesForSearchTerm:@"gb"], (@[ @"GB" ])); + XCTAssertEqualObjects([PhoneNumberUtil countryCodesForSearchTerm:@"GB "], (@[ @"GB" ])); + XCTAssertEqualObjects([PhoneNumberUtil countryCodesForSearchTerm:@" GB"], (@[ @"GB" ])); + XCTAssertTrue([[PhoneNumberUtil countryCodesForSearchTerm:@" G"] containsObject:@"GB"]); + XCTAssertFalse([[PhoneNumberUtil countryCodesForSearchTerm:@" B"] containsObject:@"GB"]); + + // Search by country name. + XCTAssertEqualObjects([PhoneNumberUtil countryCodesForSearchTerm:@"united kingdom"], (@[ @"GB" ])); + XCTAssertEqualObjects([PhoneNumberUtil countryCodesForSearchTerm:@" UNITED KINGDOM "], (@[ @"GB" ])); + XCTAssertEqualObjects([PhoneNumberUtil countryCodesForSearchTerm:@" UNITED KING "], (@[ @"GB" ])); + XCTAssertEqualObjects([PhoneNumberUtil countryCodesForSearchTerm:@" UNI KING "], (@[ @"GB" ])); + XCTAssertEqualObjects([PhoneNumberUtil countryCodesForSearchTerm:@" u k "], (@[ @"GB" ])); + XCTAssertTrue([[PhoneNumberUtil countryCodesForSearchTerm:@" u"] containsObject:@"GB"]); + XCTAssertTrue([[PhoneNumberUtil countryCodesForSearchTerm:@" k"] containsObject:@"GB"]); + XCTAssertFalse([[PhoneNumberUtil countryCodesForSearchTerm:@" m"] containsObject:@"GB"]); + + // Search by calling code. + XCTAssertTrue([[PhoneNumberUtil countryCodesForSearchTerm:@" +44 "] containsObject:@"GB"]); + XCTAssertTrue([[PhoneNumberUtil countryCodesForSearchTerm:@" 44 "] containsObject:@"GB"]); + XCTAssertTrue([[PhoneNumberUtil countryCodesForSearchTerm:@" +4 "] containsObject:@"GB"]); + XCTAssertTrue([[PhoneNumberUtil countryCodesForSearchTerm:@" 4 "] containsObject:@"GB"]); + XCTAssertFalse([[PhoneNumberUtil countryCodesForSearchTerm:@" +123 "] containsObject:@"GB"]); + XCTAssertFalse([[PhoneNumberUtil countryCodesForSearchTerm:@" +444 "] containsObject:@"GB"]); +} + +@end