summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Xaml.UnitTests/MarkupExtensionTests.cs
blob: 9d76c0166868484cdab14c5050996af78a131570 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
using System;
using NUnit.Framework;
using System.Xml;

using Xamarin.Forms.Core.UnitTests;
using System.Reflection;

namespace Xamarin.Forms.Xaml.UnitTests
{
	public class FooMarkupExtension : IMarkupExtension
	{
		public object ProvideValue (IServiceProvider serviceProvider)
		{
			return "Foo";
		}
	}

	public class AppendMarkupExtension : IMarkupExtension
	{
		public object Value0 { get; set; }
		public object Value1 { get; set; }

		public object ProvideValue (IServiceProvider serviceProvider)
		{
			return Value0.ToString () + Value1.ToString ();
		}
	}

	public class AccessServiceProviderExtension : IMarkupExtension
	{
		public object ProvideValue (IServiceProvider serviceProvider)
		{
			var result = "";
			if (serviceProvider != null) {
				var targetValueProvider = serviceProvider.GetService (typeof(IProvideValueTarget));
				result += targetValueProvider != null;
				var xamlType = serviceProvider.GetService (typeof(IXamlTypeResolver));
				result += xamlType != null;
				var rootObject = serviceProvider.GetService (typeof(IRootObjectProvider));
				result += rootObject != null;
			}
			return result;
		}
	}

	public class ColorMarkup : IMarkupExtension
	{
		public int R { get; set; }
		public int G { get; set; }
		public int B { get; set; }

		public ColorMarkup ()
		{
		}

		public object ProvideValue (IServiceProvider serviceProvider)
		{
			return Color.FromRgb (R, G, B);
		}
	}

	public class FuuExtension : IMarkupExtension
	{
		public object ProvideValue (IServiceProvider serviceProvider)
		{
			return "FuuExtension";
		}
	}

	public class Fuu : IMarkupExtension
	{
		public object ProvideValue (IServiceProvider serviceProvider)
		{
			return "Fuu";
		}
	}

	public class BaaExtension : IMarkupExtension
	{
		public object ProvideValue (IServiceProvider serviceProvider)
		{
			return "BaaExtension";
		}
	}

	[TestFixture]
	public class MarkupExtensionTests : BaseTestFixture
	{
		IXamlTypeResolver typeResolver;

		[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/2006/xaml");

			typeResolver = new Internals.XamlTypeResolver (nsManager, XamlParser.GetElementType, Assembly.GetCallingAssembly ());
		}

		[Test]
		public void TestSimpleExtension ()
		{
			var markupString = "{local:FooMarkupExtension}";
			var serviceProvider = new Internals.XamlServiceProvider (null, null) {
				IXamlTypeResolver = typeResolver,
			};
			var result = (new MarkupExtensionParser ()).ParseExpression (ref markupString, serviceProvider);

			Assert.That (result, Is.InstanceOf<string> ());
			Assert.AreEqual ("Foo", result);
		}

		[Test]
		public void TestExtensionWithParameters ()
		{
			var markupString = "{local:AppendMarkupExtension Value0=Foo, Value1=Bar}";
			var serviceProvider = new Internals.XamlServiceProvider (null, null) {
				IXamlTypeResolver = typeResolver,
			};
			var result = (new MarkupExtensionParser ()).ParseExpression (ref markupString, serviceProvider);

			Assert.That (result, Is.InstanceOf<string> ());
			Assert.AreEqual ("FooBar", result);
		}

		[Test]
		public void TestServiceProvider ()
		{
			var markupString = "{local:AccessServiceProviderExtension}";
			var serviceProvider = new Internals.XamlServiceProvider (null, null) {
				IProvideValueTarget = new Internals.XamlValueTargetProvider (null, null, null, null),
				IXamlTypeResolver = typeResolver,
				IRootObjectProvider = new Internals.XamlRootObjectProvider(null),
			};

			var result = (new MarkupExtensionParser ()).ParseExpression (ref markupString, serviceProvider);

			Assert.That (result, Is.InstanceOf<string> ());
			Assert.AreEqual ("TrueTrueTrue", result);
		}

		[Test]
		public void TestInXaml ()
		{
			var xaml = @"
			<Label 
				xmlns=""http://xamarin.com/schemas/2014/forms""
				xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
				xmlns:local=""clr-namespace:Xamarin.Forms.Xaml.UnitTests;assembly=Xamarin.Forms.Xaml.UnitTests""
				Text=""{local:AppendMarkupExtension Value0=Foo, Value1=Bar}""
			/>";

			var label = new Label ();
			label.LoadFromXaml (xaml);
			Assert.AreEqual ("FooBar", label.Text.ToString ());
		}

		[Test]
		public void TestMarkupExtensionInDefaultNamespace ()
		{
			var xaml = @"
			<forms:Label 
				xmlns=""clr-namespace:Xamarin.Forms.Xaml.UnitTests;assembly=Xamarin.Forms.Xaml.UnitTests""
				xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
				xmlns:forms=""http://xamarin.com/schemas/2014/forms""
				Text=""{AppendMarkupExtension Value0=Foo, Value1=Bar}""
			/>";

			var label = new Label();
			label.LoadFromXaml(xaml);
			Assert.AreEqual("FooBar", label.Text.ToString());
		}

		[Test]
		public void TestDocumentationCode ()
		{
			var xaml =@"
			<Label
				xmlns=""http://xamarin.com/schemas/2014/forms""
				xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
				xmlns:local=""clr-namespace:Xamarin.Forms.Xaml.UnitTests;assembly=Xamarin.Forms.Xaml.UnitTests""
				TextColor=""{local:ColorMarkup R=100, G=80, B=60}""/>";

			var label = new Label ().LoadFromXaml (xaml);
			Assert.AreEqual (Color.FromRgb (100, 80, 60), label.TextColor);
		}

		[Test]
		public void TestLookupWithSuffix ()
		{
			var markupString = "{local:Baa}";
			var serviceProvider = new Internals.XamlServiceProvider (null, null) {
				IXamlTypeResolver = typeResolver,
			};
			var result = (new MarkupExtensionParser ()).ParseExpression (ref markupString, serviceProvider);

			Assert.That (result, Is.InstanceOf<string> ());
			Assert.AreEqual ("BaaExtension", result);
		}

		[Test]
		public void TestLookupOrder ()
		{
			//The order of lookup is to look for the Extension-suffixed class name first and then look for the class name without the Extension suffix.
			var markupString = "{local:Fuu}";
			var serviceProvider = new Internals.XamlServiceProvider (null, null) {
				IXamlTypeResolver = typeResolver,
			};
			var result = (new MarkupExtensionParser ()).ParseExpression (ref markupString, serviceProvider);

			Assert.That (result, Is.InstanceOf<string> ());
			Assert.AreEqual ("FuuExtension", result);
		}

		[Test]
		public void ThrowOnMarkupExtensionNotFound ()
		{
			var markupString = "{local:Missing}";
			var serviceProvider = new Internals.XamlServiceProvider (null, null) {
				IXamlTypeResolver = typeResolver,
			};
			Assert.Throws<XamlParseException> (()=> (new MarkupExtensionParser ()).ParseExpression (ref markupString, serviceProvider));
		}
	}
}