public void CollectionModifiedRegression() { var source = new object(); var dependent = new LambdaListener(); var secondDependent = new LambdaListener(); dependent.OnNotify = () => { ReactiveManager.Evaluate(secondDependent, () => { ReactiveManager.WasRead(dependent); return(true); }); dependent.OnNotify = null; ReactiveManager.WasChanged(dependent); }; ReactiveManager.Evaluate(dependent, () => { ReactiveManager.WasRead(source); return(true); }); ReactiveManager.WasChanged(source); }
public sealed override void OnGetValue(LocationInterceptionArgs args) { ReactiveManager.Evaluate(new CompositeReactiveObject(args.Instance, property), () => { args.ProceedGetValue(); return(true); }); }
public void TestNullCannotBeASource() { Assert.Throws <ArgumentNullException>(() => { ReactiveManager.Evaluate(new Dependent("TestNullCannotBeASource"), () => { ReactiveManager.WasRead(null); return(true); }); }); }
public void TestWeakStrongExpression() { var listener = new Listener(); var source = new ReactiveVariable <int>(3); var listenerValue = ReactiveManager.Evaluate(new CompositeReactiveObject(listener, "first"), () => source.Value); Assert.AreEqual(source.Value, listenerValue); var results = new List <object>(); listener.Notifications.Subscribe(result => results.Add(result)); source.Value++; Assert.AreEqual("first", results[0]); }
/// <summary> /// Get a value from the cache. /// </summary> public T Get() { if (IsSet) { ReactiveManager.WasRead(this); } else { lastValue = ReactiveManager.Evaluate(this, get); IsSet = true; } return(lastValue); }
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 InfiniteRecursionRegression() { var source = new object(); var dependent = new LambdaListener(); dependent.OnNotify = () => ReactiveManager.WasChanged(source); ReactiveManager.Evaluate(dependent, () => { ReactiveManager.WasRead(source); return(true); }); ReactiveManager.WasChanged(source); }
public void TestExceptionInNotify() { var dependent = new ExceptionInNotify(); var dependency = new object(); ReactiveManager.Evaluate(dependent, () => { ReactiveManager.WasRead(dependency); return(true); }); Assert.Throws <NotSupportedException>(() => { ReactiveManager.WasChanged(dependency); }); }
/// <inheritdoc/> public sealed override void OnGetValue(LocationInterceptionArgs args) { // ReSharper disable once ConditionIsAlwaysTrueOrFalse if (this == null) //Look at NullAspectTest for more explanation. { args.ProceedGetValue(); return; } ReactiveManager.Evaluate(this, () => { args.ProceedGetValue(); return(true); }); }
public void DependenciesClearedAfterNotify() { var notifyCounter = new NotifyCounter(); var source = new object(); ReactiveManager.Evaluate(notifyCounter, () => { ReactiveManager.WasRead(source); return(true); }); Assert.AreEqual(0, notifyCounter.Counter); ReactiveManager.WasChanged(source); Assert.AreEqual(1, notifyCounter.Counter); ReactiveManager.WasChanged(source); Assert.AreEqual(1, notifyCounter.Counter); }
public void TestExceptionInEvaluate() { var dependent = new Dependent("TestExceptionInEvaluate"); Assert.Throws <NotSupportedException>(() => { ReactiveManager.Evaluate <bool>(dependent, () => { throw new NotSupportedException("woeps"); }); }); var dependency = new object(); ReactiveManager.WasRead(dependency); Assert.AreEqual(0, ReactiveManager.GetDependents(dependency).Count()); }
public void TestDependentWeakness() { var dependency = new object(); foreach (var obj in Enumerable.Range(0, 10000)) { ReactiveManager.Evaluate(new Dependent(), () => { ReactiveManager.WasRead(dependency); return(true); }); } GC.Collect(); Assert.AreEqual(0, ReactiveManager.GetDependents(dependency).Count()); }
public sealed override void OnGetValue(LocationInterceptionArgs args) { if (IsSet) { ReactiveManager.WasRead(this); args.Value = Value; } else { Value = ReactiveManager.Evaluate(this, () => { args.ProceedGetValue(); return(args.Value); }); IsSet = 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); }
public void TestExceptionInNotifyMultiple() { var dependency = new object(); var dependent1 = new ExceptionInNotify(); ReactiveManager.Evaluate(dependent1, () => { ReactiveManager.WasRead(dependency); return(true); }); var dependent2 = new ExceptionInNotify(); ReactiveManager.Evaluate(dependent2, () => { ReactiveManager.WasRead(dependency); return(true); }); Assert.Throws <AggregateException>(() => { ReactiveManager.WasChanged(dependency); }); }
/// <summary> /// Evaluate the expression and return its value. /// </summary> public T Evaluate() { return(ReactiveManager.Evaluate(this, expression)); }
/// <summary> /// Evaluate the function and return its value. /// </summary> public T Evaluate() { return(ReactiveManager.Evaluate(this, func)); }