1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 
5 using NUnit.Framework;
6 
7 using Mono.Cecil.Rocks;
8 
9 namespace N
10 {
11     /// <summary>
12     /// ID string generated is "T:N.X".
13     /// </summary>
14     public class X
15     {
16         /// <summary>
17         /// ID string generated is "M:N.X.#ctor".
18         /// </summary>
X()19         public X() { }
20 
21 
22         /// <summary>
23         /// ID string generated is "M:N.X.#ctor(System.Int32)".
24         /// </summary>
25         /// <param name="i">Describe parameter.</param>
X(int i)26         public X(int i) { }
27 
28 
29         /// <summary>
30         /// ID string generated is "F:N.X.q".
31         /// </summary>
32         public string q;
33 
34 
35         /// <summary>
36         /// ID string generated is "F:N.X.PI".
37         /// </summary>
38         public const double PI = 3.14;
39 
40 
41         /// <summary>
42         /// ID string generated is "M:N.X.f".
43         /// </summary>
f()44         public int f() { return 1; }
45 
46 
47         /// <summary>
48         /// ID string generated is "M:N.X.bb(System.String,System.Int32@)".
49         /// </summary>
bb(string s, ref int y)50         public int bb(string s, ref int y) { return 1; }
51 
52 
53         /// <summary>
54         /// ID string generated is "M:N.X.gg(System.Int16[],System.Int32[0:,0:])".
55         /// </summary>
gg(short[] array1, int[,] array)56         public int gg(short[] array1, int[,] array) { return 0; }
57 
58 
59         /// <summary>
60         /// ID string generated is "M:N.X.op_Addition(N.X,N.X)".
61         /// </summary>
operator +(X x, X xx)62         public static X operator +(X x, X xx) { return x; }
63 
64 
65         /// <summary>
66         /// ID string generated is "P:N.X.prop".
67         /// </summary>
68         public int prop { get { return 1; } set { } }
69 
70 
71         /// <summary>
72         /// ID string generated is "E:N.X.d".
73         /// </summary>
74 #pragma warning disable 67
75         public event D d;
76 #pragma warning restore 67
77 
78 
79 		/// <summary>
80 		/// ID string generated is "P:N.X.Item(System.String)".
81 		/// </summary>
82 		public int this[string s] { get { return 1; } }
83 
84 
85         /// <summary>
86         /// ID string generated is "T:N.X.Nested".
87         /// </summary>
88         public class Nested { }
89 
90 
91         /// <summary>
92         /// ID string generated is "T:N.X.D".
93         /// </summary>
D(int i)94         public delegate void D(int i);
95 
96 
97         /// <summary>
98         /// ID string generated is "M:N.X.op_Explicit(N.X)~System.Int32".
99         /// </summary>
operator int(X x)100         public static explicit operator int(X x) { return 1; }
101 
Linq(IEnumerable<string> enumerable, Func<string> selector)102 	    public static void Linq (IEnumerable<string> enumerable, Func<string> selector)
103 	    {
104 	    }
105     }
106 }
107 
108 namespace Mono.Cecil.Tests {
109 
110 	[TestFixture]
111 	public class DocCommentIdTests {
112 
113 		[Test]
TypeDef()114 		public void TypeDef ()
115 		{
116 			AssertDocumentID ("T:N.X", GetTestType ());
117 		}
118 
119 		[Test]
ParameterlessCtor()120 		public void ParameterlessCtor ()
121 		{
122 			var type = GetTestType ();
123 			var ctor = type.GetConstructors ().Single (m => m.Parameters.Count == 0);
124 
125 			AssertDocumentID ("M:N.X.#ctor", ctor);
126 		}
127 
128 		[Test]
CtorWithParameters()129 		public void CtorWithParameters ()
130 		{
131 			var type = GetTestType ();
132 			var ctor = type.GetConstructors ().Single (m => m.Parameters.Count == 1);
133 
134 			AssertDocumentID ("M:N.X.#ctor(System.Int32)", ctor);
135 		}
136 
137 		[Test]
Field()138 		public void Field ()
139 		{
140 			var type = GetTestType ();
141 			var field = type.Fields.Single (m => m.Name == "q");
142 
143 			AssertDocumentID ("F:N.X.q", field);
144 		}
145 
146 		[Test]
ConstField()147 		public void ConstField ()
148 		{
149 			var type = GetTestType ();
150 			var field = type.Fields.Single (m => m.Name == "PI");
151 
152 			AssertDocumentID ("F:N.X.PI", field);
153 		}
154 
155 		[Test]
ParameterlessMethod()156 		public void ParameterlessMethod ()
157 		{
158 			var type = GetTestType ();
159 			var method = type.Methods.Single (m => m.Name == "f");
160 
161 			AssertDocumentID ("M:N.X.f", method);
162 		}
163 
164 		[Test]
MethodWithByRefParameters()165 		public void MethodWithByRefParameters ()
166 		{
167 			var type = GetTestType ();
168 			var method = type.Methods.Single (m => m.Name == "bb");
169 
170 			AssertDocumentID ("M:N.X.bb(System.String,System.Int32@)", method);
171 		}
172 
173 		[Test]
MethodWithArrayParameters()174 		public void MethodWithArrayParameters ()
175 		{
176 			var type = GetTestType ();
177 			var method = type.Methods.Single (m => m.Name == "gg");
178 
179 			AssertDocumentID ("M:N.X.gg(System.Int16[],System.Int32[0:,0:])", method);
180 		}
181 
182 		[Test]
OpAddition()183 		public void OpAddition ()
184 		{
185 			var type = GetTestType ();
186 			var op = type.Methods.Single (m => m.Name == "op_Addition");
187 
188 			AssertDocumentID ("M:N.X.op_Addition(N.X,N.X)", op);
189 		}
190 
191 		[Test]
OpExplicit()192 		public void OpExplicit ()
193 		{
194 			var type = GetTestType ();
195 			var op = type.Methods.Single (m => m.Name == "op_Explicit");
196 
197 			AssertDocumentID ("M:N.X.op_Explicit(N.X)~System.Int32", op);
198 		}
199 
200 		[Test]
Property()201 		public void Property ()
202 		{
203 			var type = GetTestType ();
204 			var property = type.Properties.Single (p => p.Name == "prop");
205 
206 			AssertDocumentID ("P:N.X.prop", property);
207 		}
208 
209 		[Test]
Indexer()210 		public void Indexer ()
211 		{
212 			var type = GetTestType ();
213 			var indexer = type.Properties.Single (p => p.Name == "Item");
214 
215 			AssertDocumentID ("P:N.X.Item(System.String)", indexer);
216 		}
217 
218 		[Test]
Event()219 		public void Event ()
220 		{
221 			var type = GetTestType ();
222 			var @event = type.Events.Single (e => e.Name == "d");
223 
224 			AssertDocumentID ("E:N.X.d", @event);
225 		}
226 
227 		[Test]
Delegate()228 		public void Delegate ()
229 		{
230 			var type = GetTestType ();
231 			var @delegate = type.NestedTypes.Single (t => t.Name == "D");
232 
233 			AssertDocumentID ("T:N.X.D", @delegate);
234 		}
235 
236 		[Test]
NestedType()237 		public void NestedType ()
238 		{
239 			var type = GetTestType ();
240 			var nestedType = type.NestedTypes.Single (t => t.Name == "Nested");
241 
242 			AssertDocumentID ("T:N.X.Nested", nestedType);
243 		}
244 
245 		[Test]
Linq()246 		public void Linq ()
247 		{
248 			var type = GetTestType ();
249 			var method = type.GetMethod ("Linq");
250 
251 			AssertDocumentID ("M:N.X.Linq(System.Collections.Generic.IEnumerable{System.String},System.Func{System.String})", method);
252 		}
253 
GetTestType()254 		TypeDefinition GetTestType ()
255 		{
256 			return typeof (N.X).ToDefinition ();
257 		}
258 
AssertDocumentID(string docId, IMemberDefinition member)259 		static void AssertDocumentID (string docId, IMemberDefinition member)
260 		{
261 			Assert.AreEqual (docId, DocCommentId.GetDocCommentId (member));
262 		}
263 	}
264 }
265