13
13
import AsyncAlgorithms
14
14
15
15
final class TestLazy : XCTestCase {
16
- func test_array( ) async {
17
- let source = [ 1 , 2 , 3 , 4 ]
18
- let expected = source
19
- let sequence = source. async
20
-
21
- var actual = [ Int] ( )
16
+ func test_lazy_outputs_elements_and_finishes_when_source_is_array( ) async {
17
+ let expected = [ 1 , 2 , 3 , 4 ]
18
+ let sequence = expected. async
19
+
20
+ var collected = [ Int] ( )
22
21
for await item in sequence {
23
- actual . append ( item)
22
+ collected . append ( item)
24
23
}
25
24
26
- XCTAssertEqual ( expected, actual )
25
+ XCTAssertEqual ( expected, collected )
27
26
}
28
27
29
- func test_set( ) async {
30
- let source : Set = [ 1 , 2 , 3 , 4 ]
31
- let expected = source
32
- let sequence = source. async
28
+ func test_lazy_outputs_elements_and_finishes_when_source_is_set( ) async {
29
+ let expected : Set = [ 1 , 2 , 3 , 4 ]
30
+ let sequence = expected. async
33
31
34
- var actual = Set < Int > ( )
32
+ var collected = Set < Int > ( )
35
33
for await item in sequence {
36
- actual . insert ( item)
34
+ collected . insert ( item)
37
35
}
38
36
39
- XCTAssertEqual ( expected, actual )
37
+ XCTAssertEqual ( expected, collected )
40
38
}
41
39
42
- func test_empty( ) async {
43
- let source = EmptyCollection < Int > ( )
40
+ func test_lazy_finishes_without_elements_when_source_is_empty( ) async {
44
41
let expected = [ Int] ( )
45
- let sequence = source . async
42
+ let sequence = expected . async
46
43
47
- var actual = [ Int] ( )
44
+ var collected = [ Int] ( )
48
45
for await item in sequence {
49
- actual . append ( item)
46
+ collected . append ( item)
50
47
}
51
48
52
- XCTAssertEqual ( expected, actual )
49
+ XCTAssertEqual ( expected, collected )
53
50
}
54
51
55
- func test_iteration( ) async {
56
- let source = ReportingSequence ( [ 1 , 2 , 3 ] )
52
+ func test_lazy_triggers_expected_iterator_events_when_source_is_iterated( ) async {
53
+ let expected = [ 1 , 2 , 3 ]
54
+ let expectedEvents = [
55
+ ReportingSequence < Int > . Event. makeIterator,
56
+ . next,
57
+ . next,
58
+ . next,
59
+ . next
60
+ ]
61
+ let source = ReportingSequence ( expected)
57
62
let sequence = source. async
63
+
58
64
XCTAssertEqual ( source. events, [ ] )
65
+
59
66
var collected = [ Int] ( )
60
67
for await item in sequence {
61
68
collected. append ( item)
62
69
}
63
- XCTAssertEqual ( collected, [ 1 , 2 , 3 ] )
64
- XCTAssertEqual ( source. events, [
65
- . makeIterator,
70
+
71
+ XCTAssertEqual ( expected, collected)
72
+ XCTAssertEqual ( expectedEvents, source. events)
73
+ }
74
+
75
+ func test_lazy_stops_triggering_iterator_events_when_source_is_pastEnd( ) async {
76
+ let expected = [ 1 , 2 , 3 ]
77
+ let expectedEvents = [
78
+ ReportingSequence < Int > . Event. makeIterator,
66
79
. next,
67
80
. next,
68
81
. next,
69
82
. next
70
- ] )
71
- }
72
-
73
- func test_manual_iteration( ) async {
74
- let source = ReportingSequence ( [ 1 , 2 , 3 ] )
83
+ ]
84
+ let source = ReportingSequence ( expected)
75
85
let sequence = source. async
86
+
76
87
XCTAssertEqual ( source. events, [ ] )
88
+
77
89
var collected = [ Int] ( )
78
90
var iterator = sequence. makeAsyncIterator ( )
79
91
while let item = await iterator. next ( ) {
80
92
collected. append ( item)
81
93
}
82
- XCTAssertEqual ( collected, [ 1 , 2 , 3 ] )
83
- XCTAssertEqual ( source. events, [
84
- . makeIterator,
85
- . next,
86
- . next,
87
- . next,
88
- . next
89
- ] )
94
+
95
+ XCTAssertEqual ( expected, collected)
96
+ XCTAssertEqual ( expectedEvents, source. events)
97
+
90
98
let pastEnd = await iterator. next ( )
99
+
91
100
XCTAssertEqual ( pastEnd, nil )
92
101
// ensure that iterating past the end does not invoke next again
93
- XCTAssertEqual ( source. events, [
94
- . makeIterator,
95
- . next,
96
- . next,
97
- . next,
98
- . next
99
- ] )
102
+ XCTAssertEqual ( expectedEvents, source. events)
100
103
}
101
104
102
- func test_cancellation( ) async {
103
- let source = Indefinite ( value: " test " )
104
- let sequence = source. async
105
+ func test_lazy_finishes_when_task_is_cancelled( ) async {
105
106
let finished = expectation ( description: " finished " )
106
107
let iterated = expectation ( description: " iterated " )
108
+
109
+ let source = Indefinite ( value: " test " )
110
+ let sequence = source. async
111
+
107
112
let task = Task {
108
113
var firstIteration = false
109
114
for await _ in sequence {
@@ -114,11 +119,14 @@ final class TestLazy: XCTestCase {
114
119
}
115
120
finished. fulfill ( )
116
121
}
122
+
117
123
// ensure the other task actually starts
118
124
wait ( for: [ iterated] , timeout: 1.0 )
125
+
119
126
// cancellation should ensure the loop finishes
120
127
// without regards to the remaining underlying sequence
121
128
task. cancel ( )
129
+
122
130
wait ( for: [ finished] , timeout: 1.0 )
123
131
}
124
132
}
0 commit comments