3 changed files with 188 additions and 2 deletions
@ -0,0 +1,168 @@ |
|||||
|
// Copyright (c) The Avalonia Project. All rights reserved.
|
||||
|
// Licensed under the MIT license. See licence.md file in the project root for full license information.
|
||||
|
|
||||
|
using Avalonia.Markup.Xaml.Templates; |
||||
|
using System; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Avalonia.Markup.Xaml.UnitTests.Templates |
||||
|
{ |
||||
|
public class MemberSelectorTests |
||||
|
{ |
||||
|
[Fact] |
||||
|
public void Should_Not_Hold_Reference_To_Object() |
||||
|
{ |
||||
|
WeakReference dataRef = null; |
||||
|
|
||||
|
var selector = new MemberSelector() { MemberName = "Child.StringValue" }; |
||||
|
|
||||
|
Action run = () => |
||||
|
{ |
||||
|
var data = new Item() |
||||
|
{ |
||||
|
Child = new Item() { StringValue = "Value1" } |
||||
|
}; |
||||
|
|
||||
|
Assert.Same("Value1", selector.Select(data)); |
||||
|
|
||||
|
dataRef = new WeakReference(data); |
||||
|
}; |
||||
|
|
||||
|
run(); |
||||
|
|
||||
|
GC.Collect(); |
||||
|
|
||||
|
Assert.False(dataRef.IsAlive); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Select_Child_Property_Value() |
||||
|
{ |
||||
|
var selector = new MemberSelector() { MemberName = "Child.StringValue" }; |
||||
|
|
||||
|
var data = new Item() |
||||
|
{ |
||||
|
Child = new Item() { StringValue = "Value1" } |
||||
|
}; |
||||
|
|
||||
|
Assert.Same("Value1", selector.Select(data)); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Select_Child_Property_Value_In_Multiple_Items() |
||||
|
{ |
||||
|
var selector = new MemberSelector() { MemberName = "Child.StringValue" }; |
||||
|
|
||||
|
var data = new Item[] |
||||
|
{ |
||||
|
new Item() { Child = new Item() { StringValue = "Value1" } }, |
||||
|
new Item() { Child = new Item() { StringValue = "Value2" } }, |
||||
|
new Item() { Child = new Item() { StringValue = "Value3" } } |
||||
|
}; |
||||
|
|
||||
|
Assert.Same("Value1", selector.Select(data[0])); |
||||
|
Assert.Same("Value2", selector.Select(data[1])); |
||||
|
Assert.Same("Value3", selector.Select(data[2])); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Select_MoreComplex_Property_Value() |
||||
|
{ |
||||
|
var selector = new MemberSelector() { MemberName = "Child.Child.Child.StringValue" }; |
||||
|
|
||||
|
var data = new Item() |
||||
|
{ |
||||
|
Child = new Item() |
||||
|
{ |
||||
|
Child = new Item() |
||||
|
{ |
||||
|
Child = new Item() { StringValue = "Value1" } |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
Assert.Same("Value1", selector.Select(data)); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Select_Null_Value_On_Null_Object() |
||||
|
{ |
||||
|
var selector = new MemberSelector() { MemberName = "StringValue" }; |
||||
|
|
||||
|
Assert.Equal(null, selector.Select(null)); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Select_Null_Value_On_Wrong_MemberName() |
||||
|
{ |
||||
|
var selector = new MemberSelector() { MemberName = "WrongProperty" }; |
||||
|
|
||||
|
var data = new Item() { StringValue = "Value1" }; |
||||
|
|
||||
|
Assert.Same(null, selector.Select(data)); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Select_Simple_Property_Value() |
||||
|
{ |
||||
|
var selector = new MemberSelector() { MemberName = "StringValue" }; |
||||
|
|
||||
|
var data = new Item() { StringValue = "Value1" }; |
||||
|
|
||||
|
Assert.Same("Value1", selector.Select(data)); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Select_Simple_Property_Value_In_Multiple_Items() |
||||
|
{ |
||||
|
var selector = new MemberSelector() { MemberName = "StringValue" }; |
||||
|
|
||||
|
var data = new Item[] |
||||
|
{ |
||||
|
new Item() { StringValue = "Value1" }, |
||||
|
new Item() { StringValue = "Value2" }, |
||||
|
new Item() { StringValue = "Value3" } |
||||
|
}; |
||||
|
|
||||
|
Assert.Same("Value1", selector.Select(data[0])); |
||||
|
Assert.Same("Value2", selector.Select(data[1])); |
||||
|
Assert.Same("Value3", selector.Select(data[2])); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Select_Target_On_Empty_MemberName() |
||||
|
{ |
||||
|
var selector = new MemberSelector(); |
||||
|
|
||||
|
var data = new Item() { StringValue = "Value1" }; |
||||
|
|
||||
|
Assert.Same(data, selector.Select(data)); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Support_Change_Of_MemberName() |
||||
|
{ |
||||
|
var selector = new MemberSelector() { MemberName = "StringValue" }; |
||||
|
|
||||
|
var data = new Item() |
||||
|
{ |
||||
|
StringValue = "Value1", |
||||
|
IntValue = 1 |
||||
|
}; |
||||
|
|
||||
|
Assert.Same("Value1", selector.Select(data)); |
||||
|
|
||||
|
selector.MemberName = "IntValue"; |
||||
|
|
||||
|
Assert.Equal(1, selector.Select(data)); |
||||
|
} |
||||
|
|
||||
|
private class Item |
||||
|
{ |
||||
|
public Item Child { get; set; } |
||||
|
public int IntValue { get; set; } |
||||
|
|
||||
|
public string StringValue { get; set; } |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue