public void MultipleAssignmentRxOfficial() { var d = new MultipleAssignmentDisposable(); d.IsDisposed.IsFalse(); var id1 = new IdDisp(1); var id2 = new IdDisp(2); var id3 = new IdDisp(3); // dispose first d.Dispose(); d.IsDisposed.IsTrue(); d.Disposable = id1; id1.IsDisposed.IsTrue(); d.Disposable = id2; id2.IsDisposed.IsTrue(); d.Disposable = id3; id3.IsDisposed.IsTrue(); // normal flow d = new MultipleAssignmentDisposable(); id1 = new IdDisp(1); id2 = new IdDisp(2); id3 = new IdDisp(3); d.Disposable = id1; id1.IsDisposed.IsFalse(); d.Dispose(); id1.IsDisposed.IsTrue(); d.Disposable = id2; id2.IsDisposed.IsTrue(); d.Disposable = id3; id3.IsDisposed.IsTrue(); // exception flow d = new MultipleAssignmentDisposable(); id1 = new IdDisp(1); id2 = new IdDisp(2); id3 = new IdDisp(3); d.Disposable = id1; d.Disposable = id2; d.Disposable = id3; d.Dispose(); id1.IsDisposed.IsFalse(); id2.IsDisposed.IsFalse(); id3.IsDisposed.IsTrue(); // null d = new MultipleAssignmentDisposable(); id1 = new IdDisp(1); d.Disposable = null; d.Dispose(); d.Disposable = null; }
public void MultipleAssignmentDisposable() { var m = new MultipleAssignmentDisposable(); var disp1 = false; var d1 = Disposable.Create(() => { disp1 = true; }); m.Disposable = d1; Assert.AreSame(d1, m.Disposable); Assert.IsFalse(m.IsDisposed); var disp2 = false; var d2 = Disposable.Create(() => { disp2 = true; }); m.Disposable = d2; Assert.AreSame(d2, m.Disposable); Assert.IsFalse(m.IsDisposed); Assert.IsFalse(disp1); m.Dispose(); Assert.IsTrue(disp2); Assert.IsTrue(m.IsDisposed); //Assert.IsNull(m.Disposable); // BREAKING CHANGE v2 > v1.x - Undefined behavior after disposal. m.Disposable.Dispose(); // This should be a nop. var disp3 = false; var d3 = Disposable.Create(() => { disp3 = true; }); m.Disposable = d3; Assert.IsTrue(disp3); //Assert.IsNull(m.Disposable); // BREAKING CHANGE v2 > v1.x - Undefined behavior after disposal. m.Disposable.Dispose(); // This should be a nop. Assert.IsTrue(m.IsDisposed); }