// 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.Linq; using System.Reactive.Linq; using Xunit; namespace Perspex.Base.UnitTests { public class PerspexPropertyRegistryTests { public PerspexPropertyRegistryTests() { // Ensure properties are registered. PerspexProperty p; p = Class1.FooProperty; p = Class2.BarProperty; p = AttachedOwner.AttachedProperty; } [Fact] public void GetRegistered_Returns_Registered_Properties() { string[] names = PerspexPropertyRegistry.Instance.GetRegistered(typeof(Class1)) .Select(x => x.Name) .ToArray(); Assert.Equal(new[] { "Foo", "Baz", "Qux", "Attached" }, names); } [Fact] public void GetRegistered_Returns_Registered_Properties_For_Base_Types() { string[] names = PerspexPropertyRegistry.Instance.GetRegistered(typeof(Class2)) .Select(x => x.Name) .ToArray(); Assert.Equal(new[] { "Bar", "Flob", "Fred", "Foo", "Baz", "Qux", "Attached" }, names); } [Fact] public void GetAttached_Returns_Registered_Properties_For_Base_Types() { string[] names = PerspexPropertyRegistry.Instance.GetAttached(typeof(AttachedOwner)).Select(x => x.Name).ToArray(); Assert.Equal(new[] { "Attached" }, names); } [Fact] public void FindRegistered_Finds_Untyped_Property() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class1), "Foo"); Assert.Equal(Class1.FooProperty, result); } [Fact] public void FindRegistered_Finds_Typed_Property() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class1), "Class1.Foo"); Assert.Equal(Class1.FooProperty, result); } [Fact] public void FindRegistered_Finds_Typed_Inherited_Property() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class2), "Class1.Foo"); Assert.Equal(Class2.FooProperty, result); } [Fact] public void FindRegistered_Finds_Inherited_Property_With_Derived_Type_Name() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class2), "Class2.Foo"); Assert.Equal(Class2.FooProperty, result); } [Fact] public void FindRegistered_Finds_Attached_Property() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class2), "AttachedOwner.Attached"); Assert.Equal(AttachedOwner.AttachedProperty, result); } [Fact] public void FindRegistered_Finds_AddOwnered_Untyped_Attached_Property() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class3), "Attached"); Assert.Equal(AttachedOwner.AttachedProperty, result); } [Fact] public void FindRegistered_Finds_AddOwnered_Typed_Attached_Property() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class3), "Class3.Attached"); Assert.Equal(AttachedOwner.AttachedProperty, result); } [Fact] public void FindRegistered_Finds_AddOwnered_AttachedTyped_Attached_Property() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class3), "AttachedOwner.Attached"); Assert.Equal(AttachedOwner.AttachedProperty, result); } [Fact] public void FindRegistered_Finds_AddOwnered_BaseTyped_Attached_Property() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class3), "Class1.Attached"); Assert.Equal(AttachedOwner.AttachedProperty, result); } [Fact] public void FindRegistered_Doesnt_Find_Nonregistered_Property() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class1), "Bar"); Assert.Null(result); } [Fact] public void FindRegistered_Doesnt_Find_Nonregistered_Attached_Property() { var result = PerspexPropertyRegistry.Instance.FindRegistered(typeof(Class4), "AttachedOwner.Attached"); Assert.Null(result); } private class Class1 : PerspexObject { public static readonly PerspexProperty FooProperty = PerspexProperty.Register("Foo"); public static readonly PerspexProperty BazProperty = PerspexProperty.Register("Baz"); public static readonly PerspexProperty QuxProperty = PerspexProperty.Register("Qux"); } private class Class2 : Class1 { public static readonly PerspexProperty BarProperty = PerspexProperty.Register("Bar"); public static readonly PerspexProperty FlobProperty = PerspexProperty.Register("Flob"); public static readonly PerspexProperty FredProperty = PerspexProperty.Register("Fred"); } private class Class3 : Class1 { public static readonly PerspexProperty AttachedProperty = AttachedOwner.AttachedProperty.AddOwner(); } public class Class4 : PerspexObject { } private class AttachedOwner { public static readonly PerspexProperty AttachedProperty = PerspexProperty.RegisterAttached("Attached"); } } }