// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2015 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 TestNSIndexSet : XCTestCase {
    
    static var allTests: [(String, TestNSIndexSet -> () throws -> Void)] {
        return [
            ("test_BasicConstruction", test_BasicConstruction),
            ("test_enumeration", test_enumeration),
            ("test_sequenceType", test_sequenceType),
            ("test_removal", test_removal),
            ("test_addition",test_addition),
        ]
    }
    
    func test_BasicConstruction() {
        let set = NSIndexSet()
        let set2 = NSIndexSet(indexesInRange: NSMakeRange(4, 7))
        XCTAssertEqual(set.count, 0)
        XCTAssertEqual(set.firstIndex, NSNotFound)
        XCTAssertEqual(set.lastIndex, NSNotFound)
        XCTAssertEqual(set2.count, 7)
        XCTAssertEqual(set2.firstIndex, 4)
        XCTAssertEqual(set2.lastIndex, 10)
        
        let set3 = NSMutableIndexSet()
        set3.addIndex(2)
        set3.addIndex(5)
        set3.addIndexesInRange(NSMakeRange(4, 7))
        set3.addIndex(8)
        XCTAssertEqual(set3.count, 8)
        XCTAssertEqual(set3.firstIndex, 2)
        XCTAssertEqual(set3.lastIndex, 10)
        
    }
    
    func test_enumeration() {
        let set = NSIndexSet(indexesInRange: NSMakeRange(4, 7))
        var result = Array<Int>()
        set.enumerateIndexesUsingBlock() { (idx, _) in
            result.append(idx)
        }
        XCTAssertEqual(result, [4, 5, 6, 7, 8, 9, 10])
        
        result = Array<Int>()
        NSIndexSet().enumerateIndexesUsingBlock() { (idx, _) in
            result.append(idx)
        }
        XCTAssertEqual(result, [])
        
        let disjointSet = NSMutableIndexSet()
        disjointSet.addIndex(2)
        disjointSet.addIndex(5)
        disjointSet.addIndex(8)
        disjointSet.addIndexesInRange(NSMakeRange(7, 3))
        disjointSet.addIndex(11)
        disjointSet.addIndexesInRange(NSMakeRange(13, 2))
        result = Array<Int>()
        disjointSet.enumerateIndexesUsingBlock() { (idx, _) in
            result.append(idx)
        }
        XCTAssertEqual(result, [2, 5, 7, 8, 9, 11, 13, 14])
    }
    
    func test_sequenceType() {
        let set = NSIndexSet(indexesInRange: NSMakeRange(4, 7))
        var result = Array<Int>()
        for idx in set {
            result.append(idx)
        }
        XCTAssertEqual(result, [4, 5, 6, 7, 8, 9, 10])
    }
    
    func test_removal() {
        let removalSet = NSMutableIndexSet(indexesInRange: NSMakeRange(0, 10))
        removalSet.removeIndex(0)
        removalSet.removeIndexesInRange(NSMakeRange(9, 5))
        removalSet.removeIndexesInRange(NSMakeRange(2, 4))
        XCTAssertEqual(removalSet.count, 4)
        XCTAssertEqual(removalSet.firstIndex, 1)
        XCTAssertEqual(removalSet.lastIndex, 8)
        
        let additionSet = NSMutableIndexSet()
        additionSet.addIndex(1)
        additionSet.addIndexesInRange(NSMakeRange(6, 3))
        
        XCTAssertTrue(removalSet.isEqualToIndexSet(additionSet))
        
    }
    
    func test_addition() {
        
        let testSetA = NSMutableIndexSet(index: 0)
        testSetA.addIndex(5)
        testSetA.addIndex(6)
        testSetA.addIndex(7)
        testSetA.addIndex(8)
        testSetA.addIndex(42)
        
        let testInputA1 = [0,5,6,7,8,42]
        var i = 0
        
        if testInputA1.count == testSetA.count {
            testSetA.enumerateIndexesUsingBlock { (idx, _) in
                XCTAssertEqual(idx, testInputA1[i])
                i += 1
            }
        }
        else {
            XCTFail("IndexSet does not contain correct number of indexes")
        }
        
        
        let testInputA2 = [NSMakeRange(0, 1),NSMakeRange(5, 4),NSMakeRange(42, 1)]
        i = 0
        
        testSetA.enumerateRangesUsingBlock { (range, _) in
            let testRange = testInputA2[i]
            XCTAssertEqual(range.location, testRange.location)
            XCTAssertEqual(range.length, testRange.length)
            i += 1
        }
        
        let testSetB = NSMutableIndexSet(indexesInRange: NSMakeRange(0,5))
        testSetB.addIndexesInRange(NSMakeRange(42, 3))
        testSetB.addIndexesInRange(NSMakeRange(2, 2))
        testSetB.addIndexesInRange(NSMakeRange(18, 1))
        
        let testInputB1 = [0,1,2,3,4,18,42,43,44]
        i = 0
        
        if testInputB1.count == testSetB.count {
            testSetB.enumerateIndexesUsingBlock { (idx, _) in
                XCTAssertEqual(idx, testInputB1[i])
                i += 1
            }
        }
        else {
            XCTFail("IndexSet does not contain correct number of indexes")
        }
        
        
        let testInputB2 = [NSMakeRange(0, 5),NSMakeRange(18, 1),NSMakeRange(42, 3)]
        i = 0
        
        testSetB.enumerateRangesUsingBlock { (range, _) in
            let testRange = testInputB2[i]
            XCTAssertEqual(range.location, testRange.location)
            XCTAssertEqual(range.length, testRange.length)
            i += 1
        }
    
    }
    
}