/Mono.Cecil/Test/Mono.Cecil.Tests/MethodTests.cs

http://github.com/icsharpcode/ILSpy · C# · 201 lines · 143 code · 58 blank · 0 comment · 4 complexity · 7d428f83341902f9ecbe87e164dca6f3 MD5 · raw file

  1. using System;
  2. using System.Linq;
  3. using Mono.Cecil;
  4. using Mono.Cecil.Metadata;
  5. using NUnit.Framework;
  6. namespace Mono.Cecil.Tests {
  7. [TestFixture]
  8. public class MethodTests : BaseTestFixture {
  9. [TestCSharp ("Methods.cs")]
  10. public void AbstractMethod (ModuleDefinition module)
  11. {
  12. var type = module.Types [1];
  13. Assert.AreEqual ("Foo", type.Name);
  14. Assert.AreEqual (2, type.Methods.Count);
  15. var method = type.GetMethod ("Bar");
  16. Assert.AreEqual ("Bar", method.Name);
  17. Assert.IsTrue (method.IsAbstract);
  18. Assert.IsNotNull (method.ReturnType);
  19. Assert.AreEqual (1, method.Parameters.Count);
  20. var parameter = method.Parameters [0];
  21. Assert.AreEqual ("a", parameter.Name);
  22. Assert.AreEqual ("System.Int32", parameter.ParameterType.FullName);
  23. }
  24. [TestCSharp ("Methods.cs")]
  25. public void SimplePInvoke (ModuleDefinition module)
  26. {
  27. var bar = module.GetType ("Bar");
  28. var pan = bar.GetMethod ("Pan");
  29. Assert.IsTrue (pan.IsPInvokeImpl);
  30. Assert.IsNotNull (pan.PInvokeInfo);
  31. Assert.AreEqual ("Pan", pan.PInvokeInfo.EntryPoint);
  32. Assert.IsNotNull (pan.PInvokeInfo.Module);
  33. Assert.AreEqual ("foo.dll", pan.PInvokeInfo.Module.Name);
  34. }
  35. [TestCSharp ("Generics.cs")]
  36. public void GenericMethodDefinition (ModuleDefinition module)
  37. {
  38. var baz = module.GetType ("Baz");
  39. var gazonk = baz.GetMethod ("Gazonk");
  40. Assert.IsNotNull (gazonk);
  41. Assert.IsTrue (gazonk.HasGenericParameters);
  42. Assert.AreEqual (1, gazonk.GenericParameters.Count);
  43. Assert.AreEqual ("TBang", gazonk.GenericParameters [0].Name);
  44. }
  45. [TestCSharp ("Generics.cs")]
  46. public void ReturnGenericInstance (ModuleDefinition module)
  47. {
  48. var bar = module.GetType ("Bar`1");
  49. var self = bar.GetMethod ("Self");
  50. Assert.IsNotNull (self);
  51. var bar_t = self.ReturnType;
  52. Assert.IsTrue (bar_t.IsGenericInstance);
  53. var bar_t_instance = (GenericInstanceType) bar_t;
  54. Assert.AreEqual (bar.GenericParameters [0], bar_t_instance.GenericArguments [0]);
  55. var self_str = bar.GetMethod ("SelfString");
  56. Assert.IsNotNull (self_str);
  57. var bar_str = self_str.ReturnType;
  58. Assert.IsTrue (bar_str.IsGenericInstance);
  59. var bar_str_instance = (GenericInstanceType) bar_str;
  60. Assert.AreEqual ("System.String", bar_str_instance.GenericArguments [0].FullName);
  61. }
  62. [TestCSharp ("Generics.cs")]
  63. public void ReturnGenericInstanceWithMethodParameter (ModuleDefinition module)
  64. {
  65. var baz = module.GetType ("Baz");
  66. var gazoo = baz.GetMethod ("Gazoo");
  67. Assert.IsNotNull (gazoo);
  68. var bar_bingo = gazoo.ReturnType;
  69. Assert.IsTrue (bar_bingo.IsGenericInstance);
  70. var bar_bingo_instance = (GenericInstanceType) bar_bingo;
  71. Assert.AreEqual (gazoo.GenericParameters [0], bar_bingo_instance.GenericArguments [0]);
  72. }
  73. [TestCSharp ("Interfaces.cs")]
  74. public void SimpleOverrides (ModuleDefinition module)
  75. {
  76. var ibingo = module.GetType ("IBingo");
  77. var ibingo_foo = ibingo.GetMethod ("Foo");
  78. Assert.IsNotNull (ibingo_foo);
  79. var ibingo_bar = ibingo.GetMethod ("Bar");
  80. Assert.IsNotNull (ibingo_bar);
  81. var bingo = module.GetType ("Bingo");
  82. var foo = bingo.GetMethod ("IBingo.Foo");
  83. Assert.IsNotNull (foo);
  84. Assert.IsTrue (foo.HasOverrides);
  85. Assert.AreEqual (ibingo_foo, foo.Overrides [0]);
  86. var bar = bingo.GetMethod ("IBingo.Bar");
  87. Assert.IsNotNull (bar);
  88. Assert.IsTrue (bar.HasOverrides);
  89. Assert.AreEqual (ibingo_bar, bar.Overrides [0]);
  90. }
  91. [TestModule ("varargs.exe")]
  92. public void VarArgs (ModuleDefinition module)
  93. {
  94. var module_type = module.Types [0];
  95. Assert.AreEqual (3, module_type.Methods.Count);
  96. var bar = module_type.GetMethod ("Bar");
  97. var baz = module_type.GetMethod ("Baz");
  98. var foo = module_type.GetMethod ("Foo");
  99. Assert.IsTrue (bar.IsVarArg ());
  100. Assert.IsFalse (baz.IsVarArg ());
  101. Assert.IsTrue(foo.IsVarArg ());
  102. var bar_reference = (MethodReference) baz.Body.Instructions.Where (i => i.Offset == 0x000a).First ().Operand;
  103. Assert.IsTrue (bar_reference.IsVarArg ());
  104. Assert.AreEqual (0, bar_reference.GetSentinelPosition ());
  105. var foo_reference = (MethodReference) baz.Body.Instructions.Where (i => i.Offset == 0x0023).First ().Operand;
  106. Assert.IsTrue (foo_reference.IsVarArg ());
  107. Assert.AreEqual (1, foo_reference.GetSentinelPosition ());
  108. }
  109. [TestCSharp ("Generics.cs")]
  110. public void GenericInstanceMethod (ModuleDefinition module)
  111. {
  112. var type = module.GetType ("It");
  113. var method = type.GetMethod ("ReadPwow");
  114. GenericInstanceMethod instance = null;
  115. foreach (var instruction in method.Body.Instructions) {
  116. instance = instruction.Operand as GenericInstanceMethod;
  117. if (instance != null)
  118. break;
  119. }
  120. Assert.IsNotNull (instance);
  121. Assert.AreEqual (TokenType.MethodSpec, instance.MetadataToken.TokenType);
  122. Assert.AreNotEqual (0, instance.MetadataToken.RID);
  123. }
  124. [TestCSharp ("Generics.cs")]
  125. public void MethodRefDeclaredOnGenerics (ModuleDefinition module)
  126. {
  127. var type = module.GetType ("Tamtam");
  128. var beta = type.GetMethod ("Beta");
  129. var charlie = type.GetMethod ("Charlie");
  130. var new_list_beta = (MethodReference) beta.Body.Instructions [0].Operand;
  131. var new_list_charlie = (MethodReference) charlie.Body.Instructions [0].Operand;
  132. Assert.AreEqual ("System.Collections.Generic.List`1<TBeta>", new_list_beta.DeclaringType.FullName);
  133. Assert.AreEqual ("System.Collections.Generic.List`1<TCharlie>", new_list_charlie.DeclaringType.FullName);
  134. }
  135. [Test]
  136. public void ReturnParameterMethod ()
  137. {
  138. var method = typeof (MethodTests).ToDefinition ().GetMethod ("ReturnParameterMethod");
  139. Assert.IsNotNull (method);
  140. Assert.AreEqual (method, method.MethodReturnType.Parameter.Method);
  141. }
  142. }
  143. }