public void Should_Track_Property_Chain_Breaking_With_Object_Then_Mending()
        {
            var data = new Class1 {
                Next = new Class2 {
                    Bar = "bar"
                }
            };
            var target = new ExpressionObserver(data, "Next.Bar");
            var result = new List <object>();

            var sub      = target.Subscribe(x => result.Add(x));
            var old      = data.Next;
            var breaking = new WithoutBar();

            data.Next = breaking;
            data.Next = new Class2 {
                Bar = "baz"
            };

            Assert.Equal(new[] { "bar", PerspexProperty.UnsetValue, "baz" }, result);

            sub.Dispose();

            Assert.Equal(0, data.SubscriptionCount);
            Assert.Equal(0, data.Next.SubscriptionCount);
            Assert.Equal(0, breaking.SubscriptionCount);
            Assert.Equal(0, old.SubscriptionCount);
        }
예제 #2
0
        public void Should_Track_Property_Chain_Breaking_With_Object_Then_Mending()
        {
            var data = new Class1 {
                Next = new Class2 {
                    Bar = "bar"
                }
            };
            var target = new ExpressionObserver(data, "Next.Bar");
            var result = new List <object>();

            var sub      = target.Subscribe(x => result.Add(x));
            var old      = data.Next;
            var breaking = new WithoutBar();

            data.Next = breaking;
            data.Next = new Class2 {
                Bar = "baz"
            };

            Assert.Equal(3, result.Count);
            Assert.Equal("bar", result[0]);
            Assert.IsType <BindingError>(result[1]);
            Assert.Equal("baz", result[2]);

            sub.Dispose();

            Assert.Equal(0, data.SubscriptionCount);
            Assert.Equal(0, data.Next.SubscriptionCount);
            Assert.Equal(0, breaking.SubscriptionCount);
            Assert.Equal(0, old.SubscriptionCount);
        }
        public void Should_Track_Property_Chain_Breaking_With_Missing_Member_Then_Mending()
        {
            var data = new Class1 {
                Next = new Class2 {
                    Bar = "bar"
                }
            };
            var target = ExpressionObserver.Create(data, o => (o.Next as Class2).Bar);
            var result = new List <object>();

            var sub      = target.Subscribe(x => result.Add(x));
            var old      = data.Next;
            var breaking = new WithoutBar();

            data.Next = breaking;
            data.Next = new Class2 {
                Bar = "baz"
            };

            Assert.Equal(
                new object[]
            {
                "bar",
                new BindingNotification(
                    new MissingMemberException("Could not find a matching property accessor for 'Bar' on 'Avalonia.Base.UnitTests.Data.Core.ExpressionObserverTests_Property+WithoutBar'"),
                    BindingErrorType.Error),
                "baz",
            },
                result);

            sub.Dispose();

            // Forces WeakEvent compact
            Dispatcher.UIThread.RunJobs();

            Assert.Equal(0, data.PropertyChangedSubscriptionCount);
            Assert.Equal(0, data.Next.PropertyChangedSubscriptionCount);
            Assert.Equal(0, breaking.PropertyChangedSubscriptionCount);
            Assert.Equal(0, old.PropertyChangedSubscriptionCount);

            GC.KeepAlive(data);
        }
예제 #4
0
        public void Should_Track_Property_Chain_Breaking_With_Missing_Member_Then_Mending()
        {
            var data = new Class1 {
                Next = new Class2 {
                    Bar = "bar"
                }
            };
            var target = new ExpressionObserver(data, "Next.Bar");
            var result = new List <object>();

            var sub      = target.Subscribe(x => result.Add(x));
            var old      = data.Next;
            var breaking = new WithoutBar();

            data.Next = breaking;
            data.Next = new Class2 {
                Bar = "baz"
            };

            Assert.Equal(
                new object[]
            {
                "bar",
                new BindingNotification(
                    new MissingMemberException("Could not find CLR property 'Bar' on 'Avalonia.Markup.UnitTests.Data.ExpressionObserverTests_Property+WithoutBar'"),
                    BindingErrorType.Error),
                "baz",
            },
                result);

            sub.Dispose();

            Assert.Equal(0, data.PropertyChangedSubscriptionCount);
            Assert.Equal(0, data.Next.PropertyChangedSubscriptionCount);
            Assert.Equal(0, breaking.PropertyChangedSubscriptionCount);
            Assert.Equal(0, old.PropertyChangedSubscriptionCount);

            GC.KeepAlive(data);
        }
        public void Should_Track_Property_Chain_Breaking_With_Object_Then_Mending()
        {
            var data = new Class1 { Next = new Class2 { Bar = "bar" } };
            var target = new ExpressionObserver(data, "Next.Bar");
            var result = new List<object>();

            var sub = target.Subscribe(x => result.Add(x));
            var old = data.Next;
            var breaking = new WithoutBar();
            data.Next = breaking;
            data.Next = new Class2 { Bar = "baz" };

            Assert.Equal(new[] { "bar", PerspexProperty.UnsetValue, "baz" }, result);

            sub.Dispose();

            Assert.Equal(0, data.SubscriptionCount);
            Assert.Equal(0, data.Next.SubscriptionCount);
            Assert.Equal(0, breaking.SubscriptionCount);
            Assert.Equal(0, old.SubscriptionCount);
        }
        public void Should_Track_Property_Chain_Breaking_With_Missing_Member_Then_Mending()
        {
            var data = new Class1 { Next = new Class2 { Bar = "bar" } };
            var target = new ExpressionObserver(data, "Next.Bar");
            var result = new List<object>();

            var sub = target.Subscribe(x => result.Add(x));
            var old = data.Next;
            var breaking = new WithoutBar();
            data.Next = breaking;
            data.Next = new Class2 { Bar = "baz" };

            Assert.Equal(
                new object[]
                {
                    "bar",
                    new BindingNotification(
                        new MissingMemberException("Could not find CLR property 'Bar' on 'Avalonia.Markup.UnitTests.Data.ExpressionObserverTests_Property+WithoutBar'"),
                        BindingErrorType.Error),
                    "baz",
                },
                result);

            sub.Dispose();

            Assert.Equal(0, data.PropertyChangedSubscriptionCount);
            Assert.Equal(0, data.Next.PropertyChangedSubscriptionCount);
            Assert.Equal(0, breaking.PropertyChangedSubscriptionCount);
            Assert.Equal(0, old.PropertyChangedSubscriptionCount);
        }
        public void Should_Track_Property_Chain_Breaking_With_Object_Then_Mending()
        {
            var data = new Class1 { Next = new Class2 { Bar = "bar" } };
            var target = new ExpressionObserver(data, "Next.Bar");
            var result = new List<object>();

            var sub = target.Subscribe(x => result.Add(x));
            var old = data.Next;
            var breaking = new WithoutBar();
            data.Next = breaking;
            data.Next = new Class2 { Bar = "baz" };

            Assert.Equal(3, result.Count);
            Assert.Equal("bar", result[0]);
            Assert.IsType<BindingError>(result[1]);
            Assert.Equal("baz", result[2]);

            sub.Dispose();

            Assert.Equal(0, data.SubscriptionCount);
            Assert.Equal(0, data.Next.SubscriptionCount);
            Assert.Equal(0, breaking.SubscriptionCount);
            Assert.Equal(0, old.SubscriptionCount);
        }