4 using System.Collections.Generic;
11 namespace MonoTests.Monodoc.Ecma
14 public class EcmaUrlTests
21 parser = new EcmaUrlParser ();
24 void AssertValidUrl (string url)
29 Assert.Fail (string.Format ("URL '{0}' deemed not valid", url));
33 void AssertInvalidUrl (string url)
40 Assert.Fail (string.Format ("URL '{0}' deemed valid", url));
43 void AssertUrlDesc (EcmaDesc expected, string url)
45 EcmaDesc actual = null;
47 actual = parser.Parse (url);
48 } catch (Exception e) {
49 Assert.Fail (string.Format ("URL '{0}' deemed not valid: {1}{2}", url, Environment.NewLine, e.ToString ()));
52 Assert.AreEqual (expected, actual, "Converted URL differs");
55 void AssertEcmaString (string expected, EcmaDesc actual)
57 string actualString = actual.ToEcmaCref ();
58 Assert.AreEqual (expected, actualString);
61 IEnumerable<EcmaDesc> GenericTypeArgumentsList (params string[] parameters)
63 foreach (var p in parameters)
64 yield return new EcmaDesc {
65 DescKind = EcmaDesc.Kind.Type,
67 Namespace = string.Empty
72 public void CommonMethodUrlIsValidTest ()
74 AssertValidUrl ("M:System.String.FooBar()");
75 AssertValidUrl ("M:System.String.FooBar(System.String, Int32)");
76 AssertValidUrl ("M:System.Foo.Int32<System.String+FooBar<System.Blop<T, U`2>>>.Foo()");
77 AssertValidUrl ("M:System.Foo.Int32<System.String+FooBar<System.Blop<T, U`2>>>.Foo(Bleh,Bar)");
78 AssertValidUrl ("M:System.Foo.Int32<System.String+FooBar<System.Blop<T, U`2>>>.Foo(Bleh<V>,Bar)");
79 AssertValidUrl ("M:Gendarme.Framework.Helpers.Log.WriteLine(string,string,object[])");
80 AssertValidUrl ("M:Mono.Security.X509.Extensions.SubjectKeyIdentifierExtension.Decode");
81 AssertValidUrl ("M:Mono.Security.PKCS7.IssuerAndSerialNumber");
85 public void CommonTypeUrlIsValidTest ()
87 AssertValidUrl ("T:Int32");
88 AssertValidUrl ("T:System.Foo.Int32");
89 AssertValidUrl ("T:System.Foo.Int32<System.String+FooBar`1>");
90 AssertValidUrl ("T:System.Foo.Int32<System.String+FooBar<System.Blop<T, U>>>");
91 AssertValidUrl ("T:System.Foo.Int32<T>");
92 AssertValidUrl ("T:System.Foo.Int32<T,U>");
93 AssertValidUrl ("T:System.Foo.Int32<System.String+FooBar<System.Blop<T, U>>>");
94 AssertValidUrl ("T:System.Foo.Int32<System.String+FooBar<System.Blop<T, U`2>>>");
98 public void CommonTypeUrlNotValidTest ()
100 AssertInvalidUrl ("TInt32");
101 AssertInvalidUrl ("K:Int32");
102 AssertInvalidUrl ("T:System..Foo.Int32");
103 AssertInvalidUrl ("T:System.Foo.Int32<System.String+FooBar`1");
104 AssertInvalidUrl ("T:System.Foo.Int32<System.String+FooBarSystem.Blop<T, U>>>");
105 AssertInvalidUrl ("T:System.Foo.Int32<T,>");
106 AssertInvalidUrl ("T:System.Foo.Int32<+FooBar<System.Blop<T, U>>>");
110 public void NamespaceValidTest ()
112 AssertValidUrl ("N:Foo.Bar");
113 AssertValidUrl ("N:Foo");
114 AssertValidUrl ("N:Foo.Bar.Baz");
115 AssertValidUrl ("N:A.B.C");
117 var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Namespace,
118 Namespace = "Foo.Bar.Blop" };
119 AssertUrlDesc (ast, "N:Foo.Bar.Blop");
123 public void ConstructorValidTest ()
125 AssertValidUrl ("C:Gendarme.Rules.Concurrency.DecorateThreadsRule.DecorateThreadsRule");
126 AssertValidUrl ("C:Gendarme.Rules.Concurrency.DecorateThreadsRule.DecorateThreadsRule()");
127 AssertValidUrl ("C:Gendarme.Rules.Concurrency.DecorateThreadsRule.DecorateThreadsRule(System.String)");
128 AssertValidUrl ("C:Gendarme.Framework.Helpers.MethodSignature.MethodSignature(string,string,string[],System.Func<Mono.Cecil.MethodReference,System.Boolean>)");
129 AssertValidUrl ("C:System.Collections.Generic.Dictionary<TKey,TValue>+KeyCollection.KeyCollection(System.Collections.Generic.Dictionary<TKey,TValue>)");
130 AssertValidUrl ("C:Microsoft.Build.Utilities.TaskItem(System.String,System.Collections.IDictionary)");
134 public void SlashExpressionValidTest ()
136 AssertValidUrl ("T:Foo.Bar.Type/*");
137 AssertValidUrl ("T:Foo.Bar.Type/M");
138 AssertValidUrl ("T:Gendarme.Framework.Bitmask<T>/M/Equals");
139 AssertValidUrl ("T:Gendarme.Framework.Helpers.Log/M/WriteLine<T>");
140 AssertValidUrl ("T:System.Windows.Forms.AxHost/M/System.ComponentModel.ICustomTypeDescriptor.GetEvents");
144 public void MethodWithArgModValidTest ()
146 AssertValidUrl ("M:Foo.Bar.FooBar(int, System.Drawing.Imaging&)");
147 AssertValidUrl ("M:Foo.Bar.FooBar(int@, System.Drawing.Imaging)");
148 AssertValidUrl ("M:Foo.Bar.FooBar(int, System.Drawing.Imaging*)");
149 AssertValidUrl ("M:Foo.Bar.FooBar(int*, System.Drawing.Imaging&)");
150 AssertValidUrl ("M:Atk.NoOpObject.GetRunAttributes(int,int&,int&)");
154 public void MethodWithJaggedArrayArgsValidTest ()
156 AssertValidUrl ("M:System.Reflection.Emit.SignatureHelper.GetPropertySigHelper(System.Reflection.Module,System.Reflection.CallingConventions,Type,Type[],Type[],Type[],Type[][],Type[][])");
160 public void MethodWithInnerTypeValidTest ()
162 AssertValidUrl ("M:System.TimeZoneInfo+AdjustmentRule.CreateAdjustmentRule");
166 public void FieldValidTest ()
168 AssertValidUrl ("F:Mono.Terminal.Curses.KeyF10");
169 AssertValidUrl ("F:Novell.Directory.Ldap.Utilclass.ExceptionMessages.NOT_IMPLEMENTED");
170 AssertValidUrl ("F:Novell.Directory.Ldap.LdapException.NOT_ALLOWED_ON_NONLEAF");
174 public void PropertyValidTest ()
176 AssertValidUrl ("P:System.Foo.Bar");
177 AssertValidUrl ("P:System.ArraySegment<T>.Array");
181 public void IndexPropertyValidTest ()
183 AssertValidUrl ("P:System.ComponentModel.PropertyDescriptorCollection.Item(int)");
184 AssertValidUrl ("P:System.ComponentModel.AttributeCollection.Item(Type)");
185 AssertValidUrl ("P:System.Web.SessionState.HttpSessionStateContainer$System.Web.SessionState.IHttpSessionState.Item(System.Int32)");
186 AssertValidUrl ("P:System.Collections.Specialized.BitVector32.Item(System.Collections.Specialized.BitVector32+Section)");
190 public void ExplicitMethodImplValidTest ()
192 AssertValidUrl ("M:Microsoft.Win32.RegistryKey$System.IDisposable.Dispose");
196 public void AspNetSafeUrlValidTest ()
198 AssertValidUrl ("M:MonoTouch.UIKit.UICollectionViewLayoutAttributes.CreateForCell{T}");
202 public void GenericTypeArgsIsNumericTest ()
204 var desc = parser.Parse ("T:System.Collections.Generic.Dictionary`2");
205 Assert.IsTrue (desc.GenericTypeArgumentsIsNumeric);
206 Assert.AreEqual (2, desc.GenericTypeArguments.Count);
207 desc = parser.Parse ("T:System.Collections.Generic.Dictionary<TKey,TValue>");
208 Assert.IsFalse (desc.GenericTypeArgumentsIsNumeric);
212 public void GenericTypeArgsNumericToStringTest ()
214 string stringCref = "T:System.Collections.Generic.Dictionary`2";
215 var desc = parser.Parse (stringCref);
216 Assert.IsTrue (desc.GenericTypeArgumentsIsNumeric);
217 Assert.AreEqual (2, desc.GenericTypeArguments.Count);
218 string generatedEcmaCref = desc.ToEcmaCref ();
219 Assert.AreEqual (stringCref, generatedEcmaCref);
223 public void MetaEtcNodeTest ()
225 var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
226 Namespace = "Foo.Bar",
229 AssertUrlDesc (ast, "T:Foo.Bar.Type/*");
233 public void MetaEtcWithInnerTypeTest ()
235 var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
236 Namespace = "Novell.Directory.Ldap",
237 TypeName = "Connection",
238 NestedType = new EcmaDesc { DescKind = EcmaDesc.Kind.Type, TypeName = "ReaderThread" },
240 AssertUrlDesc (ast, "T:Novell.Directory.Ldap.Connection+ReaderThread/*");
244 public void SimpleTypeUrlParseTest ()
246 var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
248 Namespace = "System" };
249 AssertUrlDesc (ast, "T:System.String");
253 public void TypeWithOneGenericUrlParseTest ()
255 var generics = new[] {
257 DescKind = EcmaDesc.Kind.Type,
258 Namespace = string.Empty,
262 var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
264 Namespace = "System",
265 GenericTypeArguments = generics,
268 AssertUrlDesc (ast, "T:System.String<T>");
272 public void TypeWithOneGenericUrlParseTestUsingAspNetStyleUrl ()
274 var generics = new[] {
276 DescKind = EcmaDesc.Kind.Type,
277 Namespace = string.Empty,
281 var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
283 Namespace = "System",
284 GenericTypeArguments = generics,
287 AssertUrlDesc (ast, "T:System.String{T}");
291 public void TypeWithNestedGenericUrlParseTest ()
293 var generics = new[] {
295 DescKind = EcmaDesc.Kind.Type,
297 Namespace = string.Empty
300 DescKind = EcmaDesc.Kind.Type,
301 Namespace = "System.Collections.Generic",
303 GenericTypeArguments = new[] {
305 DescKind = EcmaDesc.Kind.Type,
307 Namespace = string.Empty
312 var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
314 Namespace = "System",
315 GenericTypeArguments = generics,
318 AssertUrlDesc (ast, "T:System.String<T, System.Collections.Generic.List<V>>");
322 public void SimpleMethodUrlParseTest ()
324 var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Method,
326 Namespace = "System",
327 MemberName = "FooBar"
329 AssertUrlDesc (ast, "M:System.String.FooBar()");
333 public void MethodWithArgsUrlParseTest ()
337 DescKind = EcmaDesc.Kind.Type,
338 Namespace = "System",
342 DescKind = EcmaDesc.Kind.Type,
344 Namespace = string.Empty
347 var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Method,
349 Namespace = "System",
350 MemberName = "FooBar",
351 MemberArguments = args
353 AssertUrlDesc (ast, "M:System.String.FooBar(System.String, Int32)");
357 public void MethodWithArgsAndGenericsUrlParseTest ()
361 DescKind = EcmaDesc.Kind.Type,
362 Namespace = "System",
366 DescKind = EcmaDesc.Kind.Type,
367 Namespace = "System.Collections.Generic",
368 TypeName = "Dictionary",
369 GenericTypeArguments = new[] {
371 DescKind = EcmaDesc.Kind.Type,
373 Namespace = string.Empty
376 DescKind = EcmaDesc.Kind.Type,
378 Namespace = string.Empty
384 var generics = new[] {
386 DescKind = EcmaDesc.Kind.Type,
388 Namespace = string.Empty,
389 GenericTypeArguments = new[] {
391 DescKind = EcmaDesc.Kind.Type,
392 Namespace = "System",
396 DescKind = EcmaDesc.Kind.Type,
398 Namespace = string.Empty
404 var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Method,
406 Namespace = "System",
407 MemberName = "FooBar",
408 MemberArguments = args,
409 GenericMemberArguments = generics
411 AssertUrlDesc (ast, "M:System.String.FooBar<Action<System.Single, int>>(System.String, System.Collections.Generic.Dictionary<K, V>)");
415 public void ExplicitMethodImplementationParseTest ()
417 var inner = new EcmaDesc {
418 MemberName = "Dispose",
419 TypeName = "IDisposable",
422 var ast = new EcmaDesc {
423 DescKind = EcmaDesc.Kind.Method,
424 TypeName = "RegistryKey",
425 Namespace = "Microsoft.Win32",
426 ExplicitImplMember = inner
428 AssertUrlDesc (ast, "M:Microsoft.Win32.RegistryKey$System.IDisposable.Dispose");
432 public void SimpleMethodWithNumberInType ()
434 var ast = new EcmaDesc {
435 DescKind = EcmaDesc.Kind.Method,
437 Namespace = "Mono.Security",
440 AssertUrlDesc (ast, "M:Mono.Security.ASN1.Add");
444 public void JaggedArrayWithDimensions ()
446 var ast = new EcmaDesc {
447 DescKind = EcmaDesc.Kind.Type,
449 Namespace = "System",
450 ArrayDimensions = new int[] { 3, 1, 1 }
452 AssertUrlDesc (ast, "T:System.Int32[,,][][]");
456 public void ExplicitIndexerImplementation ()
458 var explicitImpl = new EcmaDesc {
459 Namespace = "System.Web.SessionState",
460 TypeName = "IHttpSessionState",
462 MemberArguments = new [] { new EcmaDesc { DescKind = EcmaDesc.Kind.Type, Namespace = "System", TypeName = "Int32" } },
464 var ast = new EcmaDesc {
465 DescKind = EcmaDesc.Kind.Property,
466 TypeName = "HttpSessionStateContainer",
467 Namespace = "System.Web.SessionState",
468 ExplicitImplMember = explicitImpl,
470 AssertUrlDesc (ast, "P:System.Web.SessionState.HttpSessionStateContainer$System.Web.SessionState.IHttpSessionState.Item(System.Int32)");
474 public void ToEcmaCref_Namespace ()
476 var actual = new EcmaDesc {
477 DescKind = EcmaDesc.Kind.Namespace,
478 Namespace = "System.IO",
481 AssertEcmaString ("N:System.IO", actual);
485 public void ToEcmaCref_SimpleType ()
487 var actual = new EcmaDesc {
488 DescKind = EcmaDesc.Kind.Type,
489 Namespace = "System.IO",
493 AssertEcmaString ("T:System.IO.Path", actual);
497 public void ToEcmaCref_NestedType ()
499 var actual = new EcmaDesc {
500 DescKind = EcmaDesc.Kind.Type,
501 Namespace = "System.IO",
503 NestedType = new EcmaDesc {
504 DescKind = EcmaDesc.Kind.Type,
505 TypeName = "TheNestedType",
509 AssertEcmaString ("T:System.IO.Path+TheNestedType", actual);
513 public void ToEcmaCref_NestedType_FourDeep ()
515 var actual = new EcmaDesc {
516 DescKind = EcmaDesc.Kind.Type,
518 TypeName = "DocTest",
519 NestedType = new EcmaDesc {
520 DescKind = EcmaDesc.Kind.Type,
521 TypeName = "NestedClass",
522 NestedType = new EcmaDesc {
523 DescKind = EcmaDesc.Kind.Type,
525 NestedType = new EcmaDesc {
526 DescKind = EcmaDesc.Kind.Type,
528 NestedType = new EcmaDesc {
529 DescKind = EcmaDesc.Kind.Type,
530 TypeName = "Quadruple",
537 string targetUrl = "T:Mono.DocTest+NestedClass+Double+Triple+Quadruple";
538 AssertEcmaString (targetUrl, actual);
539 AssertUrlDesc (actual, targetUrl);
543 public void ToEcmaCref_NestedType_Field ()
545 var actual = new EcmaDesc {
546 DescKind = EcmaDesc.Kind.Field,
547 Namespace = "System.IO",
549 NestedType = new EcmaDesc {
550 DescKind = EcmaDesc.Kind.Type,
551 TypeName = "TheNestedType",
553 MemberName = "NestedField"
556 AssertEcmaString ("F:System.IO.Path+TheNestedType.NestedField", actual);
560 public void ToEcmaCref_SimpleType_WithGenerics ()
562 var actual = new EcmaDesc {
563 DescKind = EcmaDesc.Kind.Type,
564 Namespace = "System.IO",
566 GenericTypeArguments = GenericTypeArgumentsList ("K").ToArray ()
569 AssertEcmaString ("T:System.IO.Path<K>", actual);
573 public void ToEcmaCref_Nestedype_WithGenerics ()
575 var actual = new EcmaDesc {
576 DescKind = EcmaDesc.Kind.Type,
577 Namespace = "System.IO",
579 NestedType = new EcmaDesc {
580 DescKind = EcmaDesc.Kind.Type,
581 TypeName = "TheNestedType",
583 GenericTypeArguments = GenericTypeArgumentsList ("K").ToArray ()
586 AssertEcmaString ("T:System.IO.Path<K>+TheNestedType", actual);
590 public void ToEcmaCref_Nestedype_WithGenericsOnBoth ()
592 var actual = new EcmaDesc {
593 DescKind = EcmaDesc.Kind.Type,
594 Namespace = "System.IO",
596 NestedType = new EcmaDesc {
597 DescKind = EcmaDesc.Kind.Type,
598 TypeName = "TheNestedType",
599 GenericTypeArguments = GenericTypeArgumentsList ("T", "V").ToArray (),
601 GenericTypeArguments = GenericTypeArgumentsList ("K").ToArray ()
604 AssertEcmaString ("T:System.IO.Path<K>+TheNestedType<T,V>", actual);
608 public void ToEcmaCref_Nestedype_Property_WithGenericsOnBoth ()
610 var actual = new EcmaDesc {
611 DescKind = EcmaDesc.Kind.Property,
612 Namespace = "System.IO",
614 NestedType = new EcmaDesc {
615 DescKind = EcmaDesc.Kind.Type,
616 TypeName = "TheNestedType",
617 GenericTypeArguments = GenericTypeArgumentsList ("T", "V").ToArray (),
619 GenericTypeArguments = GenericTypeArgumentsList ("K").ToArray (),
620 MemberName = "TheProperty"
623 AssertEcmaString ("P:System.IO.Path<K>+TheNestedType<T,V>.TheProperty", actual);
627 public void ToEcmaCref_Field ()
629 var actual = new EcmaDesc {
630 DescKind = EcmaDesc.Kind.Field,
631 Namespace = "System.IO",
633 MemberName = "TheField"
636 AssertEcmaString ("F:System.IO.Path.TheField", actual);
640 public void ToEcmaCref_ExplicitlyImplemented_Field ()
642 var explicitImpl = new EcmaDesc {
643 Namespace = "System.Web.SessionState",
644 TypeName = "IHttpSessionState",
647 var actual = new EcmaDesc {
648 DescKind = EcmaDesc.Kind.Field,
649 TypeName = "HttpSessionStateContainer",
650 Namespace = "System.Web.SessionState",
651 ExplicitImplMember = explicitImpl,
653 AssertEcmaString ("F:System.Web.SessionState.HttpSessionStateContainer$System.Web.SessionState.IHttpSessionState.Item", actual);
657 public void ToEcmaCref_Property ()
659 var actual = new EcmaDesc {
660 DescKind = EcmaDesc.Kind.Property,
661 Namespace = "System.IO",
663 MemberName = "TheProperty",
666 AssertEcmaString ("P:System.IO.Path.TheProperty", actual);
670 public void ToEcmaCref_ExplicitlyImplemented_Property ()
672 var explicitImpl = new EcmaDesc {
673 Namespace = "System.Web.SessionState",
674 TypeName = "IHttpSessionState",
677 var actual = new EcmaDesc {
678 DescKind = EcmaDesc.Kind.Property,
679 TypeName = "HttpSessionStateContainer",
680 Namespace = "System.Web.SessionState",
681 ExplicitImplMember = explicitImpl,
683 AssertEcmaString ("P:System.Web.SessionState.HttpSessionStateContainer$System.Web.SessionState.IHttpSessionState.Item", actual);
687 public void ToEcmaCref_ExplicitlyImplemented_Method ()
689 var explicitImpl = new EcmaDesc {
690 Namespace = "System.Web.SessionState",
691 TypeName = "IHttpSessionState",
693 MemberArguments = new [] {
695 DescKind = EcmaDesc.Kind.Type,
696 Namespace = "System",
701 var actual = new EcmaDesc {
702 DescKind = EcmaDesc.Kind.Method,
703 TypeName = "HttpSessionStateContainer",
704 Namespace = "System.Web.SessionState",
705 ExplicitImplMember = explicitImpl,
707 AssertEcmaString ("M:System.Web.SessionState.HttpSessionStateContainer$System.Web.SessionState.IHttpSessionState.Item(System.Int32)", actual);
711 public void ToEcmaCref_Event ()
713 var actual = new EcmaDesc {
714 DescKind = EcmaDesc.Kind.Event,
715 Namespace = "System.IO",
717 MemberName = "TheEvent",
720 AssertEcmaString ("E:System.IO.Path.TheEvent", actual);
724 public void ToEcmaCref_Operator ()
726 var actual = new EcmaDesc {
727 DescKind = EcmaDesc.Kind.Operator,
728 Namespace = "System",
730 MemberName = "Addition",
733 AssertEcmaString ("O:System.Int32.Addition", actual);
737 public void ToEcmaCref_Operator_Conversion ()
739 var actual = new EcmaDesc {
740 DescKind = EcmaDesc.Kind.Operator,
741 Namespace = "System",
743 MemberName = "ExplicitConversion",
744 MemberArguments = new [] {
746 DescKind = EcmaDesc.Kind.Type,
747 Namespace = "System",
751 DescKind = EcmaDesc.Kind.Type,
752 Namespace = "System",
758 AssertEcmaString ("O:System.Int32.ExplicitConversion(System.Double,System.Int32)", actual);
762 public void ToEcmaCref_Method ()
764 var actual = new EcmaDesc {
765 DescKind = EcmaDesc.Kind.Method,
766 Namespace = "System",
771 AssertEcmaString ("M:System.Int32.Add", actual);
775 public void ToEcmaCref_Method_Parameters ()
777 var actual = new EcmaDesc {
778 DescKind = EcmaDesc.Kind.Method,
779 Namespace = "System",
782 MemberArguments = new [] {
784 DescKind = EcmaDesc.Kind.Type,
785 Namespace = "System",
789 DescKind = EcmaDesc.Kind.Type,
790 Namespace = "System",
796 AssertEcmaString ("M:System.Int32.Add(System.Double,System.Int32)", actual);
800 public void ToEcmaCref_Method_Generics ()
802 var actual = new EcmaDesc {
803 DescKind = EcmaDesc.Kind.Method,
804 Namespace = "System",
807 GenericMemberArguments = GenericTypeArgumentsList ("T", "K").ToArray (),
810 AssertEcmaString ("M:System.Int32.Add<T,K>", actual);
814 public void ToEcmaCref_Method_Generics_PlusParameters ()
816 var actual = new EcmaDesc {
817 DescKind = EcmaDesc.Kind.Method,
818 Namespace = "System",
821 GenericMemberArguments = GenericTypeArgumentsList ("T", "K").ToArray (),
822 MemberArguments = new [] {
824 DescKind = EcmaDesc.Kind.Type,
829 DescKind = EcmaDesc.Kind.Type,
836 AssertEcmaString ("M:System.Int32.Add<T,K>(T,K)", actual);