Added tests for Task.WhenAll w/ empty list
[mono.git] / mcs / tools / mdoc / Test / DocTest-v1.cs
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Linq;
5
6 /// <summary>Namespace Test: [<see cref="N:Mono.DocTest" />]</summary>
7 /// <remarks><c>T:NoNamespace</c></remarks>
8 public class NoNamespace {}
9
10 namespace System {
11         /* 
12          * The System namespace gets special treatment, e.g. instead of
13          * System.Environment C# declarations it's just Environment.
14          */
15         /// <remarks><c>T:System.Action`1</c></remarks>
16         public delegate void Action<T> (T obj);
17
18         /// <remarks><c>T:System.Environment</c></remarks>
19         public static class Environment {
20                 /// <remarks><c>T:System.Environment+SpecialFolder</c></remarks>
21                 public enum SpecialFolder {}
22
23                 /// <param name="folder">
24                 ///   A <see cref="T:System.Environment+SpecialFolder" /> instance.
25                 /// </param>
26                 /// <remarks>
27                 ///   <c>M:System.Environment.GetFolderPath(System.Environment+SpecialFolder)</c>
28                 /// </remarks>
29                 public static string GetFolderPath (SpecialFolder folder)
30                 {
31                         throw new NotSupportedException ();
32                 }
33         }
34
35         // to test ECMA doc importing...
36         public class Array {
37                 // the ECMA docs have a different return type than .NET -- skip.
38                 public static System.Collections.ObjectModel.ReadOnlyCollection<T> AsReadOnly<T> (T[] array)
39                 {
40                         throw new NotImplementedException ();
41                 }
42
43                 // ECMA docs use <T,U> instead of <TInput,TOutput> --> map them.
44                 public static TOutput[] ConvertAll<TInput, TOutput> (TInput[] array, Converter<TInput, TOutput> converter)
45                 {
46                         throw new InvalidOperationException ();
47                 }
48
49                 // ECMA docs *incorrectly* document parameter -- skip
50                 public static void Resize<T> (ref T[] array, int newSize)
51                 {
52                         throw new Exception ();
53                 }
54         }
55
56         // to test ECMA doc importing...
57         public delegate void AsyncCallback (IAsyncResult ar);
58 }
59
60 namespace Mono.DocTest {
61         internal class Internal {
62                 public class ShouldNotBeDocumented {
63                 }
64         }
65
66         internal class MonoTODOAttribute : Attribute {
67         }
68
69         /// <remarks>
70         ///  <para>
71         ///   cref=<c>T:Mono.DocTest.DocAttribute</c>.
72         ///  </para>
73         ///  <format type="text/html">
74         ///   <table width="100%">
75         ///     <tr>
76         ///       <td style="color:red">red</td>
77         ///       <td style="color:blue">blue</td>
78         ///       <td style="color:green">green</td>
79         ///     </tr>
80         ///   </table>
81         ///  </format>
82         ///  <code lang="C#" src="../DocTest.cs#DocAttribute Example" />
83         /// </remarks>
84         [AttributeUsage (AttributeTargets.All)]
85         public class DocAttribute : Attribute {
86                 #region DocAttribute Example
87                 [Doc ("documented class")]
88                 class Example {
89                         [Doc ("documented field")] public string field;
90                 }
91                 #endregion
92                 /// <remarks><c>C:Mono.DocTest.DocAttribute(System.String)</c></remarks>
93                 public DocAttribute (string docs)
94                 {
95                         if (docs == null)
96                                 throw new ArgumentNullException ("docs");
97                 }
98
99                 /// <remarks><c>P:Mono.DocTest.DocAttribute.Property</c></remarks>
100                 public Type Property { get; set; }
101
102                 /// <remarks><c>F:Mono.DocTest.DocAttribute.Field</c></remarks>
103                 public bool Field;
104
105                 /// <remarks><c>F:Mono.DocTest.DocAttribute.FlagsEnum</c></remarks>
106                 public ConsoleModifiers FlagsEnum;
107
108                 /// <remarks><c>F:Mono.DocTest.DocAttribute.NonFlagsEnum</c></remarks>
109                 public Color NonFlagsEnum;
110         }
111
112         /// <summary>Possible colors</summary>
113         /// <remarks>
114         ///   <see cref="T:Mono.DocTest.Color"/>.
115         ///   Namespace Test: [<see cref="N:Mono.DocTest" />]
116         /// </remarks>
117         [MonoTODO]
118         public enum Color {
119                 /// <summary>Insert Red summary here</summary>
120                 /// <remarks><c>F:Mono.DocTest.Color.Red</c>.</remarks>
121                 Red, 
122                 /// <summary>Insert Blue summary here</summary>
123                 /// <remarks><c>F:Mono.DocTest.Color.Blue</c>.</remarks>
124                 Blue, 
125                 /// <summary>Insert Green summary here</summary>
126                 /// <remarks><c>F:Mono.DocTest.Color.Green</c>.</remarks>
127                 Green,
128
129                 AnotherGreen = Green,
130         }
131
132         /// <summary>Process interface</summary>
133         /// <remarks><c>T:Mono.DocTest.IProcess</c>.</remarks>
134         public interface IProcess {}
135
136         /// <summary>Process interface</summary>
137         /// <remarks><c>T:Mono.DocTest.DocValueType</c>.</remarks>
138         public struct DocValueType : IProcess {
139                 /// <remarks><c>F:Mono.DocTest.DocValueType.total</c>.</remarks>
140                 public int total;
141
142                 /// <param name="i">A <see cref="T:System.Int32" />.</param>
143                 /// <remarks><see cref="M:Mono.DocTest.DocValueType.M(System.Int32)"/>.</remarks>
144                 public void M (int i)
145                 {
146                         if ((new Random().Next() % 2) == 0)
147                                 throw new SystemException ();
148                         throw new ApplicationException ();
149                 }
150         }
151
152         /// <remarks><c>T:Mono.DocTest.D</c></remarks>
153         public delegate dynamic D (Func<string, dynamic, object> value);
154
155         /// <remarks><c>T:Mono.DocTest.Widget</c>.</remarks>
156         /// <seealso cref="P:Mono.DocTest.Widget.Item(System.Int32)" />
157         /// <extra>Some extra tag value</extra>
158         public unsafe class Widget : IProcess {
159                 /// <remarks><c>T:Mono.DocTest.Widget.NestedClass</c>.</remarks>
160                 public class NestedClass {
161                         /// <remarks><c>F:Mono.DocTest.Widget.NestedClass.value</c>.</remarks>
162                         public int value;
163
164                         /// <param name="i">Some <see cref="T:System.Int32" />.</param>
165                         /// <remarks><c>M:Mono.DocTest.Widget.NestedClass.M(System.Int32)</c>.</remarks>
166                         public void M (int i) {}
167
168                         /// <remarks><c>T:Mono.DocTest.Widget.NestedClass.Double</c>.</remarks>
169                         public class Double {
170                                 /// <remarks><c>T:Mono.DocTest.Widget.NestedClass.Double.Triple</c>.</remarks>
171                                 public class Triple {
172                                         /// <remarks><c>T:Mono.DocTest.Widget.NestedClass.Double.Triple.Quadruple</c>.</remarks>
173                                         public class Quadruple {} // for good measure
174                                 }
175                         }
176                 }
177
178                 /// <remarks><c>T:Mono.DocTest.Widget.NestedClass`1</c>.</remarks>
179                 public class NestedClass<T> {
180                         /// <remarks><c>F:Mono.DocTest.Widget.NestedClass`1.value</c>.</remarks>
181                         public int value;
182
183                         /// <param name="i">Another <see cref="T:System.Int32" />.</param>
184                         /// <remarks><c>M:Mono.DocTest.Widget.NestedClass`1.M(System.Int32)</c>.</remarks>
185                         public void M (int i) {}
186                 }
187
188                 /// <remarks><c>F:Mono.DocTest.Widget.classCtorError</c>.</remarks>
189                 public static readonly string[] classCtorError = CreateArray ();
190
191                 private static string[] CreateArray ()
192                 {
193                         throw new NotSupportedException ();
194                 }
195
196                 /// <remarks><c>F:Mono.DocTest.Widget.message</c>.</remarks>
197                 public string message;
198
199                 /// <remarks><c>F:Mono.DocTest.Widget.defaultColor</c>.</remarks>
200                 protected static Color defaultColor;
201
202                 /// <remarks><c>F:Mono.DocTest.Widget.PI</c>.</remarks>
203                 protected internal const double PI = 3.14159;
204
205                 /// <remarks><c>F:Mono.DocTest.Widget.monthlyAverage</c>.</remarks>
206                 internal protected readonly double monthlyAverage;
207
208                 /// <remarks><c>F:Mono.DocTest.Widget.array1</c>.</remarks>
209                 public long[] array1;
210
211                 /// <remarks><c>F:Mono.DocTest.Widget.array2</c>.</remarks>
212                 public Widget[,] array2;
213
214                 /// <remarks><c>F:Mono.DocTest.Widget.pCount</c>.</remarks>
215                 public unsafe int *pCount;
216
217                 /// <remarks><c>F:Mono.DocTest.Widget.ppValues</c>.</remarks>
218                 public unsafe float **ppValues;
219
220                 /// <remarks><c>T:Mono.DocTest.Widget.IMenuItem</c>.</remarks>
221                 public interface IMenuItem {
222                         /// <remarks><c>M:Mono.DocTest.Widget.IMenuItem.A</c>.</remarks>
223                         void A ();
224
225                         /// <remarks><c>P:Mono.DocTest.Widget.IMenuItem.P</c>.</remarks>
226                         int B {get; set;}
227                 }
228
229                 /// <remarks><c>T:Mono.DocTest.Widget.Del</c>.</remarks>
230                 public delegate void Del (int i);
231
232                 /// <remarks><c>T:Mono.DocTest.Widget.Direction</c>.</remarks>
233                 [Flags]
234                 protected internal enum Direction {
235                         /// <remarks><c>T:Mono.DocTest.Widget.Direction.North</c>.</remarks>
236                         North,
237                         /// <remarks><c>T:Mono.DocTest.Widget.Direction.South</c>.</remarks>
238                         South,
239                         /// <remarks><c>T:Mono.DocTest.Widget.Direction.East</c>.</remarks>
240                         East,
241                         /// <remarks><c>T:Mono.DocTest.Widget.Direction.West</c>.</remarks>
242                         West,
243                 }
244
245                 /// <remarks>
246                 ///  <para><c>C:Mono.DocTest.Widget</c>.</para>
247                 ///  <para><c>M:Mono.DocTest.Widget.#ctor</c>.</para>
248                 ///  <para><see cref="C:Mono.DocTest.Widget(System.String)" /></para>
249                 ///  <para><see cref="C:Mono.DocTest.Widget(System.Converter{System.String,System.String})" /></para>
250                 /// </remarks>
251                 public Widget () {}
252
253                 /// <param name="s">A <see cref="T:System.String" />.</param>
254                 /// <remarks>
255                 ///  <para><c>C:Mono.DocTest.Widget(System.String)</c>.</para>
256                 ///  <para><c>M:Mono.DocTest.Widget.#ctor(System.String)</c>.</para>
257                 /// </remarks>
258                 public Widget (string s) {}
259
260                 /// <param name="c">A <see cref="T:System.Converter{System.String,System.String}" />.</param>
261                 /// <remarks>
262                 ///  <para><c>C:Mono.DocTest.Widget(System.Converter{System.String,System.String})</c>.</para>
263                 /// </remarks>
264                 public Widget (Converter<string,string> c) {}
265
266                 /// <remarks><c>M:Mono.DocTest.Widget.M0</c>.</remarks>
267                 public static void M0 () {}
268
269                 /// <param name="c">A <see cref="T:System.Char" />.</param>
270                 /// <param name="f">A <see cref="T:System.Single" />.</param>
271                 /// <param name="v">A <see cref="T:Mono.DocTest.DocValueType" />.</param>
272                 /// <remarks><c>M:Mono.DocTest.Widget.M1(System.Char,System.Signle@,Mono.DocTest.DocValueType@)</c>.</remarks>
273                 [return:Doc ("return:DocAttribute", Property=typeof(Widget))]
274                 [Doc("normal DocAttribute", Field=true)]
275                 public void M1 ([Doc ("c", FlagsEnum=ConsoleModifiers.Alt | ConsoleModifiers.Control)] char c, 
276                                 [Doc ("f", NonFlagsEnum=Color.Red)] out float f, 
277                                 [Doc ("v")] ref DocValueType v) {f=0;}
278
279                 /// <param name="x1">A <see cref="T:System.Int16" /> array.</param>
280                 /// <param name="x2">A <see cref="T:System.Int32" /> array.</param>
281                 /// <param name="x3">A <see cref="T:System.Int64" /> array.</param>
282                 /// <remarks><c>M:Mono.DocTest.Widget.M2(System.Int16[],System.Int32[0:,0:],System.Int64[][])</c>.</remarks>
283                 public void M2 (short[] x1, int[,] x2, long[][] x3) {}
284
285                 /// <param name="x3">Another <see cref="T:System.Int64" /> array.</param>
286                 /// <param name="x4">A <see cref="T:Mono.DocTest.Widget" /> array.</param>
287                 /// <remarks><c>M:Mono.DocTest.Widget.M3(System.Int64[][],Mono.DocTest.Widget[0:,0:,0:][])</c>.</remarks>
288                 protected void M3 (long[][] x3, Widget[][,,] x4) {}
289
290                 /// <param name="pc">A <see cref="T:System.Char" /> pointer.</param>
291                 /// <param name="ppf">A <see cref="T:Mono.DocTest.Color" /> pointer.</param>
292                 /// <remarks><c>M:Mono.DocTest.Widget.M4(System.Char*,Mono.DocTest.Color**)</c>.</remarks>
293                 protected unsafe void M4 (char *pc, Color **ppf) {}
294
295                 /// <param name="pv">A <see cref="T:System.Void" /> pointer.</param>
296                 /// <param name="pd">A <see cref="T:System.Double" /> array.</param>
297                 /// <remarks><c>M:Mono.DocTest.Widget.M5(System.Void*,System.Double*[0:,0:][])</c>.</remarks>
298                 protected unsafe void M5 (void *pv, double *[][,] pd) {}
299
300                 /// <param name="i">Yet another <see cref="T:System.Int32" />.</param>
301                 /// <param name="args">An <see cref="T:System.Object" /> array.</param>
302                 /// <remarks><c>M:Mono.DocTest.Widget.M6(System.Int32,System.Object[])</c>.</remarks>
303                 protected void M6 (int i, params object[] args) {}
304
305                 /// <remarks><c>M:Mono.DocTest.Widget.M7(Mono.DocTest.Widget.NestedClass.Double.Triple.Quadruple)</c>.</remarks>
306                 public void M7(Widget.NestedClass.Double.Triple.Quadruple a) {}
307
308                 /// <value>A <see cref="T:System.Int32" /> value...</value>
309                 /// <remarks><c>P:Mono.DocTest.Widget.Width</c>.</remarks>
310                 [Doc ("Width property")]
311                 public int Width {
312                         [Doc ("Width get accessor")]
313                         get {return 0;}
314                         [Doc ("Width set accessor")]
315                         protected set {}
316                 }
317
318                 /// <value>A <see cref="T:System.Int64" /> value...</value>
319                 /// <remarks><c>P:Mono.DocTest.Widget.Height</c>.</remarks>
320                 [Doc ("Height property")]
321                 protected long Height {get {return 0;}}
322
323                 /// <value>A <see cref="T:System.Int16" /> value...</value>
324                 /// <remarks><c>P:Mono.DocTest.Widget.X</c>.</remarks>
325                 protected internal short X {set {}}
326
327                 /// <value>A <see cref="T:System.Double" /> value...</value>
328                 /// <remarks><c>P:Mono.DocTest.Widget.Y</c>.</remarks>
329                 internal protected double Y {get {return 0;} set {}}
330
331
332                 /// <param name="i">TODO</param>
333                 /// <remarks><c>P:Mono.DocTest.Widget.Item(System.Int32)</c>.</remarks>
334                 /// <value>A <see cref="T:System.Int32" /> instance.</value>
335                 [Doc ("Item property")]
336                 public int this [int i] {
337                         get {return 0;}
338                         [Doc ("Item property set accessor")]
339                         set {}
340                 }
341
342                 /// <param name="s">Some <see cref="T:System.String" />.</param>
343                 /// <param name="i">I love <see cref="T:System.Int32" />s.</param>
344                 /// <remarks><c>P:Mono.DocTest.Widget.Item(System.String,System.Int32)</c>.</remarks>
345                 /// <value>A <see cref="T:System.Int32" /> instance.</value>
346                 public int this [string s, int i] {get {return 0;} set {}}
347
348                 /// <remarks><c>E:Mono.DocTest.Widget.AnEvent</c>.</remarks>
349                 [Doc ("Del event")]
350                 public event Del AnEvent {
351                         [Doc ("Del add accessor")]
352                         add {}
353                         [Doc ("Del remove accessor")]
354                         remove {}
355                 }
356
357                 /// <remarks><c>E:Mono.DocTest.Widget.AnotherEvent</c>.</remarks>
358                 protected event Del AnotherEvent;
359
360                 /// <param name="x">Another <see cref="T:Mono.DocTest.Widget" />.</param>
361                 /// <remarks><c>M:Mono.DocTest.Widget.op_UnaryPlus(Mono.DocTest.Widget)</c>.</remarks>
362                 /// <returns>A <see cref="T:Mono.DocTest.Widget" /> instance.</returns>
363                 public static Widget operator+ (Widget x) {return null;}
364
365                 /// <param name="x1">Yet Another <see cref="T:Mono.DocTest.Widget" />.</param>
366                 /// <param name="x2">Yay, <see cref="T:Mono.DocTest.Widget" />s.</param>
367                 /// <remarks><c>M:Mono.DocTest.Widget.op_Addition(Mono.DocTest.Widget,Mono.DocTest.Widget)</c>.</remarks>
368                 /// <returns>A <see cref="T:Mono.DocTest.Widget" /> instance (2).</returns>
369                 public static Widget operator+ (Widget x1, Widget x2) {return null;}
370
371                 /// <param name="x"><see cref="T:Mono.DocTest.Widget" />s are fun!.</param>
372                 /// <remarks><c>M:Mono.DocTest.Widget.op_Explicit(Mono.DocTest.Widget)~System.Int32</c>.</remarks>
373                 /// <returns>A <see cref="T:System.Int32" /> instance.</returns>
374                 public static explicit operator int (Widget x) {return 0;}
375
376                 /// <param name="x"><c>foo</c>; <see cref="T:Mono.DocTest.Widget" />.</param>
377                 /// <remarks><c>M:Mono.DocTest.Widget.op_Implicit(Mono.DocTest.Widget)~System.Int64</c>.</remarks>
378                 /// <returns>A <see cref="T:System.Int64" /> instance.</returns>
379                 public static implicit operator long (Widget x) {return 0;}
380
381                 /// <remarks><c>M:Mono.DocTest.Widget.Default(System.Int32,System.Int32)</c></remarks>
382                 public void Default (int a = 1, int b = 2) {}
383
384                 /// <remarks><c>M:Mono.DocTest.Widget.Default(System.String,System.Char)</c></remarks>
385                 public void Default (string a = "a", char b = 'b') {}
386
387                 /// <remarks><c>M:Mono.DocTest.Widget.Dynamic0(System.Object,System.Object)</c></remarks>
388                 public dynamic Dynamic0 (dynamic a, dynamic b) {return a + b;}
389
390                 /// <remarks><c>M:Mono.DocTest.Widget.Dynamic1(System.Collections.Generic.Dictionary{System.Object,System.Object})</c></remarks>
391                 public Dictionary<dynamic, string> Dynamic1 (Dictionary<dynamic, string> value) {return value;}
392
393                 /// <remarks><c>M:Mono.DocTest.Widget.Dynamic2(System.Func{System.String,System.Object})</c></remarks>
394                 public Func<string, dynamic> Dynamic2 (Func<string, dynamic> value) {return value;}
395
396                 /// <remarks><c>M:Mono.DocTest.Widget.Dynamic3(System.Func{System.Func{System.String,System.Object},System.Func{System.Object,System.String}})</c></remarks>
397                 public Func<Func<string, dynamic>, Func<dynamic, string>> Dynamic3 (
398                                 Func<Func<string, dynamic>, Func<dynamic, string>> value) {return value;}
399
400                 /// <remarks><c>P:Mono.DocTest.Widget.DynamicP</c></remarks>
401                 public Func<Func<string, dynamic, string>, Func<dynamic, Func<dynamic>, string>> DynamicP {
402                         get {return null;}
403                 }
404
405                 /// <remarks><c>F:Mono.DocTest.Widget.DynamicF</c></remarks>
406                 public Func<Func<string, dynamic, string>, Func<dynamic, Func<dynamic>, string>> DynamicF;
407
408                 /// <remarks><c>E:Mono.DocTest.Widget.DynamicE1</c></remarks>
409                 [Obsolete ("why not")]
410                 public event Func<dynamic> DynamicE1;
411
412                 /// <remarks><c>E:Mono.DocTest.Widget.DynamicE2</c></remarks>
413                 public event Func<dynamic> DynamicE2 {
414                         add {}
415                         remove {}
416                 }
417         }
418
419         /// <remarks><c>T:Mono.DocTest.UseLists</c>.</remarks>
420         public class UseLists
421         {
422                 /// <param name="list">A <see cref="T:Mono.DocTest.Generic.MyList{System.Int32}" />.</param>
423                 /// <remarks><c>M:Mono.DocTest.UseLists.Process(Mono.DocTest.MyList{System.Int32})</c>.</remarks>
424                 public void Process (Generic.MyList<int> list) {}
425
426                 /// <param name="value">A <c>T</c>.</param>
427                 /// <typeparam name="T">Something</typeparam>
428                 /// <remarks><c>M:Mono.DocTest.UseLists.GetValues``1(``0)</c>.</remarks>
429                 /// <returns>A <see cref="T:Mono.DocTest.Generic.MyList`1" /> instance.</returns>
430                 public Generic.MyList<T> GetValues <T> (T value) where T : struct {return null;}
431
432                 /// <param name="list">Another <see cref="T:Mono.DocTest.Generic.MyList{System.Int32}" />.</param>
433                 /// <remarks>
434                 ///  <para><c>M:Mono.DocTest.UseLists.Process(System.Collections.Generic.List{System.Int32})</c>.</para>
435                 /// <para><see cref="M:System.Collections.Generic.List{System.Int32}.Remove(`0)" /></para>
436                 /// </remarks>
437                 /// <exception invalid="foo">text!</exception>
438                 public void Process (List<int> list)
439                 {
440                         // Bug: only creation is looked for, so this generates an <exception/>
441                         // node:
442                         new Exception ();
443
444                         // Bug? We only look at "static" types, so we can't follow
445                         // delegates/interface calls:
446                         Func<int, int> a = x => {throw new InvalidOperationException ();};
447                         a (1);
448
449                         // Multi-dimensional arrays have "phantom" methods that Cecil can't
450                         // resolve, as they're provided by the runtime.  These should be
451                         // ignored.
452                         int[,] array = new int[1,1];
453                         array[0,0] = 42;
454                 }
455
456                 /// <param name="list">A <see cref="T:Mono.DocTest.Generic.MyList{System.Predicate{System.Int32}}" />.</param>
457                 /// <remarks><c>M:Mono.DocTest.UseLists.Process(System.Collections.Generic.List{System.Predicate{System.Int32}})</c>.</remarks>
458                 public void Process (List<Predicate<int>> list)
459                 {
460                         if (list == null)
461                                 throw new ArgumentNullException ("list");
462                         Process<int> (list);
463                 }
464
465                 /// <param name="list">A <see cref="T:Mono.DocTest.Generic.MyList{System.Predicate{``0}}" />.</param>
466                 /// <typeparam name="T">Something Else</typeparam>
467                 /// <remarks><c>M:Mono.DocTest.UseLists.Process``1(System.Collections.Generic.List{System.Predicate{``0}})</c>.</remarks>
468                 public void Process<T> (List<Predicate<T>> list)
469                 {
470                         if (list.Any (p => p == null))
471                                 throw new ArgumentException ("predicate null");
472                 }
473
474                 /// <param name="helper">A <see cref="T:Mono.DocTest.Generic.MyList{``0}.Helper{``1,``2}" />.</param>
475                 /// <typeparam name="T"><c>T</c></typeparam>
476                 /// <typeparam name="U"><c>U</c></typeparam>
477                 /// <typeparam name="V"><c>V</c></typeparam>
478                 /// <remarks><c>M:Mono.DocTest.UseLists.UseHelper``3(Mono.DocTest.Generic.MyList{``0}.Helper{``1,``2})</c>.</remarks>
479                 public void UseHelper<T,U,V> (Generic.MyList<T>.Helper<U,V> helper) {}
480         }
481 }
482
483 namespace Mono.DocTest.Generic {
484         // Need to place this into a separate namespace to work around gmcs bug
485         // where XML docs for type *following* this one aren't extracted.
486
487         /// <typeparam name="TArg">argument type, with attributes!</typeparam>
488         /// <typeparam name="TRet">return type, with attributes!</typeparam>
489         /// <remarks><c>T:Mono.DocTest.Generic.Func`2</c>.</remarks>
490         [Doc ("method")]
491         [return:Doc ("return", Field=false)]
492         public delegate TRet Func<[Doc ("arg!")] in TArg, [Doc ("ret!")] out TRet> (
493                         [Doc ("arg-actual")] TArg a
494         ) where TArg : Exception;
495 }
496
497 namespace Mono.DocTest.Generic {
498         using Mono.DocTest;
499
500         /// <summary>extension methods!</summary>
501         /// <remarks><c>T:Mono.DocTest.Generic.Extensions</c></remarks>
502         public static class Extensions {
503                 /// <summary><c>System.Object</c> extension method</summary>
504                 /// <remarks><c>M:Mono.DocTest.Generic.Extensions.ToEnumerable``1</c></remarks>
505                 public static IEnumerable<T> ToEnumerable<T> (this T self)
506                 {
507                         yield return self;
508                 }
509
510                 /// <summary><see cref="T:System.Collections.Generic.IEnumerable`1" /> extension method</summary>
511                 /// <remarks><c>M:Mono.DocTest.Generic.Extensions.ForEach``1</c></remarks>
512                 public static void ForEach<T> (this IEnumerable<T> self, Action<T> a)
513                 {
514                 }
515
516                 /// <summary><see cref="T:Mono.DocTest.Generic.IFoo`1" /> extension method</summary>
517                 /// <remarks><c>M:Mono.DocTest.Generic.Extensions.Bar``1</c></remarks>
518                 public static void Bar <T> (this IFoo<T> self, string s)
519                 {
520                 }
521
522                 /// <summary>
523                 ///   <see cref="T:System.Collections.Generic.IEnumerable{System.Int32}" /> 
524                 ///   extension method.
525                 /// </summary>
526                 /// <remarks><c>M:Mono.DocTest.Generic.Extensions.ToDouble</c></remarks>
527                 public static IEnumerable<double> ToDouble (this IEnumerable<int> list)
528                 {
529                         return null;
530                 }
531
532                 /// <summary>
533                 ///   <see cref="T:Mono.DocTest.Generic.IFoo`1" /> extension method.
534                 /// </summary>
535                 /// <remarks><c>M:Mono.DocTest.Generic.Extensions.ToDouble</c></remarks>
536                 public static double ToDouble<T> (this T val) where T : IFoo<T>
537                 {
538                         // the target type is T:...IFoo<T>, NOT T:System.Object.
539                         return 0.0;
540                 }
541         }
542
543         /// <typeparam name="U">Insert <c>text</c> here.</typeparam>
544         /// <remarks><c>T:Mono.DocTest.Generic.GenericBase`1</c>.</remarks>
545         public class GenericBase<U> {
546         
547                 /// <param name="genericParameter">Something</param>
548                 /// <typeparam name="S">Insert more <c>text</c> here.</typeparam>
549                 /// <remarks><c>M:Mono.DocTest.GenericBase`1.BaseMethod``1(``0)</c>.</remarks>
550                 /// <returns>The default value.</returns>
551                 public U BaseMethod<[Doc ("S")] S> (S genericParameter) {
552                         return default(U);
553                 }
554
555                 /// <remarks><c>F:Mono.DocTest.GenericBase`1.StaticField1</c></remarks>
556                 public static readonly GenericBase<U> StaticField1 = new GenericBase<U> ();
557
558                 /// <remarks><c>F:Mono.DocTest.GenericBase`1.ConstField1</c></remarks>
559                 public const int ConstField1 = 1;
560
561                 /// <param name="list">Insert description here</param>
562                 /// <remarks><c>M:Mono.DocTest.GenericBase`1.op_Explicit(Mono.DocTest.GenericBase{`0})~`0</c></remarks>
563                 /// <returns>The default value for <typeparamref name="U"/>.</returns>
564                 public static explicit operator U (GenericBase<U> list) {return default(U);}
565
566                 /// <remarks>T:Mono.DocTest.Generic.GenericBase`1.FooEventArgs</remarks>
567                 public class FooEventArgs : EventArgs {
568                 }
569
570                 /// <remarks>E:Mono.DocTest.Generic.GenericBase`1.MyEvent</remarks>
571                 public event EventHandler<FooEventArgs> MyEvent;
572
573                 /// <remarks>E:Mono.DocTest.Generic.GenericBase`1.ItemChanged</remarks>
574                 public event Action<MyList<U>, MyList<U>.Helper<U, U>> ItemChanged;
575
576                 /// <remarks>T:Mono.DocTest.Generic.GenericBase`1.NestedCollection</remarks>
577                 public class NestedCollection {
578                         /// <remarks>T:Mono.DocTest.Generic.GenericBase`1.NestedCollection.Enumerator</remarks>
579                         protected internal struct Enumerator {
580                         }
581                 }
582         }
583         
584         /// <typeparam name="T">I'm Dying Here!</typeparam>
585         /// <remarks><c>T:Mono.DocTest.Generic.MyList`1</c>.</remarks>
586         public class MyList<[Mono.DocTest.Doc("Type Parameter!")] T> : GenericBase <T>, IEnumerable<int[]>
587         {
588                 /// <typeparam name="U">Seriously!</typeparam>
589                 /// <typeparam name="V">Too <c>many</c> docs!</typeparam>
590                 /// <remarks><c>T:Mono.DocTest.MyList`1.Helper`2</c>.</remarks>
591                 public class Helper <U, V> {
592                         /// <param name="a">Ako</param>
593                         /// <param name="b">bko</param>
594                         /// <param name="c">cko</param>
595                         /// <remarks><c>M:Mono.DocTest.MyList`1.Helper`2.UseT(`0,`1,`2)</c>.</remarks>
596                         public void UseT(T a, U b, V c) { }
597                 }
598
599                 /// <param name="t">tko</param>
600                 /// <remarks><c>M:Mono.DocTest.MyList`1.Test(`0)</c>.</remarks>
601                 public void Test (T t) {}
602
603                 /// <param name="t">Class generic type</param>
604                 /// <param name="u">Method generic type</param>
605                 /// <typeparam name="U">Method generic parameter</typeparam>
606                 /// <remarks><c>M:Mono.DocTest.MyList`1.Method``1(`0,``0)</c>.</remarks>
607                 public void Method <U> (T t, U u) {}
608
609                 // mcs "crashes" (CS1569) on this method; exclude it for now.
610                 // <remarks><c>M:Mono.DocTest.MyList`1.RefMethod``1(`0@,``0@)</c>.</remarks>
611                 public void RefMethod<U> (ref T t, ref U u) {}
612
613                 /// <param name="helper">A <see cref="T:Mono.DocTest.Generic.MyList`1.Helper`2" />.</param>
614                 /// <typeparam name="U">Argh!</typeparam>
615                 /// <typeparam name="V">Foo Argh!</typeparam>
616                 /// <remarks><c>M:Mono.DocTest.Generic.MyList`1.UseHelper``2(Mono.DocTest.Generic.MyList{``0}.Helper{``1,``2})</c>.</remarks>
617                 public void UseHelper<U,V> (Helper<U,V> helper) {}
618
619                 /// <remarks><c>M:Mono.DocTest.Generic.MyList`1.GetHelper``2</c>.</remarks>
620                 /// <returns><see langword="null" />.</returns>
621                 public Helper<U,V> GetHelper<U,V> () {return null;}
622
623                 /// <remarks><c>M:Mono.DocTest.MyList`1.System#Collections#GetEnumerator</c>.</remarks>
624                 IEnumerator IEnumerable.GetEnumerator () {return null;}
625
626                 /// <remarks><c>M:Mono.DocTest.MyList`1.GetEnumerator</c>.</remarks>
627                 public IEnumerator<int[]> GetEnumerator () {return null;}
628         }
629
630         /// <typeparam name="T">T generic param</typeparam>
631         /// <remarks><c>T:Mono.DocTest.IFoo`1</c>.</remarks>
632         public interface IFoo<T> {
633                 /// <typeparam name="U">U generic param</typeparam>
634                 /// <remarks><c>T:Mono.DocTest.IFoo`1.Method``1(`0,``0)</c>.</remarks>
635                 T Method <U> (T t, U u);
636         }
637
638         /// <typeparam name="A">Ako generic param</typeparam>
639         /// <typeparam name="B">Bko generic param</typeparam>
640         /// <remarks><c>T:Mono.DocTest.MyList`2</c>.</remarks>
641         public class MyList<A,B> : GenericBase<Dictionary<A,B>>, IEnumerable<A>, 
642                                  IEnumerator<A>, ICollection<A>, IFoo<A>
643                 where A : class, IList<B>, new()
644                 where B : class, A
645         {
646                 // IEnumerator
647
648                 // shown?
649                 object IEnumerator.Current {get {return null;}}
650
651                 /// <remarks><c>M:Mono.DocTest.MyList`2.MoveNext</c>.</remarks>
652                 /// <returns><see cref="T:System.Boolean" /></returns>
653                 public bool MoveNext () {return false;}
654
655                 /// <remarks><c>M:Mono.DocTest.MyList`2.Reset</c>.</remarks>
656                 public void Reset () {}
657
658                 // IDisposable
659                 /// <remarks><c>M:Mono.DocTest.MyList`2.Dispose</c>.</remarks>
660                 public void Dispose () {}
661
662                 // IEnumerator<T>
663                 /// <remarks><c>P:Mono.DocTest.MyList`2.Current</c>.</remarks>
664                 /// <value>The current value.</value>
665                 public A Current {get {return default(A);}}
666                 /// <remarks><c>P:Mono.DocTest.MyList`2.Current</c>.</remarks>
667                 /// <value>The current value.</value>
668                 A IEnumerator<A>.Current {get {return default(A);}}
669
670                 // IEnumerable
671                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#GetEnumerator</c>.</remarks>
672                 IEnumerator IEnumerable.GetEnumerator () {return this;}
673
674                 // IEnumerable<T>
675                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#Generic#IEnumerable{A}#GetEnumerator</c>.</remarks>
676                 /// <returns>A <see cref="T:System.Collections.Generic.IEnumerator{`0}" />.</returns>
677                 IEnumerator<A> IEnumerable<A>.GetEnumerator () {return this;}
678                 /// <remarks><c>M:Mono.DocTest.MyList`2.GetEnumerator</c>.</remarks>
679                 /// <returns>A <see cref="T:System.Collections.Generic.List{`0}.Enumerator" />.</returns>
680                 public List<A>.Enumerator GetEnumerator () {return new List<A>.Enumerator ();}
681
682                 // ICollection<T>
683                 /// <remarks><c>P:Mono.DocTest.MyList`2.Count</c>.</remarks>
684                 /// <value>A <see cref="T:System.Int32" />.</value>
685                 public int Count {get {return 0;}}
686                 /// <remarks><c>P:Mono.DocTest.MyList`2.System#Collections#Generic#ICollection{A}#IsReadOnly</c>.</remarks>
687                 /// <value>A <see cref="T:System.Boolean" />.</value>
688                 bool ICollection<A>.IsReadOnly {get {return false;}}
689                 /// <param name="item">The item to add.</param>
690                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#Generic#ICollection{A}#Add(`0)</c>.</remarks>
691                 void ICollection<A>.Add (A item) {}
692                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#Generic#ICollection{A}#Clear</c>.</remarks>
693                 void ICollection<A>.Clear () {}
694                 /// <param name="item">The item to check for</param>
695                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#Generic#ICollection{A}.Contains(`0)</c>.</remarks>
696                 /// <returns>A <see cref="T:System.Boolean" /> instance (<see langword="false" />).</returns>
697                 bool ICollection<A>.Contains (A item) {return false;}
698                 /// <param name="array">Where to copy elements to</param>
699                 /// <param name="arrayIndex">Where to start copyingto</param>
700                 /// <remarks><c>M:Mono.DocTest.MyList`2.CopyTo(`0[],System.Int32)</c>.</remarks>
701                 public void CopyTo (A[] array, int arrayIndex) {}
702                 /// <param name="item">the item to remove</param>
703                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#Generic#ICollection{A}#Remove(`0)</c>.</remarks>
704                 /// <returns>Whether the item was removed.</returns>
705                 bool ICollection<A>.Remove (A item) {return false;}
706
707                 /// <remarks>M:Mono.DocTest.Generic.MyList`2.Foo</remarks>
708                 public KeyValuePair<IEnumerable<A>, IEnumerable<B>> Foo ()
709                 {
710                         return new KeyValuePair<IEnumerable<A>, IEnumerable<B>> ();
711                 }
712
713                 // IFoo members
714                 /// <typeparam name="U">U generic param on MyList`2</typeparam>
715                 /// <remarks><c>M:Mono.DocTest.Generic.MyList`2.Mono#DocTest#Generic#IFoo{A}#Method``1(`0,``0)</c>.</remarks>
716                 A IFoo<A>.Method <U> (A a, U u)
717                 {
718                         return default (A);
719                 }
720         }
721 }
722