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
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