/**
 * $Id: ReadWriteBufferTest.java,v 1.1 2005/04/30 14:40:24 rampil Exp $
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.common.net;

import junit.framework.TestCase;

/**
 * ReadWriteBufferクラスのテストコード
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public class ReadWriteBufferTest extends TestCase {
	/**
	 * 領域拡張なし状態の読み書きテスト
	 */
	public void testReadWriteWithoutExpand() {
		ReadWriteBuffer rwb = new ReadWriteBuffer();
		rwb.write("ABCDEFG");
		byte[] buf = new byte["ABCDEFG".length()];

		// 7バイトの読み込みに成功するかどうか
		assertEquals(7, rwb.read(buf));
		// 取得したバイト列を文字列に変換して一致するかどうか
		assertEquals("ABCDEFG", new String(buf));
	}
	/**
	 * バッファの最後まで読み込んでさらに読み込んだ場合のエラーのテスト
	 * (1) バッファに何もないのにいきなりread()
	 * (2) バッファにいっぱい書きこんである状態でread()
	 */
	public void testReadError() {
		ReadWriteBuffer rwb = new ReadWriteBuffer(10);
		// 何もない状態でいきなりread()
		assertEquals(-1, rwb.read());

		rwb.write(new byte[]{1,2,3,4,5});
		// 5回までは正しく読める
		for(int i = 0; i < 5; i++) {
			assertTrue(-1 != rwb.read());
		}
		// 6回目は読み込みに失敗する
		assertEquals(-1, rwb.read());

		byte[] buf = new byte[4];
		rwb.write(new byte[]{11,12});
		// 2バイト追加したので2バイトだけ読める
		assertEquals(2, rwb.read(buf));
		assertEquals(11, buf[0]);
		assertEquals(12, buf[1]);
		assertEquals(0, buf[2]);				// 何も格納されなかった
		assertEquals(0, buf[3]);				// 何も格納されなかった

		// さらに読もうとするとリードエラー
		assertEquals(-1, rwb.read());
	}
	/**
	 * 領域拡張のテスト
	 */
	public void testWriteWithExpand() {
		ReadWriteBuffer rwb = new ReadWriteBuffer(4);
		// 領域拡張が発生する書き込み(2block追加)
		rwb.write("123456789");
		byte[] buf = new byte["123456789".length()];
		assertEquals(9, rwb.read(buf));
		assertEquals("123456789", new String(buf));
	}
	/**
	 * 領域縮小のテスト
	 */
	public void testReadWithReduce() {
		ReadWriteBuffer rwb = new ReadWriteBuffer(4);
		// 5回ほどテストを繰り返す
		for(int i = 0; i < 5; i++) {
			// 領域拡張を発生させる
			rwb.write("12345678901234567890");
			// 適当に読み込む(領域縮小が発生する程度に)
			byte[] buf = new byte[13];
			assertEquals(13, rwb.read(buf));
			assertEquals("1234567890123", new String(buf));
			// 書き込む
			rwb.write("abcdefg");
			// 全部読み込む
			buf = new byte[14];
			assertEquals(14, rwb.read(buf));
			assertEquals("4567890abcdefg", new String(buf));
		}
	}
}
