summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Xaml.UnitTests/MarkupExpressionParserTests.cs
diff options
context:
space:
mode:
authorJason Smith <jason.smith@xamarin.com>2016-03-22 13:02:25 -0700
committerJason Smith <jason.smith@xamarin.com>2016-03-22 16:13:41 -0700
commit17fdde66d94155fc62a034fa6658995bef6fd6e5 (patch)
treeb5e5073a2a7b15cdbe826faa5c763e270a505729 /Xamarin.Forms.Xaml.UnitTests/MarkupExpressionParserTests.cs
downloadxamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.gz
xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.bz2
xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.zip
Initial import
Diffstat (limited to 'Xamarin.Forms.Xaml.UnitTests/MarkupExpressionParserTests.cs')
-rw-r--r--Xamarin.Forms.Xaml.UnitTests/MarkupExpressionParserTests.cs326
1 files changed, 326 insertions, 0 deletions
diff --git a/Xamarin.Forms.Xaml.UnitTests/MarkupExpressionParserTests.cs b/Xamarin.Forms.Xaml.UnitTests/MarkupExpressionParserTests.cs
new file mode 100644
index 00000000..63493030
--- /dev/null
+++ b/Xamarin.Forms.Xaml.UnitTests/MarkupExpressionParserTests.cs
@@ -0,0 +1,326 @@
+using System;
+using NUnit.Framework;
+using System.Xml;
+using System.Collections.Generic;
+
+using Xamarin.Forms.Core.UnitTests;
+using System.Reflection;
+
+namespace Xamarin.Forms.Xaml.UnitTests
+{
+ [TestFixture]
+ public class MarkupExpressionParserTests : BaseTestFixture
+ {
+ IXamlTypeResolver typeResolver;
+
+ class MockElementNode : IElementNode, IValueNode, IXmlLineInfo
+ {
+ public bool HasLineInfo () { return false; }
+
+ public int LineNumber {
+ get { return -1; }
+ }
+
+ public int LinePosition {
+ get { return -1; }
+ }
+
+
+ public IXmlNamespaceResolver NamespaceResolver {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public object Value {get;set;}
+ public Dictionary<XmlName, INode> Properties { get; set; }
+
+ public List<XmlName> SkipProperties { get; set; }
+
+ public Forms.Internals.INameScope Namescope {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public XmlType XmlType {
+ get;
+ set;
+ }
+
+ public string NamespaceURI {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public INode Parent {
+ get {
+ throw new NotImplementedException ();
+ }
+ set { throw new NotImplementedException (); }
+ }
+
+ public List<INode> CollectionItems { get; set; }
+
+ public void Accept (IXamlNodeVisitor visitor, INode parentNode)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public List<string> IgnorablePrefixes { get; set; }
+ }
+
+ [SetUp]
+ public override void Setup ()
+ {
+ base.Setup ();
+ var nsManager = new XmlNamespaceManager (new NameTable ());
+ nsManager.AddNamespace ("local", "clr-namespace:Xamarin.Forms.Xaml.UnitTests;assembly=Xamarin.Forms.Xaml.UnitTests");
+ nsManager.AddNamespace ("x", "http://schemas.microsoft.com/winfx/2009/xaml");
+ typeResolver = new Internals.XamlTypeResolver (nsManager, XamlParser.GetElementType, Assembly.GetCallingAssembly ());
+ }
+
+ [Test]
+ public void BindingOnSelf ()
+ {
+ var bindingString = "{Binding}";
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual (Binding.SelfPath, ((Binding)binding).Path);
+ }
+
+ [Test]
+ public void BindingWithImplicitPath ()
+ {
+ var bindingString = "{Binding Foo}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo", ((Binding)binding).Path);
+ }
+
+ [Test]
+ public void BindingWithPath ()
+ {
+ var bindingString = "{Binding Path=Foo}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo", ((Binding)binding).Path);
+ }
+
+ [Test]
+ public void BindingWithComposedPath ()
+ {
+ var bindingString = "{Binding Path=Foo.Bar}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo.Bar", ((Binding)binding).Path);
+ }
+
+ [Test]
+ public void BindingWithImplicitComposedPath ()
+ {
+ var bindingString = "{Binding Path=Foo.Bar}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo.Bar", ((Binding)binding).Path);
+ }
+
+ class MockValueProvider : IProvideParentValues, IProvideValueTarget
+ {
+ public MockValueProvider (string key, object resource)
+ {
+ var rd = new ResourceDictionary {
+ {key, resource}
+ };
+
+ ve = new VisualElement {
+ Resources = rd,
+ };
+ }
+
+
+ VisualElement ve;
+ public IEnumerable<object> ParentObjects {
+ get {
+ yield return ve;
+ }
+ }
+
+ public object TargetObject {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public object TargetProperty {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+ }
+
+ [Test]
+ public void BindingWithImplicitPathAndConverter ()
+ {
+ var bindingString = "{Binding Foo, Converter={StaticResource Bar}}";
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ IProvideValueTarget = new MockValueProvider ("Bar", new ReverseConverter()),
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo", ((Binding)binding).Path);
+ Assert.NotNull (((Binding)binding).Converter);
+ Assert.That (((Binding)binding).Converter, Is.InstanceOf<ReverseConverter> ());
+ }
+
+ [Test]
+ public void BindingWithPathAndConverter ()
+ {
+ var bindingString = "{Binding Path=Foo, Converter={StaticResource Bar}}";
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ IProvideValueTarget = new MockValueProvider ("Bar", new ReverseConverter()),
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo", ((Binding)binding).Path);
+ Assert.NotNull (((Binding)binding).Converter);
+ Assert.That (((Binding)binding).Converter, Is.InstanceOf<ReverseConverter> ());
+ }
+
+
+ [Test]
+ public void TestBindingMode ()
+ {
+ var bindingString = "{Binding Foo, Mode=TwoWay}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo", ((Binding)binding).Path);
+ Assert.AreEqual (BindingMode.TwoWay, ((Binding)binding).Mode);
+ }
+
+ [Test]
+ public void BindingStringFormat ()
+ {
+ var bindingString = "{Binding Foo, StringFormat=Bar}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo", ((Binding)binding).Path);
+ Assert.AreEqual ("Bar", ((Binding)binding).StringFormat);
+ }
+
+ [Test]
+ public void BindingStringFormatWithEscapes ()
+ {
+ var bindingString = "{Binding Foo, StringFormat='{}Hello {0}'}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo", ((Binding)binding).Path);
+ Assert.AreEqual ("Hello {0}", ((Binding)binding).StringFormat);
+ }
+
+ [Test]
+ public void BindingStringFormatWithoutEscaping ()
+ {
+ var bindingString = "{Binding Foo, StringFormat='{0,20}'}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo", ((Binding)binding).Path);
+ Assert.AreEqual ("{0,20}", ((Binding)binding).StringFormat);
+ }
+
+ [Test]
+ public void BindingStringFormatNumeric ()
+ {
+ var bindingString = "{Binding Foo, StringFormat=P2}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo", ((Binding)binding).Path);
+ Assert.AreEqual ("P2", ((Binding)binding).StringFormat);
+ }
+
+ [Test]
+ public void BindingConverterParameter ()
+ {
+ var bindingString = "{Binding Foo, ConverterParameter='Bar'}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo", ((Binding)binding).Path);
+ Assert.AreEqual ("Bar", ((Binding)binding).ConverterParameter);
+ }
+
+ [Test]
+ public void BindingsCompleteString ()
+ {
+ var bindingString = "{Binding Path=Foo.Bar, StringFormat='{}Qux, {0}', Converter={StaticResource Baz}, Mode=OneWayToSource}";
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ IProvideValueTarget = new MockValueProvider ("Baz", new ReverseConverter()),
+ });
+
+ Assert.That (binding, Is.InstanceOf<Binding> ());
+ Assert.AreEqual ("Foo.Bar", ((Binding)binding).Path);
+ Assert.NotNull (((Binding)binding).Converter);
+ Assert.That (((Binding)binding).Converter, Is.InstanceOf<ReverseConverter> ());
+ Assert.AreEqual (BindingMode.OneWayToSource, ((Binding)binding).Mode);
+ Assert.AreEqual ("Qux, {0}", ((Binding)binding).StringFormat);
+ }
+
+ [Test]
+ public void BindingWithStaticConverter ()
+ {
+ var bindingString = "{Binding Converter={x:Static local:ReverseConverter.Instance}}";
+
+ var binding = (new MarkupExtensionParser ()).ParseExpression (ref bindingString, new Internals.XamlServiceProvider (null, null) {
+ IXamlTypeResolver = typeResolver,
+ }) as Binding;
+
+ Assert.NotNull (binding);
+ Assert.AreEqual(".", binding.Path);
+ Assert.That (binding.Converter, Is.TypeOf<ReverseConverter> ());
+ }
+ }
+}