1 // 2 // MethodOnTypeBuilderInstTest - NUnit Test Cases for MethodOnTypeBuilderInst 3 // 4 // Author: 5 // Gert Driesen (drieseng@users.sourceforge.net) 6 // 7 // Copyright (C) 2008 Gert Driesen 8 // 9 // Permission is hereby granted, free of charge, to any person obtaining 10 // a copy of this software and associated documentation files (the 11 // "Software"), to deal in the Software without restriction, including 12 // without limitation the rights to use, copy, modify, merge, publish, 13 // distribute, sublicense, and/or sell copies of the Software, and to 14 // permit persons to whom the Software is furnished to do so, subject to 15 // the following conditions: 16 // 17 // The above copyright notice and this permission notice shall be 18 // included in all copies or substantial portions of the Software. 19 // 20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 // 28 29 30 using System; 31 using System.Globalization; 32 using System.IO; 33 using System.Reflection; 34 using System.Reflection.Emit; 35 36 using NUnit.Framework; 37 38 namespace MonoTests.System.Reflection.Emit 39 { 40 [TestFixture] 41 public class ConstructorOnTypeBuilderInstTest 42 { 43 private static string ASSEMBLY_NAME = "MonoTests.System.Reflection.Emit.ConstructorOnTypeBuilderInstTest"; 44 45 private AssemblyBuilder assembly; 46 private ModuleBuilder module; 47 private Type typeBarOfInt32; 48 private ConstructorBuilder cb; 49 private ConstructorInfo ci; 50 private TypeBuilder tb; 51 52 [SetUp] SetUp()53 public void SetUp () 54 { 55 SetUp (AssemblyBuilderAccess.RunAndSave); 56 } 57 SetUp(AssemblyBuilderAccess access)58 void SetUp (AssemblyBuilderAccess access) 59 { 60 AssemblyName assemblyName = new AssemblyName (); 61 assemblyName.Name = ASSEMBLY_NAME; 62 63 assembly = AppDomain.CurrentDomain.DefineDynamicAssembly ( 64 assemblyName, access, 65 Path.GetTempPath ()); 66 67 module = assembly.DefineDynamicModule ("module1"); 68 69 tb = module.DefineType ("Bar"); 70 GenericTypeParameterBuilder [] typeParams = tb.DefineGenericParameters ("T"); 71 72 cb = tb.DefineConstructor (MethodAttributes.Public, 73 CallingConventions.Standard, 74 new Type [] { typeof (string), typeof (int) }); 75 ILGenerator ig = cb.GetILGenerator (); 76 ig.Emit (OpCodes.Ret); 77 78 typeBarOfInt32 = tb.MakeGenericType (typeof (int)); 79 ci = TypeBuilder.GetConstructor (typeBarOfInt32, cb); 80 } 81 82 [Test] 83 [Category ("NotWorking")] Attributes()84 public void Attributes () 85 { 86 Assert.AreEqual (MethodAttributes.PrivateScope | 87 MethodAttributes.Public | MethodAttributes.SpecialName, 88 ci.Attributes, "#1"); 89 tb.CreateType (); 90 Assert.AreEqual (MethodAttributes.PrivateScope | 91 MethodAttributes.Public | MethodAttributes.SpecialName, 92 ci.Attributes, "#2"); 93 } 94 95 [Test] 96 [Category ("NotWorking")] CallingConvention()97 public void CallingConvention () 98 { 99 Assert.AreEqual (CallingConventions.HasThis, 100 ci.CallingConvention, "#1"); 101 tb.CreateType (); 102 Assert.AreEqual (CallingConventions.HasThis, 103 ci.CallingConvention, "#2"); 104 } 105 106 [Test] ContainsGenericParameters()107 public void ContainsGenericParameters () 108 { 109 Assert.IsFalse (ci.ContainsGenericParameters, "#1"); 110 tb.CreateType (); 111 Assert.IsFalse (ci.ContainsGenericParameters, "#2"); 112 } 113 114 [Test] DeclaringType()115 public void DeclaringType () 116 { 117 Assert.AreSame (typeBarOfInt32, ci.DeclaringType, "#1"); 118 tb.CreateType (); 119 Assert.AreSame (typeBarOfInt32, ci.DeclaringType, "#2"); 120 } 121 122 [Test] // GetCustomAttributes (Boolean) GetCustomAttributes1()123 public void GetCustomAttributes1 () 124 { 125 try { 126 ci.GetCustomAttributes (false); 127 Assert.Fail ("#A1"); 128 } catch (NotSupportedException ex) { 129 // The invoked member is not supported in a dynamic module 130 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2"); 131 Assert.IsNull (ex.InnerException, "#A3"); 132 Assert.IsNotNull (ex.Message, "#A4"); 133 } 134 135 tb.CreateType (); 136 137 try { 138 ci.GetCustomAttributes (false); 139 Assert.Fail ("#B1"); 140 } catch (NotSupportedException ex) { 141 // The invoked member is not supported in a dynamic module 142 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2"); 143 Assert.IsNull (ex.InnerException, "#B3"); 144 Assert.IsNotNull (ex.Message, "#B4"); 145 } 146 } 147 148 [Test] // GetCustomAttributes (Type, Boolean) GetCustomAttributes2()149 public void GetCustomAttributes2 () 150 { 151 try { 152 ci.GetCustomAttributes (typeof (FlagsAttribute), false); 153 Assert.Fail ("#A1"); 154 } catch (NotSupportedException ex) { 155 // The invoked member is not supported in a dynamic module 156 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2"); 157 Assert.IsNull (ex.InnerException, "#A3"); 158 Assert.IsNotNull (ex.Message, "#A4"); 159 } 160 161 tb.CreateType (); 162 163 try { 164 ci.GetCustomAttributes (typeof (FlagsAttribute), false); 165 Assert.Fail ("#B1"); 166 } catch (NotSupportedException ex) { 167 // The invoked member is not supported in a dynamic module 168 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2"); 169 Assert.IsNull (ex.InnerException, "#B3"); 170 Assert.IsNotNull (ex.Message, "#B4"); 171 } 172 } 173 174 [Test] GetGenericArguments()175 public void GetGenericArguments () 176 { 177 try { 178 ci.GetGenericArguments (); 179 Assert.Fail ("#A1"); 180 } catch (NotSupportedException ex) { 181 // Derived classes must provide an implementation 182 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2"); 183 Assert.IsNull (ex.InnerException, "#A3"); 184 Assert.IsNotNull (ex.Message, "#A4"); 185 } 186 187 tb.CreateType (); 188 189 try { 190 ci.GetGenericArguments (); 191 Assert.Fail ("#B1"); 192 } catch (NotSupportedException ex) { 193 // Derived classes must provide an implementation 194 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2"); 195 Assert.IsNull (ex.InnerException, "#B3"); 196 Assert.IsNotNull (ex.Message, "#B4"); 197 } 198 } 199 200 [Test] GetMethodImplementationFlags()201 public void GetMethodImplementationFlags () 202 { 203 Assert.AreEqual (MethodImplAttributes.Managed, 204 ci.GetMethodImplementationFlags (), "#1"); 205 tb.CreateType (); 206 Assert.AreEqual (MethodImplAttributes.Managed, 207 ci.GetMethodImplementationFlags (), "#2"); 208 } 209 210 [Test] GetParameters()211 public void GetParameters () 212 { 213 try { 214 ci.GetParameters (); 215 Assert.Fail ("#A1"); 216 } catch (NotSupportedException ex) { 217 // Type has not been created 218 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2"); 219 Assert.IsNull (ex.InnerException, "#A3"); 220 Assert.IsNotNull (ex.Message, "#A4"); 221 } 222 223 tb.CreateType (); 224 225 ParameterInfo [] parameters = ci.GetParameters (); 226 Assert.IsNotNull (parameters, "#B1"); 227 Assert.AreEqual (2, parameters.Length, "#B2"); 228 229 Assert.AreEqual (ParameterAttributes.None, parameters [0].Attributes, "#C1"); 230 Assert.IsNull (parameters [0].Name, "#C2"); 231 Assert.AreEqual (typeof (string), parameters [0].ParameterType, "#C3"); 232 Assert.AreEqual (0, parameters [0].Position, "#C4"); 233 234 Assert.AreEqual (ParameterAttributes.None, parameters [1].Attributes, "#D1"); 235 Assert.IsNull (parameters [1].Name, "#D2"); 236 Assert.AreEqual (typeof (int), parameters [1].ParameterType, "#D3"); 237 Assert.AreEqual (1, parameters [1].Position, "#D4"); 238 } 239 240 [Test] // Invoke (Object []) Invoke1()241 public void Invoke1 () 242 { 243 try { 244 ci.Invoke (new object [0]); 245 Assert.Fail ("#A1"); 246 } catch (InvalidOperationException ex) { 247 // Operation is not valid due to the current 248 // state of the object 249 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2"); 250 Assert.IsNull (ex.InnerException, "#A3"); 251 Assert.IsNotNull (ex.Message, "#A4"); 252 } 253 254 tb.CreateType (); 255 256 try { 257 ci.Invoke (new object [0]); 258 Assert.Fail ("#B1"); 259 } catch (InvalidOperationException ex) { 260 // Operation is not valid due to the current 261 // state of the object 262 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2"); 263 Assert.IsNull (ex.InnerException, "#B3"); 264 Assert.IsNotNull (ex.Message, "#B4"); 265 } 266 } 267 268 [Test] // Invoke (Object, Object []) Invoke2()269 public void Invoke2 () 270 { 271 try { 272 ci.Invoke (null, new object [0]); 273 Assert.Fail ("#A1"); 274 } catch (NotSupportedException ex) { 275 // Specified method is not supported 276 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2"); 277 Assert.IsNull (ex.InnerException, "#A3"); 278 Assert.IsNotNull (ex.Message, "#A4"); 279 } 280 281 tb.CreateType (); 282 283 try { 284 ci.Invoke (null, new object [0]); 285 Assert.Fail ("#B1"); 286 } catch (NotSupportedException ex) { 287 // Specified method is not supported 288 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2"); 289 Assert.IsNull (ex.InnerException, "#B3"); 290 Assert.IsNotNull (ex.Message, "#B4"); 291 } 292 } 293 294 [Test] // Invoke (BindingFlags, Binder, Object [], CultureInfo) Invoke3()295 public void Invoke3 () 296 { 297 try { 298 ci.Invoke (BindingFlags.Default, null, new object [0], 299 CultureInfo.InvariantCulture); 300 Assert.Fail ("#A1"); 301 } catch (InvalidOperationException ex) { 302 // Operation is not valid due to the current 303 // state of the object 304 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2"); 305 Assert.IsNull (ex.InnerException, "#A3"); 306 Assert.IsNotNull (ex.Message, "#A4"); 307 } 308 309 tb.CreateType (); 310 311 try { 312 ci.Invoke (BindingFlags.Default, null, new object [0], 313 CultureInfo.InvariantCulture); 314 Assert.Fail ("#B1"); 315 } catch (InvalidOperationException ex) { 316 // Operation is not valid due to the current 317 // state of the object 318 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2"); 319 Assert.IsNull (ex.InnerException, "#B3"); 320 Assert.IsNotNull (ex.Message, "#B4"); 321 } 322 } 323 324 [Test] // Invoke (Object, BindingFlags, Binder, Object [], CultureInfo) Invoke4()325 public void Invoke4 () 326 { 327 try { 328 ci.Invoke (null, BindingFlags.Default, null, 329 new object [0], CultureInfo.InvariantCulture); 330 Assert.Fail ("#A1"); 331 } catch (NotSupportedException ex) { 332 // Specified method is not supported 333 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2"); 334 Assert.IsNull (ex.InnerException, "#A3"); 335 Assert.IsNotNull (ex.Message, "#A4"); 336 } 337 338 tb.CreateType (); 339 340 try { 341 ci.Invoke (null, BindingFlags.Default, null, 342 new object [0], CultureInfo.InvariantCulture); 343 Assert.Fail ("#B1"); 344 } catch (NotSupportedException ex) { 345 // Specified method is not supported 346 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2"); 347 Assert.IsNull (ex.InnerException, "#B3"); 348 Assert.IsNotNull (ex.Message, "#B4"); 349 } 350 } 351 352 [Test] IsDefined()353 public void IsDefined () 354 { 355 try { 356 ci.IsDefined (typeof (FlagsAttribute), false); 357 Assert.Fail ("#A1"); 358 } catch (NotSupportedException ex) { 359 // The invoked member is not supported in a dynamic module 360 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2"); 361 Assert.IsNull (ex.InnerException, "#A3"); 362 Assert.IsNotNull (ex.Message, "#A4"); 363 } 364 365 tb.CreateType (); 366 367 try { 368 ci.IsDefined (typeof (FlagsAttribute), false); 369 Assert.Fail ("#B1"); 370 } catch (NotSupportedException ex) { 371 // The invoked member is not supported in a dynamic module 372 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2"); 373 Assert.IsNull (ex.InnerException, "#B3"); 374 Assert.IsNotNull (ex.Message, "#B4"); 375 } 376 } 377 378 [Test] IsGenericMethodDefinition()379 public void IsGenericMethodDefinition () 380 { 381 Assert.IsFalse (ci.IsGenericMethodDefinition, "#1"); 382 tb.CreateType (); 383 Assert.IsFalse (ci.IsGenericMethodDefinition, "#2"); 384 } 385 386 [Test] IsGenericMethod()387 public void IsGenericMethod () 388 { 389 Assert.IsFalse (ci.IsGenericMethod, "#1"); 390 tb.CreateType (); 391 Assert.IsFalse (ci.IsGenericMethod, "#2"); 392 } 393 394 [Test] MemberType()395 public void MemberType () 396 { 397 Assert.AreEqual (MemberTypes.Constructor, ci.MemberType, "#1"); 398 tb.CreateType (); 399 Assert.AreEqual (MemberTypes.Constructor, ci.MemberType, "#2"); 400 } 401 402 [Test] MethodHandle()403 public void MethodHandle () 404 { 405 try { 406 RuntimeMethodHandle handle = ci.MethodHandle; 407 Assert.Fail ("#A1:" + handle); 408 } catch (NotSupportedException ex) { 409 // The invoked member is not supported in a dynamic module 410 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2"); 411 Assert.IsNull (ex.InnerException, "#A3"); 412 Assert.IsNotNull (ex.Message, "#A4"); 413 } 414 415 tb.CreateType (); 416 417 try { 418 RuntimeMethodHandle handle = ci.MethodHandle; 419 Assert.Fail ("#B1:" + handle); 420 } catch (NotSupportedException ex) { 421 // The invoked member is not supported in a dynamic module 422 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2"); 423 Assert.IsNull (ex.InnerException, "#B3"); 424 Assert.IsNotNull (ex.Message, "#B4"); 425 } 426 } 427 428 [Test] Module()429 public void Module () 430 { 431 Assert.AreSame (module, ci.Module, "#1"); 432 tb.CreateType (); 433 Assert.AreSame (module, ci.Module, "#2"); 434 } 435 436 [Test] Name()437 public void Name () 438 { 439 Assert.AreEqual (".ctor", ci.Name, "#1"); 440 tb.CreateType (); 441 Assert.AreEqual (".ctor", ci.Name, "#2"); 442 } 443 444 [Test] ReflectedType()445 public void ReflectedType () 446 { 447 Assert.AreSame (typeBarOfInt32, ci.ReflectedType, "#1"); 448 tb.CreateType (); 449 Assert.AreSame (typeBarOfInt32, ci.ReflectedType, "#2"); 450 } 451 452 [Test] 453 [Category ("NotDotNet")] 454 // CompilerContext no longer supported 455 [Category ("NotWorking")] MetadataTokenWorksUnderCompilerContext()456 public void MetadataTokenWorksUnderCompilerContext () 457 { 458 SetUp (AssemblyBuilderAccess.RunAndSave | (AssemblyBuilderAccess)0x800); 459 int cb_token = cb.MetadataToken; 460 int inst_token = ci.MetadataToken; 461 Assert.AreEqual (cb_token, inst_token, "#1"); 462 } 463 } 464 } 465 466