summaryrefslogtreecommitdiff
path: root/mcs/class/monodoc/Test/Monodoc/EcmaDocTests.cs
blob: 9886846ed4d785bce34920edb04f805561aba048 (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
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Collections.Generic;

using NUnit.Framework;

using Monodoc;
using Monodoc.Generators;

namespace MonoTests.Monodoc
{
	[TestFixture]
	public class EcmaDocTest
	{
		// Because EcmaDoc is internal and we can't use InternalsVisibleTo since test assemblies aren't
		// signed/strong-named by the build, we have to resort to reflection
		TDelegate GetTestedMethod<TDelegate> (string methodName)
		{
			var ecmaDoc = Type.GetType ("Monodoc.Providers.EcmaDoc, monodoc, PublicKey=0738eb9f132ed756");
			return (TDelegate)(object)Delegate.CreateDelegate (typeof (TDelegate), ecmaDoc.GetMethod (methodName));
		}

		[Test]
		public void CountTypeGenericArgumentsTest ()
		{
			var realCountTypeGenericArguments = GetTestedMethod<Func<string, int, int>> ("CountTypeGenericArguments");
			// Since we don't use the optional start index parameters, bypass it by wrapping the func
			Func<string, int> countTypeGenericArguments = s => realCountTypeGenericArguments (s, 0);

			Assert.AreEqual (0, countTypeGenericArguments ("T:System.String"), "#0a");
			Assert.AreEqual (0, countTypeGenericArguments ("T:String"), "#0b");
			Assert.AreEqual (0, countTypeGenericArguments ("String"), "#0c");

			Assert.AreEqual (1, countTypeGenericArguments ("T:System.Collections.Foo<T>"), "#1a");
			Assert.AreEqual (1, countTypeGenericArguments ("T:System.Foo<T>"), "#1b");
			Assert.AreEqual (1, countTypeGenericArguments ("T:Foo<T>"), "#1c");
			Assert.AreEqual (1, countTypeGenericArguments ("Foo<T>"), "#1d");

			Assert.AreEqual (2, countTypeGenericArguments ("T:System.Collections.Foo<T, U>"), "#2a");
			Assert.AreEqual (2, countTypeGenericArguments ("T:System.Foo<TKey, TValue>"), "#2b");
			Assert.AreEqual (2, countTypeGenericArguments ("T:Foo<Something,Else>"), "#2c");
			Assert.AreEqual (2, countTypeGenericArguments ("Foo<TDelegate,TArray>"), "#2d");

			Assert.AreEqual (3, countTypeGenericArguments ("T:System.Collections.Foo<T, U, V>"), "#3a");
			Assert.AreEqual (3, countTypeGenericArguments ("T:System.Foo<TKey, TValue, THash>"), "#3b");
			Assert.AreEqual (3, countTypeGenericArguments ("T:Foo<Something,Else,Really>"), "#3c");
			Assert.AreEqual (3, countTypeGenericArguments ("Foo<TDelegate,TArray,TEvent>"), "#3d");
		}

		[Test]
		public void CountTypeGenericArgumentsTest_Nested ()
		{
			var realCountTypeGenericArguments = GetTestedMethod<Func<string, int, int>> ("CountTypeGenericArguments");
			// Since we don't use the optional start index parameters, bypass it by wrapping the func
			Func<string, int> countTypeGenericArguments = s => realCountTypeGenericArguments (s, 0);

			Assert.AreEqual (1, countTypeGenericArguments ("T:System.Collections.Foo<T[]>"), "#1a");
			Assert.AreEqual (1, countTypeGenericArguments ("T:System.Collections.Foo<IList<T>>"), "#1b");
			Assert.AreEqual (2, countTypeGenericArguments ("T:System.Collections.Foo<T, KeyValuePair<T, U>>"), "#2a");
			Assert.AreEqual (2, countTypeGenericArguments ("T:System.Collections.Foo<T, KeyValuePair<IProducerConsumerCollection<U>, IEquatable<V>>>"), "#2b");
			Assert.AreEqual (3, countTypeGenericArguments ("T:System.Collections.Foo<T, IProducerConsumerCollection<U>, IEquatable<V>>"), "#3a");
		}
	}
}