Skip to content

Commit 893d2b4

Browse files
committed
Merge pull request #2330 from austinzheng/validation-tests
2 parents 9b06e78 + 0e22ef6 commit 893d2b4

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
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

Comments
 (0)