Skip to content

Commit c1a4056

Browse files
committed
[test] Improve lastIndex tests
1 parent dd6d257 commit c1a4056

File tree

6 files changed

+108
-140
lines changed

6 files changed

+108
-140
lines changed

stdlib/private/StdlibCollectionUnittest/CheckCollectionType.swift

Lines changed: 104 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,27 @@ public struct SuffixFromTest {
110110
}
111111
}
112112

113+
public struct FindLastTest {
114+
public let expected: Int?
115+
public let comparisons: Int
116+
public let element: MinimalEquatableValue
117+
public let sequence: [MinimalEquatableValue]
118+
public let loc: SourceLoc
119+
120+
public init(
121+
expected: Int?, comparisons: Int, element: Int, sequence: [Int],
122+
file: String = #file, line: UInt = #line
123+
) {
124+
self.expected = expected
125+
self.comparisons = comparisons
126+
self.element = MinimalEquatableValue(element)
127+
self.sequence = sequence.enumerated().map {
128+
return MinimalEquatableValue($1, identity: $0)
129+
}
130+
self.loc = SourceLoc(file, line, comment: "test data")
131+
}
132+
}
133+
113134
public let subscriptRangeTests = [
114135
// Slice an empty collection.
115136
SubscriptRangeTest(
@@ -305,6 +326,68 @@ let removeFirstTests: [RemoveFirstNTest] = [
305326
),
306327
]
307328

329+
let findLastTests = [
330+
FindLastTest(
331+
expected: nil,
332+
comparisons: 0,
333+
element: 42,
334+
sequence: []),
335+
336+
FindLastTest(
337+
expected: nil,
338+
comparisons: 1,
339+
element: 42,
340+
sequence: [ 1010 ]),
341+
FindLastTest(
342+
expected: 0,
343+
comparisons: 1,
344+
element: 1010,
345+
sequence: [ 1010 ]),
346+
347+
FindLastTest(
348+
expected: nil,
349+
comparisons: 2,
350+
element: 42,
351+
sequence: [ 1010, 1010 ]),
352+
FindLastTest(
353+
expected: 1,
354+
comparisons: 1,
355+
element: 1010,
356+
sequence: [ 1010, 1010 ]),
357+
358+
FindLastTest(
359+
expected: nil,
360+
comparisons: 4,
361+
element: 42,
362+
sequence: [ 1010, 2020, 3030, 4040 ]),
363+
FindLastTest(
364+
expected: 0,
365+
comparisons: 4,
366+
element: 1010,
367+
sequence: [ 1010, 2020, 3030, 4040 ]),
368+
FindLastTest(
369+
expected: 1,
370+
comparisons: 3,
371+
element: 2020,
372+
sequence: [ 1010, 2020, 3030, 4040 ]),
373+
FindLastTest(
374+
expected: 2,
375+
comparisons: 2,
376+
element: 3030,
377+
sequence: [ 1010, 2020, 3030, 4040 ]),
378+
FindLastTest(
379+
expected: 3,
380+
comparisons: 1,
381+
element: 4040,
382+
sequence: [ 1010, 2020, 3030, 4040 ]),
383+
384+
FindLastTest(
385+
expected: 3,
386+
comparisons: 2,
387+
element: 2020,
388+
sequence: [ 1010, 2020, 3030, 2020, 4040 ]),
389+
]
390+
308391
extension Collection {
309392
public func nthIndex(_ offset: Int) -> Index {
310393
return self.index(self.startIndex, offsetBy: numericCast(offset))
@@ -1264,24 +1347,24 @@ extension TestSuite {
12641347
// last(where:)
12651348
//===------------------------------------------------------------------===//
12661349

1267-
let lastPerformanceTest = FindTest(
1268-
expected: 3,
1269-
element: 2020,
1270-
sequence: [ 1010, 2020, 3030, 2020, 4040 ],
1271-
expectedLeftoverSequence: [ 3030, 2020, 4040 ])
1272-
12731350
self.test("\(testNamePrefix).last(where:)/semantics") {
12741351
for test in findLastTests {
12751352
let c = makeWrappedCollectionWithEquatableElement(test.sequence)
1353+
var closureCounter = 0
12761354
let closureLifetimeTracker = LifetimeTracked(0)
12771355
let found = c.last(where: {
12781356
_blackHole(closureLifetimeTracker)
1357+
closureCounter += 1
12791358
return $0 == wrapValueIntoEquatable(test.element)
12801359
})
12811360
expectEqual(
12821361
test.expected == nil ? nil : wrapValueIntoEquatable(test.element),
12831362
found,
12841363
stackTrace: SourceLocStack().with(test.loc))
1364+
expectEqual(
1365+
test.comparisons,
1366+
closureCounter,
1367+
stackTrace: SourceLocStack().with(test.loc))
12851368
if let expectedIdentity = test.expected {
12861369
expectEqual(
12871370
expectedIdentity, extractValueFromEquatable(found!).identity,
@@ -1290,37 +1373,16 @@ extension TestSuite {
12901373
}
12911374
}
12921375

1293-
self.test("\(testNamePrefix).last(where:)/performance") {
1294-
let test = lastPerformanceTest
1295-
let closureLifetimeTracker = LifetimeTracked(0)
1296-
expectEqual(1, LifetimeTracked.instances)
1297-
let c = makeCollectionOfEquatable(test.sequence.map(wrapValueIntoEquatable))
1298-
var closureCounter = 0
1299-
let found = c.last(where: {
1300-
(candidate) in
1301-
_blackHole(closureLifetimeTracker)
1302-
closureCounter += 1
1303-
return
1304-
extractValueFromEquatable(candidate).value == test.element.value
1305-
})
1306-
expectEqual(
1307-
test.expected == nil ? nil : wrapValueIntoEquatable(test.element),
1308-
found,
1309-
stackTrace: SourceLocStack().with(test.loc))
1310-
expectEqual(
1311-
2,
1312-
closureCounter,
1313-
stackTrace: SourceLocStack().with(test.loc))
1314-
}
1315-
13161376
//===------------------------------------------------------------------===//
13171377
// lastIndex(of:)/lastIndex(where:)
13181378
//===------------------------------------------------------------------===//
13191379

13201380
self.test("\(testNamePrefix).lastIndex(of:)/semantics") {
13211381
for test in findLastTests {
13221382
let c = makeWrappedCollectionWithEquatableElement(test.sequence)
1323-
var result = c.lastIndex(of: wrapValueIntoEquatable(test.element))
1383+
MinimalEquatableValue.timesEqualEqualWasCalled = 0
1384+
let wrappedElement = wrapValueIntoEquatable(test.element)
1385+
var result = c.lastIndex(of: wrappedElement)
13241386
expectType(
13251387
Optional<CollectionWithEquatableElement.Index>.self,
13261388
&result)
@@ -1331,39 +1393,25 @@ extension TestSuite {
13311393
test.expected,
13321394
zeroBasedIndex,
13331395
stackTrace: SourceLocStack().with(test.loc))
1396+
if wrappedElement is MinimalEquatableValue {
1397+
expectEqual(
1398+
test.comparisons,
1399+
MinimalEquatableValue.timesEqualEqualWasCalled,
1400+
stackTrace: SourceLocStack().with(test.loc))
1401+
}
13341402
}
13351403
}
13361404

1337-
self.test("\(testNamePrefix).lastIndex(of:)/performance") {
1338-
let test = lastPerformanceTest
1339-
let wrappedElement = wrapValueIntoEquatable(test.element)
1340-
// Only test specialization when we can actually track calls to `==`
1341-
guard wrappedElement is MinimalEquatableValue else { return }
1342-
1343-
let c = makeCollectionOfEquatable(test.sequence.map(wrapValueIntoEquatable))
1344-
MinimalEquatableValue.timesEqualEqualWasCalled = 0
1345-
let result = c.lastIndex(of: wrappedElement)
1346-
let zeroBasedIndex = result.map {
1347-
numericCast(c.distance(from: c.startIndex, to: $0)) as Int
1348-
}
1349-
expectEqual(
1350-
test.expected,
1351-
zeroBasedIndex,
1352-
stackTrace: SourceLocStack().with(test.loc))
1353-
expectEqual(
1354-
2,
1355-
MinimalEquatableValue.timesEqualEqualWasCalled,
1356-
stackTrace: SourceLocStack().with(test.loc))
1357-
}
1358-
13591405
self.test("\(testNamePrefix).lastIndex(where:)/semantics") {
13601406
for test in findLastTests {
13611407
let closureLifetimeTracker = LifetimeTracked(0)
13621408
expectEqual(1, LifetimeTracked.instances)
13631409
let c = makeWrappedCollectionWithEquatableElement(test.sequence)
1410+
var closureCounter = 0
13641411
let result = c.lastIndex(where: {
13651412
(candidate) in
13661413
_blackHole(closureLifetimeTracker)
1414+
closureCounter += 1
13671415
return
13681416
extractValueFromEquatable(candidate).value == test.element.value
13691417
})
@@ -1374,35 +1422,13 @@ extension TestSuite {
13741422
test.expected,
13751423
zeroBasedIndex,
13761424
stackTrace: SourceLocStack().with(test.loc))
1425+
expectEqual(
1426+
test.comparisons,
1427+
closureCounter,
1428+
stackTrace: SourceLocStack().with(test.loc))
13771429
}
13781430
}
13791431

1380-
self.test("\(testNamePrefix).lastIndex(where:)/performance") {
1381-
let test = lastPerformanceTest
1382-
let closureLifetimeTracker = LifetimeTracked(0)
1383-
expectEqual(1, LifetimeTracked.instances)
1384-
let c = makeCollectionOfEquatable(test.sequence.map(wrapValueIntoEquatable))
1385-
var closureCounter = 0
1386-
let result = c.lastIndex(where: {
1387-
(candidate) in
1388-
_blackHole(closureLifetimeTracker)
1389-
closureCounter += 1
1390-
return
1391-
extractValueFromEquatable(candidate).value == test.element.value
1392-
})
1393-
let zeroBasedIndex = result.map {
1394-
numericCast(c.distance(from: c.startIndex, to: $0)) as Int
1395-
}
1396-
expectEqual(
1397-
test.expected,
1398-
zeroBasedIndex,
1399-
stackTrace: SourceLocStack().with(test.loc))
1400-
expectEqual(
1401-
2,
1402-
closureCounter,
1403-
stackTrace: SourceLocStack().with(test.loc))
1404-
}
1405-
14061432
//===------------------------------------------------------------------===//
14071433
// removeLast()/slice
14081434
//===------------------------------------------------------------------===//

stdlib/private/StdlibCollectionUnittest/CheckSequenceType.swift

Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -584,68 +584,6 @@ public let findTests = [
584584
expectedLeftoverSequence: [ 3030, 2020, 4040 ]),
585585
]
586586

587-
public let findLastTests = [
588-
FindTest(
589-
expected: nil,
590-
element: 42,
591-
sequence: [],
592-
expectedLeftoverSequence: []),
593-
594-
FindTest(
595-
expected: nil,
596-
element: 42,
597-
sequence: [ 1010 ],
598-
expectedLeftoverSequence: []),
599-
FindTest(
600-
expected: 0,
601-
element: 1010,
602-
sequence: [ 1010 ],
603-
expectedLeftoverSequence: []),
604-
605-
FindTest(
606-
expected: nil,
607-
element: 42,
608-
sequence: [ 1010, 1010 ],
609-
expectedLeftoverSequence: []),
610-
FindTest(
611-
expected: 1,
612-
element: 1010,
613-
sequence: [ 1010, 1010 ],
614-
expectedLeftoverSequence: [ 1010 ]),
615-
616-
FindTest(
617-
expected: nil,
618-
element: 42,
619-
sequence: [ 1010, 2020, 3030, 4040 ],
620-
expectedLeftoverSequence: []),
621-
FindTest(
622-
expected: 0,
623-
element: 1010,
624-
sequence: [ 1010, 2020, 3030, 4040 ],
625-
expectedLeftoverSequence: [ ]),
626-
FindTest(
627-
expected: 1,
628-
element: 2020,
629-
sequence: [ 1010, 2020, 3030, 4040 ],
630-
expectedLeftoverSequence: [ 3030, 4040 ]),
631-
FindTest(
632-
expected: 2,
633-
element: 3030,
634-
sequence: [ 1010, 2020, 3030, 4040 ],
635-
expectedLeftoverSequence: [ 4040 ]),
636-
FindTest(
637-
expected: 3,
638-
element: 4040,
639-
sequence: [ 1010, 2020, 3030, 4040 ],
640-
expectedLeftoverSequence: []),
641-
642-
FindTest(
643-
expected: 3,
644-
element: 2020,
645-
sequence: [ 1010, 2020, 3030, 2020, 4040 ],
646-
expectedLeftoverSequence: [ 3030, 2020, 4040 ]),
647-
]
648-
649587
public let unionTests = [
650588
CollectionBinaryOperationTest(expected: [1, 2, 3, 4, 5], lhs: [1, 3, 5], rhs: [2, 4]),
651589
CollectionBinaryOperationTest(expected: [3, 5], lhs: [3], rhs: [5])

stdlib/public/core/ClosedRange.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ where Bound : Strideable, Bound.Stride : SignedInteger
311311

312312
@inlinable
313313
public func _customLastIndexOfEquatableElement(_ element: Bound) -> Index?? {
314+
// The first and last elements are the same because each element is unique.
314315
return _customIndexOfEquatableElement(element)
315316
}
316317
}

stdlib/public/core/Dictionary.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,6 +1264,7 @@ extension Dictionary {
12641264

12651265
@inlinable // FIXME(sil-serialize-all)
12661266
public func _customLastIndexOfEquatableElement(_ element: Element) -> Index?? {
1267+
// The first and last elements are the same because each element is unique.
12671268
return _customIndexOfEquatableElement(element)
12681269
}
12691270

stdlib/public/core/Range.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ where Bound : Strideable, Bound.Stride : SignedInteger
257257

258258
@inlinable
259259
public func _customLastIndexOfEquatableElement(_ element: Bound) -> Index?? {
260+
// The first and last elements are the same because each element is unique.
260261
return _customIndexOfEquatableElement(element)
261262
}
262263

stdlib/public/core/Set.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ extension Set: Collection {
364364
public func _customLastIndexOfEquatableElement(
365365
_ member: Element
366366
) -> Index?? {
367+
// The first and last elements are the same because each element is unique.
367368
return _customIndexOfEquatableElement(member)
368369
}
369370

0 commit comments

Comments
 (0)