package test.org.itscool.commons.pool;

import junit.framework.TestCase;

import org.itscool.commons.pool.ObjectPool;
import org.itscool.commons.pool.ObjectPoolEventListener;
import org.itscool.commons.pool.ObjectPoolRuntimeException;

public class ObjectPool2Test extends TestCase implements ObjectPoolEventListener{
	ObjectPool pool = null;
	int id = 0;
	
	public ObjectPool2Test(){
		/* プールの初期サイズ=1 最大サイズ=2のプールを作成 */
		pool = new ObjectPool(this, 1, 2);
		/* オブジェクトを一つだけ生成しプールにセット */
		pool.addNewElement(String.valueOf(++id));
	}
	
	/**
	 * プールからオブジェクトを一つだけ取得
	 */
	public void testGetElement(){
		Object elem = pool.getElement();
		assertNotNull(elem);
		assertEquals(elem.toString(), "1");
		pool.returnElement(elem);
	}
	
	/**
	 * プールからオブジェクトを二つ連続で取得
	 * 二つ目はdoMissingElementEvent()イベント内で新規に
	 * 作成されたものを取得する事
	 */
	public void testGetElement2(){
		Object elem = pool.getElement();
		assertNotNull(elem);
		assertEquals(elem.toString(), "1");
		Object elem2 = pool.getElement();
		assertNotNull(elem2);
		assertEquals(elem2.toString(), "2");
		pool.returnElement(elem);
		pool.returnElement(elem2);
	}
	
	/**
	 * プールからオブジェクトを三つ連続で取得
	 * プールの最大値は２つなので3回目のgetElementで
	 * ObjectPoolRuntimeExceptionが発生する事
	 */
	public void testGetElement3(){
		try{
			pool.getElement();
			pool.getElement();
			Object elem = pool.getElement();
			fail("??? "+ elem.toString());
		}catch(ObjectPoolRuntimeException e){
			//OK!
		}
	}
	
	public void doReleaseElementEvent(Object obj){
		
	}
	
	public Object doMissingElementEvent(){
		String str = String.valueOf(++id);
		return str;
	}
}