import XCTest
@testable import PhoneNumber

class PhoneNumberTests: XCTestCase {
    func testValidWithTenDigits() {
        let startingNumber = "2234567890"
        let expected = "2234567890"
        let result = PhoneNumber(startingNumber)
        XCTAssertEqual(result.number, expected)
    }

    func testCleansNumber() {
        let startingNumber = "(223) 456-7890"
        let expected = "2234567890"
        let result = PhoneNumber(startingNumber)
        XCTAssertEqual(result.number, expected)
    }

    func testCleansNumberWithDots() {
        let startingNumber = "223.456.7890"
        let expected = "2234567890"
        let result = PhoneNumber(startingNumber)
        XCTAssertEqual(result.number, expected)
    }

    func testValidWithElevenDigitsAndFirstIsOne() {
        let startingNumber = "12234567890"
        let expected = "2234567890"
        let result = PhoneNumber(startingNumber)
        XCTAssertEqual(result.number, expected)
    }

    func testInvalidWhenElevenDigits() {
        let startingNumber = "21234567890"
        let expected = "0000000000"
        let result = PhoneNumber(startingNumber)
        XCTAssertEqual(result.number, expected)
    }

    func testInvalidWhenNineDigits() {
        let startingNumber = "123456789"
        let expected = "0000000000"
        let result = PhoneNumber(startingNumber)
        XCTAssertEqual(result.number, expected)
    }

    func testAreaCode() {
        let startingNumber = "2234567890"
        let expected = "223"
        let number = PhoneNumber(startingNumber)
        let result = number.areaCode
        XCTAssertEqual(result, expected)
    }

    func testPrettyPrint() {
        let startingNumber = "2234567890"
        let expected = "(223) 456-7890"
        let number = PhoneNumber(startingNumber)
        XCTAssertEqual(String(describing: number), expected)
    }

    func testPrettyPrintWithFullUSPhoneNumber() {
        let startingNumber = "12234567890"
        let expected = "(223) 456-7890"
        let number = PhoneNumber(startingNumber)
        XCTAssertEqual(String(describing: number), expected)
    }

    static var allTests: [(String, (PhoneNumberTests) -> () throws -> Void)] {
        return [
            ("testValidWithTenDigits", testValidWithTenDigits),
            ("testCleansNumber", testCleansNumber),
            ("testCleansNumberWithDots", testCleansNumberWithDots),
            ("testValidWithElevenDigitsAndFirstIsOne", testValidWithElevenDigitsAndFirstIsOne),
            ("testInvalidWhenElevenDigits", testInvalidWhenElevenDigits),
            ("testInvalidWhenNineDigits", testInvalidWhenNineDigits),
            ("testAreaCode", testAreaCode),
            ("testPrettyPrint", testPrettyPrint),
            ("testPrettyPrintWithFullUSPhoneNumber", testPrettyPrintWithFullUSPhoneNumber),
        ]
    }
}