/**
 * LOGICAL-PARADOX.ORG variable record manager library
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 * Release 1.0
 * ・初期パージョン
 */
package org.logical_paradox.common.vrm;

import java.util.Random;

import org.logical_paradox.common.lang.StringByteStream;
import org.logical_paradox.common.util.StringUtils;

import junit.framework.TestCase;

/**
 * 可変長レコードファイル管理クラスのテスト
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version 1.0
 */
public class VariableRecordManagerTest extends TestCase {

	// 入出力のテスト
	public void testInOut() throws Exception {
		VariableRecordManagerMoc manager = new VariableRecordManagerMoc("sample", RecordFactory.getInstance());
		manager.open();

		manager.insert(new StringRecord("ああああああ"));
		manager.insert(new StringRecord("いいいい"));
		manager.insert(new StringRecord("うう"));
		manager.insert(new StringRecord("え"));
		manager.insert(new StringRecord("お"));

		manager.close();
	}
	// レコード再利用のテスト
	public void testReuse() throws Exception {
		VariableRecordManagerMoc manager = new VariableRecordManagerMoc("sample", RecordFactory.getInstance());
		manager.open();

		manager.insert(new StringRecord("ああああああ"));
		manager.insert(new StringRecord("いいいい"));
		manager.insert(new StringRecord("うう"));
		manager.insert(new StringRecord("え"));

		manager.delete(0);
		long rno = manager.insert(new StringRecord("お"));

		assertEquals("レコードの再利用に問題があった", 0, rno);
		manager.close();
	}
	// レコードのランダムな出し入れによるレコード整合性のテスト
	public void testAvailability() throws Exception {
		VariableRecordManagerMoc manager = new VariableRecordManagerMoc("sample", RecordFactory.getInstance());
		manager.open();

		Long[] recordNumbers = null;

		Random rand = new Random();

		for(int i = 0; i < 100; i++) {
			// ランダムな長さの文字列でデータを生成する
			// ランダムな文字列は8文字以内とする
			String generatedString = StringUtils.randomText(8, false);
//System.out.println(generatedString);
			manager.insert(new StringRecord(generatedString));

			if(rand.nextInt(100) < 30) {
				// 30%の確率で，適当なレコードを取り出して削除する
				recordNumbers = (Long[])manager.getRecordNumbers().toArray(new Long[0]);
				long removeTarget = recordNumbers[rand.nextInt(recordNumbers.length)].longValue();

				manager.delete(removeTarget);
			}
		}

		/*
		 * レコードの妥当性を判定する
		 */
		recordNumbers = (Long[])manager.getRecordNumbers().toArray(new Long[0]);
		for(int cnt = 0; cnt < recordNumbers.length; cnt++) {
			long rno = recordNumbers[cnt].longValue();
			Record r = manager.get(rno);

			System.out.println(r.getObject());
			StringByteStream strb = (StringByteStream)r.getObject();
			String str = strb.getStringObject();

			// 1文字以上8文字以内のはずである
			assertTrue("レコードがどうもおかしい", str.length() >= 1 && str.length() <= 8);
		}
		manager.close();
	}
}
