Browse Source

Renamed ExpressionSubject -> BindingExpression.

`ExpressionSubject` wasn't a good name as the important thing it isn't
convert an `ExpressionObserver` into an `ISubject`. The important thing
it does is insert an `IValueConverter` into the pipeline.
pull/691/head
Steven Kirk 10 years ago
parent
commit
079d481e36
  1. 2
      src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs
  2. 2
      src/Markup/Avalonia.Markup/Avalonia.Markup.csproj
  3. 12
      src/Markup/Avalonia.Markup/Data/BindingExpression.cs
  4. 2
      tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj
  5. 49
      tests/Avalonia.Markup.UnitTests/Data/BindingExpressionTests.cs
  6. 6
      tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs
  7. 10
      tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_DataValidation.cs

2
src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs

@ -135,7 +135,7 @@ namespace Avalonia.Markup.Xaml.Data
fallback = null;
}
var subject = new ExpressionSubject(
var subject = new BindingExpression(
observer,
targetProperty?.PropertyType ?? typeof(object),
fallback,

2
src/Markup/Avalonia.Markup/Avalonia.Markup.csproj

@ -46,7 +46,7 @@
<Compile Include="Data\EmptyExpressionNode.cs" />
<Compile Include="Data\ExpressionNodeBuilder.cs" />
<Compile Include="Data\ExpressionParseException.cs" />
<Compile Include="Data\ExpressionSubject.cs" />
<Compile Include="Data\BindingExpression.cs" />
<Compile Include="ControlLocator.cs" />
<Compile Include="Data\Plugins\DataAnnotationsValidationPlugin.cs" />
<Compile Include="Data\Plugins\ExceptionValidationPlugin.cs" />

12
src/Markup/Avalonia.Markup/Data/ExpressionSubject.cs → src/Markup/Avalonia.Markup/Data/BindingExpression.cs

@ -12,10 +12,10 @@ using Avalonia.Utilities;
namespace Avalonia.Markup.Data
{
/// <summary>
/// Turns an <see cref="ExpressionObserver"/> into a subject that can be bound two-way with
/// a value converter.
/// Binds to an expression on an object using a type value converter to convert the values
/// that are send and received.
/// </summary>
public class ExpressionSubject : ISubject<object>, IDescription
public class BindingExpression : ISubject<object>, IDescription
{
private readonly ExpressionObserver _inner;
private readonly Type _targetType;
@ -28,7 +28,7 @@ namespace Avalonia.Markup.Data
/// </summary>
/// <param name="inner">The <see cref="ExpressionObserver"/>.</param>
/// <param name="targetType">The type to convert the value to.</param>
public ExpressionSubject(ExpressionObserver inner, Type targetType)
public BindingExpression(ExpressionObserver inner, Type targetType)
: this(inner, targetType, DefaultValueConverter.Instance)
{
}
@ -43,7 +43,7 @@ namespace Avalonia.Markup.Data
/// A parameter to pass to <paramref name="converter"/>.
/// </param>
/// <param name="priority">The binding priority.</param>
public ExpressionSubject(
public BindingExpression(
ExpressionObserver inner,
Type targetType,
IValueConverter converter,
@ -66,7 +66,7 @@ namespace Avalonia.Markup.Data
/// A parameter to pass to <paramref name="converter"/>.
/// </param>
/// <param name="priority">The binding priority.</param>
public ExpressionSubject(
public BindingExpression(
ExpressionObserver inner,
Type targetType,
object fallbackValue,

2
tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj

@ -111,7 +111,7 @@
<Compile Include="Data\ExpressionObserverTests_SetValue.cs" />
<Compile Include="Data\ExpressionObserverTests_Task.cs" />
<Compile Include="Data\ExpressionObserverTests_DataValidation.cs" />
<Compile Include="Data\ExpressionSubjectTests.cs" />
<Compile Include="Data\BindingExpressionTests.cs" />
<Compile Include="DefaultValueConverterTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UnitTestSynchronizationContext.cs" />

49
tests/Avalonia.Markup.UnitTests/Data/ExpressionSubjectTests.cs → tests/Avalonia.Markup.UnitTests/Data/BindingExpressionTests.cs

@ -2,26 +2,25 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Globalization;
using System.Reactive.Linq;
using Moq;
using System.Threading;
using Avalonia.Data;
using Avalonia.Markup.Data;
using Xunit;
using System.Threading;
using System.Collections.Generic;
using Avalonia.UnitTests;
using Moq;
using Xunit;
namespace Avalonia.Markup.UnitTests.Data
{
public class ExpressionSubjectTests
public class BindingExpressionTests
{
[Fact]
public async void Should_Get_Simple_Property_Value()
{
var data = new Class1 { StringValue = "foo" };
var target = new ExpressionSubject(new ExpressionObserver(data, "StringValue"), typeof(string));
var target = new BindingExpression(new ExpressionObserver(data, "StringValue"), typeof(string));
var result = await target.Take(1);
Assert.Equal("foo", result);
@ -31,7 +30,7 @@ namespace Avalonia.Markup.UnitTests.Data
public void Should_Set_Simple_Property_Value()
{
var data = new Class1 { StringValue = "foo" };
var target = new ExpressionSubject(new ExpressionObserver(data, "StringValue"), typeof(string));
var target = new BindingExpression(new ExpressionObserver(data, "StringValue"), typeof(string));
target.OnNext("bar");
@ -44,7 +43,7 @@ namespace Avalonia.Markup.UnitTests.Data
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var data = new Class1 { StringValue = "5.6" };
var target = new ExpressionSubject(new ExpressionObserver(data, "StringValue"), typeof(double));
var target = new BindingExpression(new ExpressionObserver(data, "StringValue"), typeof(double));
var result = await target.Take(1);
Assert.Equal(5.6, result);
@ -54,7 +53,7 @@ namespace Avalonia.Markup.UnitTests.Data
public async void Getting_Invalid_Double_String_Should_Return_BindingError()
{
var data = new Class1 { StringValue = "foo" };
var target = new ExpressionSubject(new ExpressionObserver(data, "StringValue"), typeof(double));
var target = new BindingExpression(new ExpressionObserver(data, "StringValue"), typeof(double));
var result = await target.Take(1);
Assert.IsType<BindingNotification>(result);
@ -64,7 +63,7 @@ namespace Avalonia.Markup.UnitTests.Data
public async void Should_Coerce_Get_Null_Double_String_To_UnsetValue()
{
var data = new Class1 { StringValue = null };
var target = new ExpressionSubject(new ExpressionObserver(data, "StringValue"), typeof(double));
var target = new BindingExpression(new ExpressionObserver(data, "StringValue"), typeof(double));
var result = await target.Take(1);
Assert.Equal(AvaloniaProperty.UnsetValue, result);
@ -76,7 +75,7 @@ namespace Avalonia.Markup.UnitTests.Data
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var data = new Class1 { StringValue = (5.6).ToString() };
var target = new ExpressionSubject(new ExpressionObserver(data, "StringValue"), typeof(double));
var target = new BindingExpression(new ExpressionObserver(data, "StringValue"), typeof(double));
target.OnNext(6.7);
@ -89,7 +88,7 @@ namespace Avalonia.Markup.UnitTests.Data
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var data = new Class1 { DoubleValue = 5.6 };
var target = new ExpressionSubject(new ExpressionObserver(data, "DoubleValue"), typeof(string));
var target = new BindingExpression(new ExpressionObserver(data, "DoubleValue"), typeof(string));
var result = await target.Take(1);
Assert.Equal((5.6).ToString(), result);
@ -101,7 +100,7 @@ namespace Avalonia.Markup.UnitTests.Data
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var data = new Class1 { DoubleValue = 5.6 };
var target = new ExpressionSubject(new ExpressionObserver(data, "DoubleValue"), typeof(string));
var target = new BindingExpression(new ExpressionObserver(data, "DoubleValue"), typeof(string));
target.OnNext("6.7");
@ -114,7 +113,7 @@ namespace Avalonia.Markup.UnitTests.Data
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var data = new Class1 { StringValue = "foo" };
var target = new ExpressionSubject(
var target = new BindingExpression(
new ExpressionObserver(data, "StringValue"),
typeof(int),
42,
@ -135,7 +134,7 @@ namespace Avalonia.Markup.UnitTests.Data
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var data = new Class1 { StringValue = "foo" };
var target = new ExpressionSubject(
var target = new BindingExpression(
new ExpressionObserver(data, "StringValue", true),
typeof(int),
42,
@ -156,7 +155,7 @@ namespace Avalonia.Markup.UnitTests.Data
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var data = new Class1 { StringValue = "foo" };
var target = new ExpressionSubject(
var target = new BindingExpression(
new ExpressionObserver(data, "StringValue"),
typeof(int),
"bar",
@ -178,7 +177,7 @@ namespace Avalonia.Markup.UnitTests.Data
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
var data = new Class1 { StringValue = "foo" };
var target = new ExpressionSubject(
var target = new BindingExpression(
new ExpressionObserver(data, "StringValue", true),
typeof(int),
"bar",
@ -198,7 +197,7 @@ namespace Avalonia.Markup.UnitTests.Data
public void Setting_Invalid_Double_String_Should_Not_Change_Target()
{
var data = new Class1 { DoubleValue = 5.6 };
var target = new ExpressionSubject(new ExpressionObserver(data, "DoubleValue"), typeof(string));
var target = new BindingExpression(new ExpressionObserver(data, "DoubleValue"), typeof(string));
target.OnNext("foo");
@ -209,7 +208,7 @@ namespace Avalonia.Markup.UnitTests.Data
public void Setting_Invalid_Double_String_Should_Use_FallbackValue()
{
var data = new Class1 { DoubleValue = 5.6 };
var target = new ExpressionSubject(
var target = new BindingExpression(
new ExpressionObserver(data, "DoubleValue"),
typeof(string),
"9.8",
@ -224,7 +223,7 @@ namespace Avalonia.Markup.UnitTests.Data
public void Should_Coerce_Setting_Null_Double_To_Default_Value()
{
var data = new Class1 { DoubleValue = 5.6 };
var target = new ExpressionSubject(new ExpressionObserver(data, "DoubleValue"), typeof(string));
var target = new BindingExpression(new ExpressionObserver(data, "DoubleValue"), typeof(string));
target.OnNext(null);
@ -235,7 +234,7 @@ namespace Avalonia.Markup.UnitTests.Data
public void Should_Coerce_Setting_UnsetValue_Double_To_Default_Value()
{
var data = new Class1 { DoubleValue = 5.6 };
var target = new ExpressionSubject(new ExpressionObserver(data, "DoubleValue"), typeof(string));
var target = new BindingExpression(new ExpressionObserver(data, "DoubleValue"), typeof(string));
target.OnNext(AvaloniaProperty.UnsetValue);
@ -247,7 +246,7 @@ namespace Avalonia.Markup.UnitTests.Data
{
var data = new Class1 { DoubleValue = 5.6 };
var converter = new Mock<IValueConverter>();
var target = new ExpressionSubject(
var target = new BindingExpression(
new ExpressionObserver(data, "DoubleValue"),
typeof(string),
converter.Object,
@ -263,7 +262,7 @@ namespace Avalonia.Markup.UnitTests.Data
{
var data = new Class1 { DoubleValue = 5.6 };
var converter = new Mock<IValueConverter>();
var target = new ExpressionSubject(
var target = new BindingExpression(
new ExpressionObserver(data, "DoubleValue"),
typeof(string),
converter.Object,
@ -279,7 +278,7 @@ namespace Avalonia.Markup.UnitTests.Data
{
var data = new Class1 { DoubleValue = 5.6 };
var converter = new Mock<IValueConverter>();
var target = new ExpressionSubject(new ExpressionObserver(data, "DoubleValue", true), typeof(string));
var target = new BindingExpression(new ExpressionObserver(data, "DoubleValue", true), typeof(string));
var result = new List<object>();
target.Subscribe(x => result.Add(x));

6
tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs

@ -200,7 +200,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
var result = binding.Initiate(target, TextBox.TextProperty).Subject;
Assert.IsType<DefaultValueConverter>(((ExpressionSubject)result).Converter);
Assert.IsType<DefaultValueConverter>(((BindingExpression)result).Converter);
}
[Fact]
@ -216,7 +216,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
var result = binding.Initiate(target, TextBox.TextProperty).Subject;
Assert.Same(converter.Object, ((ExpressionSubject)result).Converter);
Assert.Same(converter.Object, ((BindingExpression)result).Converter);
}
[Fact]
@ -233,7 +233,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
var result = binding.Initiate(target, TextBox.TextProperty).Subject;
Assert.Same("foo", ((ExpressionSubject)result).ConverterParameter);
Assert.Same("foo", ((BindingExpression)result).ConverterParameter);
}
[Fact]

10
tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_DataValidation.cs

@ -2,15 +2,11 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Markup.Data;
using Avalonia.Markup.Xaml.Data;
using Moq;
using ReactiveUI;
using Xunit;
namespace Avalonia.Markup.Xaml.UnitTests.Data
@ -27,7 +23,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
var target = new Binding(nameof(Class1.Foo));
var instanced = target.Initiate(textBlock, TextBlock.TextProperty, enableDataValidation: false);
var subject = (ExpressionSubject)instanced.Subject;
var subject = (BindingExpression)instanced.Subject;
object result = null;
subject.Subscribe(x => result = x);
@ -45,7 +41,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
var target = new Binding(nameof(Class1.Foo));
var instanced = target.Initiate(textBlock, TextBlock.TextProperty, enableDataValidation: true);
var subject = (ExpressionSubject)instanced.Subject;
var subject = (BindingExpression)instanced.Subject;
object result = null;
subject.Subscribe(x => result = x);
@ -63,7 +59,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
var target = new Binding(nameof(Class1.Foo)) { Priority = BindingPriority.TemplatedParent };
var instanced = target.Initiate(textBlock, TextBlock.TextProperty, enableDataValidation: true);
var subject = (ExpressionSubject)instanced.Subject;
var subject = (BindingExpression)instanced.Subject;
object result = null;
subject.Subscribe(x => result = x);

Loading…
Cancel
Save