diff --git a/spec/Observable-spec.ts b/spec/Observable-spec.ts index 6ea8a39fdb..49280149f9 100644 --- a/spec/Observable-spec.ts +++ b/spec/Observable-spec.ts @@ -193,6 +193,80 @@ describe('Observable', () => { source.subscribe(); }); + it('should work when subscribe is called with no arguments and other subscription with no arguments completes', (done: MochaDone) => { + let nextCalled = false; + const source = new Observable((subscriber: Rx.Subscriber) => { + const id = setTimeout(() => { + subscriber.next('foo'); + subscriber.complete(); + nextCalled = true; + }, 1); + return () => { + clearTimeout(id); + }; + }); + + source.subscribe(); + + Observable.empty().subscribe(); + + setTimeout(() => { + let err; + let errHappened = false; + try { + expect(nextCalled).to.be.true; + } catch (e) { + err = e; + errHappened = true; + } finally { + if (!errHappened) { + done(); + } else { + done(err); + } + } + }, 100); + }); + + it('should work when subscribe is called with observer and other subscription with same observer instance completes', (done: MochaDone) => { + let nextCalled = false; + const source = new Observable((subscriber: Rx.Subscriber) => { + const id = setTimeout(() => { + subscriber.next('foo'); + subscriber.complete(); + nextCalled = true; + }, 1); + return () => { + clearTimeout(id); + }; + }); + + let observer = { + next: function () { /*noop*/ } + }; + + source.subscribe(observer); + + Observable.empty().subscribe(observer); + + setTimeout(() => { + let err; + let errHappened = false; + try { + expect(nextCalled).to.be.true; + } catch (e) { + err = e; + errHappened = true; + } finally { + if (!errHappened) { + done(); + } else { + done(err); + } + } + }, 100); + }); + it('should run unsubscription logic when an error is sent synchronously and subscribe is called with no arguments', () => { let unsubscribeCalled = false; const source = new Observable((subscriber: Rx.Subscriber) => { diff --git a/spec/Subscriber-spec.ts b/spec/Subscriber-spec.ts index 5a2daf4431..bafe6cc6a6 100644 --- a/spec/Subscriber-spec.ts +++ b/spec/Subscriber-spec.ts @@ -83,4 +83,18 @@ describe('Subscriber', () => { expect(times).to.equal(2); expect(completeCalled).to.be.false; }); + + it('should not be closed when other subscriber with same observer instance completes', () => { + let observer = { + next: function () { /*noop*/ } + }; + + const sub1 = new Subscriber(observer); + const sub2 = new Subscriber(observer); + + sub2.complete(); + + expect(sub1.closed).to.be.false; + expect(sub2.closed).to.be.true; + }); }); diff --git a/spec/util/toSubscriber-spec.ts b/spec/util/toSubscriber-spec.ts new file mode 100644 index 0000000000..d17581fbd4 --- /dev/null +++ b/spec/util/toSubscriber-spec.ts @@ -0,0 +1,28 @@ +import {expect} from 'chai'; +import {toSubscriber} from '../../dist/cjs/util/toSubscriber'; + +describe('toSubscriber', () => { + it('should not be closed when other subscriber created with no arguments completes', () => { + let sub1 = toSubscriber(); + let sub2 = toSubscriber(); + + sub2.complete(); + + expect(sub1.closed).to.be.false; + expect(sub2.closed).to.be.true; + }); + +it('should not be closed when other subscriber created with same observer instance completes', () => { + let observer = { + next: function () { /*noop*/ } + }; + + let sub1 = toSubscriber(observer); + let sub2 = toSubscriber(observer); + + sub2.complete(); + + expect(sub1.closed).to.be.false; + expect(sub2.closed).to.be.true; + }); +}); \ No newline at end of file