1313import AsyncAlgorithms
1414
1515final 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] ( )
2221 for await item in sequence {
23- actual . append ( item)
22+ collected . append ( item)
2423 }
2524
26- XCTAssertEqual ( expected, actual )
25+ XCTAssertEqual ( expected, collected )
2726 }
2827
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
3331
34- var actual = Set < Int > ( )
32+ var collected = Set < Int > ( )
3533 for await item in sequence {
36- actual . insert ( item)
34+ collected . insert ( item)
3735 }
3836
39- XCTAssertEqual ( expected, actual )
37+ XCTAssertEqual ( expected, collected )
4038 }
4139
42- func test_empty( ) async {
43- let source = EmptyCollection < Int > ( )
40+ func test_lazy_finishes_without_elements_when_source_is_empty( ) async {
4441 let expected = [ Int] ( )
45- let sequence = source . async
42+ let sequence = expected . async
4643
47- var actual = [ Int] ( )
44+ var collected = [ Int] ( )
4845 for await item in sequence {
49- actual . append ( item)
46+ collected . append ( item)
5047 }
5148
52- XCTAssertEqual ( expected, actual )
49+ XCTAssertEqual ( expected, collected )
5350 }
5451
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)
5762 let sequence = source. async
63+
5864 XCTAssertEqual ( source. events, [ ] )
65+
5966 var collected = [ Int] ( )
6067 for await item in sequence {
6168 collected. append ( item)
6269 }
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,
6679 . next,
6780 . next,
6881 . next,
6982 . next
70- ] )
71- }
72-
73- func test_manual_iteration( ) async {
74- let source = ReportingSequence ( [ 1 , 2 , 3 ] )
83+ ]
84+ let source = ReportingSequence ( expected)
7585 let sequence = source. async
86+
7687 XCTAssertEqual ( source. events, [ ] )
88+
7789 var collected = [ Int] ( )
7890 var iterator = sequence. makeAsyncIterator ( )
7991 while let item = await iterator. next ( ) {
8092 collected. append ( item)
8193 }
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+
9098 let pastEnd = await iterator. next ( )
99+
91100 XCTAssertEqual ( pastEnd, nil )
92101 // 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)
100103 }
101104
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 {
105106 let finished = expectation ( description: " finished " )
106107 let iterated = expectation ( description: " iterated " )
108+
109+ let source = Indefinite ( value: " test " )
110+ let sequence = source. async
111+
107112 let task = Task {
108113 var firstIteration = false
109114 for await _ in sequence {
@@ -114,11 +119,14 @@ final class TestLazy: XCTestCase {
114119 }
115120 finished. fulfill ( )
116121 }
122+
117123 // ensure the other task actually starts
118124 wait ( for: [ iterated] , timeout: 1.0 )
125+
119126 // cancellation should ensure the loop finishes
120127 // without regards to the remaining underlying sequence
121128 task. cancel ( )
129+
122130 wait ( for: [ finished] , timeout: 1.0 )
123131 }
124132}
0 commit comments