|
|
@@ -1,14 +1,11 @@
|
|
|
// Copyright (c) The Perspex 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.Globalization;
|
|
|
-using System.Reactive.Linq;
|
|
|
-using System.Reactive.Subjects;
|
|
|
using Moq;
|
|
|
using Perspex.Controls;
|
|
|
using Perspex.Markup.Data;
|
|
|
using Perspex.Markup.Xaml.Data;
|
|
|
+using ReactiveUI;
|
|
|
using Xunit;
|
|
|
|
|
|
namespace Perspex.Markup.Xaml.UnitTests.Data
|
|
|
@@ -18,101 +15,101 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
|
|
|
[Fact]
|
|
|
public void OneWay_Binding_Should_Be_Set_Up()
|
|
|
{
|
|
|
- var target = CreateTarget();
|
|
|
+ var source = new Source { Foo = "foo" };
|
|
|
+ var target = new TextBlock { DataContext = source };
|
|
|
var binding = new Binding
|
|
|
{
|
|
|
Path = "Foo",
|
|
|
Mode = BindingMode.OneWay,
|
|
|
};
|
|
|
|
|
|
- binding.Bind(target.Object, TextBox.TextProperty);
|
|
|
+ binding.Bind(target, TextBox.TextProperty);
|
|
|
|
|
|
- target.Verify(x => x.Bind(
|
|
|
- TextBox.TextProperty,
|
|
|
- It.IsAny<IObservable<object>>(),
|
|
|
- BindingPriority.LocalValue));
|
|
|
+ Assert.Equal("foo", target.Text);
|
|
|
+ source.Foo = "bar";
|
|
|
+ Assert.Equal("bar", target.Text);
|
|
|
+ target.Text = "baz";
|
|
|
+ Assert.Equal("bar", source.Foo);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void TwoWay_Binding_Should_Be_Set_Up()
|
|
|
{
|
|
|
- var target = CreateTarget();
|
|
|
+ var source = new Source { Foo = "foo" };
|
|
|
+ var target = new TextBlock { DataContext = source };
|
|
|
var binding = new Binding
|
|
|
{
|
|
|
Path = "Foo",
|
|
|
Mode = BindingMode.TwoWay,
|
|
|
};
|
|
|
|
|
|
- binding.Bind(target.Object, TextBox.TextProperty);
|
|
|
+ binding.Bind(target, TextBox.TextProperty);
|
|
|
|
|
|
- target.Verify(x => x.BindTwoWay(
|
|
|
- TextBox.TextProperty,
|
|
|
- It.IsAny<ISubject<object>>(),
|
|
|
- BindingPriority.LocalValue));
|
|
|
+ Assert.Equal("foo", target.Text);
|
|
|
+ source.Foo = "bar";
|
|
|
+ Assert.Equal("bar", target.Text);
|
|
|
+ target.Text = "baz";
|
|
|
+ Assert.Equal("baz", source.Foo);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void OneTime_Binding_Should_Be_Set_Up()
|
|
|
{
|
|
|
- var dataContext = new BehaviorSubject<object>(null);
|
|
|
- var expression = new BehaviorSubject<object>(null);
|
|
|
- var target = CreateTarget(dataContext: dataContext);
|
|
|
+ var source = new Source { Foo = "foo" };
|
|
|
+ var target = new TextBlock { DataContext = source };
|
|
|
var binding = new Binding
|
|
|
{
|
|
|
Path = "Foo",
|
|
|
Mode = BindingMode.OneTime,
|
|
|
};
|
|
|
|
|
|
- binding.Bind(target.Object, TextBox.TextProperty, expression);
|
|
|
+ binding.Bind(target, TextBox.TextProperty);
|
|
|
|
|
|
- target.Verify(x => x.SetValue(
|
|
|
- (PerspexProperty)TextBox.TextProperty,
|
|
|
- null,
|
|
|
- BindingPriority.LocalValue));
|
|
|
- target.ResetCalls();
|
|
|
-
|
|
|
- expression.OnNext("foo");
|
|
|
- dataContext.OnNext(1);
|
|
|
-
|
|
|
- target.Verify(x => x.SetValue(
|
|
|
- (PerspexProperty)TextBox.TextProperty,
|
|
|
- "foo",
|
|
|
- BindingPriority.LocalValue));
|
|
|
+ Assert.Equal("foo", target.Text);
|
|
|
+ source.Foo = "bar";
|
|
|
+ Assert.Equal("foo", target.Text);
|
|
|
+ target.Text = "baz";
|
|
|
+ Assert.Equal("bar", source.Foo);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void OneWayToSource_Binding_Should_Be_Set_Up()
|
|
|
{
|
|
|
- var textObservable = new Mock<IObservable<string>>();
|
|
|
- var expression = new Mock<ISubject<object>>();
|
|
|
- var target = CreateTarget(text: textObservable.Object);
|
|
|
+ var source = new Source { Foo = "foo" };
|
|
|
+ var target = new TextBlock { DataContext = source, Text = "bar" };
|
|
|
var binding = new Binding
|
|
|
{
|
|
|
Path = "Foo",
|
|
|
Mode = BindingMode.OneWayToSource,
|
|
|
};
|
|
|
|
|
|
- binding.Bind(target.Object, TextBox.TextProperty, expression.Object);
|
|
|
+ binding.Bind(target, TextBox.TextProperty);
|
|
|
|
|
|
- textObservable.Verify(x => x.Subscribe(expression.Object));
|
|
|
+ Assert.Equal("bar", source.Foo);
|
|
|
+ target.Text = "baz";
|
|
|
+ Assert.Equal("baz", source.Foo);
|
|
|
+ source.Foo = "quz";
|
|
|
+ Assert.Equal("baz", target.Text);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void Default_BindingMode_Should_Be_Used()
|
|
|
{
|
|
|
- var target = CreateTarget(null);
|
|
|
+ // Default for TextBox.Text is two-way.
|
|
|
+ var source = new Source { Foo = "foo" };
|
|
|
+ var target = new TextBlock { DataContext = source };
|
|
|
var binding = new Binding
|
|
|
{
|
|
|
Path = "Foo",
|
|
|
};
|
|
|
|
|
|
- binding.Bind(target.Object, TextBox.TextProperty);
|
|
|
+ binding.Bind(target, TextBox.TextProperty);
|
|
|
|
|
|
- // Default for TextBox.Text is two-way.
|
|
|
- target.Verify(x => x.BindTwoWay(
|
|
|
- TextBox.TextProperty,
|
|
|
- It.IsAny<ISubject<object>>(),
|
|
|
- BindingPriority.LocalValue));
|
|
|
+ Assert.Equal("foo", target.Text);
|
|
|
+ source.Foo = "bar";
|
|
|
+ Assert.Equal("bar", target.Text);
|
|
|
+ target.Text = "baz";
|
|
|
+ Assert.Equal("baz", source.Foo);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
@@ -164,13 +161,13 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
|
|
|
[Fact]
|
|
|
public void Should_Use_DefaultValueConverter_When_No_Converter_Specified()
|
|
|
{
|
|
|
- var target = CreateTarget(null);
|
|
|
+ var target = new TextBlock(); ;
|
|
|
var binding = new Binding
|
|
|
{
|
|
|
Path = "Foo",
|
|
|
};
|
|
|
|
|
|
- var result = binding.CreateSubject(target.Object, TextBox.TextProperty.PropertyType);
|
|
|
+ var result = binding.CreateSubject(target, TextBox.TextProperty.PropertyType);
|
|
|
|
|
|
Assert.IsType<DefaultValueConverter>(((ExpressionSubject)result).Converter);
|
|
|
}
|
|
|
@@ -178,7 +175,7 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
|
|
|
[Fact]
|
|
|
public void Should_Use_Supplied_Converter()
|
|
|
{
|
|
|
- var target = CreateTarget(null);
|
|
|
+ var target = new TextBlock();
|
|
|
var converter = new Mock<IValueConverter>();
|
|
|
var binding = new Binding
|
|
|
{
|
|
|
@@ -186,7 +183,7 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
|
|
|
Path = "Foo",
|
|
|
};
|
|
|
|
|
|
- var result = binding.CreateSubject(target.Object, TextBox.TextProperty.PropertyType);
|
|
|
+ var result = binding.CreateSubject(target, TextBox.TextProperty.PropertyType);
|
|
|
|
|
|
Assert.Same(converter.Object, ((ExpressionSubject)result).Converter);
|
|
|
}
|
|
|
@@ -194,7 +191,7 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
|
|
|
[Fact]
|
|
|
public void Should_Pass_ConverterParameter_To_Supplied_Converter()
|
|
|
{
|
|
|
- var target = CreateTarget();
|
|
|
+ var target = new TextBlock();
|
|
|
var converter = new Mock<IValueConverter>();
|
|
|
var binding = new Binding
|
|
|
{
|
|
|
@@ -203,7 +200,7 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
|
|
|
Path = "Bar",
|
|
|
};
|
|
|
|
|
|
- var result = binding.CreateSubject(target.Object, TextBox.TextProperty.PropertyType);
|
|
|
+ var result = binding.CreateSubject(target, TextBox.TextProperty.PropertyType);
|
|
|
|
|
|
Assert.Same("foo", ((ExpressionSubject)result).ConverterParameter);
|
|
|
}
|
|
|
@@ -261,24 +258,15 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
|
|
|
Assert.Equal(2, vm.Bar);
|
|
|
}
|
|
|
|
|
|
- private Mock<IObservablePropertyBag> CreateTarget(object dataContext)
|
|
|
- {
|
|
|
- return CreateTarget(dataContext: Observable.Never<object>().StartWith(dataContext));
|
|
|
- }
|
|
|
-
|
|
|
- private Mock<IObservablePropertyBag> CreateTarget(
|
|
|
- IObservable<object> dataContext = null,
|
|
|
- IObservable<string> text = null)
|
|
|
+ public class Source : ReactiveObject
|
|
|
{
|
|
|
- var result = new Mock<IObservablePropertyBag>();
|
|
|
-
|
|
|
- dataContext = dataContext ?? Observable.Never<object>().StartWith((object)null);
|
|
|
- text = text ?? Observable.Never<string>().StartWith((string)null);
|
|
|
+ private string _foo;
|
|
|
|
|
|
- result.Setup(x => x.GetObservable(Control.DataContextProperty)).Returns(dataContext);
|
|
|
- result.Setup(x => x.GetObservable((PerspexProperty)Control.DataContextProperty)).Returns(dataContext);
|
|
|
- result.Setup(x => x.GetObservable((PerspexProperty)TextBox.TextProperty)).Returns(text);
|
|
|
- return result;
|
|
|
+ public string Foo
|
|
|
+ {
|
|
|
+ get { return _foo; }
|
|
|
+ set { this.RaiseAndSetIfChanged(ref _foo, value); }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private class OldDataContextViewModel
|
|
|
@@ -297,7 +285,7 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
|
|
|
|
|
|
public OldDataContextTest()
|
|
|
{
|
|
|
- Bind(BarProperty, GetObservable(FooProperty));
|
|
|
+ Bind(BarProperty, this.GetObservable(FooProperty));
|
|
|
}
|
|
|
}
|
|
|
}
|