Guest User

Untitled

a guest
Jun 23rd, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.09 KB | None | 0 0
  1. import Foundation
  2. import RxSwift
  3. import RxCocoa
  4. import RxTest
  5. import Nimble
  6.  
  7. // Nimble Matchers to work with RxTest and Events
  8.  
  9. public func equal<T: Equatable>(_ expectedValue: [Recorded<Event<T>>]) -> Predicate<[Recorded<Event<T>>]> {
  10. return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in
  11. guard let actualValue = try actualExpression.evaluate() else {
  12. return PredicateResult(
  13. status: .fail,
  14. message: msg.appendedBeNilHint()
  15. )
  16. }
  17. let left = expectedValue.map { AnyEquatable(target: $0, comparer: ==) }
  18. let right = actualValue.map { AnyEquatable(target: $0, comparer: ==) }
  19. let matches = left == right
  20. return PredicateResult(bool: matches, message: msg)
  21. }
  22. }
  23.  
  24. public func equal<T: Equatable>(_ expectedValue: [Recorded<Event<T?>>]) -> Predicate<[Recorded<Event<T?>>]> {
  25. return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in
  26. guard let actualValue = try actualExpression.evaluate() else {
  27. return PredicateResult(
  28. status: .fail,
  29. message: msg.appendedBeNilHint()
  30. )
  31. }
  32. let left = expectedValue.map { AnyEquatable(target: $0, comparer: ==) }
  33. let right = actualValue.map { AnyEquatable(target: $0, comparer: ==) }
  34. let matches = left == right
  35. return PredicateResult(bool: matches, message: msg)
  36. }
  37. }
  38.  
  39.  
  40. public func equal<T: Equatable>(_ expectedValue: [MaybeEvent<T>]) -> Predicate<[MaybeEvent<T>]> {
  41. return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in
  42. guard let actualValue = try actualExpression.evaluate() else {
  43. return PredicateResult(
  44. status: .fail,
  45. message: msg.appendedBeNilHint()
  46. )
  47. }
  48.  
  49. let left = expectedValue.map { AnyEquatable(target: $0, comparer: ==) }
  50. let right = actualValue.map { AnyEquatable(target: $0, comparer: ==) }
  51. let matches = left == right
  52. return PredicateResult(bool: matches, message: msg)
  53. }
  54. }
  55.  
  56. public func equal<T: Equatable>(_ expectedValue: [SingleEvent<T>]) -> Predicate<[SingleEvent<T>]> {
  57. return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in
  58. guard let actualValue = try actualExpression.evaluate() else {
  59. return PredicateResult(
  60. status: .fail,
  61. message: msg.appendedBeNilHint()
  62. )
  63. }
  64.  
  65. let left = expectedValue.map { AnyEquatable(target: $0, comparer: ==) }
  66. let right = actualValue.map { AnyEquatable(target: $0, comparer: ==) }
  67. let matches = left == right
  68. return PredicateResult(bool: matches, message: msg)
  69. }
  70. }
  71.  
  72. public func equal(_ expectedValue: [CompletableEvent]) -> Predicate<[CompletableEvent]> {
  73. return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in
  74. guard let actualValue = try actualExpression.evaluate() else {
  75. return PredicateResult(
  76. status: .fail,
  77. message: msg.appendedBeNilHint()
  78. )
  79. }
  80.  
  81. let left = expectedValue.map { AnyEquatable(target: $0, comparer: ==) }
  82. let right = actualValue.map { AnyEquatable(target: $0, comparer: ==) }
  83. let matches = left == right
  84. return PredicateResult(bool: matches, message: msg)
  85. }
  86. }
  87.  
  88.  
  89. // Taken from RxTest - because RxTest doesn't expose this
  90. struct AnyEquatable<Target> : Equatable {
  91. typealias Comparer = (Target, Target) -> Bool
  92.  
  93. let _target: Target
  94. let _comparer: Comparer
  95.  
  96. init(target: Target, comparer: @escaping Comparer) {
  97. _target = target
  98. _comparer = comparer
  99. }
  100. }
  101.  
  102. func == <T>(lhs: AnyEquatable<T>, rhs: AnyEquatable<T>) -> Bool {
  103. return lhs._comparer(lhs._target, rhs._target)
  104. }
  105.  
  106. extension AnyEquatable
  107. : CustomDebugStringConvertible
  108. , CustomStringConvertible {
  109. var description: String {
  110. return "\(_target)"
  111. }
  112.  
  113. var debugDescription: String {
  114. return "\(_target)"
  115. }
  116. }
Add Comment
Please, Sign In to add comment