public void TestWeakStrongVariable() { var listener = new Listener(); var source = new CompositeReactiveObject(listener, "first"); var sameSource = new CompositeReactiveObject(listener, "first"); var otherSource = new CompositeReactiveObject(listener, "second"); var expression = Reactive.Expression(() => { ReactiveManager.WasRead(source); return(1); }); var listenerValue = expression.Evaluate(); Assert.AreEqual(1, listenerValue); var counter = 0; var expectation = 0; expression.Subscribe(getValue => ReactiveManagerTest.Const(getValue, () => counter++)); Assert.AreEqual(++expectation, counter); ReactiveManager.WasChanged(sameSource); Assert.AreEqual(++expectation, counter); ReactiveManager.WasChanged(otherSource); Assert.AreEqual(expectation, counter); }
static void TestManyToOneDependency() { var dependency = new CompositeReactiveObject(new object(), 0); var dependent = new object(); foreach (var i in Enumerable.Range(0, 100000)) { ReactiveManager.Evaluate(new CompositeReactiveObject(dependent, i), () => { ReactiveManager.WasRead(dependency); return(true); }); } }
public void TestRobustAgainstGarbageCollection() { var dependency = new CompositeReactiveObject(new object(), 0); var dependent = new object(); foreach (var i in Enumerable.Range(0, 1000)) { ReactiveManager.Evaluate(new CompositeReactiveObject(dependent, i.ToString()), () => { ReactiveManager.WasRead(dependency); return(true); }); } GC.Collect(); Assert.AreEqual(1000, ReactiveManager.GetDependents(dependency).Count()); }
public void ReactiveManagerForwardThreadSafety() { var weak = new object(); var weak2 = new object(); var dependency = new CompositeReactiveObject(weak, 0); var firsts = Enumerable.Range(0, 1000).Select(i => new CompositeReactiveObject(weak2, i)).ToList(); var first = new Thread(() => { foreach (var obj in firsts) { ReactiveManager.Evaluate(obj, () => { ReactiveManager.WasRead(dependency); return(true); }); } }); var weak3 = new object(); var seconds = Enumerable.Range(0, 1000).Select(i => new CompositeReactiveObject(weak3, i)).ToList(); var second = new Thread(() => { foreach (var obj in seconds) { ReactiveManager.Evaluate(obj, () => { ReactiveManager.WasRead(dependency); return(true); }); } }); first.Start(); second.Start(); first.Join(); second.Join(); var dependencyCount = ReactiveManager.GetDependents(dependency).Count(); Assert.AreEqual(2000, dependencyCount); }