Skip to content
Snippets Groups Projects
Commit 4b3b46b5 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Add ListenersRegistry

parent be2c14ae
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!85Messenger - send & receive messages
This commit is part of merge request !85. Comments created here will be created in the context of that merge request.
import Foundation
import XCTestDynamicOverlay
import XXClient
public struct ListenersRegistry {
public var register: (Listener) -> Cancellable
public var registered: () -> Listener
}
extension ListenersRegistry {
public static func live() -> ListenersRegistry {
class Registry {
var listeners: [UUID: Listener] = [:]
}
let registry = Registry()
return ListenersRegistry(
register: { listener in
let id = UUID()
registry.listeners[id] = listener
return Cancellable { registry.listeners[id] = nil }
},
registered: {
Listener(name: "listeners-registry") { message in
registry.listeners.values.forEach { $0.handle(message) }
}
}
)
}
}
extension ListenersRegistry {
public static let unimplemented = ListenersRegistry(
register: XCTUnimplemented("\(Self.self).register", placeholder: Cancellable {}),
registered: XCTUnimplemented("\(Self.self).registered", placeholder: Listener(
name: "unimplemented",
handle: { _ in }
))
)
}
import XXClient
extension Message {
static func stub(_ stubId: Int) -> Message {
.init(
messageType: stubId,
id: "id-\(stubId)".data(using: .utf8)!,
payload: "payload-\(stubId)".data(using: .utf8)!,
sender: "sender-\(stubId)".data(using: .utf8)!,
recipientId: "recipientId-\(stubId)".data(using: .utf8)!,
ephemeralId: stubId,
timestamp: stubId,
encrypted: stubId % 2 == 0,
roundId: stubId,
roundURL: "roundURL-\(stubId)"
)
}
}
import CustomDump
import XCTest
import XXClient
@testable import XXMessengerClient
final class ListenersRegistryTestsTests: XCTestCase {
func testRegistry() {
var firstListenerDidHandle: [Message] = []
var secondListenerDidHandle: [Message] = []
let firstListener = Listener { message in
firstListenerDidHandle.append(message)
}
let secondListener = Listener { message in
secondListenerDidHandle.append(message)
}
let listenersRegistry: ListenersRegistry = .live()
let registeredListeners = listenersRegistry.registered()
let firstListenerCancellable = listenersRegistry.register(firstListener)
let secondListenerCancellable = listenersRegistry.register(secondListener)
let firstMessage = Message.stub(1)
registeredListeners.handle(firstMessage)
XCTAssertNoDifference(firstListenerDidHandle, [firstMessage])
XCTAssertNoDifference(secondListenerDidHandle, [firstMessage])
firstListenerCancellable.cancel()
let secondMessage = Message.stub(2)
registeredListeners.handle(secondMessage)
XCTAssertNoDifference(firstListenerDidHandle, [firstMessage])
XCTAssertNoDifference(secondListenerDidHandle, [firstMessage, secondMessage])
secondListenerCancellable.cancel()
let thirdMessage = Message.stub(3)
registeredListeners.handle(thirdMessage)
XCTAssertNoDifference(firstListenerDidHandle, [firstMessage])
XCTAssertNoDifference(secondListenerDidHandle, [firstMessage, secondMessage])
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment