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

https://github.com/gluck/cecil · C# · 394 lines · 304 code · 90 blank · 0 comment · 1 complexity · b983502b9f97fc47f6f4511885cfef9a 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. var module = GetCurrentModule ();
  184. var fullname = string.Format ("System.Collections.Generic.Dictionary`2[[System.Int32, {0}],[System.String, {0}]]",
  185. typeof (object).Assembly.FullName);
  186. var type = TypeParser.ParseType (module, fullname);
  187. Assert.AreEqual (fullname, TypeParser.ToParseable (type));
  188. var instance = type as GenericInstanceType;
  189. Assert.IsNotNull (instance);
  190. Assert.AreEqual (2, instance.GenericArguments.Count);
  191. Assert.AreEqual ("mscorlib", type.Scope.Name);
  192. Assert.AreEqual (module, type.Module);
  193. Assert.AreEqual ("System.Collections.Generic", type.Namespace);
  194. Assert.AreEqual ("Dictionary`2", type.Name);
  195. type = instance.ElementType;
  196. Assert.AreEqual (2, type.GenericParameters.Count);
  197. var argument = instance.GenericArguments [0];
  198. Assert.AreEqual ("mscorlib", argument.Scope.Name);
  199. Assert.AreEqual (module, argument.Module);
  200. Assert.AreEqual ("System", argument.Namespace);
  201. Assert.AreEqual ("Int32", argument.Name);
  202. argument = instance.GenericArguments [1];
  203. Assert.AreEqual ("mscorlib", argument.Scope.Name);
  204. Assert.AreEqual (module, argument.Module);
  205. Assert.AreEqual ("System", argument.Namespace);
  206. Assert.AreEqual ("String", argument.Name);
  207. }
  208. [Test]
  209. public void GenericInstanceMixedArguments ()
  210. {
  211. var module = GetCurrentModule ();
  212. var fullname = string.Format ("System.Collections.Generic.Dictionary`2[Mono.Cecil.Tests.TypeParserTests,[System.String, {0}]]",
  213. typeof (object).Assembly.FullName);
  214. var type = TypeParser.ParseType (module, fullname);
  215. var instance = type as GenericInstanceType;
  216. Assert.IsNotNull (instance);
  217. Assert.AreEqual (2, instance.GenericArguments.Count);
  218. Assert.AreEqual ("mscorlib", type.Scope.Name);
  219. Assert.AreEqual (module, type.Module);
  220. Assert.AreEqual ("System.Collections.Generic", type.Namespace);
  221. Assert.AreEqual ("Dictionary`2", type.Name);
  222. type = instance.ElementType;
  223. Assert.AreEqual (2, type.GenericParameters.Count);
  224. var argument = instance.GenericArguments [0];
  225. Assert.IsInstanceOf (typeof (TypeDefinition), argument);
  226. Assert.AreEqual (module, argument.Module);
  227. Assert.AreEqual ("Mono.Cecil.Tests", argument.Namespace);
  228. Assert.AreEqual ("TypeParserTests", argument.Name);
  229. argument = instance.GenericArguments [1];
  230. Assert.AreEqual ("mscorlib", argument.Scope.Name);
  231. Assert.AreEqual (module, argument.Module);
  232. Assert.AreEqual ("System", argument.Namespace);
  233. Assert.AreEqual ("String", argument.Name);
  234. }
  235. public class Foo<TX, TY> {
  236. }
  237. public class Bar {}
  238. [Test]
  239. public void GenericInstanceTwoNonFqArguments ()
  240. {
  241. var module = GetCurrentModule ();
  242. var fullname = string.Format ("System.Collections.Generic.Dictionary`2[Mono.Cecil.Tests.TypeParserTests+Bar,Mono.Cecil.Tests.TypeParserTests+Bar], {0}", typeof (object).Assembly.FullName);
  243. var type = TypeParser.ParseType (module, fullname);
  244. var instance = type as GenericInstanceType;
  245. Assert.IsNotNull (instance);
  246. Assert.AreEqual (2, instance.GenericArguments.Count);
  247. Assert.AreEqual ("mscorlib", type.Scope.Name);
  248. Assert.AreEqual (module, type.Module);
  249. Assert.AreEqual ("System.Collections.Generic", type.Namespace);
  250. Assert.AreEqual ("Dictionary`2", type.Name);
  251. type = instance.ElementType;
  252. Assert.AreEqual (2, type.GenericParameters.Count);
  253. var argument = instance.GenericArguments [0];
  254. Assert.AreEqual (module, argument.Module);
  255. Assert.AreEqual ("", argument.Namespace);
  256. Assert.AreEqual ("Bar", argument.Name);
  257. Assert.IsInstanceOf (typeof (TypeDefinition), argument);
  258. argument = instance.GenericArguments [1];
  259. Assert.AreEqual (module, argument.Module);
  260. Assert.AreEqual ("", argument.Namespace);
  261. Assert.AreEqual ("Bar", argument.Name);
  262. Assert.IsInstanceOf (typeof (TypeDefinition), argument);
  263. }
  264. [Test]
  265. public void ComplexGenericInstanceMixedArguments ()
  266. {
  267. var module = GetCurrentModule ();
  268. 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}]]]",
  269. typeof (object).Assembly.FullName);
  270. var type = TypeParser.ParseType (module, fullname);
  271. var instance = type as GenericInstanceType;
  272. Assert.IsNotNull (instance);
  273. Assert.AreEqual (2, instance.GenericArguments.Count);
  274. Assert.AreEqual ("mscorlib", type.Scope.Name);
  275. Assert.AreEqual (module, type.Module);
  276. Assert.AreEqual ("System.Collections.Generic", type.Namespace);
  277. Assert.AreEqual ("Dictionary`2", type.Name);
  278. type = instance.ElementType;
  279. Assert.AreEqual (2, type.GenericParameters.Count);
  280. var argument = instance.GenericArguments [0];
  281. Assert.AreEqual ("mscorlib", argument.Scope.Name);
  282. Assert.AreEqual (module, argument.Module);
  283. Assert.AreEqual ("System", argument.Namespace);
  284. Assert.AreEqual ("String", argument.Name);
  285. argument = instance.GenericArguments [1];
  286. instance = argument as GenericInstanceType;
  287. Assert.IsNotNull (instance);
  288. Assert.AreEqual (2, instance.GenericArguments.Count);
  289. Assert.AreEqual (module, instance.Module);
  290. Assert.AreEqual ("Mono.Cecil.Tests.TypeParserTests/Foo`2", instance.ElementType.FullName);
  291. Assert.IsInstanceOf (typeof (TypeDefinition), instance.ElementType);
  292. argument = instance.GenericArguments [0];
  293. Assert.AreEqual (module, argument.Module);
  294. Assert.AreEqual ("Mono.Cecil.Tests", argument.Namespace);
  295. Assert.AreEqual ("TypeParserTests", argument.Name);
  296. Assert.IsInstanceOf (typeof (TypeDefinition), argument);
  297. argument = instance.GenericArguments [1];
  298. Assert.AreEqual ("mscorlib", argument.Scope.Name);
  299. Assert.AreEqual (module, argument.Module);
  300. Assert.AreEqual ("System", argument.Namespace);
  301. Assert.AreEqual ("Int32", argument.Name);
  302. }
  303. }
  304. }