// ----------------------------------------------------------------------- // // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex.Styling.UnitTests { using System; using System.Collections.Generic; using System.Reactive.Subjects; using Perspex.Controls; using Perspex.Styling; using Xunit; public class StyleTests { [Fact] public void Style_With_Only_Type_Selector_Should_Update_Value() { Style style = new Style(x => x.OfType()) { Setters = new[] { new Setter(Class1.FooProperty, "Foo"), }, }; var target = new Class1(); style.Attach(target); Assert.Equal("Foo", target.Foo); } [Fact] public void Style_With_Class_Selector_Should_Update_And_Restore_Value() { Style style = new Style(x => x.OfType().Class("foo")) { Setters = new[] { new Setter(Class1.FooProperty, "Foo"), }, }; var target = new Class1(); style.Attach(target); Assert.Equal("foodefault", target.Foo); target.Classes.Add("foo"); Assert.Equal("Foo", target.Foo); target.Classes.Remove("foo"); Assert.Equal("foodefault", target.Foo); } [Fact] public void LocalValue_Should_Override_Style() { Style style = new Style(x => x.OfType()) { Setters = new[] { new Setter(Class1.FooProperty, "Foo"), }, }; var target = new Class1 { Foo = "Original", }; style.Attach(target); Assert.Equal("Original", target.Foo); } [Fact] public void Later_Styles_Should_Override_Earlier() { Styles styles = new Styles { new Style(x => x.OfType().Class("foo")) { Setters = new[] { new Setter(Class1.FooProperty, "Foo"), }, }, new Style(x => x.OfType().Class("foo")) { Setters = new[] { new Setter(Class1.FooProperty, "Bar"), }, } }; var target = new Class1(); List values = new List(); target.GetObservable(Class1.FooProperty).Subscribe(x => values.Add(x)); styles.Attach(target); target.Classes.Add("foo"); target.Classes.Remove("foo"); Assert.Equal(new[] { "foodefault", "Foo", "Bar", "foodefault" }, values); } [Fact] public void Style_With_Value_And_Source_Should_Throw_Exception() { var source = new BehaviorSubject("Foo"); Style style = new Style(x => x.OfType()) { Setters = new[] { new Setter { Property = Class1.FooProperty, Source = source, Value = "Foo", }, }, }; var target = new Class1(); Assert.Throws(() => style.Attach(target)); } [Fact] public void Style_With_Source_Should_Update_Value() { var source = new BehaviorSubject("Foo"); Style style = new Style(x => x.OfType()) { Setters = new[] { new Setter(Class1.FooProperty, source), }, }; var target = new Class1(); style.Attach(target); Assert.Equal("Foo", target.Foo); source.OnNext("Bar"); Assert.Equal("Bar", target.Foo); } [Fact] public void Style_With_Source_Should_Update_And_Restore_Value() { var source = new BehaviorSubject("Foo"); Style style = new Style(x => x.OfType().Class("foo")) { Setters = new[] { new Setter(Class1.FooProperty, source), }, }; var target = new Class1(); style.Attach(target); Assert.Equal("foodefault", target.Foo); target.Classes.Add("foo"); Assert.Equal("Foo", target.Foo); source.OnNext("Bar"); Assert.Equal("Bar", target.Foo); target.Classes.Remove("foo"); Assert.Equal("foodefault", target.Foo); } private class Class1 : Control { public static readonly PerspexProperty FooProperty = PerspexProperty.Register("Foo", "foodefault"); public string Foo { get { return this.GetValue(FooProperty); } set { this.SetValue(FooProperty, value); } } protected override Size MeasureOverride(Size availableSize) { throw new NotImplementedException(); } } } }