mirror of https://github.com/oxen-io/session-ios
commit
f167b08312
@ -1 +1 @@
|
|||||||
Subproject commit 58e7f2e84662e05d5d3f8664a4f93e4fd28f5b3f
|
Subproject commit cfe3608532c42224ce3f5c24295616862f884fc7
|
@ -1,157 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import XCTest
|
|
||||||
import PromiseKit
|
|
||||||
import SignalServiceKit
|
|
||||||
@testable import Session
|
|
||||||
|
|
||||||
struct VerificationFailedError: Error { }
|
|
||||||
struct FailedToGetRPRegistrationTokenError: Error { }
|
|
||||||
|
|
||||||
enum PushNotificationRequestResult: String {
|
|
||||||
case FailTSOnly = "FailTSOnly",
|
|
||||||
FailRPOnly = "FailRPOnly",
|
|
||||||
FailBoth = "FailBoth",
|
|
||||||
Succeed = "Succeed"
|
|
||||||
}
|
|
||||||
|
|
||||||
class FailingTSAccountManager: TSAccountManager {
|
|
||||||
override public init(primaryStorage: OWSPrimaryStorage) {
|
|
||||||
AssertIsOnMainThread()
|
|
||||||
|
|
||||||
super.init(primaryStorage: primaryStorage)
|
|
||||||
|
|
||||||
self.phoneNumberAwaitingVerification = "+13235555555"
|
|
||||||
}
|
|
||||||
|
|
||||||
override func verifyAccount(withCode: String,
|
|
||||||
pin: String?,
|
|
||||||
success: @escaping () -> Void, failure: @escaping (Error) -> Void) {
|
|
||||||
failure(VerificationFailedError())
|
|
||||||
}
|
|
||||||
|
|
||||||
override func registerForPushNotifications(pushToken: String, voipToken: String, isForcedUpdate: Bool, success successHandler: @escaping () -> Void, failure failureHandler: @escaping (Error) -> Void) {
|
|
||||||
if pushToken == PushNotificationRequestResult.FailTSOnly.rawValue || pushToken == PushNotificationRequestResult.FailBoth.rawValue {
|
|
||||||
failureHandler(OWSErrorMakeUnableToProcessServerResponseError())
|
|
||||||
} else {
|
|
||||||
successHandler()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class VerifyingTSAccountManager: FailingTSAccountManager {
|
|
||||||
override func verifyAccount(withCode: String,
|
|
||||||
pin: String?,
|
|
||||||
success: @escaping () -> Void, failure: @escaping (Error) -> Void) {
|
|
||||||
success()
|
|
||||||
}
|
|
||||||
|
|
||||||
override func performUpdateAccountAttributes() -> AnyPromise {
|
|
||||||
return AnyPromise(Promise.value(()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class TokenObtainingTSAccountManager: VerifyingTSAccountManager {
|
|
||||||
}
|
|
||||||
|
|
||||||
class VerifyingPushRegistrationManager: PushRegistrationManager {
|
|
||||||
public override func requestPushTokens() -> Promise<(pushToken: String, voipToken: String)> {
|
|
||||||
return Promise.value(("a", "b"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AccountManagerTest: SignalBaseTest {
|
|
||||||
|
|
||||||
override func setUp() {
|
|
||||||
super.setUp()
|
|
||||||
|
|
||||||
let tsAccountManager = FailingTSAccountManager(primaryStorage: OWSPrimaryStorage.shared())
|
|
||||||
let sskEnvironment = SSKEnvironment.shared as! MockSSKEnvironment
|
|
||||||
sskEnvironment.tsAccountManager = tsAccountManager
|
|
||||||
}
|
|
||||||
|
|
||||||
override func tearDown() {
|
|
||||||
super.tearDown()
|
|
||||||
}
|
|
||||||
|
|
||||||
func testRegisterWhenEmptyCode() {
|
|
||||||
let accountManager = AccountManager()
|
|
||||||
|
|
||||||
let expectation = self.expectation(description: "should fail")
|
|
||||||
|
|
||||||
firstly {
|
|
||||||
accountManager.register(verificationCode: "", pin: "")
|
|
||||||
}.done {
|
|
||||||
XCTFail("Should fail")
|
|
||||||
}.catch { error in
|
|
||||||
let nserror = error as NSError
|
|
||||||
if OWSErrorCode(rawValue: nserror.code) == OWSErrorCode.userError {
|
|
||||||
expectation.fulfill()
|
|
||||||
} else {
|
|
||||||
XCTFail("Unexpected error: \(error)")
|
|
||||||
}
|
|
||||||
}.retainUntilComplete()
|
|
||||||
|
|
||||||
self.waitForExpectations(timeout: 1.0, handler: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testRegisterWhenVerificationFails() {
|
|
||||||
let accountManager = AccountManager()
|
|
||||||
|
|
||||||
let expectation = self.expectation(description: "should fail")
|
|
||||||
|
|
||||||
firstly {
|
|
||||||
accountManager.register(verificationCode: "123456", pin: "")
|
|
||||||
}.done {
|
|
||||||
XCTFail("Should fail")
|
|
||||||
}.catch { error in
|
|
||||||
if error is VerificationFailedError {
|
|
||||||
expectation.fulfill()
|
|
||||||
} else {
|
|
||||||
XCTFail("Unexpected error: \(error)")
|
|
||||||
}
|
|
||||||
}.retainUntilComplete()
|
|
||||||
|
|
||||||
self.waitForExpectations(timeout: 1.0, handler: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testSuccessfulRegistration() {
|
|
||||||
let tsAccountManager = TokenObtainingTSAccountManager(primaryStorage: OWSPrimaryStorage.shared())
|
|
||||||
let sskEnvironment = SSKEnvironment.shared as! MockSSKEnvironment
|
|
||||||
sskEnvironment.tsAccountManager = tsAccountManager
|
|
||||||
|
|
||||||
AppEnvironment.shared.pushRegistrationManager = VerifyingPushRegistrationManager()
|
|
||||||
|
|
||||||
let accountManager = AccountManager()
|
|
||||||
|
|
||||||
let expectation = self.expectation(description: "should succeed")
|
|
||||||
|
|
||||||
firstly {
|
|
||||||
accountManager.register(verificationCode: "123456", pin: "")
|
|
||||||
}.done {
|
|
||||||
expectation.fulfill()
|
|
||||||
}.catch { error in
|
|
||||||
XCTFail("Unexpected error: \(error)")
|
|
||||||
}.retainUntilComplete()
|
|
||||||
|
|
||||||
self.waitForExpectations(timeout: 1.0, handler: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testUpdatePushTokens() {
|
|
||||||
let accountManager = AccountManager()
|
|
||||||
|
|
||||||
let expectation = self.expectation(description: "should fail")
|
|
||||||
|
|
||||||
firstly {
|
|
||||||
accountManager.updatePushTokens(pushToken: PushNotificationRequestResult.FailTSOnly.rawValue, voipToken: "whatever", isForcedUpdate: false)
|
|
||||||
}.done {
|
|
||||||
XCTFail("Expected to fail.")
|
|
||||||
}.catch { _ in
|
|
||||||
expectation.fulfill()
|
|
||||||
}.retainUntilComplete()
|
|
||||||
|
|
||||||
self.waitForExpectations(timeout: 1.0, handler: nil)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,69 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import XCTest
|
|
||||||
import Session
|
|
||||||
|
|
||||||
class PhoneNumberValidatorTest: SignalBaseTest {
|
|
||||||
|
|
||||||
func assertValid(e164: String,
|
|
||||||
file: StaticString = #file,
|
|
||||||
line: UInt = #line) {
|
|
||||||
let validator = PhoneNumberValidator()
|
|
||||||
guard let phoneNumber = PhoneNumber(fromE164: e164) else {
|
|
||||||
XCTFail("unparseable phone number", file: file, line: line)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let isValid = validator.isValidForRegistration(phoneNumber: phoneNumber)
|
|
||||||
XCTAssertTrue(isValid, file: file, line: line)
|
|
||||||
}
|
|
||||||
|
|
||||||
func assertInvalid(e164: String,
|
|
||||||
file: StaticString = #file,
|
|
||||||
line: UInt = #line) {
|
|
||||||
let validator = PhoneNumberValidator()
|
|
||||||
guard let phoneNumber = PhoneNumber(fromE164: e164) else {
|
|
||||||
XCTFail("unparseable phone number", file: file, line: line)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let isValid = validator.isValidForRegistration(phoneNumber: phoneNumber)
|
|
||||||
XCTAssertFalse(isValid, file: file, line: line)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testUnitedStates() {
|
|
||||||
// valid us number
|
|
||||||
assertValid(e164: "+13235551234")
|
|
||||||
|
|
||||||
// too short
|
|
||||||
assertInvalid(e164: "+1323555123")
|
|
||||||
|
|
||||||
// too long
|
|
||||||
assertInvalid(e164: "+132355512345")
|
|
||||||
|
|
||||||
// not a US phone number
|
|
||||||
assertValid(e164: "+3235551234")
|
|
||||||
}
|
|
||||||
|
|
||||||
func testBrazil() {
|
|
||||||
// valid mobile
|
|
||||||
assertValid(e164: "+5532912345678")
|
|
||||||
|
|
||||||
// valid landline
|
|
||||||
assertValid(e164: "+553212345678")
|
|
||||||
|
|
||||||
// mobile length, but with out the leading '9'
|
|
||||||
assertInvalid(e164: "+5532812345678")
|
|
||||||
|
|
||||||
// too short
|
|
||||||
assertInvalid(e164: "+5532812345678")
|
|
||||||
|
|
||||||
// too long landline
|
|
||||||
assertInvalid(e164: "+5532123456789")
|
|
||||||
assertInvalid(e164: "+55321234567890")
|
|
||||||
|
|
||||||
// too long mobile
|
|
||||||
assertInvalid(e164: "+55329123456789")
|
|
||||||
assertInvalid(e164: "+553291234567890")
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,60 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import XCTest
|
|
||||||
@testable import SignalServiceKit
|
|
||||||
|
|
||||||
class ContactDiscoveryOperationTest: SignalBaseTest {
|
|
||||||
|
|
||||||
override func setUp() {
|
|
||||||
super.setUp()
|
|
||||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
||||||
}
|
|
||||||
|
|
||||||
override func tearDown() {
|
|
||||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
|
||||||
super.tearDown()
|
|
||||||
}
|
|
||||||
|
|
||||||
func tesBoolArrayFromEmptyData() {
|
|
||||||
let data = Data()
|
|
||||||
let bools = CDSBatchOperation.boolArray(data: data)
|
|
||||||
XCTAssert(bools == [])
|
|
||||||
}
|
|
||||||
|
|
||||||
func testBoolArrayFromFalseByte() {
|
|
||||||
let data = Data(repeating: 0x00, count: 4)
|
|
||||||
let bools = CDSBatchOperation.boolArray(data: data)
|
|
||||||
XCTAssert(bools == [false, false, false, false])
|
|
||||||
}
|
|
||||||
|
|
||||||
func testBoolArrayFromTrueByte() {
|
|
||||||
let data = Data(repeating: 0x01, count: 4)
|
|
||||||
let bools = CDSBatchOperation.boolArray(data: data)
|
|
||||||
XCTAssert(bools == [true, true, true, true])
|
|
||||||
}
|
|
||||||
|
|
||||||
func testBoolArrayFromMixedBytes() {
|
|
||||||
let data = Data(bytes: [0x01, 0x00, 0x01, 0x01])
|
|
||||||
let bools = CDSBatchOperation.boolArray(data: data)
|
|
||||||
XCTAssert(bools == [true, false, true, true])
|
|
||||||
}
|
|
||||||
|
|
||||||
func testEncodeNumber() {
|
|
||||||
let recipientIds = [ "+1011" ]
|
|
||||||
let actual = try! CDSBatchOperation.encodePhoneNumbers(recipientIds: recipientIds)
|
|
||||||
let expected: Data = Data(bytes: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf3])
|
|
||||||
|
|
||||||
XCTAssertEqual(expected, actual)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testEncodeMultipleNumber() {
|
|
||||||
let recipientIds = [ "+1011", "+15551231234"]
|
|
||||||
let actual = try! CDSBatchOperation.encodePhoneNumbers(recipientIds: recipientIds)
|
|
||||||
let expected: Data = Data(bytes: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf3,
|
|
||||||
0x00, 0x00, 0x00, 0x03, 0x9e, 0xec, 0xf5, 0x02])
|
|
||||||
|
|
||||||
XCTAssertEqual(expected, actual)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,83 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import XCTest
|
|
||||||
import Contacts
|
|
||||||
@testable import Session
|
|
||||||
|
|
||||||
final class ContactsPickerTest: SignalBaseTest {
|
|
||||||
private var prevLang: Any?
|
|
||||||
|
|
||||||
override func setUp() {
|
|
||||||
super.setUp()
|
|
||||||
|
|
||||||
prevLang = getLang()
|
|
||||||
}
|
|
||||||
|
|
||||||
override func tearDown() {
|
|
||||||
super.tearDown()
|
|
||||||
|
|
||||||
if let prevLang = prevLang {
|
|
||||||
setLang(value: prevLang)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func testContactSectionMatchesEmailFirstLetterWhenOnlyEmailContact() {
|
|
||||||
setLangEN()
|
|
||||||
|
|
||||||
let emailOnlyContactB = CNMutableContact()
|
|
||||||
emailOnlyContactB.emailAddresses.append(CNLabeledValue(label: nil, value: "bla@bla.com"))
|
|
||||||
|
|
||||||
let emailOnlyContactD = CNMutableContact()
|
|
||||||
emailOnlyContactD.emailAddresses.append(CNLabeledValue(label: nil, value: "dude@bla.com"))
|
|
||||||
|
|
||||||
let contactsPicker = ContactsPicker(allowsMultipleSelection: false, subtitleCellType: .phoneNumber)
|
|
||||||
let collatedContacts = contactsPicker.collatedContacts([emailOnlyContactB, emailOnlyContactD])
|
|
||||||
|
|
||||||
let sectionTitles = contactsPicker.collationForTests.sectionTitles
|
|
||||||
if let bIndex = sectionTitles.firstIndex(of: "B") {
|
|
||||||
let bSectionContacts = collatedContacts[bIndex]
|
|
||||||
XCTAssertEqual(bSectionContacts.first, emailOnlyContactB)
|
|
||||||
}
|
|
||||||
|
|
||||||
if let dIndex = sectionTitles.firstIndex(of: "D") {
|
|
||||||
let dSectionContacts = collatedContacts[dIndex]
|
|
||||||
XCTAssertEqual(dSectionContacts.first, emailOnlyContactD)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func testContactSectionMatchesNameFirstLetterWhenNameExistsInContact() {
|
|
||||||
setLangEN()
|
|
||||||
|
|
||||||
let nameAndEmailContact = CNMutableContact()
|
|
||||||
nameAndEmailContact.givenName = "Alice"
|
|
||||||
nameAndEmailContact.emailAddresses.append(CNLabeledValue(label: nil, value: "nameAndEmail@bla.com"))
|
|
||||||
|
|
||||||
let contactsPicker = ContactsPicker(allowsMultipleSelection: false, subtitleCellType: .phoneNumber)
|
|
||||||
let collatedContacts = contactsPicker.collatedContacts([nameAndEmailContact])
|
|
||||||
|
|
||||||
let sectionTitles = contactsPicker.collationForTests.sectionTitles
|
|
||||||
if let aIndex = sectionTitles.firstIndex(of: "A") {
|
|
||||||
let aSectionContacts = collatedContacts[aIndex]
|
|
||||||
XCTAssertEqual(aSectionContacts.first, nameAndEmailContact)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func setLangEN() {
|
|
||||||
setLang(value: "en")
|
|
||||||
}
|
|
||||||
|
|
||||||
private func setLang(value: Any) {
|
|
||||||
UserDefaults.standard.set(value, forKey: "AppleLanguages")
|
|
||||||
UserDefaults.standard.synchronize()
|
|
||||||
}
|
|
||||||
|
|
||||||
private func setLang(value: String) {
|
|
||||||
setLang(value: [value])
|
|
||||||
}
|
|
||||||
|
|
||||||
private func getLang() -> Any? {
|
|
||||||
return UserDefaults.standard.value(forKey: "AppleLanguages")
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,122 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "Contact.h"
|
|
||||||
#import "SSKBaseTestObjC.h"
|
|
||||||
|
|
||||||
@import Contacts;
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@interface ContactSortingTest : SSKBaseTestObjC
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation ContactSortingTest
|
|
||||||
|
|
||||||
- (void)setUp
|
|
||||||
{
|
|
||||||
[super setUp];
|
|
||||||
|
|
||||||
srandom((unsigned int)time(NULL));
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testSortingNamesByFirstLast
|
|
||||||
{
|
|
||||||
NSComparator comparator = [Contact comparatorSortingNamesByFirstThenLast:YES];
|
|
||||||
NSArray<Contact *>*sortedContacts = [self.class contactArrayForNames:@[@[@"Adam", @"Smith"],
|
|
||||||
@[@"Adam", @"West"],
|
|
||||||
@[@"", @"Daisy"],
|
|
||||||
@[@"Daisy", @"Chain"],
|
|
||||||
@[@"Daisy", @"Duke"],
|
|
||||||
@[@"James", @"Smith"],
|
|
||||||
@[@"James", @"Van"],
|
|
||||||
@[@"James", @"Van Der Beek"],
|
|
||||||
@[@"Kevin", @"Smith"],
|
|
||||||
@[@"Mae", @"West"],
|
|
||||||
@[@"Mary", @"Oliver"],
|
|
||||||
@[@"Mary Jo", @"Catlett"],
|
|
||||||
]];
|
|
||||||
NSUInteger numContacts = sortedContacts.count;
|
|
||||||
|
|
||||||
for (NSUInteger i = 0; i < 20; i++) {
|
|
||||||
NSArray *shuffledContacts = [self.class shuffleArray:sortedContacts];
|
|
||||||
NSArray *resortedContacts = [shuffledContacts sortedArrayUsingComparator:comparator];
|
|
||||||
for (NSUInteger j = 0; j < numContacts; j++) {
|
|
||||||
Contact *a = sortedContacts[j];
|
|
||||||
Contact *b = resortedContacts[j];
|
|
||||||
BOOL correct = ([a.firstName isEqualToString:b.firstName] && [a.lastName isEqualToString:b.lastName]);
|
|
||||||
if (!correct) {
|
|
||||||
XCTFail(@"Contacts failed to sort names by first, last");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testSortingNamesByLastFirst
|
|
||||||
{
|
|
||||||
NSComparator comparator = [Contact comparatorSortingNamesByFirstThenLast:NO];
|
|
||||||
NSArray<Contact *>*sortedContacts = [self.class contactArrayForNames:@[@[@"Mary Jo", @"Catlett"],
|
|
||||||
@[@"Daisy", @"Chain"],
|
|
||||||
@[@"", @"Daisy"],
|
|
||||||
@[@"Daisy", @"Duke"],
|
|
||||||
@[@"Mary", @"Oliver"],
|
|
||||||
@[@"Adam", @"Smith"],
|
|
||||||
@[@"James", @"Smith"],
|
|
||||||
@[@"Kevin", @"Smith"],
|
|
||||||
@[@"James", @"Van"],
|
|
||||||
@[@"James", @"Van Der Beek"],
|
|
||||||
@[@"Adam", @"West"],
|
|
||||||
@[@"Mae", @"West"],
|
|
||||||
]];
|
|
||||||
NSUInteger numContacts = sortedContacts.count;
|
|
||||||
|
|
||||||
for (NSUInteger i = 0; i < 20; i++) {
|
|
||||||
NSArray *shuffledContacts = [self.class shuffleArray:sortedContacts];
|
|
||||||
NSArray *resortedContacts = [shuffledContacts sortedArrayUsingComparator:comparator];
|
|
||||||
for (NSUInteger j = 0; j < numContacts; j++) {
|
|
||||||
Contact *a = sortedContacts[j];
|
|
||||||
Contact *b = resortedContacts[j];
|
|
||||||
BOOL correct = ([a.firstName isEqualToString:b.firstName] && [a.lastName isEqualToString:b.lastName]);
|
|
||||||
if (!correct) {
|
|
||||||
XCTFail(@"Contacts failed to sort names by last, first");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (NSArray<Contact *> *)contactArrayForNames:(NSArray<NSArray<NSString *>*>*)namePairs
|
|
||||||
{
|
|
||||||
NSMutableArray<Contact *>*contacts = [[NSMutableArray alloc] initWithCapacity:namePairs.count];
|
|
||||||
for (NSArray<NSString *>*namePair in namePairs) {
|
|
||||||
|
|
||||||
CNMutableContact *cnContact = [CNMutableContact new];
|
|
||||||
cnContact.givenName = namePair[0];
|
|
||||||
cnContact.familyName = namePair[1];
|
|
||||||
|
|
||||||
Contact *c = [[Contact alloc] initWithSystemContact:cnContact];
|
|
||||||
|
|
||||||
[contacts addObject:c];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [contacts copy]; // Return an immutable for good hygene
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (NSArray*)shuffleArray:(NSArray *)array
|
|
||||||
{
|
|
||||||
NSMutableArray *shuffled = [[NSMutableArray alloc] initWithArray:array];
|
|
||||||
|
|
||||||
for(NSUInteger i = [array count]; i > 1; i--) {
|
|
||||||
NSUInteger j = arc4random_uniform((uint32_t)i);
|
|
||||||
[shuffled exchangeObjectAtIndex:(i - 1) withObjectAtIndex:j];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [shuffled copy]; // Return an immutable for good hygene
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
@ -1,202 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "PhoneNumber.h"
|
|
||||||
#import "SSKBaseTestObjC.h"
|
|
||||||
|
|
||||||
@interface PhoneNumberTest : SSKBaseTestObjC
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
|
|
||||||
@implementation PhoneNumberTest
|
|
||||||
|
|
||||||
-(void)testE164 {
|
|
||||||
XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"+1 (902) 555-5555"] toE164]);
|
|
||||||
XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"1 (902) 555-5555"] toE164]);
|
|
||||||
XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"1-902-555-5555"] toE164]);
|
|
||||||
|
|
||||||
// Phone numbers missing a calling code.
|
|
||||||
XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"9025555555"] toE164]);
|
|
||||||
|
|
||||||
// Phone numbers with a calling code but without a plus
|
|
||||||
XCTAssertEqualObjects(@"+19025555555", [[PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"19025555555"] toE164]);
|
|
||||||
|
|
||||||
// Empty input.
|
|
||||||
XCTAssertEqualObjects(nil, [[PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@""] toE164]);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testTryParsePhoneNumberFromUserSpecifiedTextAssumesLocalRegion {
|
|
||||||
PhoneNumber *actual = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"3235551234"];
|
|
||||||
XCTAssertEqualObjects(@"+13235551234", [actual toE164]);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testTryParsePhoneNumberFromUserSpecifiedTextWithExplicitRegionCode {
|
|
||||||
PhoneNumber *actual = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"+33 1 70 39 38 00"];
|
|
||||||
XCTAssertEqualObjects(@"+33170393800", [actual toE164]);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testTryParsePhoneNumberFromUserSpecifiedTextWithoutPlus {
|
|
||||||
PhoneNumber *actual = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"33 1 70 39 38 00"];
|
|
||||||
|
|
||||||
// This might not be desired, but documents existing behavior.
|
|
||||||
// You *must* include a plus when dialing outside of your locale.
|
|
||||||
XCTAssertEqualObjects(@"+133170393800", [actual toE164]);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testTryParsePhoneNumberFromUserSpecifiedTextRemovesAnyFormatting {
|
|
||||||
PhoneNumber *actual = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"323 555 1234"];
|
|
||||||
XCTAssertEqualObjects(@"+13235551234", [actual toE164]);
|
|
||||||
|
|
||||||
actual = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"323-555-1234"];
|
|
||||||
XCTAssertEqualObjects(@"+13235551234", [actual toE164]);
|
|
||||||
|
|
||||||
actual = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"323.555.1234"];
|
|
||||||
XCTAssertEqualObjects(@"+13235551234", [actual toE164]);
|
|
||||||
|
|
||||||
actual = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:@"1-323-555-1234"];
|
|
||||||
XCTAssertEqualObjects(@"+13235551234", [actual toE164]);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSArray<NSString *> *)unpackTryParsePhoneNumbersFromsUserSpecifiedText:(NSString *)text
|
|
||||||
clientPhoneNumber:(NSString *)clientPhoneNumber
|
|
||||||
{
|
|
||||||
NSArray<PhoneNumber *> *phoneNumbers =
|
|
||||||
[PhoneNumber tryParsePhoneNumbersFromsUserSpecifiedText:text clientPhoneNumber:clientPhoneNumber];
|
|
||||||
NSMutableArray<NSString *> *result = [NSMutableArray new];
|
|
||||||
for (PhoneNumber *phoneNumber in phoneNumbers) {
|
|
||||||
[result addObject:phoneNumber.toE164];
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testTryParsePhoneNumbersFromsUserSpecifiedText_SimpleUSA
|
|
||||||
{
|
|
||||||
NSArray<NSString *> *parsed =
|
|
||||||
[self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"323 555 1234" clientPhoneNumber:@"+13213214321"];
|
|
||||||
XCTAssertTrue(parsed.count >= 1);
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+13235551234"]);
|
|
||||||
XCTAssertEqualObjects(parsed.firstObject, @"+13235551234");
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"323-555-1234" clientPhoneNumber:@"+13213214321"];
|
|
||||||
XCTAssertTrue(parsed.count >= 1);
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+13235551234"]);
|
|
||||||
XCTAssertEqualObjects(parsed.firstObject, @"+13235551234");
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"323.555.1234" clientPhoneNumber:@"+13213214321"];
|
|
||||||
XCTAssertTrue(parsed.count >= 1);
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+13235551234"]);
|
|
||||||
XCTAssertEqualObjects(parsed.firstObject, @"+13235551234");
|
|
||||||
|
|
||||||
parsed =
|
|
||||||
[self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"1-323-555-1234" clientPhoneNumber:@"+13213214321"];
|
|
||||||
XCTAssertTrue(parsed.count >= 1);
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+13235551234"]);
|
|
||||||
XCTAssertEqualObjects(parsed.firstObject, @"+13235551234");
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"+13235551234" clientPhoneNumber:@"+13213214321"];
|
|
||||||
XCTAssertTrue(parsed.count >= 1);
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+13235551234"]);
|
|
||||||
XCTAssertEqualObjects(parsed.firstObject, @"+13235551234");
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testTryParsePhoneNumbersFromsUserSpecifiedText_Mexico1
|
|
||||||
{
|
|
||||||
NSArray<NSString *> *parsed =
|
|
||||||
[self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"528341639157" clientPhoneNumber:@"+528341639144"];
|
|
||||||
XCTAssertTrue(parsed.count >= 1);
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+528341639157"]);
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"8341639157" clientPhoneNumber:@"+528341639144"];
|
|
||||||
XCTAssertTrue(parsed.count >= 1);
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+528341639157"]);
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"341639157" clientPhoneNumber:@"+528341639144"];
|
|
||||||
XCTAssertTrue(parsed.count >= 1);
|
|
||||||
// The parsing logic should try adding Mexico's national prefix for cell numbers "1"
|
|
||||||
// after the country code.
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+52341639157"]);
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+521341639157"]);
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"528341639157" clientPhoneNumber:@"+13213214321"];
|
|
||||||
XCTAssertTrue(parsed.count >= 1);
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+528341639157"]);
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"13235551234" clientPhoneNumber:@"+528341639144"];
|
|
||||||
XCTAssertTrue(parsed.count >= 1);
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+13235551234"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testMissingAreaCode_USA
|
|
||||||
{
|
|
||||||
// Add area code to numbers that look like "local" numbers
|
|
||||||
NSArray<NSString *> *parsed =
|
|
||||||
[self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"555-1234" clientPhoneNumber:@"+13233214321"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+13235551234"]);
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"5551234" clientPhoneNumber:@"+13233214321"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+13235551234"]);
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"555 1234" clientPhoneNumber:@"+13233214321"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+13235551234"]);
|
|
||||||
|
|
||||||
// Don't touch numbers that look like e164, even if they're the same length as a "local" us number
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"+5551234" clientPhoneNumber:@"+13213214321"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+5551234"]);
|
|
||||||
|
|
||||||
// Don't touch numbers that already have an area code
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"570 555 1234" clientPhoneNumber:@"+13233214321"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+15705551234"]);
|
|
||||||
|
|
||||||
// Don't touch numbers that are already in e164
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"+33170393800" clientPhoneNumber:@"+13213214321"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+33170393800"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testMissingAreaCode_Brazil
|
|
||||||
{
|
|
||||||
// Add area code to land-line numbers that look like "local" numbers
|
|
||||||
NSArray<NSString *> *parsed =
|
|
||||||
[self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"87654321" clientPhoneNumber:@"+5521912345678"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+552187654321"]);
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"8765-4321" clientPhoneNumber:@"+5521912345678"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+552187654321"]);
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"8765 4321" clientPhoneNumber:@"+5521912345678"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+552187654321"]);
|
|
||||||
|
|
||||||
// Add area code to mobile numbers that look like "local" numbers
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"987654321" clientPhoneNumber:@"+5521912345678"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+5521987654321"]);
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"9 8765-4321" clientPhoneNumber:@"+5521912345678"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+5521987654321"]);
|
|
||||||
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"9 8765 4321" clientPhoneNumber:@"+5521912345678"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+5521987654321"]);
|
|
||||||
|
|
||||||
// Don't touch numbers that look like e164, even if they're the same length as a "local" us number
|
|
||||||
parsed = [self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"+3365-4321" clientPhoneNumber:@"+5521912345678"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+33654321"]);
|
|
||||||
|
|
||||||
// Don't touch land-line numbers that already have an area code
|
|
||||||
parsed =
|
|
||||||
[self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"22 8765 4321" clientPhoneNumber:@"+5521912345678"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+552287654321"]);
|
|
||||||
|
|
||||||
// Don't touch mobile numbers that already have an area code
|
|
||||||
parsed =
|
|
||||||
[self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"22 9 8765 4321" clientPhoneNumber:@"+5521912345678"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+5522987654321"]);
|
|
||||||
|
|
||||||
// Don't touch numbers that are already in e164
|
|
||||||
parsed =
|
|
||||||
[self unpackTryParsePhoneNumbersFromsUserSpecifiedText:@"+33170393800" clientPhoneNumber:@"+5521912345678"];
|
|
||||||
XCTAssertTrue([parsed containsObject:@"+33170393800"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@end
|
|
@ -1,209 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "PhoneNumberUtil.h"
|
|
||||||
#import "SSKBaseTestObjC.h"
|
|
||||||
|
|
||||||
@interface PhoneNumberUtilTest : SSKBaseTestObjC
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation PhoneNumberUtilTest
|
|
||||||
|
|
||||||
#ifdef BROKEN_TESTS
|
|
||||||
|
|
||||||
- (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"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@end
|
|
@ -1,40 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
import SignalServiceKit
|
|
||||||
import XCTest
|
|
||||||
|
|
||||||
class OWSSignalAddressTest: SSKBaseTestSwift {
|
|
||||||
|
|
||||||
override func setUp() {
|
|
||||||
super.setUp()
|
|
||||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
||||||
}
|
|
||||||
|
|
||||||
override func tearDown() {
|
|
||||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
|
||||||
super.tearDown()
|
|
||||||
}
|
|
||||||
|
|
||||||
func testInitializer() {
|
|
||||||
let recipientId = "+13213214321"
|
|
||||||
let deviceId: UInt = 1
|
|
||||||
let address = try! OWSSignalAddress(recipientId: recipientId, deviceId: deviceId)
|
|
||||||
XCTAssertEqual(address.recipientId, recipientId)
|
|
||||||
XCTAssertEqual(address.deviceId, deviceId)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testInitializer_badRecipientId() {
|
|
||||||
let recipientId = ""
|
|
||||||
let deviceId: UInt = 1
|
|
||||||
XCTAssertThrowsError(try OWSSignalAddress(recipientId: recipientId, deviceId: deviceId))
|
|
||||||
}
|
|
||||||
|
|
||||||
func testInitializer_badDeviceId() {
|
|
||||||
let recipientId = "+13213214321"
|
|
||||||
let deviceId: UInt = 0
|
|
||||||
XCTAssertThrowsError(try OWSSignalAddress(recipientId: recipientId, deviceId: deviceId))
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "OWSAnalytics.h"
|
|
||||||
#import "SSKBaseTestObjC.h"
|
|
||||||
#import <SignalCoreKit/NSData+OWS.h>
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@interface OWSAnalyticsTests : SSKBaseTestObjC
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
#pragma mark -
|
|
||||||
|
|
||||||
@implementation OWSAnalyticsTests
|
|
||||||
|
|
||||||
- (void)testOrderOfMagnitudeOf
|
|
||||||
{
|
|
||||||
XCTAssertEqual(0, [OWSAnalytics orderOfMagnitudeOf:-1]);
|
|
||||||
XCTAssertEqual(0, [OWSAnalytics orderOfMagnitudeOf:0]);
|
|
||||||
XCTAssertEqual(1, [OWSAnalytics orderOfMagnitudeOf:1]);
|
|
||||||
XCTAssertEqual(1, [OWSAnalytics orderOfMagnitudeOf:5]);
|
|
||||||
XCTAssertEqual(1, [OWSAnalytics orderOfMagnitudeOf:9]);
|
|
||||||
XCTAssertEqual(10, [OWSAnalytics orderOfMagnitudeOf:10]);
|
|
||||||
XCTAssertEqual(10, [OWSAnalytics orderOfMagnitudeOf:11]);
|
|
||||||
XCTAssertEqual(10, [OWSAnalytics orderOfMagnitudeOf:19]);
|
|
||||||
XCTAssertEqual(10, [OWSAnalytics orderOfMagnitudeOf:99]);
|
|
||||||
XCTAssertEqual(100, [OWSAnalytics orderOfMagnitudeOf:100]);
|
|
||||||
XCTAssertEqual(100, [OWSAnalytics orderOfMagnitudeOf:303]);
|
|
||||||
XCTAssertEqual(100, [OWSAnalytics orderOfMagnitudeOf:999]);
|
|
||||||
XCTAssertEqual(1000, [OWSAnalytics orderOfMagnitudeOf:1000]);
|
|
||||||
XCTAssertEqual(1000, [OWSAnalytics orderOfMagnitudeOf:3030]);
|
|
||||||
XCTAssertEqual(10000, [OWSAnalytics orderOfMagnitudeOf:10000]);
|
|
||||||
XCTAssertEqual(10000, [OWSAnalytics orderOfMagnitudeOf:30303]);
|
|
||||||
XCTAssertEqual(10000, [OWSAnalytics orderOfMagnitudeOf:99999]);
|
|
||||||
XCTAssertEqual(100000, [OWSAnalytics orderOfMagnitudeOf:100000]);
|
|
||||||
XCTAssertEqual(100000, [OWSAnalytics orderOfMagnitudeOf:303030]);
|
|
||||||
XCTAssertEqual(100000, [OWSAnalytics orderOfMagnitudeOf:999999]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
Loading…
Reference in New Issue