-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
CecilExtensionsTests.cs
98 lines (87 loc) · 2.67 KB
/
CecilExtensionsTests.cs
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
using System;
using System.Collections.Generic;
using Mono.Cecil;
using NUnit.Framework;
using Xamarin.Forms.Build.Tasks;
using IOPath = System.IO.Path;
namespace Xamarin.Forms.Xaml.UnitTests
{
[TestFixture]
public class CecilExtensionsTests : IAssemblyResolver
{
const string testNamespace = "Xamarin.Forms.Xaml.UnitTests";
AssemblyDefinition assembly;
readonly List<AssemblyDefinition> assemblies = new List<AssemblyDefinition>();
readonly ReaderParameters readerParameters;
public CecilExtensionsTests()
{
readerParameters = new ReaderParameters
{
AssemblyResolver = this,
};
}
[SetUp]
public void SetUp()
{
assembly = AssemblyDefinition.ReadAssembly(GetType().Assembly.Location, readerParameters);
assemblies.Add(assembly);
}
public AssemblyDefinition Resolve(AssemblyNameReference name)
{
var path = IOPath.Combine(IOPath.GetDirectoryName(GetType().Assembly.Location), name.Name + ".dll");
var assembly = AssemblyDefinition.ReadAssembly(path, readerParameters);
assemblies.Add(assembly);
return assembly;
}
public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters)
{
var path = IOPath.Combine(IOPath.GetDirectoryName(GetType().Assembly.Location), name.Name + ".dll");
var assembly = AssemblyDefinition.ReadAssembly(path, parameters);
assemblies.Add(assembly);
return assembly;
}
[TearDown]
public void Dispose()
{
foreach (var assembly in assemblies)
{
assembly.Dispose();
}
assemblies.Clear();
}
EmbeddedResource GetResource(string name)
{
var resourceName = $"{testNamespace}.{name}.xaml";
foreach (EmbeddedResource res in assembly.MainModule.Resources)
{
if (res.Name == resourceName)
return res;
}
throw new InvalidOperationException($"Resource '{resourceName}' not found in assembly '{assembly.Name.Name}'.");
}
static string[] IsXamlTrueSource = new[]
{
"IsCompiledDefault",
"X2006Namespace",
"X2009Primitives",
};
[Test, TestCaseSource(nameof(IsXamlTrueSource))]
public void IsXamlTrue(string name)
{
var resource = GetResource(name);
Assert.IsTrue(resource.IsXaml(assembly.MainModule, out string className), $"IsXaml should return true for '{name}'.");
Assert.AreEqual(className, $"{testNamespace}.{name}"); // Test cases x:Class matches the file name
}
static string[] IsXamlFalseSource = new[]
{
"Validation.MissingXClass",
"Validation.NotXaml",
};
[Test, TestCaseSource(nameof(IsXamlFalseSource))]
public void IsXamlFalse(string name)
{
var resource = GetResource(name);
Assert.IsFalse(resource.IsXaml(assembly.MainModule, out _), $"IsXaml should return false for '{name}'.");
}
}
}