55// Created on 17/01/25.
66//
77
8+ import ConcurrencyExtras
89import Foundation
910import XCTest
1011
@@ -41,15 +42,15 @@ final class MessageRouterTests: XCTestCase {
4142 // MARK: - Tests
4243
4344 func testRouteToRegisteredChannel( ) async {
44- var channelAMessages : [ RealtimeMessageV2 ] = [ ]
45- var channelBMessages : [ RealtimeMessageV2 ] = [ ]
45+ let channelAMessages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
46+ let channelBMessages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
4647
4748 await router. registerChannel ( topic: " channel-a " ) { message in
48- channelAMessages. append ( message)
49+ channelAMessages. withValue { $0 . append ( message) }
4950 }
5051
5152 await router. registerChannel ( topic: " channel-b " ) { message in
52- channelBMessages. append ( message)
53+ channelBMessages. withValue { $0 . append ( message) }
5354 }
5455
5556 let messageA = makeMessage ( topic: " channel-a " , event: " test " )
@@ -58,11 +59,11 @@ final class MessageRouterTests: XCTestCase {
5859 await router. route ( messageA)
5960 await router. route ( messageB)
6061
61- XCTAssertEqual ( channelAMessages. count, 1 )
62- XCTAssertEqual ( channelAMessages. first? . topic, " channel-a " )
62+ XCTAssertEqual ( channelAMessages. value . count, 1 )
63+ XCTAssertEqual ( channelAMessages. value . first? . topic, " channel-a " )
6364
64- XCTAssertEqual ( channelBMessages. count, 1 )
65- XCTAssertEqual ( channelBMessages. first? . topic, " channel-b " )
65+ XCTAssertEqual ( channelBMessages. value . count, 1 )
66+ XCTAssertEqual ( channelBMessages. value . first? . topic, " channel-b " )
6667 }
6768
6869 func testRouteToUnregisteredChannelDoesNotCrash( ) async {
@@ -73,10 +74,10 @@ final class MessageRouterTests: XCTestCase {
7374 }
7475
7576 func testSystemHandlerReceivesAllMessages( ) async {
76- var systemMessages : [ RealtimeMessageV2 ] = [ ]
77+ let systemMessages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
7778
7879 await router. registerSystemHandler { message in
79- systemMessages. append ( message)
80+ systemMessages. withValue { $0 . append ( message) }
8081 }
8182
8283 let message1 = makeMessage ( topic: " channel-a " , event: " event1 " )
@@ -87,42 +88,42 @@ final class MessageRouterTests: XCTestCase {
8788 await router. route ( message2)
8889 await router. route ( message3)
8990
90- XCTAssertEqual ( systemMessages. count, 3 )
91- XCTAssertEqual ( systemMessages [ 0 ] . topic, " channel-a " )
92- XCTAssertEqual ( systemMessages [ 1 ] . topic, " channel-b " )
93- XCTAssertEqual ( systemMessages [ 2 ] . topic, " channel-c " )
91+ XCTAssertEqual ( systemMessages. value . count, 3 )
92+ XCTAssertEqual ( systemMessages. value [ 0 ] . topic, " channel-a " )
93+ XCTAssertEqual ( systemMessages. value [ 1 ] . topic, " channel-b " )
94+ XCTAssertEqual ( systemMessages. value [ 2 ] . topic, " channel-c " )
9495 }
9596
9697 func testBothSystemAndChannelHandlersReceiveMessage( ) async {
97- var systemMessages : [ RealtimeMessageV2 ] = [ ]
98- var channelMessages : [ RealtimeMessageV2 ] = [ ]
98+ let systemMessages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
99+ let channelMessages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
99100
100101 await router. registerSystemHandler { message in
101- systemMessages. append ( message)
102+ systemMessages. withValue { $0 . append ( message) }
102103 }
103104
104105 await router. registerChannel ( topic: " test-channel " ) { message in
105- channelMessages. append ( message)
106+ channelMessages. withValue { $0 . append ( message) }
106107 }
107108
108109 let message = makeMessage ( topic: " test-channel " , event: " test " )
109110 await router. route ( message)
110111
111- XCTAssertEqual ( systemMessages. count, 1 )
112- XCTAssertEqual ( channelMessages. count, 1 )
112+ XCTAssertEqual ( systemMessages. value . count, 1 )
113+ XCTAssertEqual ( channelMessages. value . count, 1 )
113114 }
114115
115116 func testUnregisterChannelStopsRoutingToIt( ) async {
116- var channelMessages : [ RealtimeMessageV2 ] = [ ]
117+ let channelMessages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
117118
118119 await router. registerChannel ( topic: " test-channel " ) { message in
119- channelMessages. append ( message)
120+ channelMessages. withValue { $0 . append ( message) }
120121 }
121122
122123 let message1 = makeMessage ( topic: " test-channel " , event: " test1 " )
123124 await router. route ( message1)
124125
125- XCTAssertEqual ( channelMessages. count, 1 )
126+ XCTAssertEqual ( channelMessages. value . count, 1 )
126127
127128 // Unregister
128129 await router. unregisterChannel ( topic: " test-channel " )
@@ -131,47 +132,47 @@ final class MessageRouterTests: XCTestCase {
131132 await router. route ( message2)
132133
133134 // Should still be 1 (not routed after unregister)
134- XCTAssertEqual ( channelMessages. count, 1 )
135+ XCTAssertEqual ( channelMessages. value . count, 1 )
135136 }
136137
137138 func testReregisterChannelReplacesHandler( ) async {
138- var handler1Messages : [ RealtimeMessageV2 ] = [ ]
139- var handler2Messages : [ RealtimeMessageV2 ] = [ ]
139+ let handler1Messages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
140+ let handler2Messages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
140141
141142 await router. registerChannel ( topic: " test-channel " ) { message in
142- handler1Messages. append ( message)
143+ handler1Messages. withValue { $0 . append ( message) }
143144 }
144145
145146 let message1 = makeMessage ( topic: " test-channel " , event: " test1 " )
146147 await router. route ( message1)
147148
148- XCTAssertEqual ( handler1Messages. count, 1 )
149- XCTAssertEqual ( handler2Messages. count, 0 )
149+ XCTAssertEqual ( handler1Messages. value . count, 1 )
150+ XCTAssertEqual ( handler2Messages. value . count, 0 )
150151
151152 // Re-register with new handler
152153 await router. registerChannel ( topic: " test-channel " ) { message in
153- handler2Messages. append ( message)
154+ handler2Messages. withValue { $0 . append ( message) }
154155 }
155156
156157 let message2 = makeMessage ( topic: " test-channel " , event: " test2 " )
157158 await router. route ( message2)
158159
159160 // First handler should not receive second message
160- XCTAssertEqual ( handler1Messages. count, 1 )
161+ XCTAssertEqual ( handler1Messages. value . count, 1 )
161162 // Second handler should receive it
162- XCTAssertEqual ( handler2Messages. count, 1 )
163+ XCTAssertEqual ( handler2Messages. value . count, 1 )
163164 }
164165
165166 func testResetRemovesAllHandlers( ) async {
166- var channelMessages : [ RealtimeMessageV2 ] = [ ]
167- var systemMessages : [ RealtimeMessageV2 ] = [ ]
167+ let channelMessages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
168+ let systemMessages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
168169
169170 await router. registerChannel ( topic: " channel-a " ) { message in
170- channelMessages. append ( message)
171+ channelMessages. withValue { $0 . append ( message) }
171172 }
172173
173174 await router. registerSystemHandler { message in
174- systemMessages. append ( message)
175+ systemMessages. withValue { $0 . append ( message) }
175176 }
176177
177178 let message1 = makeMessage ( topic: " channel-a " , event: " test1 " )
@@ -187,8 +188,8 @@ final class MessageRouterTests: XCTestCase {
187188 await router. route ( message2)
188189
189190 // No more messages after reset
190- XCTAssertEqual ( channelMessages. count, 1 )
191- XCTAssertEqual ( systemMessages. count, 1 )
191+ XCTAssertEqual ( channelMessages. value . count, 1 )
192+ XCTAssertEqual ( systemMessages. value . count, 1 )
192193 }
193194
194195 func testChannelCountReflectsRegistrations( ) async {
@@ -213,32 +214,29 @@ final class MessageRouterTests: XCTestCase {
213214 }
214215
215216 func testMultipleSystemHandlers( ) async {
216- var system1Messages : [ RealtimeMessageV2 ] = [ ]
217- var system2Messages : [ RealtimeMessageV2 ] = [ ]
217+ let system1Messages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
218+ let system2Messages = LockIsolated ( [ RealtimeMessageV2 ] ( ) )
218219
219220 await router. registerSystemHandler { message in
220- system1Messages. append ( message)
221+ system1Messages. withValue { $0 . append ( message) }
221222 }
222223
223224 await router. registerSystemHandler { message in
224- system2Messages. append ( message)
225+ system2Messages. withValue { $0 . append ( message) }
225226 }
226227
227228 let message = makeMessage ( topic: " test " , event: " test " )
228229 await router. route ( message)
229230
230- XCTAssertEqual ( system1Messages. count, 1 )
231- XCTAssertEqual ( system2Messages. count, 1 )
231+ XCTAssertEqual ( system1Messages. value . count, 1 )
232+ XCTAssertEqual ( system2Messages. value . count, 1 )
232233 }
233234
234235 func testConcurrentRouting( ) async {
235- var receivedCount = 0
236- let lock = NSLock ( )
236+ let receivedCount = LockIsolated ( 0 )
237237
238238 await router. registerChannel ( topic: " test-channel " ) { _ in
239- lock. lock ( )
240- receivedCount += 1
241- lock. unlock ( )
239+ receivedCount. withValue { $0 += 1 }
242240 }
243241
244242 // Route messages concurrently
@@ -253,6 +251,6 @@ final class MessageRouterTests: XCTestCase {
253251 await group. waitForAll ( )
254252 }
255253
256- XCTAssertEqual ( receivedCount, 100 , " Should receive all messages " )
254+ XCTAssertEqual ( receivedCount. value , 100 , " Should receive all messages " )
257255 }
258256}
0 commit comments