//
// ModuleHandleTest - NUnit Test Cases for the ModuleHandle class
//
// Zoltan Varga (vargaz@freemail.hu)
//
// (C) Ximian, Inc.  http://www.ximian.com
//
//

//
// MISSING TESTS:
// - dynamic assemblies
//


using System;
using System.Threading;
using System.Reflection;
using System.IO;
using System.Collections;

using NUnit.Framework;

namespace MonoTests.System
{

[TestFixture]
public class ModuleHandleTest 
{	
	public static int foo;

	public static int bar {
		get {
			return 0;
		}
	}

	public ModuleHandleTest () {
	}

	public static void gnaf (int i, int j) {
	}

	public ModuleHandle module;

	[SetUp]
	public void SetUp () {
		module = typeof (ModuleHandleTest).Assembly.GetModules ()[0].ModuleHandle;
	}

	[Test]
	public void ResolveTypeToken () {
		// A typedef
		Assert.AreEqual (typeof (ModuleHandleTest), Type.GetTypeFromHandle (module.ResolveTypeHandle (typeof (ModuleHandleTest).MetadataToken)));
	}

	[Test]
	[ExpectedException (typeof (ArgumentNullException))]
	public void ResolveTypeTokenInvalidHandle () {
		ModuleHandle.EmptyHandle.ResolveTypeHandle (typeof (ModuleHandleTest).MetadataToken);
	}

	[Test]
	[ExpectedException (typeof (TypeLoadException))]
	public void ResolveTypeTokenInvalidTokenType () {
		module.ResolveTypeHandle (1234);
	}

	[Test]
	[ExpectedException (typeof (TypeLoadException))]
	public void ResolveTypeTokenInvalidTokenType2 () {
		module.ResolveTypeHandle (0x4000001);
	}



	[Test]
	public void ResolveFieldToken () {
		FieldInfo fi = typeof (ModuleHandleTest).GetField ("foo");

		Assert.AreEqual (fi, FieldInfo.GetFieldFromHandle (module.ResolveFieldHandle (fi.MetadataToken)));
	}

	[Test]
	[ExpectedException (typeof (ArgumentNullException))]
	public void ResolveFieldTokenInvalidHandle () {
		ModuleHandle.EmptyHandle.ResolveFieldHandle (typeof (ModuleHandleTest).MetadataToken);
	}

	[Test]
	[ExpectedException (typeof (Exception))]
	public void ResolveFieldTokenInvalidTokenType () {
		module.ResolveFieldHandle (1234);
	}

	[Test]
	[ExpectedException (typeof (Exception))]
	public void ResolveFieldTokenInvalidTokenType2 () {
		/* A typedef */
		module.ResolveFieldHandle (0x2000002);
	}

	[Test]
	[ExpectedException (typeof (Exception))]
	public void ResolveFieldTokenInvalidTokenType3 () {
		/* A memberref which points to a method */
		module.ResolveFieldHandle (typeof (Console).GetMethod ("ReadLine").MetadataToken);
	}

	[Test]
	[ExpectedException (typeof (Exception))]
	public void ResolveFieldTokenInvalidToken () {
		/* An out-of-range field def */
		module.ResolveFieldHandle (0x40f0001);
	}




	[Test]
	public void ResolveMethodToken () {
		MethodInfo mi = typeof (ModuleHandleTest).GetMethod ("ResolveMethodToken");

		Assert.AreEqual (mi, MethodInfo.GetMethodFromHandle (module.ResolveMethodHandle (mi.MetadataToken)));
	}

	[Test]
	[ExpectedException (typeof (ArgumentNullException))]
	public void ResolveMethodTokenInvalidHandle () {
		ModuleHandle.EmptyHandle.ResolveMethodHandle (typeof (ModuleHandleTest).GetMethod ("ResolveMethodToken").MetadataToken);
	}

	[Test]
	[ExpectedException (typeof (Exception))]
	public void ResolveMethodTokenInvalidTokenType () {
		module.ResolveMethodHandle (1234);
	}

	[Test]
	[ExpectedException (typeof (Exception))]
	public void ResolveMethodTokenInvalidTokenType2 () {
		/* A typedef */
		module.ResolveMethodHandle (0x2000002);
	}

	[Test]
	[ExpectedException (typeof (Exception))]
	public void ResolveMethodTokenInvalidTokenType3 () {
		/* A memberref which points to a field */
		module.ResolveMethodHandle (typeof (Type).GetField ("Delimiter").MetadataToken);
	}

	[Test]
	[ExpectedException (typeof (Exception))]
	public void ResolveMethodTokenInvalidToken () {
		/* An out-of-range method def */
		module.ResolveMethodHandle (0x60f0001);
	}

/* it is not public in 2.0 RTM.
	[Test]
	public void GetPEKind () {
		PortableExecutableKinds pe_kind;
		ImageFileMachine machine;

		module.GetPEKind (out pe_kind, out machine);

		Assert.AreEqual (PortableExecutableKinds.ILOnly, pe_kind);
	}

	[Test]
	[ExpectedException (typeof (ArgumentNullException))]
	public void GetPEKindInvalidHandle () {
		PortableExecutableKinds pe_kind;
		ImageFileMachine machine;

		ModuleHandle.EmptyHandle.GetPEKind (out pe_kind, out machine);
	}
*/
}
}