/Mono.Cecil/Test/Mono.Cecil.Tests/ParameterTests.cs

http://github.com/icsharpcode/ILSpy · C# · 224 lines · 163 code · 61 blank · 0 comment · 0 complexity · 535833294906a711923b1d3149f69999 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 ParameterTests : BaseTestFixture {
  9. [TestModule ("marshal.dll")]
  10. public void MarshalAsI4 (ModuleDefinition module)
  11. {
  12. var bar = module.GetType ("Bar");
  13. var pan = bar.GetMethod ("Pan");
  14. Assert.AreEqual (1, pan.Parameters.Count);
  15. var parameter = pan.Parameters [0];
  16. Assert.IsTrue (parameter.HasMarshalInfo);
  17. var info = parameter.MarshalInfo;
  18. Assert.AreEqual (typeof (MarshalInfo), info.GetType ());
  19. Assert.AreEqual (NativeType.I4, info.NativeType);
  20. }
  21. [TestModule ("marshal.dll")]
  22. public void CustomMarshaler (ModuleDefinition module)
  23. {
  24. var bar = module.GetType ("Bar");
  25. var pan = bar.GetMethod ("PanPan");
  26. var parameter = pan.Parameters [0];
  27. Assert.IsTrue (parameter.HasMarshalInfo);
  28. var info = (CustomMarshalInfo) parameter.MarshalInfo;
  29. Assert.AreEqual (Guid.Empty, info.Guid);
  30. Assert.AreEqual (string.Empty, info.UnmanagedType);
  31. Assert.AreEqual (NativeType.CustomMarshaler, info.NativeType);
  32. Assert.AreEqual ("nomnom", info.Cookie);
  33. Assert.AreEqual ("Boc", info.ManagedType.FullName);
  34. Assert.AreEqual (module, info.ManagedType.Scope);
  35. }
  36. [TestModule ("marshal.dll")]
  37. public void SafeArrayMarshaler (ModuleDefinition module)
  38. {
  39. var bar = module.GetType ("Bar");
  40. var pan = bar.GetMethod ("PanPan");
  41. Assert.IsTrue (pan.MethodReturnType.HasMarshalInfo);
  42. var info = (SafeArrayMarshalInfo) pan.MethodReturnType.MarshalInfo;
  43. Assert.AreEqual (VariantType.Dispatch, info.ElementType);
  44. }
  45. [TestModule ("marshal.dll")]
  46. public void ArrayMarshaler (ModuleDefinition module)
  47. {
  48. var bar = module.GetType ("Bar");
  49. var pan = bar.GetMethod ("PanPan");
  50. var parameter = pan.Parameters [1];
  51. Assert.IsTrue (parameter.HasMarshalInfo);
  52. var info = (ArrayMarshalInfo) parameter.MarshalInfo;
  53. Assert.AreEqual (NativeType.I8, info.ElementType);
  54. Assert.AreEqual (66, info.Size);
  55. Assert.AreEqual (2, info.SizeParameterIndex);
  56. parameter = pan.Parameters [3];
  57. Assert.IsTrue (parameter.HasMarshalInfo);
  58. info = (ArrayMarshalInfo) parameter.MarshalInfo;
  59. Assert.AreEqual (NativeType.I2, info.ElementType);
  60. Assert.AreEqual (-1, info.Size);
  61. Assert.AreEqual (-1, info.SizeParameterIndex);
  62. }
  63. [TestModule ("marshal.dll")]
  64. public void ArrayMarshalerSized (ModuleDefinition module)
  65. {
  66. var delegate_type = module.GetType ("SomeMethod");
  67. var parameter = delegate_type.GetMethod ("Invoke").Parameters [1];
  68. Assert.IsTrue (parameter.HasMarshalInfo);
  69. var array_info = (ArrayMarshalInfo) parameter.MarshalInfo;
  70. Assert.IsNotNull (array_info);
  71. Assert.AreEqual (0, array_info.SizeParameterMultiplier);
  72. }
  73. [TestModule ("boxedoptarg.dll")]
  74. public void BoxedDefaultArgumentValue (ModuleDefinition module)
  75. {
  76. var foo = module.GetType ("Foo");
  77. var bar = foo.GetMethod ("Bar");
  78. var baz = bar.Parameters [0];
  79. Assert.IsTrue (baz.HasConstant);
  80. Assert.AreEqual (-1, baz.Constant);
  81. }
  82. [Test]
  83. public void AddParameterIndex ()
  84. {
  85. var object_ref = new TypeReference ("System", "Object", null, null, false);
  86. var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref);
  87. var x = new ParameterDefinition ("x", ParameterAttributes.None, object_ref);
  88. var y = new ParameterDefinition ("y", ParameterAttributes.None, object_ref);
  89. method.Parameters.Add (x);
  90. method.Parameters.Add (y);
  91. Assert.AreEqual (0, x.Index);
  92. Assert.AreEqual (1, y.Index);
  93. Assert.AreEqual (method, x.Method);
  94. Assert.AreEqual (method, y.Method);
  95. }
  96. [Test]
  97. public void RemoveAtParameterIndex ()
  98. {
  99. var object_ref = new TypeReference ("System", "Object", null, null, false);
  100. var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref);
  101. var x = new ParameterDefinition ("x", ParameterAttributes.None, object_ref);
  102. var y = new ParameterDefinition ("y", ParameterAttributes.None, object_ref);
  103. var z = new ParameterDefinition ("y", ParameterAttributes.None, object_ref);
  104. method.Parameters.Add (x);
  105. method.Parameters.Add (y);
  106. method.Parameters.Add (z);
  107. Assert.AreEqual (0, x.Index);
  108. Assert.AreEqual (1, y.Index);
  109. Assert.AreEqual (2, z.Index);
  110. method.Parameters.RemoveAt (1);
  111. Assert.AreEqual (0, x.Index);
  112. Assert.AreEqual (-1, y.Index);
  113. Assert.AreEqual (1, z.Index);
  114. }
  115. [Test]
  116. public void RemoveParameterIndex ()
  117. {
  118. var object_ref = new TypeReference ("System", "Object", null, null, false);
  119. var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref);
  120. var x = new ParameterDefinition ("x", ParameterAttributes.None, object_ref);
  121. var y = new ParameterDefinition ("y", ParameterAttributes.None, object_ref);
  122. var z = new ParameterDefinition ("y", ParameterAttributes.None, object_ref);
  123. method.Parameters.Add (x);
  124. method.Parameters.Add (y);
  125. method.Parameters.Add (z);
  126. Assert.AreEqual (0, x.Index);
  127. Assert.AreEqual (1, y.Index);
  128. Assert.AreEqual (2, z.Index);
  129. method.Parameters.Remove (y);
  130. Assert.AreEqual (0, x.Index);
  131. Assert.AreEqual (-1, y.Index);
  132. Assert.AreEqual (1, z.Index);
  133. }
  134. [Test]
  135. public void InsertParameterIndex ()
  136. {
  137. var object_ref = new TypeReference ("System", "Object", null, null, false);
  138. var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref);
  139. var x = new ParameterDefinition ("x", ParameterAttributes.None, object_ref);
  140. var y = new ParameterDefinition ("y", ParameterAttributes.None, object_ref);
  141. var z = new ParameterDefinition ("y", ParameterAttributes.None, object_ref);
  142. method.Parameters.Add (x);
  143. method.Parameters.Add (z);
  144. Assert.AreEqual (0, x.Index);
  145. Assert.AreEqual (-1, y.Index);
  146. Assert.AreEqual (1, z.Index);
  147. method.Parameters.Insert (1, y);
  148. Assert.AreEqual (0, x.Index);
  149. Assert.AreEqual (1, y.Index);
  150. Assert.AreEqual (2, z.Index);
  151. }
  152. [TestIL ("hello.il")]
  153. public void GenericParameterConstant (ModuleDefinition module)
  154. {
  155. var foo = module.GetType ("Foo");
  156. var method = foo.GetMethod ("GetState");
  157. Assert.IsNotNull (method);
  158. var parameter = method.Parameters [1];
  159. Assert.IsTrue (parameter.HasConstant);
  160. Assert.IsNull (parameter.Constant);
  161. }
  162. }
  163. }