PageRenderTime 53ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/mcs/class/monodoc/Test/Monodoc.Ecma/EcmaUrlTests.cs

https://github.com/skolima/mono
C# | 480 lines | 404 code | 43 blank | 33 comment | 0 complexity | 8e80d01c9186ba223ff8a198802a5e79 MD5 | raw file
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Collections.Generic;
  5. using NUnit.Framework;
  6. using Monodoc;
  7. using Monodoc.Ecma;
  8. namespace MonoTests.Monodoc.Ecma
  9. {
  10. [TestFixture]
  11. public class EcmaUrlTests
  12. {
  13. EcmaUrlParser parser;
  14. [SetUp]
  15. public void Setup ()
  16. {
  17. parser = new EcmaUrlParser ();
  18. }
  19. void AssertValidUrl (string url)
  20. {
  21. try {
  22. parser.IsValid (url);
  23. } catch {
  24. Assert.Fail (string.Format ("URL '{0}' deemed not valid", url));
  25. }
  26. }
  27. void AssertInvalidUrl (string url)
  28. {
  29. try {
  30. parser.IsValid (url);
  31. } catch {
  32. return;
  33. }
  34. Assert.Fail (string.Format ("URL '{0}' deemed valid", url));
  35. }
  36. void AssertUrlDesc (EcmaDesc expected, string url)
  37. {
  38. EcmaDesc actual = null;
  39. try {
  40. actual = parser.Parse (url);
  41. } catch (Exception e) {
  42. Assert.Fail (string.Format ("URL '{0}' deemed not valid: {1}{2}", url, Environment.NewLine, e.ToString ()));
  43. }
  44. Assert.AreEqual (expected, actual, "Converted URL differs");
  45. }
  46. [Test]
  47. public void CommonMethodUrlIsValidTest ()
  48. {
  49. AssertValidUrl ("M:System.String.FooBar()");
  50. AssertValidUrl ("M:System.String.FooBar(System.String, Int32)");
  51. AssertValidUrl ("M:System.Foo.Int32<System.String+FooBar<System.Blop<T, U`2>>>.Foo()");
  52. AssertValidUrl ("M:System.Foo.Int32<System.String+FooBar<System.Blop<T, U`2>>>.Foo(Bleh,Bar)");
  53. AssertValidUrl ("M:System.Foo.Int32<System.String+FooBar<System.Blop<T, U`2>>>.Foo(Bleh<V>,Bar)");
  54. AssertValidUrl ("M:Gendarme.Framework.Helpers.Log.WriteLine(string,string,object[])");
  55. AssertValidUrl ("M:Mono.Security.X509.Extensions.SubjectKeyIdentifierExtension.Decode");
  56. AssertValidUrl ("M:Mono.Security.PKCS7.IssuerAndSerialNumber");
  57. }
  58. [Test]
  59. public void CommonTypeUrlIsValidTest ()
  60. {
  61. AssertValidUrl ("T:Int32");
  62. AssertValidUrl ("T:System.Foo.Int32");
  63. AssertValidUrl ("T:System.Foo.Int32<System.String+FooBar`1>");
  64. AssertValidUrl ("T:System.Foo.Int32<System.String+FooBar<System.Blop<T, U>>>");
  65. AssertValidUrl ("T:System.Foo.Int32<T>");
  66. AssertValidUrl ("T:System.Foo.Int32<T,U>");
  67. AssertValidUrl ("T:System.Foo.Int32<System.String+FooBar<System.Blop<T, U>>>");
  68. AssertValidUrl ("T:System.Foo.Int32<System.String+FooBar<System.Blop<T, U`2>>>");
  69. }
  70. [Test]
  71. public void CommonTypeUrlNotValidTest ()
  72. {
  73. AssertInvalidUrl ("TInt32");
  74. AssertInvalidUrl ("K:Int32");
  75. AssertInvalidUrl ("T:System..Foo.Int32");
  76. AssertInvalidUrl ("T:System.Foo.Int32<System.String+FooBar`1");
  77. AssertInvalidUrl ("T:System.Foo.Int32<System.String+FooBarSystem.Blop<T, U>>>");
  78. AssertInvalidUrl ("T:System.Foo.Int32<T,>");
  79. AssertInvalidUrl ("T:System.Foo.Int32<+FooBar<System.Blop<T, U>>>");
  80. }
  81. [Test]
  82. public void NamespaceValidTest ()
  83. {
  84. AssertValidUrl ("N:Foo.Bar");
  85. AssertValidUrl ("N:Foo");
  86. AssertValidUrl ("N:Foo.Bar.Baz");
  87. AssertValidUrl ("N:A.B.C");
  88. var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Namespace,
  89. Namespace = "Foo.Bar.Blop" };
  90. AssertUrlDesc (ast, "N:Foo.Bar.Blop");
  91. }
  92. [Test]
  93. public void ConstructorValidTest ()
  94. {
  95. AssertValidUrl ("C:Gendarme.Rules.Concurrency.DecorateThreadsRule.DecorateThreadsRule");
  96. AssertValidUrl ("C:Gendarme.Rules.Concurrency.DecorateThreadsRule.DecorateThreadsRule()");
  97. AssertValidUrl ("C:Gendarme.Rules.Concurrency.DecorateThreadsRule.DecorateThreadsRule(System.String)");
  98. AssertValidUrl ("C:Gendarme.Framework.Helpers.MethodSignature.MethodSignature(string,string,string[],System.Func<Mono.Cecil.MethodReference,System.Boolean>)");
  99. AssertValidUrl ("C:System.Collections.Generic.Dictionary<TKey,TValue>+KeyCollection.KeyCollection(System.Collections.Generic.Dictionary<TKey,TValue>)");
  100. AssertValidUrl ("C:Microsoft.Build.Utilities.TaskItem(System.String,System.Collections.IDictionary)");
  101. }
  102. [Test]
  103. public void SlashExpressionValidTest ()
  104. {
  105. AssertValidUrl ("T:Foo.Bar.Type/*");
  106. AssertValidUrl ("T:Foo.Bar.Type/M");
  107. AssertValidUrl ("T:Gendarme.Framework.Bitmask<T>/M/Equals");
  108. AssertValidUrl ("T:Gendarme.Framework.Helpers.Log/M/WriteLine<T>");
  109. AssertValidUrl ("T:System.Windows.Forms.AxHost/M/System.ComponentModel.ICustomTypeDescriptor.GetEvents");
  110. }
  111. [Test]
  112. public void MethodWithArgModValidTest ()
  113. {
  114. AssertValidUrl ("M:Foo.Bar.FooBar(int, System.Drawing.Imaging&)");
  115. AssertValidUrl ("M:Foo.Bar.FooBar(int@, System.Drawing.Imaging)");
  116. AssertValidUrl ("M:Foo.Bar.FooBar(int, System.Drawing.Imaging*)");
  117. AssertValidUrl ("M:Foo.Bar.FooBar(int*, System.Drawing.Imaging&)");
  118. AssertValidUrl ("M:Atk.NoOpObject.GetRunAttributes(int,int&,int&)");
  119. }
  120. [Test]
  121. public void MethodWithJaggedArrayArgsValidTest ()
  122. {
  123. AssertValidUrl ("M:System.Reflection.Emit.SignatureHelper.GetPropertySigHelper(System.Reflection.Module,System.Reflection.CallingConventions,Type,Type[],Type[],Type[],Type[][],Type[][])");
  124. }
  125. [Test]
  126. public void MethodWithInnerTypeValidTest ()
  127. {
  128. AssertValidUrl ("M:System.TimeZoneInfo+AdjustmentRule.CreateAdjustmentRule");
  129. }
  130. [Test]
  131. public void FieldValidTest ()
  132. {
  133. AssertValidUrl ("F:Mono.Terminal.Curses.KeyF10");
  134. AssertValidUrl ("F:Novell.Directory.Ldap.Utilclass.ExceptionMessages.NOT_IMPLEMENTED");
  135. AssertValidUrl ("F:Novell.Directory.Ldap.LdapException.NOT_ALLOWED_ON_NONLEAF");
  136. }
  137. [Test]
  138. public void PropertyValidTest ()
  139. {
  140. AssertValidUrl ("P:System.Foo.Bar");
  141. AssertValidUrl ("P:System.ArraySegment<T>.Array");
  142. }
  143. [Test]
  144. public void IndexPropertyValidTest ()
  145. {
  146. AssertValidUrl ("P:System.ComponentModel.PropertyDescriptorCollection.Item(int)");
  147. AssertValidUrl ("P:System.ComponentModel.AttributeCollection.Item(Type)");
  148. AssertValidUrl ("P:System.Web.SessionState.HttpSessionStateContainer$System.Web.SessionState.IHttpSessionState.Item(System.Int32)");
  149. AssertValidUrl ("P:System.Collections.Specialized.BitVector32.Item(System.Collections.Specialized.BitVector32+Section)");
  150. }
  151. [Test]
  152. public void ExplicitMethodImplValidTest ()
  153. {
  154. AssertValidUrl ("M:Microsoft.Win32.RegistryKey$System.IDisposable.Dispose");
  155. }
  156. [Test]
  157. public void AspNetSafeUrlValidTest ()
  158. {
  159. AssertValidUrl ("M:MonoTouch.UIKit.UICollectionViewLayoutAttributes.CreateForCell{T}");
  160. }
  161. [Test]
  162. public void GenericTypeArgsIsNumericTest ()
  163. {
  164. var desc = parser.Parse ("T:System.Collections.Generic.Dictionary`2");
  165. Assert.IsTrue (desc.GenericTypeArgumentsIsNumeric);
  166. Assert.AreEqual (2, desc.GenericTypeArguments.Count);
  167. desc = parser.Parse ("T:System.Collections.Generic.Dictionary<TKey,TValue>");
  168. Assert.IsFalse (desc.GenericTypeArgumentsIsNumeric);
  169. }
  170. [Test]
  171. public void MetaEtcNodeTest ()
  172. {
  173. var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
  174. Namespace = "Foo.Bar",
  175. TypeName = "Type",
  176. Etc = '*' };
  177. AssertUrlDesc (ast, "T:Foo.Bar.Type/*");
  178. }
  179. [Test]
  180. public void MetaEtcWithInnerTypeTest ()
  181. {
  182. var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
  183. Namespace = "Novell.Directory.Ldap",
  184. TypeName = "Connection",
  185. NestedType = new EcmaDesc { DescKind = EcmaDesc.Kind.Type, TypeName = "ReaderThread" },
  186. Etc = '*' };
  187. AssertUrlDesc (ast, "T:Novell.Directory.Ldap.Connection+ReaderThread/*");
  188. }
  189. [Test]
  190. public void SimpleTypeUrlParseTest ()
  191. {
  192. var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
  193. TypeName = "String",
  194. Namespace = "System" };
  195. AssertUrlDesc (ast, "T:System.String");
  196. }
  197. [Test]
  198. public void TypeWithOneGenericUrlParseTest ()
  199. {
  200. var generics = new[] {
  201. new EcmaDesc {
  202. DescKind = EcmaDesc.Kind.Type,
  203. Namespace = string.Empty,
  204. TypeName = "T"
  205. }
  206. };
  207. var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
  208. TypeName = "String",
  209. Namespace = "System",
  210. GenericTypeArguments = generics,
  211. };
  212. AssertUrlDesc (ast, "T:System.String<T>");
  213. }
  214. [Test]
  215. public void TypeWithOneGenericUrlParseTestUsingAspNetStyleUrl ()
  216. {
  217. var generics = new[] {
  218. new EcmaDesc {
  219. DescKind = EcmaDesc.Kind.Type,
  220. Namespace = string.Empty,
  221. TypeName = "T"
  222. }
  223. };
  224. var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
  225. TypeName = "String",
  226. Namespace = "System",
  227. GenericTypeArguments = generics,
  228. };
  229. AssertUrlDesc (ast, "T:System.String{T}");
  230. }
  231. [Test]
  232. public void TypeWithNestedGenericUrlParseTest ()
  233. {
  234. var generics = new[] {
  235. new EcmaDesc {
  236. DescKind = EcmaDesc.Kind.Type,
  237. TypeName = "T",
  238. Namespace = string.Empty
  239. },
  240. new EcmaDesc {
  241. DescKind = EcmaDesc.Kind.Type,
  242. Namespace = "System.Collections.Generic",
  243. TypeName = "List",
  244. GenericTypeArguments = new[] {
  245. new EcmaDesc {
  246. DescKind = EcmaDesc.Kind.Type,
  247. TypeName = "V",
  248. Namespace = string.Empty
  249. }
  250. }
  251. }
  252. };
  253. var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
  254. TypeName = "String",
  255. Namespace = "System",
  256. GenericTypeArguments = generics,
  257. };
  258. AssertUrlDesc (ast, "T:System.String<T, System.Collections.Generic.List<V>>");
  259. }
  260. [Test]
  261. public void SimpleMethodUrlParseTest ()
  262. {
  263. var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Method,
  264. TypeName = "String",
  265. Namespace = "System",
  266. MemberName = "FooBar"
  267. };
  268. AssertUrlDesc (ast, "M:System.String.FooBar()");
  269. }
  270. [Test]
  271. public void MethodWithArgsUrlParseTest ()
  272. {
  273. var args = new[] {
  274. new EcmaDesc {
  275. DescKind = EcmaDesc.Kind.Type,
  276. Namespace = "System",
  277. TypeName = "String"
  278. },
  279. new EcmaDesc {
  280. DescKind = EcmaDesc.Kind.Type,
  281. TypeName = "Int32",
  282. Namespace = string.Empty
  283. }
  284. };
  285. var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Method,
  286. TypeName = "String",
  287. Namespace = "System",
  288. MemberName = "FooBar",
  289. MemberArguments = args
  290. };
  291. AssertUrlDesc (ast, "M:System.String.FooBar(System.String, Int32)");
  292. }
  293. [Test]
  294. public void MethodWithArgsAndGenericsUrlParseTest ()
  295. {
  296. var args = new[] {
  297. new EcmaDesc {
  298. DescKind = EcmaDesc.Kind.Type,
  299. Namespace = "System",
  300. TypeName = "String"
  301. },
  302. new EcmaDesc {
  303. DescKind = EcmaDesc.Kind.Type,
  304. Namespace = "System.Collections.Generic",
  305. TypeName = "Dictionary",
  306. GenericTypeArguments = new[] {
  307. new EcmaDesc {
  308. DescKind = EcmaDesc.Kind.Type,
  309. TypeName = "K",
  310. Namespace = string.Empty
  311. },
  312. new EcmaDesc {
  313. DescKind = EcmaDesc.Kind.Type,
  314. TypeName = "V",
  315. Namespace = string.Empty
  316. }
  317. }
  318. }
  319. };
  320. var generics = new[] {
  321. new EcmaDesc {
  322. DescKind = EcmaDesc.Kind.Type,
  323. TypeName = "Action",
  324. Namespace = string.Empty,
  325. GenericTypeArguments = new[] {
  326. new EcmaDesc {
  327. DescKind = EcmaDesc.Kind.Type,
  328. Namespace = "System",
  329. TypeName = "Single",
  330. },
  331. new EcmaDesc {
  332. DescKind = EcmaDesc.Kind.Type,
  333. TypeName = "int",
  334. Namespace = string.Empty
  335. },
  336. }
  337. }
  338. };
  339. var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Method,
  340. TypeName = "String",
  341. Namespace = "System",
  342. MemberName = "FooBar",
  343. MemberArguments = args,
  344. GenericMemberArguments = generics
  345. };
  346. AssertUrlDesc (ast, "M:System.String.FooBar<Action<System.Single, int>>(System.String, System.Collections.Generic.Dictionary<K, V>)");
  347. }
  348. [Test]
  349. public void ExplicitMethodImplementationParseTest ()
  350. {
  351. var inner = new EcmaDesc {
  352. MemberName = "Dispose",
  353. TypeName = "IDisposable",
  354. Namespace = "System"
  355. };
  356. var ast = new EcmaDesc {
  357. DescKind = EcmaDesc.Kind.Method,
  358. TypeName = "RegistryKey",
  359. Namespace = "Microsoft.Win32",
  360. ExplicitImplMember = inner
  361. };
  362. AssertUrlDesc (ast, "M:Microsoft.Win32.RegistryKey$System.IDisposable.Dispose");
  363. }
  364. [Test]
  365. public void SimpleMethodWithNumberInType ()
  366. {
  367. var ast = new EcmaDesc {
  368. DescKind = EcmaDesc.Kind.Method,
  369. TypeName = "ASN1",
  370. Namespace = "Mono.Security",
  371. MemberName = "Add"
  372. };
  373. AssertUrlDesc (ast, "M:Mono.Security.ASN1.Add");
  374. }
  375. [Test]
  376. public void JaggedArrayWithDimensions ()
  377. {
  378. var ast = new EcmaDesc {
  379. DescKind = EcmaDesc.Kind.Type,
  380. TypeName = "Int32",
  381. Namespace = "System",
  382. ArrayDimensions = new int[] { 3, 1, 1 }
  383. };
  384. AssertUrlDesc (ast, "T:System.Int32[,,][][]");
  385. }
  386. [Test]
  387. public void ExplicitIndexerImplementation ()
  388. {
  389. var explicitImpl = new EcmaDesc {
  390. Namespace = "System.Web.SessionState",
  391. TypeName = "IHttpSessionState",
  392. MemberName = "Item",
  393. MemberArguments = new [] { new EcmaDesc { DescKind = EcmaDesc.Kind.Type, Namespace = "System", TypeName = "Int32" } },
  394. };
  395. var ast = new EcmaDesc {
  396. DescKind = EcmaDesc.Kind.Property,
  397. TypeName = "HttpSessionStateContainer",
  398. Namespace = "System.Web.SessionState",
  399. ExplicitImplMember = explicitImpl,
  400. };
  401. AssertUrlDesc (ast, "P:System.Web.SessionState.HttpSessionStateContainer$System.Web.SessionState.IHttpSessionState.Item(System.Int32)");
  402. }
  403. /* [Test]
  404. public void TreeParsabilityTest ()
  405. {
  406. var rootTree = RootTree.LoadTree ("/home/jeremie/monodoc/");
  407. Node result;
  408. var generator = new CheckGenerator ();
  409. foreach (var leaf in GetLeaves (rootTree.RootNode).Where (IsEcmaNode))
  410. AssertUrl (leaf.PublicUrl);
  411. }
  412. IEnumerable<Node> GetLeaves (Node node)
  413. {
  414. if (node == null)
  415. yield break;
  416. if (node.IsLeaf)
  417. yield return node;
  418. else {
  419. foreach (var child in node.Nodes) {
  420. if (!string.IsNullOrEmpty (child.Element) && !child.Element.StartsWith ("root:/"))
  421. yield return child;
  422. foreach (var childLeaf in GetLeaves (child))
  423. yield return childLeaf;
  424. }
  425. }
  426. }
  427. bool IsEcmaNode (Node node)
  428. {
  429. var url = node.PublicUrl;
  430. return url != null && url.Length > 2 && url[1] == ':';
  431. }*/
  432. }
  433. }