コード例 #1
0
        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);
        }
コード例 #2
0
 public sealed override void OnGetValue(LocationInterceptionArgs args)
 {
     ReactiveManager.Evaluate(new CompositeReactiveObject(args.Instance, property), () =>
     {
         args.ProceedGetValue();
         return(true);
     });
 }
コード例 #3
0
 public void TestNullCannotBeASource()
 {
     Assert.Throws <ArgumentNullException>(() =>
     {
         ReactiveManager.Evaluate(new Dependent("TestNullCannotBeASource"), () =>
         {
             ReactiveManager.WasRead(null);
             return(true);
         });
     });
 }
コード例 #4
0
        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]);
        }
コード例 #5
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);
 }
コード例 #6
0
ファイル: Profiling.cs プロジェクト: zs2hx/SmartReactives
        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);
                });
            }
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
            });
        }
コード例 #9
0
        /// <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);
            });
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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());
        }
コード例 #12
0
        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());
        }
コード例 #13
0
 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;
     }
 }
コード例 #14
0
        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());
        }
コード例 #15
0
        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);
        }
コード例 #16
0
        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);
            });
        }
コード例 #17
0
 /// <summary>
 /// Evaluate the expression and return its value.
 /// </summary>
 public T Evaluate()
 {
     return(ReactiveManager.Evaluate(this, expression));
 }
コード例 #18
0
 /// <summary>
 /// Evaluate the function and return its value.
 /// </summary>
 public T Evaluate()
 {
     return(ReactiveManager.Evaluate(this, func));
 }