//
//  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")
    }
}