RxLua/tests/merge.lua
Junseong Jang 5e4e857c96 Fix merge operator to handle onCompleted of input observables not a destructive way
The merge operator removed the source observable if it complete.
After that the subscriptions after that source observable index can not unsubscribe.
Fix the issue by recording the completed source index, as combineLatest operator does.
2018-11-28 17:20:41 +09:00

68 lines
2.2 KiB
Lua

describe('merge', function()
it('produces values from the first observable if it is the only argument', function()
local observable = Rx.Observable.fromRange(5):merge()
expect(observable).to.produce(1, 2, 3, 4, 5)
end)
it('unsubscribes from all input observables', function()
local observableA = Rx.Observable.create(function(observer)
return
end)
local unsubscribeB = spy()
local subscriptionB = Rx.Subscription.create(unsubscribeB)
local observableB = Rx.Observable.create(function(observer)
return subscriptionB
end)
local subscription = observableA:merge(observableB):subscribe()
subscription:unsubscribe()
expect(#unsubscribeB).to.equal(1)
end)
it('unsubscribes from all input observables included completed', function()
local observableA = Rx.Observable.empty()
local unsubscribeB = spy()
local subscriptionB = Rx.Subscription.create(unsubscribeB)
local observableB = Rx.Observable.create(function(observer)
return subscriptionB
end)
local subscription = observableA:merge(Rx.Observable.empty(), observableB):subscribe()
subscription:unsubscribe()
expect(#unsubscribeB).to.equal(1)
end)
it('produces values from all input observables, in order', function()
local observableA = Rx.Subject.create()
local observableB = Rx.Subject.create()
local merged = observableA:merge(observableB)
local onNext, onError, onCompleted = observableSpy(merged)
observableA:onNext('a')
observableB:onNext('b')
observableB:onNext('b')
observableA:onNext('a')
observableA:onCompleted()
observableB:onCompleted()
expect(onNext).to.equal({{'a'}, {'b'}, {'b'}, {'a'}})
end)
it('completes when all source observables complete', function()
local observableA = Rx.Subject.create()
local observableB = Rx.Subject.create()
local complete = spy()
Rx.Observable.merge(observableA, observableB):subscribe(nil, nil, complete)
expect(#complete).to.equal(0)
observableA:onNext(1)
expect(#complete).to.equal(0)
observableB:onNext(2)
expect(#complete).to.equal(0)
observableB:onCompleted()
expect(#complete).to.equal(0)
observableA:onCompleted()
expect(#complete).to.equal(1)
end)
end)