package test.org.itscool.commons.bean;

import java.util.Calendar;
import java.util.Date;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.itscool.commons.bean.BeanUtil;
import org.itscool.commons.bean.BeanUtilRuntimeException;

/*
判定メソッド一覧 
判定する方法                       使用するメソッド             メッセージをつけて使用するメソッド 
真偽で判定注3                      assert(boolean)              assert(String, boolean) 
2つの整数が等しいか判定            assertEquals(long, long)     assertEquals(String, long, long) 
2つの浮動小数が等しいか判定        assertEquals(double, double) assertEquals(String, double, double) 
2つのオブジェクトが等しい注1か判定 assertEquals(Object, Object) assertEquals(String, Object, Object) 
2つのオブジェクトが同一注2か判定   assertSame(Object, Object)   assertSame(String, Object, Object) 
オブジェクトがnullでないことを判定 assertNotNull(Object)        assertNotNull(String, Object) 
オブジェクトがnullであることを判定 assertNull(Object)           assertNull(String, Object) 
テストの判定結果を否にする         fail()                       fail(String) 

注１ 
Object.equals()メソッドで判定します。 
注2 
==で判定します。 
注3 
JDK1.4からassertが予約語になったため、JUnit3.7からassertTrueに改名された。 
*/

// 1. junit.framework.TestCaseを継承する
public class BeanTest extends TestCase {
    
    // 2. 引数にStringを取るコンストラクタを定義する
    public BeanTest(String name) {
        super(name);
    }

    // 3. テスト準備を行うsetUpメソッドを記述する
    protected void setUp(){
    }
    
    public void testCreateInstance() {
        SampleBean bean = 
            (SampleBean)BeanUtil.createInstance("test.org.itscool.commons.bean.SampleBean");
        
        if( bean == null ){
            fail("SampleBean is null.");
        }
        if( !(bean instanceof SampleBean) ){
            fail("bean is not SampleBean instance.");
        } 
    }
    
    public void testCreateInstanceNG() {
        
        try{
        	SampleBean bean = 
                (SampleBean)BeanUtil.createInstance("NgSampleBean");
            fail("生成されてはいけないBeanインスタンスが生成された.");
        }catch(BeanUtilRuntimeException bre){
            System.out.println("ＯＫ：意図する例外を検知した");
        }
    }
    
    public void testSetShort() {
        SampleBean bean = new SampleBean();
        
        try{
            BeanUtil.setProperty(bean, "shortVal", "100");
            assertEquals("shortVal(String)不一致", 100, bean.getShortVal());
        }catch( BeanUtilRuntimeException bre ){
            fail("shortValのsetProperty()で例外が発生：" + bre.getMessage());
        }
        try{
            BeanUtil.setProperty(bean, "shortVal", new Long("100"));
            assertEquals("shortVal(Short)不一致", 100, bean.getShortVal());
        }catch( BeanUtilRuntimeException bre ){
            fail("shortValのsetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testSetInteger() {
        SampleBean bean = new SampleBean();
        
        try{
            BeanUtil.setProperty(bean, "integerId", "1");
            assertEquals("integerId(String)不一致", "1", bean.getIntegerId().toString());
        }catch( BeanUtilRuntimeException bre ){
            fail("idのsetProperty()で例外が発生：" + bre.getMessage());
        }
        try{
            BeanUtil.setProperty(bean, "integerId", new Integer("10000"));
            assertEquals("integerId(Integer)不一致", "10000", bean.getIntegerId().toString());
        }catch( BeanUtilRuntimeException bre ){
            fail("integerIdのsetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testSetInt() {
        SampleBean bean = new SampleBean();
        
        try{
            BeanUtil.setProperty(bean, "id", "1");
            assertEquals("id(String)不一致", 1, bean.getId());
        }catch( BeanUtilRuntimeException bre ){
            fail("idのsetProperty()で例外が発生：" + bre.getMessage());
        }
        try{
            BeanUtil.setProperty(bean, "id", new Integer("10000"));
            assertEquals("id(Integer)不一致", 10000, bean.getId());
        }catch( BeanUtilRuntimeException bre ){
            fail("idのsetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testSetLong() {
        SampleBean bean = new SampleBean();
        
        try{
            BeanUtil.setProperty(bean, "longVal", "10000000");
            assertEquals("longVal(String)不一致", 10000000, bean.getLongVal());
        }catch( BeanUtilRuntimeException bre ){
            fail("longValのsetProperty()で例外が発生：" + bre.getMessage());
        }
        try{
            BeanUtil.setProperty(bean, "longVal", new Long("10000000"));
            assertEquals("longVal(Long)不一致", 10000000, bean.getLongVal());
        }catch( BeanUtilRuntimeException bre ){
            fail("longValのsetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testSetDouble() {
        SampleBean bean = new SampleBean();
        
        try{
            BeanUtil.setProperty(bean, "doubleVal", "1.2345");
            if( 1.2345 != bean.getDoubleVal() ){
				fail("doubleVal不一致 bean["+bean.getDoubleVal()+
				"], 1.2345");
            }
            //assertEquals("doubleVal不一致", 1.2345, bean.getDoubleVal());
        }catch( BeanUtilRuntimeException bre ){
            fail("doublValのsetProperty()で例外が発生：" + bre.getMessage());
        }
        
        try{
            BeanUtil.setProperty(bean, "doubleVal", new Double("99.99999"));
            if( 99.99999 != bean.getDoubleVal() ){
				fail("doubleVal不一致 bean["+bean.getDoubleVal()+
				"], 99.99999");
            }
            //assertEquals("doubleVal不一致", 1.2345, bean.getDoubleVal());
        }catch( BeanUtilRuntimeException bre ){
            fail("doublValのsetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testSetBoolean() {
        SampleBean bean = new SampleBean();
        
        try{
            BeanUtil.setProperty(bean, "boolVal", "true");
            if( bean.getBoolVal() != true){
                fail("boolVal不一致 bean["+bean.getBoolVal()+
				"], true");
            }
        }catch( BeanUtilRuntimeException bre ){
            fail("boolValのsetProperty()で例外が発生：" + bre.getMessage());
        }
        
        try{
            BeanUtil.setProperty(bean, "boolVal", new Boolean("false"));
            if( bean.getBoolVal() != false ){
				fail("boolVal不一致 bean["+bean.getBoolVal()+
				"], false");
            }
        }catch( BeanUtilRuntimeException bre ){
            fail("boolValのsetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testSetString() {
        SampleBean bean = new SampleBean();
    
        try{
            BeanUtil.setProperty(bean, "name", "名無しの権兵衛");
            assertEquals("name不一致", "名無しの権兵衛", bean.getName());
        }catch( BeanUtilRuntimeException bre ){
            fail("nameのsetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testSetDate() {
        SampleBean bean = new SampleBean();
    
        Calendar cal = Calendar.getInstance();
        Date date = cal.getTime();
        try{
            BeanUtil.setProperty(bean, "date", date);
            assertEquals("date不一致", date, bean.getDate());
        }catch( BeanUtilRuntimeException bre ){
            fail("dateのsetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetShort(){
        SampleBean bean = new SampleBean();
        bean.setShortVal((short)123);
        
        try{
            short shortVal = ((Short)BeanUtil.getProperty(bean, "shortVal")).shortValue();
            assertEquals("shortVal不一致", shortVal, bean.getShortVal());
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetShort2(){
        SampleBean bean = new SampleBean();
        bean.setShortVal((short)123);
        
        try{
            short shortVal = BeanUtil.getShortValue(bean, "shortVal");
            assertEquals("shortVal不一致", shortVal, bean.getShortVal());
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetShortValue()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetInt(){
        SampleBean bean = new SampleBean();
        bean.setId(12345);
        
        try{
            int id = ((Integer)BeanUtil.getProperty(bean, "id")).intValue();
            assertEquals("id不一致", id, bean.getId());
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetInt2(){
        SampleBean bean = new SampleBean();
        bean.setId(12345);
        
        try{
            int id = BeanUtil.getIntValue(bean, "id");
            assertEquals("id不一致", id, bean.getId());
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetIntValue()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetLong(){
        SampleBean bean = new SampleBean();
        bean.setLongVal((long)999999999);
        
        try{
            long longVal = ((Long)BeanUtil.getProperty(bean, "longVal")).longValue();
            assertEquals("longVal不一致", longVal, bean.getLongVal());
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetLong2(){
        SampleBean bean = new SampleBean();
        bean.setLongVal((long)999999999);
        
        try{
            long longVal = BeanUtil.getLongValue(bean, "longVal");
            assertEquals("longVal不一致", longVal, bean.getLongVal());
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetLongValue()で例外が発生：" + bre.getMessage());
        }
    }
        
    public void testGetDouble(){
        SampleBean bean = new SampleBean();
        bean.setDoubleVal((long)99.9999999);
        
        try{
            double doubleVal = ((Double)BeanUtil.getProperty(bean, "doubleVal")).doubleValue();
            if( doubleVal != bean.getDoubleVal() ){
                fail("doubleVal不一致");
            }
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetDouble2(){
        SampleBean bean = new SampleBean();
        bean.setDoubleVal((long)99.9999999);
        
        try{
            double doubleVal = BeanUtil.getDoubleValue(bean, "doubleVal");
            if( doubleVal != bean.getDoubleVal() ){
                fail("doubleVal不一致");
            }
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetDoubleValue()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetFloat(){
        SampleBean bean = new SampleBean();
        bean.setFloatVal((long)99.999);
        
        try{
            float floatVal = ((Float)BeanUtil.getProperty(bean, "floatVal")).floatValue();
            if( floatVal != bean.getFloatVal() ){
                fail("floatVal不一致");
            }
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetFloat2(){
        SampleBean bean = new SampleBean();
        bean.setFloatVal((long)99.999);
        
        try{
            float floatVal = BeanUtil.getFloatValue(bean, "floatVal");
            if( floatVal != bean.getFloatVal() ){
                fail("floatVal不一致");
            }
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetFloatValue()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetBoolean(){
        SampleBean bean = new SampleBean();
        bean.setBoolVal(true);
        
        try{
            boolean boolVal = ((Boolean)BeanUtil.getProperty(bean, "boolVal")).booleanValue();
            if( boolVal != bean.getBoolVal() ){
                fail("boolVal不一致");
            }
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetProperty()で例外が発生：" + bre.getMessage());
        }
    }
    
    public void testGetBoolean2(){
        SampleBean bean = new SampleBean();
        bean.setBoolVal(true);
        
        try{
            boolean boolVal = BeanUtil.getBooleanValue(bean, "boolVal");
            if( boolVal != bean.getBoolVal() ){
                fail("boolVal不一致");
            }
        }catch( BeanUtilRuntimeException bre ){
            fail("SampleBeanのgetProperty()で例外が発生：" + bre.getMessage());
        }
    }
        
    public void testSetIntNG() {
        SampleBean bean = new SampleBean();
        
        try{
            BeanUtil.setProperty(bean, "ngId", "1");
            fail("セットされてはいけないプロパティがセットされた.");
        }catch( BeanUtilRuntimeException bre ){
            //System.out.println("ＯＫ：意図する例外を検知した");
        }
    }
    
    public void testGetIntNG() {
        SampleBean bean = new SampleBean();
        bean.setId(1);
        
        try{
            int id = ((Integer)BeanUtil.getProperty(bean, "ngId")).intValue();
            fail("セットされてはいけないプロパティがセットされた.");
        }catch( BeanUtilRuntimeException bre ){
            //System.out.println("ＯＫ：意図する例外を検知した");
        }
    }
    
    public void tearDown() {
        // ここはこのテストプログラムの終了処理を書きたければ書きます。
    }
	public static Test suite() {
		return new TestSuite(BeanTest.class);
	}

}

