/*
 * "Peko" Visual Novel System
 *
 * All Rights Reserved.
 * (c) Copyright 1999-2003 by Tsukuba Bunko.
 *
 * $Id: ReflectionUtilTest.java,v 1.2 2003/08/31 14:08:52 ppoi Exp $
 */
package tsukuba_bunko.util.test;

import	java.lang.reflect.Method;

import	java.util.Arrays;

import	junit.framework.TestCase;

import	tsukuba_bunko.util.ReflectionUtil;


/**
 * @author	$Author: ppoi $
 * @version	$Revision: 1.2 $
 */
public class ReflectionUtilTest extends TestCase {

	/**
	 */
	public ReflectionUtilTest( String name )
	{
		super( name );
	}



	public void test_findMethod_オーバーライドした場合かつ親クラスもたどる場合()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{ String.class, boolean.class };

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodA", parameterTypes, true );
		assertNotNull( "検出失敗", method );
		assertEquals( "宣言されている型が違う", ReflectionTestClassB.class, method.getDeclaringClass() );
		assertTrue( "仮引数タイプが違う", Arrays.equals(method.getParameterTypes(), parameterTypes) );
	}

	public void test_findMethod_オーバーライドした場合かつこのクラスだけの場合()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{ String.class, boolean.class };

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodA", parameterTypes, false );
		assertNotNull( "検出失敗", method );
		assertEquals( "宣言されている型が違う", ReflectionTestClassB.class, method.getDeclaringClass() );
		assertTrue( "仮引数タイプが違う", Arrays.equals(method.getParameterTypes(), parameterTypes) );
	}

	public void test_findMethod_オーバーライドしてない場合かつ親クラスもたどる場合スーパークラス版()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{ String.class, boolean.class };

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodB", parameterTypes, true );
		assertNotNull( "検出失敗", method );
		assertEquals( "宣言されている型が違う", ReflectionTestClassA.class, method.getDeclaringClass() );
		assertTrue( "仮引数タイプが違う", Arrays.equals(method.getParameterTypes(), parameterTypes) );
	}

	public void test_findMethod_オーバーライドしてない場合かつこのクラスだけの場合スーパークラス版()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{ String.class, boolean.class };

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodB", parameterTypes, false );
		assertNull( "変なのが検出されている", method );
	}

	public void test_findMethod_オーバーライドしてない場合かつ親クラスもたどる場合サブクラス版()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{ String.class };

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodB", parameterTypes, true );
		assertNotNull( "検出失敗", method );
		assertEquals( "宣言されている型が違う", ReflectionTestClassB.class, method.getDeclaringClass() );
		assertTrue( "仮引数タイプが違う", Arrays.equals(method.getParameterTypes(), parameterTypes) );
	}

	public void test_findMethod_オーバーライドしてない場合かつこのクラスだけの場合サブクラス版()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{ String.class };

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodB", parameterTypes, false );
		assertNotNull( "検出失敗", method );
		assertEquals( "宣言されている型が違う", ReflectionTestClassB.class, method.getDeclaringClass() );
		assertTrue( "仮引数タイプが違う", Arrays.equals(method.getParameterTypes(), parameterTypes) );
	}

	public void test_findMethod_サブクラス独自メソッドかつ親クラスもたどる場合()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{};

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodC", parameterTypes, true );
		assertNotNull( "検出失敗", method );
		assertEquals( "宣言されている型が違う", ReflectionTestClassB.class, method.getDeclaringClass() );
		assertTrue( "仮引数タイプが違う", Arrays.equals(method.getParameterTypes(), parameterTypes) );
	}

	public void test_findMethod_サブクラス独自メソッドかつこのクラスだけの場合()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{};

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodC", parameterTypes, false );
		assertNotNull( "検出失敗", method );
		assertEquals( "宣言されている型が違う", ReflectionTestClassB.class, method.getDeclaringClass() );
		assertTrue( "仮引数タイプが違う", Arrays.equals(method.getParameterTypes(), parameterTypes) );
	}

	public void test_findMethod_存在しないメソッドかつ親クラスもたどる場合()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{};

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodD", parameterTypes, true );
		assertNull( "変なクラスが検出された", method );
	}

	public void test_findMethod_存在しないメソッドかつこのクラスだけの場合()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{};

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodD", parameterTypes, false );
		assertNull( "変なクラスが検出された", method );
	}

	public void test_findMethod_スーパークラス独自メソッドかつ親クラスもたどる場合()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{};

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodE", parameterTypes, true );
		assertNotNull( "検出失敗", method );
		assertEquals( "宣言されている型が違う", ReflectionTestClassA.class, method.getDeclaringClass() );
		assertTrue( "仮引数タイプが違う", Arrays.equals(method.getParameterTypes(), parameterTypes) );
	}

	public void test_findMethod_スーパークラス独自メソッドかつこのクラスだけの場合()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{};

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodE", parameterTypes, false );
		assertNull( "変なクラスが検出された", method );
	}

	public void test_findMethod_存在しないオーバーロードかつ親クラスもたどる場合()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{};

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodA", parameterTypes, true );
		assertNull( "変なクラスが検出された", method );
	}

	public void test_findMethod_存在しないオーバーロードかつこのクラスだけの場合()
		throws Exception
	{
		Class[]	parameterTypes = new Class[]{};

		Method	method = ReflectionUtil.findMethod( ReflectionTestClassB.class, "testMethodA", parameterTypes, false );
		assertNull( "変なクラスが検出された", method );
	}
}