/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: ParserTest.java,v 1.1 2005/05/31 14:38:20 rampil Exp $
 */
package org.logical_paradox.koike.core.parser;

import java.util.Iterator;

import junit.framework.TestCase;

/**
 * n-gramパーザーのテスト
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public class ParserTest extends TestCase {

	/**
	 * Constructor for ParserTest.
	 * @param arg0
	 */
	public ParserTest(String arg0) {
		super(arg0);
	}
	/**
	 * n-gram数に対してテキストが短い場合のテスト
	 */
	public void testTooShortDocument() throws ParserException {
		String text = "n-gram数に対して";

		Parser p = new Parser(12);
		try {
			p.parse(text);
			fail();
		} catch(ParserException e) {
			// OK
		}

		p = new Parser(11);
		p.parse(text);
	}
	/**
	 * n-gram分割のテスト
	 * @throws ParserException 分割処理中に発生した例外
	 */
	public void testParserResult() throws ParserException {
		String text = "分割処理中に発生した例外処理";

		Term[] terms = new Parser(2).parse(text);

		assertTrue(contains(terms, "分割"));
		assertTrue(contains(terms, "割処"));
		assertTrue(contains(terms, "処理"));
		assertTrue(contains(terms, "理中"));
		assertTrue(contains(terms, "中に"));
		assertTrue(contains(terms, "に発"));
		assertTrue(contains(terms, "発生"));
		assertTrue(contains(terms, "生し"));
		assertTrue(contains(terms, "した"));
		assertTrue(contains(terms, "た例"));
		assertTrue(contains(terms, "例外"));
		assertTrue(contains(terms, "外処"));

		assertEquals(12, terms.length);

		Term term = getTerm(terms, "処理");
		Iterator it = term.iterator();

		assertTrue(it.hasNext());
		assertEquals(2, ((Integer)it.next()).intValue());
		assertTrue(it.hasNext());
		assertEquals(12, ((Integer)it.next()).intValue());
		assertFalse(it.hasNext());
	}
	/**
	 * 指定配列中に指定した索引語が格納されているかどうかを返す
	 * @param base 検索対象の配列
	 * @param term 探しだす索引語
	 * @return 検索された索引語
	 */
	protected Term getTerm(Term[] base, String term) {
		for(int i = 0; i < base.length; i++) {
			if(base[i].getTerm().equals(term)) {
				return base[i];
			}
		}
		return null;
	}
	/**
	 * 指定された辞書内に、索引語が含まれているかどうかを返す
	 * @param base 辞書としての配列
	 * @param term 索引語
	 * @return true:ある / false:ない
	 */
	protected boolean contains(Term[] base, String term) {
		return getTerm(base, term) != null;
	}
}
