observer.lua 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. describe('Observer', function()
  2. describe('create', function()
  3. local function expectObserverToBeInCleanStateAndValid(observer)
  4. expect(observer).to.be.an(Rx.Observer)
  5. expect(observer.stopped).to.equal(false)
  6. end
  7. it('works when no parameters is passed', function()
  8. local observer = Rx.Observer.create()
  9. expectObserverToBeInCleanStateAndValid(observer)
  10. end)
  11. it('works when onNext callback parameter is passed', function()
  12. local observer = Rx.Observer.create(function() end)
  13. expectObserverToBeInCleanStateAndValid(observer)
  14. end)
  15. it('works when onError callback parameter is passed', function()
  16. local observer = Rx.Observer.create(nil, function() end)
  17. expectObserverToBeInCleanStateAndValid(observer)
  18. end)
  19. it('works when onComplete callback parameter is passed', function()
  20. local observer = Rx.Observer.create(nil, nil, function() end)
  21. expectObserverToBeInCleanStateAndValid(observer)
  22. end)
  23. it('works when all callback parameters are passed', function()
  24. local observer = Rx.Observer.create(function() end, function() end, function() end)
  25. expectObserverToBeInCleanStateAndValid(observer)
  26. end)
  27. end)
  28. describe('onNext', function()
  29. it('calls custom onNext callback if it was provided', function()
  30. local onNext = spy()
  31. local observer = Rx.Observer.create(onNext, nil, nil)
  32. observer:onNext()
  33. expect(#onNext).to.equal(1)
  34. end)
  35. it('passes all arguments to custom onNext callback if it was provided', function()
  36. local onNext = spy()
  37. local observer = Rx.Observer.create(onNext, nil, nil)
  38. observer:onNext(1, '2', 3, nil, 5, { key = 6 })
  39. expect(onNext).to.equal({{1, '2', 3, nil, 5, { key = 6 }}})
  40. end)
  41. it('works and does not error when custom onNext callback was not provided', function()
  42. local observer = Rx.Observer.create()
  43. local errors = {}
  44. -- would gladly use something like to_not.fail() here but it's
  45. -- not quite good with producing useful error messages
  46. local success = tryCall(function() observer:onNext() end, errors)
  47. tryCall(function() expect(success).to.equal(true) end, errors)
  48. throwErrorsIfAny(errors)
  49. end)
  50. describe('does not call custom onError callback', function()
  51. it('if observer already received completion notification', function()
  52. local onNext = spy()
  53. local observer = Rx.Observer.create(onNext, nil, nil)
  54. observer:onCompleted()
  55. observer:onNext()
  56. expect(#onNext).to.equal(0)
  57. end)
  58. it('if observer already received error notification', function()
  59. local onNext = spy()
  60. local observer = Rx.Observer.create(onNext, nil, nil)
  61. observer:onCompleted()
  62. observer:onNext()
  63. expect(#onNext).to.equal(0)
  64. end)
  65. end)
  66. end)
  67. describe('onError', function()
  68. it('causes an error by default if custom onError callback was not provided', function()
  69. local observer = Rx.Observer.create()
  70. expect(function() observer:onError() end).to.fail()
  71. end)
  72. it('calls custom onError callback if it was provided', function()
  73. local onError = spy()
  74. local observer = Rx.Observer.create(nil, onError, nil)
  75. observer:onError()
  76. expect(#onError).to.equal(1)
  77. end)
  78. it('passes first value from error notification to custom onError callback', function()
  79. local onError = spy()
  80. local observer = Rx.Observer.create(nil, onError, nil)
  81. observer:onError("err msg", "excessive arg", 1)
  82. expect(onError).to.equal({{"err msg"}})
  83. end)
  84. it('marks observer as stopped', function()
  85. local observer = Rx.Observer.create(nil, function() end, nil)
  86. observer:onError()
  87. expect(observer.stopped).to.equal(true)
  88. end)
  89. describe('does not call custom onError callback', function()
  90. it('if observer already received completion notification', function()
  91. local onError = spy()
  92. local observer = Rx.Observer.create(nil, onError, nil)
  93. observer:onCompleted()
  94. observer:onError()
  95. expect(#onError).to.equal(0)
  96. end)
  97. it('if observer already received error notification', function()
  98. local spyEnabled = false
  99. local onError = spy()
  100. local observer = Rx.Observer.create(nil, function() if spyEnabled then onError() end end, nil)
  101. observer:onError()
  102. spyEnabled = true
  103. observer:onError()
  104. expect(#onError).to.equal(0)
  105. end)
  106. end)
  107. end)
  108. describe('onCompleted', function()
  109. it('calls custom onCompleted callback if it was provided', function()
  110. local onCompleted = spy()
  111. local observer = Rx.Observer.create(nil, nil, onCompleted)
  112. observer:onCompleted()
  113. expect(#onCompleted).to.equal(1)
  114. end)
  115. it('calls custom onCompleted callback with no parameters', function()
  116. local onCompleted = spy()
  117. local observer = Rx.Observer.create(nil, nil, onCompleted)
  118. observer:onCompleted("excessive arg", 1)
  119. expect(onCompleted).to.equal({{}})
  120. end)
  121. it('marks observer as stopped', function()
  122. local observer = Rx.Observer.create(nil, function() end, nil)
  123. observer:onCompleted()
  124. expect(observer.stopped).to.equal(true)
  125. end)
  126. describe('does not call custom onCompleted callback', function()
  127. it('if observer already received completion notification', function()
  128. local spyEnabled = false
  129. local onCompleted = spy()
  130. local observer = Rx.Observer.create(nil, function() if spyEnabled then onCompleted() end end, nil)
  131. observer:onCompleted()
  132. spyEnabled = true
  133. observer:onCompleted()
  134. expect(#onCompleted).to.equal(0)
  135. end)
  136. it('if observer already received error notification', function()
  137. local onCompleted = spy()
  138. local observer = Rx.Observer.create(nil, function() end, onCompleted)
  139. observer:onError()
  140. observer:onCompleted()
  141. expect(#onCompleted).to.equal(0)
  142. end)
  143. end)
  144. end)
  145. end)