|
| 1 | +// -*- swift -*- |
| 2 | + |
| 3 | +// RUN: rm -rf %t |
| 4 | +// RUN: mkdir -p %t |
| 5 | +// RUN: %S/../../../utils/gyb %s -o %t/main.swift |
| 6 | +// RUN: %S/../../../utils/line-directive %t/main.swift -- %target-build-swift %t/main.swift -o %t/LazyMapCollection.swift.a.out |
| 7 | +// RUN: %S/../../../utils/line-directive %t/main.swift -- %target-run %t/LazyMapCollection.swift.a.out |
| 8 | +// REQUIRES: executable_test |
| 9 | + |
| 10 | +import StdlibUnittest |
| 11 | +import StdlibCollectionUnittest |
| 12 | + |
| 13 | +var CollectionTests = TestSuite("Collection") |
| 14 | + |
| 15 | +%{ |
| 16 | +variations = [('', 'Sequence'), ('', 'Collection'), ('Bidirectional', 'Collection'), ('RandomAccess', 'Collection')] |
| 17 | +}% |
| 18 | + |
| 19 | +// Test collections using value types as elements. |
| 20 | +% for (traversal, kind) in variations: |
| 21 | +CollectionTests.add${traversal}${kind}Tests( |
| 22 | + make${kind}: { (elements: [OpaqueValue<Int>]) -> LazyMap${traversal}${kind}<Minimal${traversal}${kind}<OpaqueValue<Int>>, OpaqueValue<Int>> in |
| 23 | + Minimal${traversal}${kind}(elements: elements).lazy.map(identity) |
| 24 | + }, |
| 25 | + wrapValue: identity, |
| 26 | + extractValue: identity, |
| 27 | + make${kind}OfEquatable: { (elements: [MinimalEquatableValue]) -> LazyMap${traversal}${kind}<Minimal${traversal}${kind}<MinimalEquatableValue>, MinimalEquatableValue> in |
| 28 | + Minimal${traversal}${kind}(elements: elements).lazy.map(identityEq) |
| 29 | + }, |
| 30 | + wrapValueIntoEquatable: identityEq, |
| 31 | + extractValueFromEquatable: identityEq |
| 32 | +) |
| 33 | +% end |
| 34 | + |
| 35 | +// Test collections using reference types as elements. |
| 36 | +% for (traversal, kind) in variations: |
| 37 | +CollectionTests.add${traversal}${kind}Tests( |
| 38 | + make${kind}: { (elements: [LifetimeTracked]) -> LazyMap${traversal}${kind}<Minimal${traversal}${kind}<LifetimeTracked>, LifetimeTracked> in |
| 39 | + Minimal${traversal}${kind}(elements: elements).lazy.map { $0 } |
| 40 | + }, |
| 41 | + wrapValue: { (element: OpaqueValue<Int>) in |
| 42 | + LifetimeTracked(element.value, identity: element.identity) |
| 43 | + }, |
| 44 | + extractValue: { (element: LifetimeTracked) in |
| 45 | + OpaqueValue(element.value, identity: element.identity) |
| 46 | + }, |
| 47 | + // FIXME: use LifetimeTracked once bug is validated/fixed |
| 48 | + make${kind}OfEquatable: { (elements: [MinimalEquatableValue]) -> LazyMap${traversal}${kind}<Minimal${traversal}${kind}<MinimalEquatableValue>, MinimalEquatableValue> in // -> LazyMap${traversal}${kind}<Minimal${traversal}${kind}<LifetimeTracked>, LifetimeTracked> in |
| 49 | + Minimal${traversal}${kind}(elements: elements).lazy.map { $0 } |
| 50 | + }, |
| 51 | + wrapValueIntoEquatable: identityEq, //{ (element: MinimalEquatableValue) in |
| 52 | +// LifetimeTracked(element.value, identity: element.identity) |
| 53 | +// }, |
| 54 | + extractValueFromEquatable: identityEq //{ (element: LifetimeTracked) in |
| 55 | +// MinimalEquatableValue(element.value, identity: element.identity) |
| 56 | +// } |
| 57 | +) |
| 58 | +% end |
| 59 | + |
| 60 | +// Test sequence instances and iterators. |
| 61 | +% for (traversal, kind) in variations: |
| 62 | +CollectionTests.test("LazyMapCollection instances (${traversal}${kind})") { |
| 63 | + do { |
| 64 | + // MinimalIterator will error if next() is called after exhaustion |
| 65 | + var resiliency = CollectionMisuseResiliencyChecks.all |
| 66 | + resiliency.callNextOnExhaustedGenerator = false |
| 67 | + |
| 68 | + let expected = ["convent", "conform", "constrict", "condone"] |
| 69 | + let base = ["vent", "form", "strict", "done"] |
| 70 | +% if kind == 'Sequence': |
| 71 | + checkSequence( |
| 72 | + expected, |
| 73 | + MinimalSequence(elements: base).lazy.map { "con" + $0 }, |
| 74 | + resiliencyChecks: resiliency |
| 75 | + ) |
| 76 | +% elif traversal == '' and kind == 'Collection': |
| 77 | + checkForwardCollection(expected, |
| 78 | + MinimalCollection(elements: base).lazy.map { "con" + $0 }, |
| 79 | + resiliencyChecks: resiliency, |
| 80 | + sameValue: { $0 == $1 } |
| 81 | + ) |
| 82 | +% else: |
| 83 | + check${traversal}${kind}(expected, |
| 84 | + Minimal${traversal}${kind}(elements: base).lazy.map { "con" + $0 }, |
| 85 | + resiliencyChecks: resiliency, |
| 86 | + sameValue: { $0 == $1 } |
| 87 | + ) |
| 88 | +% end |
| 89 | + } |
| 90 | + do { |
| 91 | + // MinimalIterator will error if next() is called after exhaustion |
| 92 | + var resiliency = CollectionMisuseResiliencyChecks.all |
| 93 | + resiliency.callNextOnExhaustedGenerator = false |
| 94 | + |
| 95 | + let expected = [1, 4, 9, 16, 25, 36, 49, 64] |
| 96 | + let base = [1, 2, 3, 4, 5, 6, 7, 8] |
| 97 | +% if kind == 'Sequence': |
| 98 | + checkSequence( |
| 99 | + expected, |
| 100 | + MinimalSequence(elements: base).lazy.map { $0 * $0 }, |
| 101 | + resiliencyChecks: resiliency |
| 102 | + ) |
| 103 | +% elif traversal == '' and kind == 'Collection': |
| 104 | + checkForwardCollection(expected, |
| 105 | + MinimalCollection(elements: base).lazy.map { $0 * $0 }, |
| 106 | + resiliencyChecks: resiliency, |
| 107 | + sameValue: { $0 == $1 } |
| 108 | + ) |
| 109 | +% else: |
| 110 | + check${traversal}${kind}( |
| 111 | + expected, |
| 112 | + Minimal${traversal}${kind}(elements: base).lazy.map { $0 * $0 }, |
| 113 | + resiliencyChecks: resiliency, |
| 114 | + sameValue: { $0 == $1 } |
| 115 | + ) |
| 116 | +% end |
| 117 | + } |
| 118 | +} |
| 119 | +% end |
| 120 | + |
| 121 | +runAllTests() |
0 commit comments