diff --git a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Property.cs b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Property.cs index a97c998264..4f7264f2f2 100644 --- a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Property.cs +++ b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Property.cs @@ -1,10 +1,10 @@ -using Avalonia.Data; -using Avalonia.Markup.Parsers; -using System; +using System; using System.Collections.Generic; using System.Reactive.Linq; -using System.Text; +using System.Reactive.Subjects; using System.Threading.Tasks; +using Avalonia.Data; +using Avalonia.Markup.Parsers; using Xunit; namespace Avalonia.Markup.UnitTests.Parsers @@ -38,5 +38,55 @@ namespace Avalonia.Markup.UnitTests.Parsers GC.KeepAlive(data); } + + [Fact] + public void Should_Update_Value_After_Root_Changes() + { + var root = new { DataContext = new { Value = "Foo" } }; + var subject = new Subject(); + var obs = ExpressionObserverBuilder.Build(subject, "DataContext.Value"); + + var values = new List(); + obs.Subscribe(v => values.Add(v)); + + subject.OnNext(root); + subject.OnNext(null); + subject.OnNext(root); + + Assert.Equal("Foo", values[0]); + + Assert.IsType(values[1]); + var bn = values[1] as BindingNotification; + Assert.Equal(AvaloniaProperty.UnsetValue, bn.Value); + Assert.Equal(BindingErrorType.Error, bn.ErrorType); + + Assert.Equal(3, values.Count); + Assert.Equal("Foo", values[2]); + } + + [Fact] + public void Should_Update_Value_After_Root_Changes_With_ComplexPath() + { + var root = new { DataContext = new { Foo = new { Value = "Foo" } } }; + var subject = new Subject(); + var obs = ExpressionObserverBuilder.Build(subject, "DataContext.Foo.Value"); + + var values = new List(); + obs.Subscribe(v => values.Add(v)); + + subject.OnNext(root); + subject.OnNext(null); + subject.OnNext(root); + + Assert.Equal("Foo", values[0]); + + Assert.IsType(values[1]); + var bn = values[1] as BindingNotification; + Assert.Equal(AvaloniaProperty.UnsetValue, bn.Value); + Assert.Equal(BindingErrorType.Error, bn.ErrorType); + + Assert.Equal(3, values.Count); + Assert.Equal("Foo", values[2]); + } } }