committed by
GitHub
10 changed files with 470 additions and 51 deletions
@ -0,0 +1,308 @@ |
|||
using System; |
|||
using Avalonia.Data; |
|||
using Avalonia.Diagnostics; |
|||
using Xunit; |
|||
using Observable = Avalonia.Reactive.Observable; |
|||
|
|||
namespace Avalonia.Base.UnitTests |
|||
{ |
|||
public class AvaloniaObjectTests_SetCurrentValue |
|||
{ |
|||
[Fact] |
|||
public void SetCurrentValue_Sets_Unset_Value() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetCurrentValue(Class1.FooProperty, "newvalue"); |
|||
|
|||
Assert.Equal("newvalue", target.GetValue(Class1.FooProperty)); |
|||
Assert.True(target.IsSet(Class1.FooProperty)); |
|||
Assert.Equal(BindingPriority.Unset, GetPriority(target, Class1.FooProperty)); |
|||
Assert.True(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void SetCurrentValue_Sets_Unset_Value_Untyped() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetCurrentValue((AvaloniaProperty)Class1.FooProperty, "newvalue"); |
|||
|
|||
Assert.Equal("newvalue", target.GetValue(Class1.FooProperty)); |
|||
Assert.True(target.IsSet(Class1.FooProperty)); |
|||
Assert.Equal(BindingPriority.Unset, GetPriority(target, Class1.FooProperty)); |
|||
Assert.True(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Theory] |
|||
[InlineData(BindingPriority.LocalValue)] |
|||
[InlineData(BindingPriority.Style)] |
|||
[InlineData(BindingPriority.Animation)] |
|||
public void SetCurrentValue_Overrides_Existing_Value(BindingPriority priority) |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetValue(Class1.FooProperty, "oldvalue", priority); |
|||
target.SetCurrentValue(Class1.FooProperty, "newvalue"); |
|||
|
|||
Assert.Equal("newvalue", target.GetValue(Class1.FooProperty)); |
|||
Assert.True(target.IsSet(Class1.FooProperty)); |
|||
Assert.Equal(priority, GetPriority(target, Class1.FooProperty)); |
|||
Assert.True(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void SetCurrentValue_Overrides_Inherited_Value() |
|||
{ |
|||
var parent = new Class1(); |
|||
var target = new Class1 { InheritanceParent = parent }; |
|||
|
|||
parent.SetValue(Class1.InheritedProperty, "inheritedvalue"); |
|||
target.SetCurrentValue(Class1.InheritedProperty, "newvalue"); |
|||
|
|||
Assert.Equal("newvalue", target.GetValue(Class1.InheritedProperty)); |
|||
Assert.True(target.IsSet(Class1.InheritedProperty)); |
|||
Assert.Equal(BindingPriority.Unset, GetPriority(target, Class1.InheritedProperty)); |
|||
Assert.True(IsOverridden(target, Class1.InheritedProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void SetCurrentValue_Is_Inherited() |
|||
{ |
|||
var parent = new Class1(); |
|||
var target = new Class1 { InheritanceParent = parent }; |
|||
|
|||
parent.SetCurrentValue(Class1.InheritedProperty, "newvalue"); |
|||
|
|||
Assert.Equal("newvalue", target.GetValue(Class1.InheritedProperty)); |
|||
Assert.False(target.IsSet(Class1.FooProperty)); |
|||
Assert.Equal(BindingPriority.Inherited, GetPriority(target, Class1.InheritedProperty)); |
|||
Assert.False(IsOverridden(target, Class1.InheritedProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void ClearValue_Clears_CurrentValue_With_Unset_Priority() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetCurrentValue(Class1.FooProperty, "newvalue"); |
|||
target.ClearValue(Class1.FooProperty); |
|||
|
|||
Assert.Equal("foodefault", target.Foo); |
|||
Assert.False(target.IsSet(Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void ClearValue_Clears_CurrentValue_With_Inherited_Priority() |
|||
{ |
|||
var parent = new Class1(); |
|||
var target = new Class1 { InheritanceParent = parent }; |
|||
|
|||
parent.SetValue(Class1.InheritedProperty, "inheritedvalue"); |
|||
target.SetCurrentValue(Class1.InheritedProperty, "newvalue"); |
|||
target.ClearValue(Class1.InheritedProperty); |
|||
|
|||
Assert.Equal("inheritedvalue", target.Inherited); |
|||
Assert.False(target.IsSet(Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void ClearValue_Clears_CurrentValue_With_LocalValue_Priority() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetValue(Class1.FooProperty, "localvalue"); |
|||
target.SetCurrentValue(Class1.FooProperty, "newvalue"); |
|||
target.ClearValue(Class1.FooProperty); |
|||
|
|||
Assert.Equal("foodefault", target.Foo); |
|||
Assert.False(target.IsSet(Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void ClearValue_Clears_CurrentValue_With_Style_Priority() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetValue(Class1.FooProperty, "stylevalue", BindingPriority.Style); |
|||
target.SetCurrentValue(Class1.FooProperty, "newvalue"); |
|||
target.ClearValue(Class1.FooProperty); |
|||
|
|||
Assert.Equal("stylevalue", target.Foo); |
|||
Assert.True(target.IsSet(Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void SetCurrentValue_Can_Be_Coerced() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetCurrentValue(Class1.CoercedProperty, 60); |
|||
Assert.Equal(60, target.GetValue(Class1.CoercedProperty)); |
|||
|
|||
target.CoerceMax = 50; |
|||
target.CoerceValue(Class1.CoercedProperty); |
|||
Assert.Equal(50, target.GetValue(Class1.CoercedProperty)); |
|||
|
|||
target.CoerceMax = 100; |
|||
target.CoerceValue(Class1.CoercedProperty); |
|||
Assert.Equal(60, target.GetValue(Class1.CoercedProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void SetCurrentValue_Unset_Clears_CurrentValue() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetCurrentValue(Class1.FooProperty, "newvalue"); |
|||
target.SetCurrentValue(Class1.FooProperty, AvaloniaProperty.UnsetValue); |
|||
|
|||
Assert.Equal("foodefault", target.Foo); |
|||
Assert.False(target.IsSet(Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Theory] |
|||
[InlineData(BindingPriority.LocalValue)] |
|||
[InlineData(BindingPriority.Style)] |
|||
[InlineData(BindingPriority.Animation)] |
|||
public void SetValue_Overrides_CurrentValue_With_Unset_Priority(BindingPriority priority) |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetCurrentValue(Class1.FooProperty, "current"); |
|||
target.SetValue(Class1.FooProperty, "setvalue", priority); |
|||
|
|||
Assert.Equal("setvalue", target.Foo); |
|||
Assert.True(target.IsSet(Class1.FooProperty)); |
|||
Assert.Equal(priority, GetPriority(target, Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Animation_Value_Overrides_CurrentValue_With_LocalValue_Priority() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetValue(Class1.FooProperty, "localvalue"); |
|||
target.SetCurrentValue(Class1.FooProperty, "current"); |
|||
target.SetValue(Class1.FooProperty, "setvalue", BindingPriority.Animation); |
|||
|
|||
Assert.Equal("setvalue", target.Foo); |
|||
Assert.True(target.IsSet(Class1.FooProperty)); |
|||
Assert.Equal(BindingPriority.Animation, GetPriority(target, Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void StyleTrigger_Value_Overrides_CurrentValue_With_Style_Priority() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetValue(Class1.FooProperty, "style", BindingPriority.Style); |
|||
target.SetCurrentValue(Class1.FooProperty, "current"); |
|||
target.SetValue(Class1.FooProperty, "setvalue", BindingPriority.StyleTrigger); |
|||
|
|||
Assert.Equal("setvalue", target.Foo); |
|||
Assert.True(target.IsSet(Class1.FooProperty)); |
|||
Assert.Equal(BindingPriority.StyleTrigger, GetPriority(target, Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
} |
|||
|
|||
[Theory] |
|||
[InlineData(BindingPriority.LocalValue)] |
|||
[InlineData(BindingPriority.Style)] |
|||
[InlineData(BindingPriority.Animation)] |
|||
public void Binding_Overrides_CurrentValue_With_Unset_Priority(BindingPriority priority) |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetCurrentValue(Class1.FooProperty, "current"); |
|||
|
|||
var s = target.Bind(Class1.FooProperty, Observable.SingleValue("binding"), priority); |
|||
|
|||
Assert.Equal("binding", target.Foo); |
|||
Assert.True(target.IsSet(Class1.FooProperty)); |
|||
Assert.Equal(priority, GetPriority(target, Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
|
|||
s.Dispose(); |
|||
|
|||
Assert.Equal("foodefault", target.Foo); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Animation_Binding_Overrides_CurrentValue_With_LocalValue_Priority() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetValue(Class1.FooProperty, "localvalue"); |
|||
target.SetCurrentValue(Class1.FooProperty, "current"); |
|||
|
|||
var s = target.Bind(Class1.FooProperty, Observable.SingleValue("binding"), BindingPriority.Animation); |
|||
|
|||
Assert.Equal("binding", target.Foo); |
|||
Assert.True(target.IsSet(Class1.FooProperty)); |
|||
Assert.Equal(BindingPriority.Animation, GetPriority(target, Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
|
|||
s.Dispose(); |
|||
|
|||
Assert.Equal("current", target.Foo); |
|||
} |
|||
|
|||
[Fact] |
|||
public void StyleTrigger_Binding_Overrides_CurrentValue_With_Style_Priority() |
|||
{ |
|||
var target = new Class1(); |
|||
|
|||
target.SetValue(Class1.FooProperty, "style", BindingPriority.Style); |
|||
target.SetCurrentValue(Class1.FooProperty, "current"); |
|||
|
|||
var s = target.Bind(Class1.FooProperty, Observable.SingleValue("binding"), BindingPriority.StyleTrigger); |
|||
|
|||
Assert.Equal("binding", target.Foo); |
|||
Assert.True(target.IsSet(Class1.FooProperty)); |
|||
Assert.Equal(BindingPriority.StyleTrigger, GetPriority(target, Class1.FooProperty)); |
|||
Assert.False(IsOverridden(target, Class1.FooProperty)); |
|||
|
|||
s.Dispose(); |
|||
|
|||
Assert.Equal("style", target.Foo); |
|||
} |
|||
|
|||
private BindingPriority GetPriority(AvaloniaObject target, AvaloniaProperty property) |
|||
{ |
|||
return target.GetDiagnostic(property).Priority; |
|||
} |
|||
|
|||
private bool IsOverridden(AvaloniaObject target, AvaloniaProperty property) |
|||
{ |
|||
return target.GetDiagnostic(property).IsOverriddenCurrentValue; |
|||
} |
|||
|
|||
private class Class1 : AvaloniaObject |
|||
{ |
|||
public static readonly StyledProperty<string> FooProperty = |
|||
AvaloniaProperty.Register<Class1, string>(nameof(Foo), "foodefault"); |
|||
public static readonly StyledProperty<string> InheritedProperty = |
|||
AvaloniaProperty.Register<Class1, string>(nameof(Inherited), "inheriteddefault", inherits: true); |
|||
public static readonly StyledProperty<double> CoercedProperty = |
|||
AvaloniaProperty.Register<Class1, double>(nameof(Coerced), coerce: Coerce); |
|||
|
|||
public string Foo => GetValue(FooProperty); |
|||
public string Inherited => GetValue(InheritedProperty); |
|||
public double Coerced => GetValue(CoercedProperty); |
|||
public double CoerceMax { get; set; } = 100; |
|||
|
|||
private static double Coerce(AvaloniaObject sender, double value) |
|||
{ |
|||
return Math.Min(value, ((Class1)sender).CoerceMax); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue