-
Notifications
You must be signed in to change notification settings - Fork 69
/
Equal+RxTest.swift
35 lines (29 loc) · 1.18 KB
/
Equal+RxTest.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import Nimble
import RxSwift
import RxTest
/// A Nimble matcher that succeeds when the actual events are equal to the expected events.
public func equal<T: Equatable>(_ expectedEvents: RecordedEvents<T>) -> Predicate<RecordedEvents<T>> {
return Predicate.define { actualEvents in
let actualEquatableEvents = try actualEvents.evaluate()?.map { AnyEquatable(target: $0, comparer: ==) }
let expectedEquatableEvents = expectedEvents.map { AnyEquatable(target: $0, comparer: ==) }
let matches = (actualEquatableEvents == expectedEquatableEvents)
return PredicateResult(bool: matches,
message: .expectedActualValueTo(
"emit <\(stringify(expectedEquatableEvents))>")
)
}
}
// Borrowed this implementation from RxTest.
struct AnyEquatable<Target>
: Equatable {
typealias Comparer = (Target, Target) -> Bool
let _target: Target
let _comparer: Comparer
init(target: Target, comparer: @escaping Comparer) {
_target = target
_comparer = comparer
}
}
func == <T>(lhs: AnyEquatable<T>, rhs: AnyEquatable<T>) -> Bool {
return lhs._comparer(lhs._target, rhs._target)
}