1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift Collections open source project
//
// Copyright (c) 2021 - 2024 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
//
//===----------------------------------------------------------------------===//
import XCTest
#if COLLECTIONS_SINGLE_MODULE
import Collections
#else
@_spi(Testing) import OrderedCollections
import _CollectionsTestSupport
#endif
// Note: This cannot really work unless `UnorderedView` becomes a Collection.
// extension OrderedSet.UnorderedView: SetAPIChecker {}
class OrderedSetUnorderedViewTests: CollectionTestCase {
func test_unordered_insert() {
withEvery("count", in: 0 ..< 20) { count in
withEvery("dupes", in: 1 ... 3) { dupes in
withLifetimeTracking { tracker in
let input = (0 ..< dupes * count)
.map { tracker.instance(for: $0 / dupes) }
.shuffled()
let reference: [Int: LifetimeTracked<Int>] =
.init(input.lazy.map { ($0.payload, $0) },
uniquingKeysWith: { a, b in a })
var set = OrderedSet<LifetimeTracked<Int>>()
withEvery("offset", in: input.indices) { offset in
let item = input[offset]
let ref = reference[item.payload]
let (inserted, member) = set.unordered.insert(item)
expectEqual(inserted, ref === item)
expectEqual(member, item)
expectIdentical(member, ref)
expectTrue(set.contains(item))
}
}
}
}
// Check CoW copying behavior
do {
var set = OrderedSet<Int>(0 ..< 30)
let copy = set
expectTrue(set.unordered.insert(30).inserted)
expectTrue(set.contains(30))
expectFalse(copy.contains(30))
}
}
func test_unordered_update() {
withEvery("count", in: 0 ..< 20) { count in
withEvery("dupes", in: 1 ... 3) { dupes in
withLifetimeTracking { tracker in
let input = (0 ..< dupes * count)
.map { tracker.instance(for: $0 / dupes) }
.shuffled()
var reference: [Int: LifetimeTracked<Int>] = [:]
var set = OrderedSet<LifetimeTracked<Int>>()
withEvery("offset", in: input.indices) { offset in
let item = input[offset]
let old = set.unordered.update(with: item)
expectIdentical(old, reference[item.payload])
reference[item.payload] = item
expectTrue(set.contains(item))
}
}
}
}
// Check CoW copying behavior
do {
var set = OrderedSet<Int>(0 ..< 30)
let copy = set
expectNil(set.unordered.update(with: 30))
expectTrue(set.contains(30))
expectFalse(copy.contains(30))
}
}
}
|