combineLatest.lua 3.1 KB

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