@@ -48,34 +48,62 @@ class AmbTests: XCTestCase {
48
48
}
49
49
50
50
func testAmbCancelPreSubscription( ) {
51
- enum CancelError : Swift . Error {
52
- case cancelled
53
- }
54
- var ambPublisher : AnyCancellable ?
51
+ let ambPublisher : AnyCancellable ?
55
52
56
- var firstCompletion : Subscribers . Completion < CancelError > ?
57
- let subject1 = PassthroughSubject < Int , CancelError > ( )
53
+ let subject1Cancelled = expectation ( description : " first publisher cancelled " )
54
+ let subject1 = PassthroughSubject < Int , Error > ( )
58
55
let subject1Publisher = subject1
59
56
. handleEvents ( receiveCancel: {
60
- firstCompletion = . failure ( CancelError . cancelled )
57
+ subject1Cancelled . fulfill ( )
61
58
} )
62
59
. eraseToAnyPublisher ( )
63
60
64
- var secondCompletion : Subscribers . Completion < CancelError > ?
65
- let subject2 = PassthroughSubject < Int , CancelError > ( )
61
+ let subject2Cancelled = expectation ( description : " second publisher cancelled " )
62
+ let subject2 = PassthroughSubject < Int , Error > ( )
66
63
let subject2Publisher = subject2
67
64
. handleEvents ( receiveCancel: {
68
- secondCompletion = . failure ( CancelError . cancelled )
65
+ subject2Cancelled . fulfill ( )
69
66
} )
70
67
. eraseToAnyPublisher ( )
71
68
72
69
ambPublisher = Publishers . Amb ( first: subject1Publisher, second: subject2Publisher)
73
70
. sink ( receiveCompletion: { _ in } ,
74
71
receiveValue: { _ in } )
72
+
73
+ // cancelling amb should cancel the inner publishers
75
74
ambPublisher? . cancel ( )
76
75
77
- XCTAssertEqual ( firstCompletion, . failure( CancelError . cancelled) )
78
- XCTAssertEqual ( secondCompletion, . failure( CancelError . cancelled) )
76
+ waitForExpectations ( timeout: 0.01 )
77
+ }
78
+
79
+ func testAmbCancelPostSubscription( ) {
80
+ let subject1 = PassthroughSubject < Int , Error > ( )
81
+ var subject1cancelCounter = 0
82
+ let subject1Publisher = subject1
83
+ . handleEvents ( receiveCancel: {
84
+ subject1cancelCounter += 1
85
+ } )
86
+ . eraseToAnyPublisher ( )
87
+
88
+ let subject2 = PassthroughSubject < Int , Error > ( )
89
+ var subject2cancelCounter = 0
90
+ let subject2Publisher = subject2
91
+ . handleEvents ( receiveCancel: {
92
+ subject2cancelCounter += 1
93
+ } )
94
+ . eraseToAnyPublisher ( )
95
+
96
+ Publishers . Amb ( first: subject1Publisher, second: subject2Publisher)
97
+ . sink ( receiveCompletion: { _ in } ,
98
+ receiveValue: { _ in } )
99
+ . store ( in: & subscriptions)
100
+
101
+ // subject1 wins the race, so 2 has to be cancelled
102
+ subject1. send ( 1 )
103
+
104
+ // At dealloc both publishes are cancelled, so we cannot use expectations here and count the cancel events instead
105
+ XCTAssertEqual ( subject1cancelCounter, 0 )
106
+ XCTAssertEqual ( subject2cancelCounter, 1 )
79
107
}
80
108
81
109
func testAmbLimitedPreDemand( ) {
0 commit comments