combineLatest.lua 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. describe('combineLatest', function()
  2. it('returns the observable it is called on if only the identity function is passed as an argument', function()
  3. local observable = Rx.Observable.fromRange(1, 5):combineLatest(function(x) return x end)
  4. expect(observable).to.produce(1, 2, 3, 4, 5)
  5. end)
  6. it('unsubscribes from the combined source observables', function()
  7. local unsubscribeA = spy()
  8. local subscriptionA = Rx.Subscription.create(unsubscribeA)
  9. local observableA = Rx.Observable.create(function(observer)
  10. return subscriptionA
  11. end)
  12. local unsubscribeB = spy()
  13. local subscriptionB = Rx.Subscription.create(unsubscribeB)
  14. local observableB = Rx.Observable.create(function(observer)
  15. return subscriptionB
  16. end)
  17. local subscription = Rx.Observable.combineLatest(observableA, observableB):subscribe()
  18. subscription:unsubscribe()
  19. expect(#unsubscribeA).to.equal(1)
  20. expect(#unsubscribeB).to.equal(1)
  21. end)
  22. it('calls the combinator function with all values produced from all input observables once they have all produced a value', function()
  23. local observableA = Rx.Observable.of('a')
  24. local observableB = Rx.Observable.of('b')
  25. local observableC = Rx.Observable.of('c')
  26. local combinator = spy()
  27. Rx.Observable.combineLatest(observableA, observableB, observableC, function(...) combinator(...) end):subscribe()
  28. expect(combinator).to.equal({{'a', 'b', 'c'}})
  29. end)
  30. it('emits the return value of the combinator as values', function()
  31. local observableA = Rx.Subject.create()
  32. local observableB = Rx.Subject.create()
  33. local onNext = spy()
  34. Rx.Observable.combineLatest(observableA, observableB, function(a, b) return a + b end):subscribe(Rx.Observer.create(onNext))
  35. expect(#onNext).to.equal(0)
  36. observableA:onNext(1)
  37. observableB:onNext(2)
  38. observableB:onNext(3)
  39. observableA:onNext(4)
  40. expect(onNext).to.equal({{3}, {4}, {7}})
  41. end)
  42. it('calls onCompleted once all sources complete', function()
  43. local observableA = Rx.Subject.create()
  44. local observableB = Rx.Subject.create()
  45. local complete = spy()
  46. Rx.Observable.combineLatest(observableA, observableB, function() end):subscribe(nil, nil, complete)
  47. expect(#complete).to.equal(0)
  48. observableA:onNext(1)
  49. expect(#complete).to.equal(0)
  50. observableB:onNext(2)
  51. expect(#complete).to.equal(0)
  52. observableB:onCompleted()
  53. expect(#complete).to.equal(0)
  54. observableA:onCompleted()
  55. expect(#complete).to.equal(1)
  56. end)
  57. it('calls onError if one source errors', function()
  58. local observableA = Rx.Subject.create()
  59. local observableB = Rx.Subject.create()
  60. local errored = spy()
  61. Rx.Observable.combineLatest(observableA, observableB, function() end):subscribe(nil, errored)
  62. expect(#errored).to.equal(0)
  63. observableB:onError()
  64. expect(#errored).to.equal(1)
  65. end)
  66. it('calls onError if the combinator is absent', function()
  67. expect(Rx.Observable.combineLatest(Rx.Observable.fromRange(3)).subscribe).to.fail()
  68. end)
  69. it('calls onError if the combinator errors', function()
  70. local onError = spy()
  71. Rx.Observable.combineLatest(Rx.Observable.fromRange(3), error):subscribe(nil, onError, nil)
  72. expect(#onError).to.equal(1)
  73. end)
  74. end)