SignalProducerNimbleMatchers.swift 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. //
  2. // SignalProducerNimbleMatchers.swift
  3. // ReactiveCocoa
  4. //
  5. // Created by Javier Soto on 1/25/15.
  6. // Copyright (c) 2015 GitHub. All rights reserved.
  7. //
  8. import Foundation
  9. import ReactiveCocoa
  10. import Nimble
  11. public func sendValue<T: Equatable, E: Equatable>(value: T?, sendError: E?, complete: Bool) -> NonNilMatcherFunc<SignalProducer<T, E>> {
  12. return sendValues(value.map { [$0] } ?? [], sendError: sendError, complete: complete)
  13. }
  14. public func sendValues<T: Equatable, E: Equatable>(values: [T], sendError maybeSendError: E?, complete: Bool) -> NonNilMatcherFunc<SignalProducer<T, E>> {
  15. return NonNilMatcherFunc { actualExpression, failureMessage in
  16. precondition(maybeSendError == nil || !complete, "Signals can't both send an error and complete")
  17. failureMessage.postfixMessage = "Send values \(values). Send error \(maybeSendError). Complete: \(complete)"
  18. let maybeProducer = try actualExpression.evaluate()
  19. if let signalProducer = maybeProducer {
  20. var sentValues: [T] = []
  21. var sentError: E?
  22. var signalCompleted = false
  23. signalProducer.start { event in
  24. switch event {
  25. case let .Next(value):
  26. sentValues.append(value)
  27. case .Completed:
  28. signalCompleted = true
  29. case let .Failed(error):
  30. sentError = error
  31. default:
  32. break
  33. }
  34. }
  35. if sentValues != values {
  36. return false
  37. }
  38. if sentError != maybeSendError {
  39. return false
  40. }
  41. return signalCompleted == complete
  42. }
  43. else {
  44. return false
  45. }
  46. }
  47. }