/Test/Mono.Cecil.Tests/TypeParserTests.cs

http://github.com/jbevain/cecil · C# · 397 lines · 306 code · 91 blank · 0 comment · 2 complexity · 4a35cb68f670f91d57c9aa4aab38e6bb MD5 · raw file

  1. using System;
  2. using System.Linq;
  3. using NUnit.Framework;
  4. namespace Mono.Cecil.Tests {
  5. [TestFixture]
  6. public class TypeParserTests : BaseTestFixture {
  7. [Test]
  8. public void SimpleStringReference ()
  9. {
  10. var module = GetCurrentModule ();
  11. var corlib = module.TypeSystem.CoreLibrary;
  12. const string fullname = "System.String";
  13. var type = TypeParser.ParseType (module, fullname);
  14. Assert.IsNotNull (type);
  15. Assert.AreEqual (corlib, type.Scope);
  16. Assert.AreEqual (module, type.Module);
  17. Assert.AreEqual ("System", type.Namespace);
  18. Assert.AreEqual ("String", type.Name);
  19. Assert.AreEqual (MetadataType.String, type.MetadataType);
  20. Assert.IsFalse (type.IsValueType);
  21. Assert.IsInstanceOf (typeof (TypeReference), type);
  22. }
  23. [Test]
  24. public void SimpleInt32Reference ()
  25. {
  26. var module = GetCurrentModule ();
  27. var corlib = module.TypeSystem.CoreLibrary;
  28. const string fullname = "System.Int32";
  29. var type = TypeParser.ParseType (module, fullname);
  30. Assert.IsNotNull (type);
  31. Assert.AreEqual (corlib, type.Scope);
  32. Assert.AreEqual (module, type.Module);
  33. Assert.AreEqual ("System", type.Namespace);
  34. Assert.AreEqual ("Int32", type.Name);
  35. Assert.AreEqual (MetadataType.Int32, type.MetadataType);
  36. Assert.IsTrue (type.IsValueType);
  37. Assert.IsInstanceOf (typeof (TypeReference), type);
  38. }
  39. [Test]
  40. public void SimpleTypeDefinition ()
  41. {
  42. var module = GetCurrentModule ();
  43. const string fullname = "Mono.Cecil.Tests.TypeParserTests";
  44. var type = TypeParser.ParseType (module, fullname);
  45. Assert.IsNotNull (type);
  46. Assert.AreEqual (module, type.Scope);
  47. Assert.AreEqual (module, type.Module);
  48. Assert.AreEqual ("Mono.Cecil.Tests", type.Namespace);
  49. Assert.AreEqual ("TypeParserTests", type.Name);
  50. Assert.IsInstanceOf (typeof (TypeDefinition), type);
  51. }
  52. [Test]
  53. public void ByRefTypeReference ()
  54. {
  55. var module = GetCurrentModule ();
  56. var corlib = module.TypeSystem.CoreLibrary;
  57. const string fullname = "System.String&";
  58. var type = TypeParser.ParseType (module, fullname);
  59. Assert.IsInstanceOf (typeof (ByReferenceType), type);
  60. type = ((ByReferenceType) type).ElementType;
  61. Assert.IsNotNull (type);
  62. Assert.AreEqual (corlib, type.Scope);
  63. Assert.AreEqual (module, type.Module);
  64. Assert.AreEqual ("System", type.Namespace);
  65. Assert.AreEqual ("String", type.Name);
  66. Assert.IsInstanceOf (typeof (TypeReference), type);
  67. }
  68. [Test]
  69. public void FullyQualifiedTypeReference ()
  70. {
  71. var module = GetCurrentModule ();
  72. var cecil = module.AssemblyReferences.Where (reference => reference.Name == "Mono.Cecil").First ();
  73. var fullname = "Mono.Cecil.TypeDefinition, " + cecil.FullName;
  74. var type = TypeParser.ParseType (module, fullname);
  75. Assert.IsNotNull (type);
  76. Assert.AreEqual (cecil, type.Scope);
  77. Assert.AreEqual (module, type.Module);
  78. Assert.AreEqual ("Mono.Cecil", type.Namespace);
  79. Assert.AreEqual ("TypeDefinition", type.Name);
  80. Assert.IsInstanceOf (typeof (TypeReference), type);
  81. }
  82. [Test]
  83. public void OpenGenericType ()
  84. {
  85. var module = GetCurrentModule ();
  86. var corlib = module.TypeSystem.CoreLibrary;
  87. const string fullname = "System.Collections.Generic.Dictionary`2";
  88. var type = TypeParser.ParseType (module, fullname);
  89. Assert.IsNotNull (type);
  90. Assert.AreEqual (corlib, type.Scope);
  91. Assert.AreEqual (module, type.Module);
  92. Assert.AreEqual ("System.Collections.Generic", type.Namespace);
  93. Assert.AreEqual ("Dictionary`2", type.Name);
  94. Assert.IsInstanceOf (typeof (TypeReference), type);
  95. Assert.AreEqual (2, type.GenericParameters.Count);
  96. }
  97. public class ID {}
  98. [Test]
  99. public void SimpleNestedType ()
  100. {
  101. var module = GetCurrentModule ();
  102. const string fullname = "Mono.Cecil.Tests.TypeParserTests+ID";
  103. var type = TypeParser.ParseType (module, fullname);
  104. Assert.IsNotNull (type);
  105. Assert.AreEqual (module, type.Module);
  106. Assert.AreEqual (module, type.Scope);
  107. Assert.AreEqual ("", type.Namespace);
  108. Assert.AreEqual ("ID", type.Name);
  109. Assert.AreEqual ("Mono.Cecil.Tests.TypeParserTests/ID", type.FullName);
  110. Assert.AreEqual (fullname, TypeParser.ToParseable (type));
  111. }
  112. [Test]
  113. public void TripleNestedTypeWithScope ()
  114. {
  115. var module = GetCurrentModule ();
  116. const string fullname = "Bingo.Foo`1+Bar`1+Baz`1, Bingo";
  117. var type = TypeParser.ParseType (module, fullname);
  118. Assert.AreEqual ("Bingo.Foo`1+Bar`1+Baz`1, Bingo, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", TypeParser.ToParseable (type));
  119. Assert.IsNotNull (type);
  120. Assert.AreEqual ("Bingo", type.Scope.Name);
  121. Assert.AreEqual (module, type.Module);
  122. Assert.AreEqual ("", type.Namespace);
  123. Assert.AreEqual ("Baz`1", type.Name);
  124. Assert.IsInstanceOf (typeof (TypeReference), type);
  125. Assert.AreEqual (1, type.GenericParameters.Count);
  126. type = type.DeclaringType;
  127. Assert.IsNotNull (type);
  128. Assert.AreEqual ("Bingo", type.Scope.Name);
  129. Assert.AreEqual (module, type.Module);
  130. Assert.AreEqual ("", type.Namespace);
  131. Assert.AreEqual ("Bar`1", type.Name);
  132. Assert.IsInstanceOf (typeof (TypeReference), type);
  133. Assert.AreEqual (1, type.GenericParameters.Count);
  134. type = type.DeclaringType;
  135. Assert.IsNotNull (type);
  136. Assert.AreEqual ("Bingo", type.Scope.Name);
  137. Assert.AreEqual (module, type.Module);
  138. Assert.AreEqual ("Bingo", type.Namespace);
  139. Assert.AreEqual ("Foo`1", type.Name);
  140. Assert.IsInstanceOf (typeof (TypeReference), type);
  141. Assert.AreEqual (1, type.GenericParameters.Count);
  142. }
  143. [Test]
  144. public void Vector ()
  145. {
  146. var module = GetCurrentModule ();
  147. const string fullname = "Bingo.Gazonk[], Bingo";
  148. var type = TypeParser.ParseType (module, fullname);
  149. Assert.AreEqual ("Bingo.Gazonk[], Bingo, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", TypeParser.ToParseable (type));
  150. var array = type as ArrayType;
  151. Assert.IsNotNull (array);
  152. Assert.AreEqual (1, array.Rank);
  153. Assert.IsTrue (array.IsVector);
  154. type = array.ElementType;
  155. Assert.IsNotNull (type);
  156. Assert.AreEqual ("Bingo", type.Scope.Name);
  157. Assert.AreEqual (module, type.Module);
  158. Assert.AreEqual ("Bingo", type.Namespace);
  159. Assert.AreEqual ("Gazonk", type.Name);
  160. Assert.IsInstanceOf (typeof (TypeReference), type);
  161. }
  162. [Test]
  163. public void ThreeDimensionalArray ()
  164. {
  165. var module = GetCurrentModule ();
  166. const string fullname = "Bingo.Gazonk[,,], Bingo";
  167. var type = TypeParser.ParseType (module, fullname);
  168. var array = type as ArrayType;
  169. Assert.IsNotNull (array);
  170. Assert.AreEqual (3, array.Rank);
  171. Assert.IsFalse (array.IsVector);
  172. type = array.ElementType;
  173. Assert.IsNotNull (type);
  174. Assert.AreEqual ("Bingo", type.Scope.Name);
  175. Assert.AreEqual (module, type.Module);
  176. Assert.AreEqual ("Bingo", type.Namespace);
  177. Assert.AreEqual ("Gazonk", type.Name);
  178. Assert.IsInstanceOf (typeof (TypeReference), type);
  179. }
  180. [Test]
  181. public void GenericInstanceExternArguments ()
  182. {
  183. if (Platform.OnCoreClr)
  184. return;
  185. var module = GetCurrentModule ();
  186. var fullname = string.Format ("System.Collections.Generic.Dictionary`2[[System.Int32, {0}],[System.String, {0}]]",
  187. typeof (object).Assembly.FullName);
  188. var type = TypeParser.ParseType (module, fullname);
  189. Assert.AreEqual (fullname, TypeParser.ToParseable (type));
  190. var instance = type as GenericInstanceType;
  191. Assert.IsNotNull (instance);
  192. Assert.AreEqual (2, instance.GenericArguments.Count);
  193. Assert.AreEqual ("mscorlib", type.Scope.Name);
  194. Assert.AreEqual (module, type.Module);
  195. Assert.AreEqual ("System.Collections.Generic", type.Namespace);
  196. Assert.AreEqual ("Dictionary`2", type.Name);
  197. type = instance.ElementType;
  198. Assert.AreEqual (2, type.GenericParameters.Count);
  199. var argument = instance.GenericArguments [0];
  200. Assert.AreEqual ("mscorlib", argument.Scope.Name);
  201. Assert.AreEqual (module, argument.Module);
  202. Assert.AreEqual ("System", argument.Namespace);
  203. Assert.AreEqual ("Int32", argument.Name);
  204. argument = instance.GenericArguments [1];
  205. Assert.AreEqual ("mscorlib", argument.Scope.Name);
  206. Assert.AreEqual (module, argument.Module);
  207. Assert.AreEqual ("System", argument.Namespace);
  208. Assert.AreEqual ("String", argument.Name);
  209. }
  210. [Test]
  211. public void GenericInstanceMixedArguments ()
  212. {
  213. var module = GetCurrentModule ();
  214. var fullname = string.Format ("System.Collections.Generic.Dictionary`2[Mono.Cecil.Tests.TypeParserTests,[System.String, {0}]]",
  215. typeof (object).Assembly.FullName);
  216. var type = TypeParser.ParseType (module, fullname);
  217. var instance = type as GenericInstanceType;
  218. Assert.IsNotNull (instance);
  219. Assert.AreEqual (2, instance.GenericArguments.Count);
  220. Assert.AreEqual (Platform.OnCoreClr ? "System.Runtime" : "mscorlib", type.Scope.Name);
  221. Assert.AreEqual (module, type.Module);
  222. Assert.AreEqual ("System.Collections.Generic", type.Namespace);
  223. Assert.AreEqual ("Dictionary`2", type.Name);
  224. type = instance.ElementType;
  225. Assert.AreEqual (2, type.GenericParameters.Count);
  226. var argument = instance.GenericArguments [0];
  227. Assert.IsInstanceOf (typeof (TypeDefinition), argument);
  228. Assert.AreEqual (module, argument.Module);
  229. Assert.AreEqual ("Mono.Cecil.Tests", argument.Namespace);
  230. Assert.AreEqual ("TypeParserTests", argument.Name);
  231. argument = instance.GenericArguments [1];
  232. Assert.AreEqual (Platform.OnCoreClr ? "System.Private.CoreLib" : "mscorlib", argument.Scope.Name);
  233. Assert.AreEqual (module, argument.Module);
  234. Assert.AreEqual ("System", argument.Namespace);
  235. Assert.AreEqual ("String", argument.Name);
  236. }
  237. public class Foo<TX, TY> {
  238. }
  239. public class Bar {}
  240. [Test]
  241. public void GenericInstanceTwoNonFqArguments ()
  242. {
  243. var module = GetCurrentModule ();
  244. var fullname = string.Format ("System.Collections.Generic.Dictionary`2[Mono.Cecil.Tests.TypeParserTests+Bar,Mono.Cecil.Tests.TypeParserTests+Bar], {0}", typeof (object).Assembly.FullName);
  245. var type = TypeParser.ParseType (module, fullname);
  246. var instance = type as GenericInstanceType;
  247. Assert.IsNotNull (instance);
  248. Assert.AreEqual (2, instance.GenericArguments.Count);
  249. Assert.AreEqual (Platform.OnCoreClr ? "System.Private.CoreLib" : "mscorlib", type.Scope.Name);
  250. Assert.AreEqual (module, type.Module);
  251. Assert.AreEqual ("System.Collections.Generic", type.Namespace);
  252. Assert.AreEqual ("Dictionary`2", type.Name);
  253. type = instance.ElementType;
  254. Assert.AreEqual (2, type.GenericParameters.Count);
  255. var argument = instance.GenericArguments [0];
  256. Assert.AreEqual (module, argument.Module);
  257. Assert.AreEqual ("", argument.Namespace);
  258. Assert.AreEqual ("Bar", argument.Name);
  259. Assert.IsInstanceOf (typeof (TypeDefinition), argument);
  260. argument = instance.GenericArguments [1];
  261. Assert.AreEqual (module, argument.Module);
  262. Assert.AreEqual ("", argument.Namespace);
  263. Assert.AreEqual ("Bar", argument.Name);
  264. Assert.IsInstanceOf (typeof (TypeDefinition), argument);
  265. }
  266. [Test]
  267. public void ComplexGenericInstanceMixedArguments ()
  268. {
  269. var module = GetCurrentModule ();
  270. var fullname = string.Format ("System.Collections.Generic.Dictionary`2[[System.String, {0}],Mono.Cecil.Tests.TypeParserTests+Foo`2[Mono.Cecil.Tests.TypeParserTests,[System.Int32, {0}]]]",
  271. typeof (object).Assembly.FullName);
  272. var type = TypeParser.ParseType (module, fullname);
  273. var instance = type as GenericInstanceType;
  274. Assert.IsNotNull (instance);
  275. Assert.AreEqual (2, instance.GenericArguments.Count);
  276. Assert.AreEqual (Platform.OnCoreClr ? "System.Runtime" : "mscorlib", type.Scope.Name);
  277. Assert.AreEqual (module, type.Module);
  278. Assert.AreEqual ("System.Collections.Generic", type.Namespace);
  279. Assert.AreEqual ("Dictionary`2", type.Name);
  280. type = instance.ElementType;
  281. Assert.AreEqual (2, type.GenericParameters.Count);
  282. var argument = instance.GenericArguments [0];
  283. Assert.AreEqual (Platform.OnCoreClr ? "System.Private.CoreLib" : "mscorlib", argument.Scope.Name);
  284. Assert.AreEqual (module, argument.Module);
  285. Assert.AreEqual ("System", argument.Namespace);
  286. Assert.AreEqual ("String", argument.Name);
  287. argument = instance.GenericArguments [1];
  288. instance = argument as GenericInstanceType;
  289. Assert.IsNotNull (instance);
  290. Assert.AreEqual (2, instance.GenericArguments.Count);
  291. Assert.AreEqual (module, instance.Module);
  292. Assert.AreEqual ("Mono.Cecil.Tests.TypeParserTests/Foo`2", instance.ElementType.FullName);
  293. Assert.IsInstanceOf (typeof (TypeDefinition), instance.ElementType);
  294. argument = instance.GenericArguments [0];
  295. Assert.AreEqual (module, argument.Module);
  296. Assert.AreEqual ("Mono.Cecil.Tests", argument.Namespace);
  297. Assert.AreEqual ("TypeParserTests", argument.Name);
  298. Assert.IsInstanceOf (typeof (TypeDefinition), argument);
  299. argument = instance.GenericArguments [1];
  300. Assert.AreEqual (Platform.OnCoreClr ? "System.Private.CoreLib" : "mscorlib", argument.Scope.Name);
  301. Assert.AreEqual (module, argument.Module);
  302. Assert.AreEqual ("System", argument.Namespace);
  303. Assert.AreEqual ("Int32", argument.Name);
  304. }
  305. }
  306. }