// 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



class TestNSOrderedSet : XCTestCase {

    static var allTests: [(String, (TestNSOrderedSet) -> () throws -> Void)] {
        return [
            ("test_BasicConstruction", test_BasicConstruction),
            ("test_Enumeration", test_Enumeration),
            ("test_Uniqueness", test_Uniqueness),
            ("test_reversedEnumeration", test_reversedEnumeration),
            ("test_reversedOrderedSet", test_reversedOrderedSet),
            ("test_reversedEmpty", test_reversedEmpty),
            ("test_ObjectAtIndex", test_ObjectAtIndex),
            ("test_ObjectsAtIndexes", test_ObjectsAtIndexes),
            ("test_GetObjects", test_GetObjects),
            ("test_FirstAndLastObjects", test_FirstAndLastObjects),
            ("test_AddObject", test_AddObject),
            ("test_AddObjects", test_AddObjects),
            ("test_RemoveAllObjects", test_RemoveAllObjects),
            ("test_RemoveObject", test_RemoveObject),
            ("test_RemoveObjectAtIndex", test_RemoveObjectAtIndex),
            ("test_IsEqualToOrderedSet", test_IsEqualToOrderedSet),
            ("test_Subsets", test_Subsets),
            ("test_ReplaceObject", test_ReplaceObject),
            ("test_ExchangeObjects", test_ExchangeObjects),
            ("test_MoveObjects", test_MoveObjects),
            ("test_InserObjects", test_InsertObjects),
            ("test_SetObjectAtIndex", test_SetObjectAtIndex),
            ("test_RemoveObjectsInRange", test_RemoveObjectsInRange),
            ("test_ReplaceObjectsAtIndexes", test_ReplaceObjectsAtIndexes),
            ("test_Intersection", test_Intersection),
            ("test_Subtraction", test_Subtraction),
            ("test_Union", test_Union),
            ("test_Initializers", test_Initializers),
            ("test_Sorting", test_Sorting),
            ("test_reversedEnumerationMutable", test_reversedEnumerationMutable),
            ("test_reversedOrderedSetMutable", test_reversedOrderedSetMutable),
        ]
    }

    func test_BasicConstruction() {
        let set = NSOrderedSet()
        let set2 = NSOrderedSet(array: ["foo", "bar"].bridge().bridge())
        XCTAssertEqual(set.count, 0)
        XCTAssertEqual(set2.count, 2)
    }

    func test_Enumeration() {
        let arr = ["foo", "bar", "bar"]
        let set = NSOrderedSet(array: arr.bridge().bridge())
        var index = 0
        for item in set {
            XCTAssertEqual(arr[index].bridge(), item as? NSString)
            index += 1
        }
    }

    func test_Uniqueness() {
        let set = NSOrderedSet(array: ["foo", "bar", "bar"].bridge().bridge())
        XCTAssertEqual(set.count, 2)
        XCTAssertEqual(set.objectAtIndex(0) as? NSString, "foo")
        XCTAssertEqual(set.objectAtIndex(1) as? NSString, "bar")
    }

    func test_reversedEnumeration() {
        let arr = ["foo", "bar", "baz"]
        let set = NSOrderedSet(array: arr.bridge().bridge())
        var index = set.count - 1
        let revSet = set.reverseObjectEnumerator()
        for item in revSet {
            XCTAssertEqual(set.objectAtIndex(index) as? NSString, item as? NSString)
            index -= 1
        }
    }

    func test_reversedOrderedSet() {
        let days = ["monday", "tuesday", "wednesday", "thursday", "friday"]
        let work = NSOrderedSet(array: days.bridge().bridge())
        let krow = work.reversedOrderedSet
        var index = work.count - 1
        for item in krow {
           XCTAssertEqual(work.objectAtIndex(index) as? NSString, item as? NSString)
           index -= 1
        }
    }

    func test_reversedEmpty() {
        let set = NSOrderedSet(array: [])
        let reversedEnum = set.reverseObjectEnumerator()
        XCTAssertNil(reversedEnum.nextObject())
        let reversedSet = set.reversedOrderedSet
        XCTAssertNil(reversedSet.firstObject)
    }

    func test_ObjectAtIndex() {
        let set = NSOrderedSet(array: ["foo", "bar", "baz"].bridge().bridge())
        XCTAssertEqual(set.objectAtIndex(0) as? NSString, "foo")
        XCTAssertEqual(set.objectAtIndex(1) as? NSString, "bar")
        XCTAssertEqual(set.objectAtIndex(2) as? NSString, "baz")
    }

    func test_ObjectsAtIndexes() {
        let set = NSOrderedSet(array: ["foo", "bar", "baz", "1", "2", "3"].bridge().bridge())
        let indexSet = NSMutableIndexSet()
        indexSet.addIndex(1)
        indexSet.addIndex(3)
        indexSet.addIndex(5)
        let objects = set.objectsAtIndexes(indexSet)
        XCTAssertEqual(objects[0] as? NSString, "bar")
        XCTAssertEqual(objects[1] as? NSString, "1")
        XCTAssertEqual(objects[2] as? NSString, "3")
    }

    func test_GetObjects() {
        let set = NSOrderedSet(array: ["foo", "bar", "baz"].bridge().bridge())
        var objects = [AnyObject]()
        set.getObjects(&objects, range: NSMakeRange(1, 2))
        XCTAssertEqual(objects[0] as? NSString, "bar")
        XCTAssertEqual(objects[1] as? NSString, "baz")
    }

    func test_FirstAndLastObjects() {
        let set = NSOrderedSet(array: ["foo", "bar", "baz"].bridge().bridge())
        XCTAssertEqual(set.firstObject as? NSString, "foo")
        XCTAssertEqual(set.lastObject as? NSString, "baz")
    }

    func test_AddObject() {
        let set = NSMutableOrderedSet()
        set.addObject("1".bridge())
        set.addObject("2".bridge())
        XCTAssertEqual(set[0] as? NSString, "1")
        XCTAssertEqual(set[1] as? NSString, "2")
    }

    func test_AddObjects() {
        let set = NSMutableOrderedSet()
        set.addObjectsFromArray(["foo", "bar", "baz"].bridge().bridge())
        XCTAssertEqual(set.objectAtIndex(0) as? NSString, "foo")
        XCTAssertEqual(set.objectAtIndex(1) as? NSString, "bar")
        XCTAssertEqual(set.objectAtIndex(2) as? NSString, "baz")
    }

    func test_RemoveAllObjects() {
        let set = NSMutableOrderedSet()
        set.addObjectsFromArray(["foo", "bar", "baz"].bridge().bridge())
        XCTAssertEqual(set.indexOfObject("foo" as NSString), 0)
        set.removeAllObjects()
        XCTAssertEqual(set.count, 0)
        XCTAssertEqual(set.indexOfObject("foo" as NSString), NSNotFound)
    }

    func test_RemoveObject() {
        let set = NSMutableOrderedSet()
        set.addObjectsFromArray(["foo", "bar", "baz"].bridge().bridge())
        set.removeObject("bar" as NSString)
        XCTAssertEqual(set.count, 2)
        XCTAssertEqual(set.indexOfObject("baz" as NSString), 1)
    }

    func test_RemoveObjectAtIndex() {
        let set = NSMutableOrderedSet()
        set.addObjectsFromArray(["foo", "bar", "baz"].bridge().bridge())
        set.removeObjectAtIndex(1)
        XCTAssertEqual(set.count, 2)
        XCTAssertEqual(set.indexOfObject("baz" as NSString), 1)
    }

    func test_IsEqualToOrderedSet() {
        let set = NSOrderedSet(array: ["foo", "bar", "baz"].bridge().bridge())
        let otherSet = NSOrderedSet(array: ["foo", "bar", "baz"].bridge().bridge())
        let otherOtherSet = NSOrderedSet(array: ["foo", "bar", "123"].bridge().bridge())
        XCTAssert(set.isEqualToOrderedSet(otherSet))
        XCTAssertFalse(set.isEqualToOrderedSet(otherOtherSet))
    }

    func test_Subsets() {
        let set = NSOrderedSet(array: ["foo", "bar", "baz"].bridge().bridge())
        let otherOrderedSet = NSOrderedSet(array: ["foo", "bar"].bridge().bridge())
        let otherSet = Set<NSObject>(["foo" as NSString, "baz" as NSString])
        let otherOtherSet = Set<NSObject>(["foo".bridge(), "bar".bridge(), "baz".bridge(), "123".bridge()])
        XCTAssert(otherOrderedSet.isSubsetOfOrderedSet(set))
        XCTAssertFalse(set.isSubsetOfOrderedSet(otherOrderedSet))
        XCTAssertFalse(set.isSubsetOfSet(otherSet))
        XCTAssert(set.isSubsetOfSet(otherOtherSet))
    }

    func test_ReplaceObject() {
        let set = NSMutableOrderedSet(arrayLiteral: "foo".bridge(), "bar".bridge(), "baz".bridge())
        set.replaceObjectAtIndex(1, withObject: "123".bridge())
        XCTAssertEqual(set.count, 3)
        XCTAssertEqual(set[0] as? NSString, "foo")
        XCTAssertEqual(set[1] as? NSString, "123")
        XCTAssertEqual(set[2] as? NSString, "baz")
    }

    func test_ExchangeObjects() {
        let set = NSMutableOrderedSet(arrayLiteral: "foo".bridge(), "bar".bridge(), "baz".bridge())
        set.exchangeObjectAtIndex(0, withObjectAtIndex: 2)
        XCTAssertEqual(set.count, 3)
        XCTAssertEqual(set[0] as? NSString, "baz")
        XCTAssertEqual(set[1] as? NSString, "bar")
        XCTAssertEqual(set[2] as? NSString, "foo")
    }

    func test_MoveObjects() {
        let set = NSMutableOrderedSet(arrayLiteral: "foo".bridge(), "bar".bridge(), "baz".bridge(), "123".bridge(), "456".bridge())
        let indexes = NSMutableIndexSet()
        indexes.addIndex(1)
        indexes.addIndex(2)
        indexes.addIndex(4)
        set.moveObjectsAtIndexes(indexes, toIndex: 0)
        XCTAssertEqual(set.count, 5)
        XCTAssertEqual(set[0] as? NSString, "bar")
        XCTAssertEqual(set[1] as? NSString, "baz")
        XCTAssertEqual(set[2] as? NSString, "456")
        XCTAssertEqual(set[3] as? NSString, "foo")
        XCTAssertEqual(set[4] as? NSString, "123")
    }

    func test_InsertObjects() {
        let set = NSMutableOrderedSet(arrayLiteral: "foo".bridge(), "bar".bridge(), "baz".bridge())
        let indexes = NSMutableIndexSet()
        indexes.addIndex(1)
        indexes.addIndex(3)
        set.insertObjects(["123".bridge(), "456".bridge()], atIndexes: indexes)
        XCTAssertEqual(set.count, 5)
        XCTAssertEqual(set[0] as? NSString, "foo")
        XCTAssertEqual(set[1] as? NSString, "123")
        XCTAssertEqual(set[2] as? NSString, "bar")
        XCTAssertEqual(set[3] as? NSString, "456")
        XCTAssertEqual(set[4] as? NSString, "baz")
    }

    func test_SetObjectAtIndex() {
        let set = NSMutableOrderedSet(arrayLiteral: "foo".bridge(), "bar".bridge(), "baz".bridge())
        set.setObject("123".bridge(), atIndex: 1)
        XCTAssertEqual(set[0] as? NSString, "foo")
        XCTAssertEqual(set[1] as? NSString, "123")
        XCTAssertEqual(set[2] as? NSString, "baz")
        set.setObject("456".bridge(), atIndex: 3)
        XCTAssertEqual(set[3] as? NSString, "456")
    }

    func test_RemoveObjectsInRange() {
        let set = NSMutableOrderedSet(arrayLiteral: "foo".bridge(), "bar".bridge(), "baz".bridge(), "123".bridge(), "456".bridge())
        set.removeObjectsInRange(NSMakeRange(1, 2))
        XCTAssertEqual(set.count, 3)
        XCTAssertEqual(set[0] as? NSString, "foo")
        XCTAssertEqual(set[1] as? NSString, "123")
        XCTAssertEqual(set[2] as? NSString, "456")
    }

    func test_ReplaceObjectsAtIndexes() {
        let set = NSMutableOrderedSet(arrayLiteral: "foo".bridge(), "bar".bridge(), "baz".bridge())
        let indexes = NSMutableIndexSet()
        indexes.addIndex(0)
        indexes.addIndex(2)
        set.replaceObjectsAtIndexes(indexes, withObjects: ["a".bridge(), "b".bridge()])
        XCTAssertEqual(set.count, 3)
        XCTAssertEqual(set[0] as? NSString, "a")
        XCTAssertEqual(set[1] as? NSString, "bar")
        XCTAssertEqual(set[2] as? NSString, "b")
    }

    func test_Intersection() {
        let set = NSMutableOrderedSet(arrayLiteral: "foo".bridge(), "bar".bridge(), "baz".bridge())
        let otherSet = NSOrderedSet(array: ["foo", "baz"].bridge().bridge())
        XCTAssert(set.intersectsOrderedSet(otherSet))
        let otherOtherSet = Set<NSObject>(["foo".bridge(), "123".bridge()])
        XCTAssert(set.intersectsSet(otherOtherSet))
        set.intersectOrderedSet(otherSet)
        XCTAssertEqual(set.count, 2)
        XCTAssertEqual(set[0] as? NSString, "foo")
        XCTAssertEqual(set[1] as? NSString, "baz")
        set.intersectSet(otherOtherSet)
        XCTAssertEqual(set.count, 1)
        XCTAssertEqual(set[0] as? NSString, "foo")

        let nonIntersectingSet = Set<NSObject>(["asdf".bridge()])
        XCTAssertFalse(set.intersectsSet(nonIntersectingSet))
    }

    func test_Subtraction() {
        let set = NSMutableOrderedSet(arrayLiteral: "foo".bridge(), "bar".bridge(), "baz".bridge())
        let otherSet = NSOrderedSet(array: ["baz"].bridge().bridge())
        let otherOtherSet = Set<NSObject>(["foo".bridge()])
        set.minusOrderedSet(otherSet)
        XCTAssertEqual(set.count, 2)
        XCTAssertEqual(set[0] as? NSString, "foo")
        XCTAssertEqual(set[1] as? NSString, "bar")
        set.minusSet(otherOtherSet)
        XCTAssertEqual(set.count, 1)
        XCTAssertEqual(set[0] as? NSString, "bar")
    }

    func test_Union() {
        let set = NSMutableOrderedSet(arrayLiteral: "foo".bridge(), "bar".bridge(), "baz".bridge())
        let otherSet = NSOrderedSet(array: ["123", "baz"].bridge().bridge())
        let otherOtherSet = Set<NSObject>(["foo".bridge(), "456".bridge()])
        set.unionOrderedSet(otherSet)
        XCTAssertEqual(set.count, 4)
        XCTAssertEqual(set[0] as? NSString, "foo")
        XCTAssertEqual(set[1] as? NSString, "bar")
        XCTAssertEqual(set[2] as? NSString, "baz")
        XCTAssertEqual(set[3] as? NSString, "123")
        set.unionSet(otherOtherSet)
        XCTAssertEqual(set.count, 5)
        XCTAssertEqual(set[4] as? NSString, "456")
    }

    func test_Initializers() {
        let copyableObject = NSObject()
        let set = NSMutableOrderedSet(arrayLiteral: copyableObject, "bar".bridge(), "baz".bridge())
        let newSet = NSOrderedSet(orderedSet: set)
        XCTAssert(newSet.isEqualToOrderedSet(set))
        XCTAssert(set[0] === newSet[0])

        let unorderedSet = Set<NSObject>(["foo".bridge(), "bar".bridge(), "baz".bridge()])
        let newSetFromUnorderedSet = NSOrderedSet(set: unorderedSet)
        XCTAssertEqual(newSetFromUnorderedSet.count, 3)
        XCTAssert(newSetFromUnorderedSet.containsObject("foo".bridge()))
    }

    func test_Sorting() {
        let set = NSMutableOrderedSet(arrayLiteral: "a".bridge(), "d".bridge(), "c".bridge(), "b".bridge())
        set.sortUsingComparator { lhs, rhs in
            if let lhs = lhs as? NSString, rhs = rhs as? NSString {
                return lhs.compare(rhs.bridge())
            }
            return NSComparisonResult.orderedSame
        }
        XCTAssertEqual(set[0] as? NSString, "a")
        XCTAssertEqual(set[1] as? NSString, "b")
        XCTAssertEqual(set[2] as? NSString, "c")
        XCTAssertEqual(set[3] as? NSString, "d")

        set.sortRange(NSMakeRange(1, 2), options: []) { lhs, rhs in
            if let lhs = lhs as? NSString, rhs = rhs as? NSString {
                return rhs.compare(lhs.bridge())
            }
            return NSComparisonResult.orderedSame
        }
        XCTAssertEqual(set[0] as? NSString, "a")
        XCTAssertEqual(set[1] as? NSString, "c")
        XCTAssertEqual(set[2] as? NSString, "b")
        XCTAssertEqual(set[3] as? NSString, "d")
    }

    func test_reversedEnumerationMutable() {
        let arr = ["foo", "bar", "baz"]
        let set = NSMutableOrderedSet()
        set.addObjectsFromArray(arr.bridge().bridge())

        set.addObject("jazz".bridge())
        var index = set.count - 1
        var revSet = set.reverseObjectEnumerator()
        for item in revSet {
            XCTAssertEqual(set.objectAtIndex(index) as? NSString, item as? NSString)
            index -= 1
        }

        set.removeObject("jazz".bridge())
        index = set.count - 1
        revSet = set.reverseObjectEnumerator()
        for item in revSet {
            XCTAssertEqual(set.objectAtIndex(index) as? NSString, item as? NSString)
            index -= 1
        }


    }

    func test_reversedOrderedSetMutable() {
        let days = ["monday", "tuesday", "wednesday", "thursday", "friday"]
        let work =  NSMutableOrderedSet()
        work.addObjectsFromArray(days.bridge().bridge())
        var krow = work.reversedOrderedSet
        XCTAssertEqual(work.firstObject as? NSString, krow.lastObject as? NSString)
        XCTAssertEqual(work.lastObject as? NSString, krow.firstObject as? NSString)

        work.addObject("saturday".bridge())
        krow = work.reversedOrderedSet
        XCTAssertEqual(work.firstObject as? NSString, krow.lastObject as? NSString)
        XCTAssertEqual(work.lastObject as? NSString, krow.firstObject as? NSString)
    }

}
