// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//



#if DEPLOYMENT_RUNTIME_OBJC || os(Linux)
    import Foundation
    import XCTest
#else
    import SwiftFoundation
    import SwiftXCTest
#endif

private func assertEqual(_ lhs:PersonNameComponents,
                         _ rhs: PersonNameComponents,
                         file: StaticString = #file,
                         line: UInt = #line) {
    assert(equal: true, lhs, rhs, file: file, line: line)
}

private func assertNotEqual(_ lhs:PersonNameComponents,
                            _ rhs: PersonNameComponents,
                            file: StaticString = #file,
                            line: UInt = #line) {
    assert(equal: false, lhs, rhs, file: file, line: line)
}

private func assert(equal: Bool,
                    _ lhs:PersonNameComponents,
                    _ rhs: PersonNameComponents,
                    file: StaticString = #file,
                    line: UInt = #line) {
    if equal {
        XCTAssertEqual(lhs, rhs, file: file, line: line)
        XCTAssertEqual(lhs._bridgeToObjectiveC(), rhs._bridgeToObjectiveC(), file: file, line: line)
        XCTAssertTrue(lhs._bridgeToObjectiveC().isEqual(rhs), file: file, line: line)
    } else {
        XCTAssertNotEqual(lhs, rhs, file: file, line: line)
        XCTAssertNotEqual(lhs._bridgeToObjectiveC(), rhs._bridgeToObjectiveC(), file: file, line: line)
        XCTAssertFalse(lhs._bridgeToObjectiveC().isEqual(rhs), file: file, line: line)
    }
}

class TestPersonNameComponents : XCTestCase {
    
    static var allTests: [(String, (TestPersonNameComponents) -> () throws -> Void)] {
        return [
            ("testCopy", testCopy),
            ("testEquality", testEquality),
        ]
    }
    
    func testCopy() {
        let original = NSPersonNameComponents()
        original.givenName = "Maria"
        original.phoneticRepresentation = PersonNameComponents()
        original.phoneticRepresentation!.givenName = "Jeff"
        let copy = original.copy(with:nil) as! NSPersonNameComponents
        copy.givenName = "Rebecca"
        
        XCTAssertNotEqual(original.givenName, copy.givenName)
        XCTAssertEqual(original.phoneticRepresentation!.givenName,copy.phoneticRepresentation!.givenName)
        XCTAssertNil(copy.phoneticRepresentation!.phoneticRepresentation)
    }

    func testEquality() {
        do {
            let lhs = PersonNameComponents()
            let rhs = PersonNameComponents()
            assertEqual(lhs, rhs)
        }

        let lhs = self.makePersonNameComponentsWithTestValues()
        do {
            let rhs = self.makePersonNameComponentsWithTestValues()
            assertEqual(lhs, rhs)
        }
        do {
            var rhs = self.makePersonNameComponentsWithTestValues()
            rhs.namePrefix = "differentValue"
            assertNotEqual(lhs, rhs)
        }
        do {
            var rhs = self.makePersonNameComponentsWithTestValues()
            rhs.givenName = "differentValue"
            assertNotEqual(lhs, rhs)
        }
        do {
            var rhs = self.makePersonNameComponentsWithTestValues()
            rhs.middleName = "differentValue"
            assertNotEqual(lhs, rhs)
        }
        do {
            var rhs = self.makePersonNameComponentsWithTestValues()
            rhs.familyName = "differentValue"
            assertNotEqual(lhs, rhs)
        }
        do {
            var rhs = self.makePersonNameComponentsWithTestValues()
            rhs.nameSuffix = "differentValue"
            assertNotEqual(lhs, rhs)
        }
        do {
            var rhs = self.makePersonNameComponentsWithTestValues()
            rhs.nickname = "differentValue"
            assertNotEqual(lhs, rhs)
        }
        do {
            var rhs = self.makePersonNameComponentsWithTestValues()
            rhs.phoneticRepresentation?.namePrefix = "differentValue"
            assertNotEqual(lhs, rhs)
        }
    }

    // MARK: - Helpers

    private func makePersonNameComponentsWithTestValues() -> PersonNameComponents {
        var components = PersonNameComponents()
        components.namePrefix = "namePrefix"
        components.givenName = "givenName"
        components.middleName = "middleName"
        components.familyName = "familyName"
        components.nameSuffix = "nameSuffix"
        components.nickname = "nickname"
        components.phoneticRepresentation = {
            var components = PersonNameComponents()
            components.namePrefix = "phonetic_namePrefix"
            components.givenName = "phonetic_givenName"
            components.middleName = "phonetic_middleName"
            components.familyName = "phonetic_familyName"
            components.nameSuffix = "phonetic_nameSuffix"
            components.nickname = "phonetic_nickname"
            return components
        }()
        return components
    }
}

        
