package test.org.itscool.commons.file;

import java.io.IOException;

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

import org.itscool.commons.property.HexPropertyFile;

/**
 * @author kano
 *
 * 作成日： 2005/01/12
 */
public class HexPropertyFileTest extends TestCase{
    private HexPropertyFile file;
    
//     2. 引数にStringを取るコンストラクタを定義する
    public HexPropertyFileTest(String name) {
        super(name);
    }
    
//  3. テスト準備を行うsetUpメソッドを記述する
    protected void setUp() throws Exception {
        file = new HexPropertyFile("testBinaryFile.dat");
    }
    
    /**
     * データ登録テスト
    */
    public void testWriteHex(){
        String data = "さんぷるデータ";
        
        try{
            file.removeAll();
            boolean ret = file.writeHex("key", data.getBytes() ,false);
            assertEquals("重複データが存在します", ret, true);
            assertEquals("データ追加が反映されていません", file.size(), 1);
        }catch(IOException ioe){
            fail(ioe.getMessage());
        }
    }
    
    /**
     * データ重複テスト
    */
    public void testWriteHex2(){
        String data = "さんぷるデータ";
        
        try{
            file.removeAll();
            boolean ret = file.writeHex("key", data.getBytes() ,false);
            ret = file.writeHex("key", data.getBytes() ,true);
            assertEquals("write()の結果がtrueで返されました", ret, false);
            if( file.size() == 2 ){
                fail("重複データが追加されています");
            }
        }catch(IOException ioe){
            fail(ioe.getMessage());
        }
    }
    
    /**
     * データ読み込みテスト（存在するデータをロード）
    */
    public void testReadHex(){
        String data = "さんぷるでーた";
        try{
            file.removeAll();
            boolean ret = file.writeHex("key", data.getBytes() ,false);
            assertEquals("重複データが存在します", ret, true);
            byte[] readData = file.readHex("key");
        
            assertNotNull("readBytes()でNULLを返した", readData);
            assertEquals("データ追加が反映されていません", file.size(), 1);
            assertEquals("取得データが違います", new String(readData), data);
        }catch(IOException ioe){
            fail(ioe.getMessage());
        }
    }
    
    /**
     * データ読み込みテスト（存在しないデータをロード）
    */
    public void testReadHex2(){
        String data = "さんぷるでーた";
        try{
            file.removeAll();
            boolean ret = file.writeHex("key", data.getBytes() ,false);
            assertEquals("重複データが存在します", ret, true);
            byte[] readData = file.readHex("あああああああああ");
            
            assertNull("readBytes()でNULL以外の値を返した", readData);
            
        }catch(IOException ioe){
            fail(ioe.getMessage());
        }
    }
    
    /**
     * 複数のデータを登録/読み込み
    */
    public void testMore(){
        String data = "data";
        //String key = "key";
        boolean append = true;
        int max = 30;
        file.removeAll();
        
        for(int i=0; i<max; i++ ){
            try{
                String buf = data + i;
                boolean ret = file.writeHex("key"+i, buf.getBytes(), append);
                assertEquals("登録失敗：重複データが存在します", ret, true);
                append = true;
            }catch(IOException ioe){
                fail("登録失敗："+ioe.getMessage());
            }
        }
        
        assertEquals("データの登録件数不一致", file.size(), max);
        
        for(int i=0; i<max; i++ ){
            byte[] readData = file.readHex("key"+i);
            
            assertNotNull("readBytes()でNULLを返した", readData);
            assertEquals("取得データが違います", new String(readData), (data+i));
            
        }
    }

    /**
     * writeメソッドによるHex以外の値を書き込むテスト
     */
    public void testWrite(){
        String data = "さんぷるデータ";
        
        try{
            file.removeAll();
            boolean ret = file.write("key", data ,false);
            assertEquals("write()の結果がfalseで返されました", ret, true);
        }catch(IOException ioe){
            fail(ioe.getMessage());
        }
    }
    
    /**
     * Hex以外のプロパティをreadHex()で読み込むテスト
     */
    public void testReadHexNotHex(){
        String data = "sampledata";
        
        try{
            file.removeAll();
            //Hexにせず、そのままのデータを書き込む
            boolean ret = file.write("key", data ,false);
            assertEquals("write()の結果がfalseで返されました", ret, true);
        }catch(IOException ioe){
            fail("write()でエラーが発生しました" + ioe.getMessage());
        }
        
        //Hexでデータを取得
        byte[] readData = file.readHex("key");
        String readStr = "";
        readStr = new String(readData);
        
        //System.out.println("readHex()の結果：" + readData);
        //System.out.println("readHex()をString：" + readStr);
        assertEquals("readHex()の結果が違います", data, readStr);
        
    }
    
    public void tearDown() {
        // ここはこのテストプログラムの終了処理を書きたければ書きます。
        file.removeAll();
        file = null;
    }
	public static Test suite() {
		return new TestSuite(HexPropertyFileTest.class);
	}

}
