summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Xaml.UnitTests/XamlC/FieldReferenceExtensionsTests.cs
blob: 79144f98bd0b958e5407f0b69025fbbf87c820cf (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
using System;
using System.Linq;

using Mono.Cecil;

using Xamarin.Forms.Build.Tasks;

using NUnit.Framework;

namespace Xamarin.Forms.Xaml.XamlcUnitTests
{
	[TestFixture]
	public class FieldReferenceExtensionsTests
	{
		public class NonGenericClass {
			public object Field;
		}

		public class GenericClass<T1,T2> {
			public object NonGenericField;
			public T1 GenericField1;
			public T2 GenericField2;
		}

		public class Inheritor : GenericClass<string,double>
		{
		}

		ModuleDefinition module;

		[SetUp]
		public void SetUp ()
		{
			module = ModuleDefinition.CreateModule ("foo", ModuleKind.Dll);
		}

		[Test]
		public void ResolveGenericsOnNonGenericDoesNotThrow ()
		{
			var type = module.Import (typeof (NonGenericClass));
			TypeReference declaringTypeReference;
			FieldDefinition field = type.GetField (fd => fd.Name == "Field", out declaringTypeReference);
			Assert.DoesNotThrow (() => field.ResolveGenericParameters (declaringTypeReference));
		}

		[Test]
		public void NonGenericFieldOnGenericType ()
		{
			var type = module.Import (typeof (Inheritor));
			TypeReference declaringTypeReference;
			FieldDefinition field = type.GetField (fd => fd.Name == "NonGenericField", out declaringTypeReference);
			Assert.AreEqual ("NonGenericField", field.Name);
			Assert.AreEqual ("Xamarin.Forms.Xaml.XamlcUnitTests.FieldReferenceExtensionsTests/GenericClass`2", field.DeclaringType.FullName);
			Assert.False (field.DeclaringType.IsGenericInstance);
			var genericField = field.ResolveGenericParameters (declaringTypeReference);
			Assert.AreEqual ("NonGenericField", genericField.Name);
			Assert.AreEqual ("Xamarin.Forms.Xaml.XamlcUnitTests.FieldReferenceExtensionsTests/GenericClass`2<System.String,System.Double>", genericField.DeclaringType.FullName);
			Assert.True (genericField.DeclaringType.IsGenericInstance);
		}

		[Test]
		public void GenericFieldOnGenericType ()
		{
			var type = module.Import (typeof (Inheritor));
			TypeReference declaringTypeReference;

			FieldDefinition field1 = type.GetField (fd => fd.Name == "GenericField1", out declaringTypeReference);
			Assert.AreEqual ("GenericField1", field1.Name);
			Assert.AreEqual ("Xamarin.Forms.Xaml.XamlcUnitTests.FieldReferenceExtensionsTests/GenericClass`2", field1.DeclaringType.FullName);
			Assert.False (field1.DeclaringType.IsGenericInstance);
			Assert.True (field1.FieldType.IsGenericParameter);
			Assert.AreEqual ("T1", field1.FieldType.FullName);

			var genericField1 = field1.ResolveGenericParameters (declaringTypeReference);
			Assert.AreEqual ("GenericField1", genericField1.Name);
			Assert.AreEqual ("Xamarin.Forms.Xaml.XamlcUnitTests.FieldReferenceExtensionsTests/GenericClass`2<System.String,System.Double>", genericField1.DeclaringType.FullName);
			Assert.True (genericField1.DeclaringType.IsGenericInstance);
			Assert.False (genericField1.FieldType.IsGenericParameter);
			Assert.AreEqual ("System.String", genericField1.FieldType.FullName);

			FieldDefinition field2 = type.GetField (fd => fd.Name == "GenericField2", out declaringTypeReference);
			Assert.AreEqual ("GenericField2", field2.Name);
			Assert.AreEqual ("Xamarin.Forms.Xaml.XamlcUnitTests.FieldReferenceExtensionsTests/GenericClass`2", field2.DeclaringType.FullName);
			Assert.False (field2.DeclaringType.IsGenericInstance);
			Assert.True (field2.FieldType.IsGenericParameter);
			Assert.AreEqual ("T2", field2.FieldType.FullName);

			var genericField2 = field2.ResolveGenericParameters (declaringTypeReference);
			Assert.AreEqual ("GenericField2", genericField2.Name);
			Assert.AreEqual ("Xamarin.Forms.Xaml.XamlcUnitTests.FieldReferenceExtensionsTests/GenericClass`2<System.String,System.Double>", genericField2.DeclaringType.FullName);
			Assert.True (genericField2.DeclaringType.IsGenericInstance);
			Assert.False (genericField2.FieldType.IsGenericParameter);
			Assert.AreEqual ("System.Double", genericField2.FieldType.FullName);
		}
	}
}