@import function descriptionWithoutEntity(aString) { var descriptionWithEntity = [aString description]; //print(descriptionWithEntity); return descriptionWithEntity.substr(descriptionWithEntity.indexOf('>') + 1); } @implementation CPIndexSetTest : OJTestCase { CPIndexSet _set; } - (void)testAddIndexes { var indexSet = [CPIndexSet indexSet]; // Test no indexes [self assert:descriptionWithoutEntity(indexSet) equals:@"(no indexes)"]; // Test adding initial range [indexSet addIndexesInRange:CPMakeRange(30,10)]; [self assert:@"[number of indexes: 10 (in 1 range), indexes: (30-39)]" equals:descriptionWithoutEntity(indexSet)]; // Test adding range after existing ranges. [indexSet addIndexesInRange:CPMakeRange(50,10)]; [self assert:@"[number of indexes: 20 (in 2 ranges), indexes: (30-39 50-59)]" equals:descriptionWithoutEntity(indexSet)]; // Test adding range before existing ranges. [indexSet addIndexesInRange:CPMakeRange(10,10)]; [self assert:@"[number of indexes: 30 (in 3 ranges), indexes: (10-19 30-39 50-59)]" equals:descriptionWithoutEntity(indexSet)]; // Test adding range inbetween existing ranges. [indexSet addIndexesInRange:CPMakeRange(45,2)]; [self assert:@"[number of indexes: 32 (in 4 ranges), indexes: (10-19 30-39 45-46 50-59)]" equals:descriptionWithoutEntity(indexSet)]; // Test adding single index inbetween existing ranges. [indexSet addIndexesInRange:CPMakeRange(23,1)]; [self assert:@"[number of indexes: 33 (in 5 ranges), indexes: (10-19 23 30-39 45-46 50-59)]" equals:descriptionWithoutEntity(indexSet)]; // Test adding range inbetween existing ranges that forces a combination [indexSet addIndexesInRange:CPMakeRange(47,3)]; [self assert:@"[number of indexes: 36 (in 4 ranges), indexes: (10-19 23 30-39 45-59)]" equals:descriptionWithoutEntity(indexSet)]; // Test adding range across ranges forcing a combination [indexSet addIndexesInRange:CPMakeRange(35,15)]; [self assert:@"[number of indexes: 41 (in 3 ranges), indexes: (10-19 23 30-59)]" equals:descriptionWithoutEntity(indexSet)]; // Test adding range across two empty slots forcing a combination [indexSet addIndexesInRange:CPMakeRange(5,70)]; [self assert:@"[number of indexes: 70 (in 1 range), indexes: (5-74)]" equals:descriptionWithoutEntity(indexSet)]; // Test adding to extend the beginning of the first range [indexSet addIndex:4]; [self assert:@"[number of indexes: 71 (in 1 range), indexes: (4-74)]" equals:descriptionWithoutEntity(indexSet)]; } - (void)testRemoveIndexes { var indexSet = [CPIndexSet indexSet]; // Test no indexes [self assert:descriptionWithoutEntity(indexSet) equals:@"(no indexes)"]; // Test adding initial range [indexSet addIndexesInRange:CPMakeRange(0, 70)]; [self assert:@"[number of indexes: 70 (in 1 range), indexes: (0-69)]" equals:descriptionWithoutEntity(indexSet)]; // Test remove range that is subset of existing range, causing a split. [indexSet removeIndexesInRange:CPMakeRange(30, 10)]; [self assert:@"[number of indexes: 60 (in 2 ranges), indexes: (0-29 40-69)]" equals:descriptionWithoutEntity(indexSet)]; // Test remove range that is subset of existing range, causing a split. [indexSet removeIndexesInRange:CPMakeRange(50, 5)]; [self assert:@"[number of indexes: 55 (in 3 ranges), indexes: (0-29 40-49 55-69)]" equals:descriptionWithoutEntity(indexSet)]; // Test remove index that is subset of existing range, causing a split. [indexSet removeIndex:57]; [self assert:@"[number of indexes: 54 (in 4 ranges), indexes: (0-29 40-49 55-56 58-69)]" equals:descriptionWithoutEntity(indexSet)]; // Test remove range that is an exactly represented in the set. [indexSet removeIndexesInRange:CPMakeRange(40, 10)]; [self assert:@"[number of indexes: 44 (in 3 ranges), indexes: (0-29 55-56 58-69)]" equals:descriptionWithoutEntity(indexSet)]; // Test remove range that isn't in the set. [indexSet removeIndexesInRange:CPMakeRange(35, 3)]; [self assert:@"[number of indexes: 44 (in 3 ranges), indexes: (0-29 55-56 58-69)]" equals:descriptionWithoutEntity(indexSet)]; // Test remove range that is partially in a left range. [indexSet removeIndexesInRange:CPMakeRange(25, 7)]; [self assert:@"[number of indexes: 39 (in 3 ranges), indexes: (0-24 55-56 58-69)]" equals:descriptionWithoutEntity(indexSet)]; // Test remove range that is partially in a left range. [indexSet removeIndexesInRange:CPMakeRange(57, 3)]; [self assert:@"[number of indexes: 37 (in 3 ranges), indexes: (0-24 55-56 60-69)]" equals:descriptionWithoutEntity(indexSet)]; // Test remove range that is partially in a left and right range. [indexSet removeIndexesInRange:CPMakeRange(20, 36)]; [self assert:@"[number of indexes: 31 (in 3 ranges), indexes: (0-19 56 60-69)]" equals:descriptionWithoutEntity(indexSet)]; // Remove single index that represents an entire range. [indexSet removeIndex:56]; [self assert:@"[number of indexes: 30 (in 2 ranges), indexes: (0-19 60-69)]" equals:descriptionWithoutEntity(indexSet)]; // Remove index set that is subset of existing range, causing a split. [indexSet removeIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(5, 10)]]; [self assert:@"[number of indexes: 20 (in 3 ranges), indexes: (0-4 15-19 60-69)]" equals:descriptionWithoutEntity(indexSet)]; // Remove indexes that are partially in 2 ranges and contains intermediate range. [indexSet removeIndexesInRange:CPMakeRange(2, 62)]; [self assert:@"[number of indexes: 8 (in 2 ranges), indexes: (0-1 64-69)]" equals:descriptionWithoutEntity(indexSet)]; // Remove indexes that fit exactly in 2 ranges. [indexSet removeIndexesInRange:CPMakeRange(0, 70)]; [self assert:@"(no indexes)" equals:descriptionWithoutEntity(indexSet)]; indexSet = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 30)]; // Remove indexes from left hand of single range [indexSet removeIndexesInRange:CPMakeRange(0, 29)]; [self assert:@"[number of indexes: 1 (in 1 range), indexes: (29)]" equals:descriptionWithoutEntity(indexSet)]; indexSet = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 30)]; // Remove indexes from right hand of single range [indexSet removeIndexesInRange:CPMakeRange(1, 29)]; [self assert:@"[number of indexes: 1 (in 1 range), indexes: (0)]" equals:descriptionWithoutEntity(indexSet)]; } - (void)testGetIndexes { var indexSet = [CPIndexSet indexSet]; // Test no indexes [self assert:descriptionWithoutEntity(indexSet) equals:@"(no indexes)"]; // Test adding initial range [indexSet addIndexesInRange:CPMakeRange(0, 10)]; [indexSet addIndexesInRange:CPMakeRange(15, 1)]; [indexSet addIndexesInRange:CPMakeRange(20, 10)]; [indexSet addIndexesInRange:CPMakeRange(50, 10)]; [self assert:@"[number of indexes: 31 (in 4 ranges), indexes: (0-9 15 20-29 50-59)]" equals:descriptionWithoutEntity(indexSet)]; var array = []; [indexSet getIndexes:array maxCount:1000 inIndexRange:nil]; [self assert:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59] equals:array]; } - (void)setUp { _set = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(10, 10)]; } - (void)tearDown { _set = nil; } - (void)testIndexSet:(CPIndexSet)set containsRange:(CPRange)range { [self assertFalse:[set containsIndex:range.location -1]]; for (var i=range.location, max=CPMaxRange(range); i