From 318be5196d31922611b5ec9ca02a345efd64f8df Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 4 Dec 2015 00:24:56 +0100 Subject: [PATCH] Added some ExpressionObserver lifetime tests. --- .../Perspex.Markup/Data/ExpressionObserver.cs | 5 ++ .../Data/ExpressionObserverTests_Lifetime.cs | 70 +++++++++++++++++++ .../Data/ExpressionObserverTests_Property.cs | 2 +- .../Perspex.Markup.UnitTests.csproj | 1 + 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs diff --git a/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs b/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs index e8df013d50..791a788df5 100644 --- a/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs +++ b/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs @@ -156,6 +156,11 @@ namespace Perspex.Markup.Data /// string IDescription.Description => Expression; + /// + /// Gets the root expression node. Used for testing. + /// + internal ExpressionNode Node => _node; + /// /// Gets the leaf node. /// diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs new file mode 100644 index 0000000000..22373193c3 --- /dev/null +++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs @@ -0,0 +1,70 @@ +// Copyright (c) The Perspex Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Reactive; +using System.Reactive.Subjects; +using Microsoft.Reactive.Testing; +using Perspex.Markup.Data; +using Xunit; + +namespace Perspex.Markup.UnitTests.Data +{ + public class ExpressionObserverTests_Lifetime + { + [Fact(Skip = "Not working yet")] + public void Should_Complete_When_Source_Observable_Completes() + { + var source = new BehaviorSubject(1); + var target = new ExpressionObserver(source, "Foo"); + var completed = false; + + target.Subscribe(_ => { }, () => completed = true); + source.OnCompleted(); + + Assert.True(completed); + } + + [Fact] + public void Should_Unsubscribe_From_Source_Observable() + { + var scheduler = new TestScheduler(); + var source = scheduler.CreateColdObservable( + OnNext(1, new { Foo = "foo" })); + var target = new ExpressionObserver(source, "Foo"); + var result = new List(); + + using (target.Subscribe(x => result.Add(x))) + using (target.Subscribe(_ => { })) + { + scheduler.Start(); + } + + Assert.Equal(new[] { PerspexProperty.UnsetValue, "foo" }, result); + Assert.Equal(1, source.Subscriptions.Count); + Assert.NotEqual(Subscription.Infinite, source.Subscriptions[0].Unsubscribe); + } + + [Fact] + public void Should_Set_Node_Target_To_Null_On_Unsubscribe() + { + var target = new ExpressionObserver(new { Foo = "foo" }, "Foo"); + var result = new List(); + + using (target.Subscribe(x => result.Add(x))) + using (target.Subscribe(_ => { })) + { + Assert.NotNull(target.Node.Target); + } + + Assert.Equal(new[] { "foo" }, result); + Assert.Null(target.Node.Target); + } + + private Recorded> OnNext(long time, object value) + { + return new Recorded>(time, Notification.CreateOnNext(value)); + } + } +} diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs index fd1583106c..0d917b15b4 100644 --- a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs +++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs @@ -355,7 +355,7 @@ namespace Perspex.Markup.UnitTests.Data { } - public Recorded> OnNext(long time, object value) + private Recorded> OnNext(long time, object value) { return new Recorded>(time, Notification.CreateOnNext(value)); } diff --git a/tests/Perspex.Markup.UnitTests/Perspex.Markup.UnitTests.csproj b/tests/Perspex.Markup.UnitTests/Perspex.Markup.UnitTests.csproj index ad9843a103..639142b00e 100644 --- a/tests/Perspex.Markup.UnitTests/Perspex.Markup.UnitTests.csproj +++ b/tests/Perspex.Markup.UnitTests/Perspex.Markup.UnitTests.csproj @@ -84,6 +84,7 @@ +