8 changed files with 238 additions and 4 deletions
@ -0,0 +1,139 @@ |
|||||
|
// 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 System; |
||||
|
using System.Reactive.Subjects; |
||||
|
using Avalonia.Data; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Avalonia.Base.UnitTests |
||||
|
{ |
||||
|
public class AvaloniaObjectTests_Coercion |
||||
|
{ |
||||
|
[Fact] |
||||
|
public void Coerces_Set_Value() |
||||
|
{ |
||||
|
var target = new Class1(); |
||||
|
|
||||
|
target.Foo = 150; |
||||
|
|
||||
|
Assert.Equal(100, target.Foo); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Coerces_Bound_Value() |
||||
|
{ |
||||
|
var target = new Class1(); |
||||
|
var source = new Subject<BindingValue<int>>(); |
||||
|
|
||||
|
target.Bind(Class1.FooProperty, source); |
||||
|
source.OnNext(150); |
||||
|
|
||||
|
Assert.Equal(100, target.Foo); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void CoerceValue_Updates_Value() |
||||
|
{ |
||||
|
var target = new Class1 { Foo = 99 }; |
||||
|
|
||||
|
Assert.Equal(99, target.Foo); |
||||
|
|
||||
|
target.MaxFoo = 50; |
||||
|
target.CoerceValue(Class1.FooProperty); |
||||
|
|
||||
|
Assert.Equal(50, target.Foo); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Coerced_Value_Can_Be_Restored_If_Limit_Changed() |
||||
|
{ |
||||
|
var target = new Class1(); |
||||
|
|
||||
|
target.Foo = 150; |
||||
|
Assert.Equal(100, target.Foo); |
||||
|
|
||||
|
target.MaxFoo = 200; |
||||
|
target.CoerceValue(Class1.FooProperty); |
||||
|
|
||||
|
Assert.Equal(150, target.Foo); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Coerced_Value_Can_Be_Restored_From_Previously_Active_Binding() |
||||
|
{ |
||||
|
var target = new Class1(); |
||||
|
var source1 = new Subject<BindingValue<int>>(); |
||||
|
var source2 = new Subject<BindingValue<int>>(); |
||||
|
|
||||
|
target.Bind(Class1.FooProperty, source1); |
||||
|
source1.OnNext(150); |
||||
|
|
||||
|
target.Bind(Class1.FooProperty, source2); |
||||
|
source2.OnNext(160); |
||||
|
|
||||
|
Assert.Equal(100, target.Foo); |
||||
|
|
||||
|
target.MaxFoo = 200; |
||||
|
source2.OnCompleted(); |
||||
|
|
||||
|
Assert.Equal(150, target.Foo); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Coercion_Can_Be_Overridden() |
||||
|
{ |
||||
|
var target = new Class2(); |
||||
|
|
||||
|
target.Foo = 150; |
||||
|
|
||||
|
Assert.Equal(-150, target.Foo); |
||||
|
} |
||||
|
|
||||
|
private class Class1 : AvaloniaObject |
||||
|
{ |
||||
|
public static readonly StyledProperty<int> FooProperty = |
||||
|
AvaloniaProperty.Register<Class1, int>( |
||||
|
"Qux", |
||||
|
defaultValue: 11, |
||||
|
coerce: CoerceFoo); |
||||
|
|
||||
|
public int Foo |
||||
|
{ |
||||
|
get => GetValue(FooProperty); |
||||
|
set => SetValue(FooProperty, value); |
||||
|
} |
||||
|
|
||||
|
public int MaxFoo { get; set; } = 100; |
||||
|
|
||||
|
public static int CoerceFoo(IAvaloniaObject instance, int value) |
||||
|
{ |
||||
|
return Math.Min(((Class1)instance).MaxFoo, value); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private class Class2 : AvaloniaObject |
||||
|
{ |
||||
|
public static readonly StyledProperty<int> FooProperty = |
||||
|
Class1.FooProperty.AddOwner<Class2>(); |
||||
|
|
||||
|
static Class2() |
||||
|
{ |
||||
|
FooProperty.OverrideMetadata<Class2>( |
||||
|
new StyledPropertyMetadata<int>( |
||||
|
coerce: CoerceFoo)); |
||||
|
} |
||||
|
|
||||
|
public int Foo |
||||
|
{ |
||||
|
get => GetValue(FooProperty); |
||||
|
set => SetValue(FooProperty, value); |
||||
|
} |
||||
|
|
||||
|
public static int CoerceFoo(IAvaloniaObject instance, int value) |
||||
|
{ |
||||
|
return -value; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue