/*
 * RuntimeArgumentsAnalyzerTest.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.session;


import jp.co.cybec.cb3.exception.RuntimeArgumentsAnalyzeException;
import jp.co.cybec.cb3.session.RuntimeArgumentsAnalyzer;
import jp.co.cybec.cb3.session.RuntimeParameters;
import junit.framework.Assert;

import org.junit.Test;

/**
 * RuntimeArgumentsAnalyzerのテストケース。
 * @author Naoko Sugimoto
 */
public class RuntimeArgumentsAnalyzerTest {

	/**
	 * {@link jp.co.cybec.cb3.session.RuntimeArgumentsAnalyzer#RuntimeArgumentsAnalyzer(String[], String...)} のためのテスト・メソッド。
	 * 想定どおりの引数が渡された場合のテスト。
	 */
	@Test
	public void testNomalParameters() {

		String[] argument = new String[]{
				"-ReserveKey1", "reserveValue1", "-ReserveKey2", "reserveValue2", "-AppParams", "key1=value1", "key2="
		};
		// RuntimeArgumentsAnalyzerを生成。
		RuntimeArgumentsAnalyzer analyzer = new RuntimeArgumentsAnalyzer(argument, "-ReserveKey1", "-ReserveKey2");

		// 起動パラメータ（予約分）が正しく取得できていることを確認。
		Assert.assertEquals("reserveValue1", analyzer.getReservedParameter("-ReserveKey1"));
		Assert.assertEquals("reserveValue2", analyzer.getReservedParameter("-ReserveKey2"));
		// 起動パラメータ（任意分）が正しく取得できていることを確認。
		RuntimeParameters runtimeParameters = analyzer.getRuntimeParameters();
		Assert.assertEquals("value1", runtimeParameters.get("key1"));
		Assert.assertEquals("", runtimeParameters.get("key2"));
	}

	/**
	 * {@link jp.co.cybec.cb3.session.RuntimeArgumentsAnalyzer#RuntimeArgumentsAnalyzer(String[], String...)} のためのテスト・メソッド。
	 * 想定どおりの引数が渡された場合のテスト。
	 * 「-AppParams」を使用しない場合。
	 */
	@Test
	public void testNomalParametersWithoutAppParam() {

		String[] argument = new String[]{
				"-key1", "value1", "-key2", "-123"
		};
		// RuntimeArgumentsAnalyzerを生成。
		RuntimeArgumentsAnalyzer analyzer = new RuntimeArgumentsAnalyzer(argument, "-key1", "-key2");

		// 予約パラメータが正しく取得できていることを確認。
		Assert.assertEquals("value1", analyzer.getReservedParameter("-key1"));
		Assert.assertEquals("-123", analyzer.getReservedParameter("-key2"));
	}

	/**
	 * {@link jp.co.cybec.cb3.session.RuntimeArgumentsAnalyzer#RuntimeArgumentsAnalyzer(String[], String...)} のためのテスト・メソッド。
	 * 不正な引数が渡された場合のテスト。
	 * 値指定のない予約キーが渡された場合、適切な例外が発生することを確認。
	 * 例）「-key1 -key2 value2」
	 *     「-key1 value1 -key2」
	 *     「-key1 value1 -key2 -AppParam parameter1」
	 */
	@Test
	public void testNoValueParameters() {
		String[] argument = new String[]{
				"-key1", "-key2", "value2"
		};
		try {
			// RuntimeArgumentsAnalyzerを生成。
			new RuntimeArgumentsAnalyzer(argument, "-key1", "-key2");
			// 例外が発生しなければテスト失敗
			Assert.fail();
		} catch (RuntimeArgumentsAnalyzeException e) {
			// 想定どおり
		}

		argument = new String[]{
				"-key1", "value1", "-key2"
		};
		try {
			// RuntimeArgumentsAnalyzerを生成。
			new RuntimeArgumentsAnalyzer(argument, "-key1", "-key2");
			// 例外が発生しなければテスト失敗
			Assert.fail();
		} catch (RuntimeArgumentsAnalyzeException e) {
			// 想定どおり
		}

		argument = new String[]{
				"-key1", "value1", "-key2", "-AppParam", "parameter1"
		};
		try {
			// RuntimeArgumentsAnalyzerを生成。
			new RuntimeArgumentsAnalyzer(argument, "-key1", "-key2");
			// 例外が発生しなければテスト失敗
			Assert.fail();
		} catch (RuntimeArgumentsAnalyzeException e) {
			// 想定どおり
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.session.RuntimeArgumentsAnalyzer#RuntimeArgumentsAnalyzer(String[], String...)} のためのテスト・メソッド。
	 * 不正な引数が渡された場合のテスト。
	 * キーのないパラメータ値が指定された場合、適切な例外が発生することを確認。
	 * 例）「value1 -key2 value2 」
	 *     「-key1 value1 value2」
	 */
	@Test(expected=RuntimeArgumentsAnalyzeException.class)
	public void testNoKeyParameters() {
		String[] argument = new String[]{
				"value1", "-key2", "value2"
		};
		try {
			// RuntimeArgumentsAnalyzerを生成。
			new RuntimeArgumentsAnalyzer(argument, "-key1", "-key2");
			// 例外が発生しなければテスト失敗
			Assert.fail();
		} catch (RuntimeArgumentsAnalyzeException e) {
			// 想定どおり
		}

		argument = new String[]{
				"-key1", "value1", "value2"
		};
		// RuntimeArgumentsAnalyzerを生成。
		new RuntimeArgumentsAnalyzer(argument, "-key1", "-key2");
	}

	/**
	 * {@link jp.co.cybec.cb3.session.RuntimeArgumentsAnalyzer#RuntimeArgumentsAnalyzer(String[], String...)} のためのテスト・メソッド。
	 * 不正な引数が渡された場合のテスト。
	 * 重複キーが指定された場合、適切な例外が発生することを確認。
	 * 例）「-key1 value1a -key2 value2 -key1 value1b」
	 */
	@Test(expected=RuntimeArgumentsAnalyzeException.class)
	public void testDuplicateKeyParameters() {
		String[] argument = new String[]{
				"-key1", "value1a", "-key2", "value2", "-key1", "value1b"
		};
		// RuntimeArgumentsAnalyzerを生成。
		new RuntimeArgumentsAnalyzer(argument, "-key1", "-key2", "-key3");
	}


	/**
	 * {@link jp.co.cybec.cb3.session.RuntimeArgumentsAnalyzer#RuntimeArgumentsAnalyzer(String[], String...)} のためのテスト・メソッド。
	 * 「-AppParams」に「key1=value1」の形式ではない引数が渡された場合のテスト。
	 * "="が含まれない引数が指定された場合、適切な例外が発生することを確認。
	 */
	@Test(expected=RuntimeArgumentsAnalyzeException.class)
	public void testBadAppParams() {

		String[] argument = new String[]{
				"-AppParams", "dummy"
		};
		// RuntimeArgumentsAnalyzerを生成。
		new RuntimeArgumentsAnalyzer(argument);
	}

}
