-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add BindingOperations.GetBindingExpressionBase. (#16214)
With basic unit tests. Co-authored-by: Max Katz <maxkatz6@outlook.com>
- Loading branch information
Showing
3 changed files
with
202 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
147 changes: 147 additions & 0 deletions
147
tests/Avalonia.Base.UnitTests/Data/BindingOperationsTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
using Avalonia.Controls; | ||
using Avalonia.Data; | ||
using Avalonia.Data.Converters; | ||
using Avalonia.Styling; | ||
using Avalonia.UnitTests; | ||
using Xunit; | ||
|
||
namespace Avalonia.Base.UnitTests.Data; | ||
|
||
public class BindingOperationsTests | ||
{ | ||
[Fact] | ||
public void GetBindingExpressionBase_Returns_Null_When_Not_Bound() | ||
{ | ||
var target = new Control(); | ||
var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty); | ||
Assert.Null(expression); | ||
} | ||
|
||
[Theory] | ||
[InlineData(BindingPriority.Animation)] | ||
[InlineData(BindingPriority.LocalValue)] | ||
[InlineData(BindingPriority.Style)] | ||
[InlineData(BindingPriority.StyleTrigger)] | ||
public void GetBindingExpressionBase_Returns_Expression_When_Bound(BindingPriority priority) | ||
{ | ||
var data = new { Tag = "foo" }; | ||
var target = new Control { DataContext = data }; | ||
var binding = new Binding("Tag") { Priority = priority }; | ||
target.Bind(Control.TagProperty, binding); | ||
|
||
var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty); | ||
Assert.NotNull(expression); | ||
} | ||
|
||
[Fact] | ||
public void GetBindingExpressionBase_Returns_Expression_When_Bound_Locally_With_Binding_Error() | ||
{ | ||
// Target has no data context so binding will fail. | ||
var target = new Control(); | ||
var binding = new Binding("Tag"); | ||
target.Bind(Control.TagProperty, binding); | ||
|
||
var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty); | ||
Assert.NotNull(expression); | ||
} | ||
|
||
[Fact] | ||
public void GetBindingExpressionBase_Returns_Expression_When_Bound_To_MultiBinding() | ||
{ | ||
var data = new { Tag = "foo" }; | ||
var target = new Control { DataContext = data }; | ||
var binding = new MultiBinding | ||
{ | ||
Converter = new FuncMultiValueConverter<object, string>(x => string.Join(',', x)), | ||
Bindings = | ||
{ | ||
new Binding("Tag"), | ||
new Binding("Tag"), | ||
} | ||
}; | ||
|
||
target.Bind(Control.TagProperty, binding); | ||
|
||
var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty); | ||
Assert.NotNull(expression); | ||
} | ||
|
||
[Fact] | ||
public void GetBindingExpressionBase_Returns_Binding_When_Bound_Via_ControlTheme() | ||
{ | ||
var target = new Control(); | ||
var binding = new Binding("Tag"); | ||
var theme = new ControlTheme(typeof(Control)) | ||
{ | ||
Setters = { new Setter(Control.TagProperty, binding) }, | ||
}; | ||
|
||
target.Theme = theme; | ||
var root = new TestRoot(target); | ||
root.UpdateLayout(); | ||
|
||
var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty); | ||
Assert.NotNull(expression); | ||
} | ||
|
||
[Fact] | ||
public void GetBindingExpressionBase_Returns_Binding_When_Bound_Via_ControlTheme_TemplateBinding() | ||
{ | ||
var target = new Control(); | ||
var binding = new TemplateBinding(Control.TagProperty); | ||
var theme = new ControlTheme(typeof(Control)) | ||
{ | ||
Setters = { new Setter(Control.TagProperty, binding) }, | ||
}; | ||
|
||
target.Theme = theme; | ||
var root = new TestRoot(target); | ||
root.UpdateLayout(); | ||
|
||
var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty); | ||
Assert.NotNull(expression); | ||
} | ||
|
||
[Fact] | ||
public void GetBindingExpressionBase_Returns_Binding_When_Bound_Via_ControlTheme_Style() | ||
{ | ||
var target = new Control { Classes = { "foo" } }; | ||
var binding = new Binding("Tag"); | ||
var theme = new ControlTheme(typeof(Control)) | ||
{ | ||
Children = | ||
{ | ||
new Style(x => x.Nesting().Class("foo")) | ||
{ | ||
Setters = { new Setter(Control.TagProperty, binding) }, | ||
}, | ||
} | ||
}; | ||
|
||
target.Theme = theme; | ||
var root = new TestRoot(target); | ||
root.UpdateLayout(); | ||
|
||
var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty); | ||
Assert.NotNull(expression); | ||
} | ||
|
||
[Fact] | ||
public void GetBindingExpressionBase_Returns_Binding_When_Bound_Via_Style() | ||
{ | ||
var target = new Control(); | ||
var binding = new Binding("Tag"); | ||
var style = new Style(x => x.OfType<Control>()) | ||
{ | ||
Setters = { new Setter(Control.TagProperty, binding) }, | ||
}; | ||
|
||
var root = new TestRoot(); | ||
root.Styles.Add(style); | ||
root.Child = target; | ||
root.UpdateLayout(); | ||
|
||
var expression = BindingOperations.GetBindingExpressionBase(target, Control.TagProperty); | ||
Assert.NotNull(expression); | ||
} | ||
} |