From d87f585eadca8a810c98d226ac17cf8601e673c7 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 4 Mar 2016 19:46:06 +0100 Subject: [PATCH 1/2] Fixed changes affected by last commit. --- .../Data/ExpressionObserverTests_Lifetime.cs | 21 ++++++++++++++----- .../Data/ExpressionObserverTests_Property.cs | 3 +-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs index cfbc4bc29f..ac82e411be 100644 --- a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs +++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Lifetime.cs @@ -13,7 +13,7 @@ namespace Perspex.Markup.UnitTests.Data { public class ExpressionObserverTests_Lifetime { - [Fact(Skip = "Not working yet")] + [Fact] public void Should_Complete_When_Source_Observable_Completes() { var source = new BehaviorSubject(1); @@ -26,6 +26,19 @@ namespace Perspex.Markup.UnitTests.Data Assert.True(completed); } + [Fact] + public void Should_Complete_When_Update_Observable_Completes() + { + var update = new Subject(); + var target = new ExpressionObserver(() => 1, "Foo", update); + var completed = false; + + target.Subscribe(_ => { }, () => completed = true); + update.OnCompleted(); + + Assert.True(completed); + } + [Fact] public void Should_Unsubscribe_From_Source_Observable() { @@ -42,8 +55,7 @@ namespace Perspex.Markup.UnitTests.Data } Assert.Equal(new[] { PerspexProperty.UnsetValue, "foo" }, result); - Assert.Equal(1, source.Subscriptions.Count); - Assert.NotEqual(Subscription.Infinite, source.Subscriptions[0].Unsubscribe); + Assert.All(source.Subscriptions, x => Assert.NotEqual(Subscription.Infinite, x.Unsubscribe)); } [Fact] @@ -61,8 +73,7 @@ namespace Perspex.Markup.UnitTests.Data } Assert.Equal(new[] { "foo" }, result); - Assert.Equal(1, update.Subscriptions.Count); - Assert.NotEqual(Subscription.Infinite, update.Subscriptions[0].Unsubscribe); + Assert.All(update.Subscriptions, x => Assert.NotEqual(Subscription.Infinite, x.Unsubscribe)); } [Fact] diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs index ebf98a363e..a24e10f650 100644 --- a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs +++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs @@ -250,8 +250,7 @@ namespace Perspex.Markup.UnitTests.Data } Assert.Equal(new[] { PerspexProperty.UnsetValue, "foo", "bar" }, result); - Assert.Equal(1, source.Subscriptions.Count); - Assert.NotEqual(Subscription.Infinite, source.Subscriptions[0].Unsubscribe); + Assert.All(source.Subscriptions, x => Assert.NotEqual(Subscription.Infinite, x.Unsubscribe)); } [Fact] From 6b99bcf30beb1d5cae6fa8e407d2660b292f451d Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 4 Mar 2016 19:48:06 +0100 Subject: [PATCH 2/2] Use LastOrDefaultAsync for completion. --- src/Markup/Perspex.Markup/Data/ExpressionObserver.cs | 11 ++--------- src/Perspex.Styling/Styling/ActivatedObservable.cs | 4 ++-- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs b/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs index cebf0daebd..097e1cb3cf 100644 --- a/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs +++ b/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs @@ -197,11 +197,11 @@ namespace Perspex.Markup.Data if (_rootObservable != null) { - source = source.TakeUntil(Complete(_rootObservable)); + source = source.TakeUntil(_rootObservable.LastOrDefaultAsync()); } else if (_update != null) { - source = source.TakeUntil(Complete(_update)); + source = source.TakeUntil(_update.LastOrDefaultAsync()); } var subscription = source.Subscribe(observer); @@ -232,13 +232,6 @@ namespace Perspex.Markup.Data } } - private static IObservable Complete(IObservable input) - { - return Observable.Merge( - input.TakeLast(1).Select(_ => Unit.Default), - input.IsEmpty().Where(x => x).Select(_ => Unit.Default)); - } - private void IncrementCount() { if (_count++ == 0 && _node != null) diff --git a/src/Perspex.Styling/Styling/ActivatedObservable.cs b/src/Perspex.Styling/Styling/ActivatedObservable.cs index 4ab2f04495..d5bd9e8047 100644 --- a/src/Perspex.Styling/Styling/ActivatedObservable.cs +++ b/src/Perspex.Styling/Styling/ActivatedObservable.cs @@ -62,8 +62,8 @@ namespace Perspex.Styling { Contract.Requires(observer != null); - var sourceCompleted = Source.TakeLast(1).Select(_ => Unit.Default); - var activatorCompleted = Activator.TakeLast(1).Select(_ => Unit.Default); + var sourceCompleted = Source.LastOrDefaultAsync().Select(_ => Unit.Default); + var activatorCompleted = Activator.LastOrDefaultAsync().Select(_ => Unit.Default); var completed = sourceCompleted.Merge(activatorCompleted); return Activator