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

import jp.co.cybec.cb3.exception.MessageResourceException;
import jp.co.cybec.cb3.util.logging.LogMessageConstant;
import jp.co.cybec.cb3.util.logging.LogMessageFactory;
import jp.co.cybec.cb3.util.logging.LogMessageIdentifier;
import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

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

	private static String MESSAGE_FILENAME = "jp/co/cybec/cb3/util/LogMessageFactory/" + LogMessageConstant.CB3_MESSAGE_FILENAME;

	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
	}

	/**
	 * {@link jp.co.cybec.cb3.util.logging.LogMessageFactory#LogMessageFactory(java.lang.String)} のためのテスト・メソッド。
	 * 存在しないプロパティファイルを指定したとき、適切な例外が発生することを確認する。
	 */
	@Test
	public void testLogMessageFileNotFound() {
		try {
			// コンストラクタに存在しないファイル名を指定。
			new LogMessageFactory("dummy");
			// 例外が発生しなかった場合、テスト失敗。
			Assert.fail();
		} catch (MessageResourceException e) {
			// 想定通り。
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.util.logging.LogMessageFactory#getMessage(java.lang.String)} のためのテスト・メソッド。
	 * メッセージを取得できることを確認する。
	 */
	@Test
	public void testGetMessageString() {
		LogMessageFactory MESSAGE = new LogMessageFactory(MESSAGE_FILENAME);
		String message = MESSAGE.getMessage("CB3.UTIL.001");
		String expected = "MessageID:[CB3.UTIL.001] パラメータのないメッセージ。";
		Assert.assertTrue(message.indexOf(expected) > -1);
	}

	/**
	 * {@link jp.co.cybec.cb3.util.logging.LogMessageFactory#getMessage(java.lang.String)} のためのテスト・メソッド。
	 * プロパティファイルに存在しないメッセージIDを指定したとき、メッセージが取得できない旨のメッセージが取得できることを確認する。
	 */
	@Test
	public void testGetMessageStringIDNotFound() {
		LogMessageFactory MESSAGE = new LogMessageFactory(MESSAGE_FILENAME);
		// 存在しないIDを指定。
		String message = MESSAGE.getMessage("CB3.UTIL.999");
		Assert.assertEquals(
			"メッセージID[CB3.UTIL.999]が[" + MESSAGE_FILENAME + ".properties]上に見つかりません。",
			message);
	}

	/**
	 * {@link jp.co.cybec.cb3.util.logging.LogMessageFactory#getMessage(java.lang.String, java.lang.Object[])} のためのテスト・メソッド。
	 * メッセージを取得できることを確認する。
	 */
	@Test
	public void testGetMessageStringObjectArray() {
		LogMessageFactory MESSAGE = new LogMessageFactory(MESSAGE_FILENAME);
		String message = MESSAGE.getMessage("CB3.UTIL.002", "value1", 123);
		String expected = "MessageID:[CB3.UTIL.002] パラメータのあるメッセージ。param1=value1,param2=123";
		Assert.assertTrue(message.indexOf(expected) > -1);
	}

	/**
	 * {@link jp.co.cybec.cb3.util.logging.LogMessageFactory#getMessage(java.lang.String)} のためのテスト・メソッド。
	 * メッセージ識別子が追加されたメッセージを取得できることを確認する。（Advancedパッケージ形式）
	 */
	@Test
	public void testGetMessageIdentifierStringAdvancedFormat() {
		LogMessageIdentifier.setJobProcessId("123");
		LogMessageIdentifier.setJobId("456");
		LogMessageIdentifier.setTaskId("789");
		LogMessageIdentifier.setServiceId("abc");
		LogMessageFactory MESSAGE = new LogMessageFactory(MESSAGE_FILENAME);
		String message = MESSAGE.getMessage("CB3.UTIL.001");
		Assert.assertEquals("JobProcessID:[123] JobID:[456] TaskID:[789] ServiceID:[abc] MessageID:[CB3.UTIL.001] パラメータのないメッセージ。", message);
		LogMessageIdentifier.setJobProcessId(null);
		LogMessageIdentifier.setJobId(null);
		LogMessageIdentifier.setTaskId(null);
		LogMessageIdentifier.setServiceId(null);
	}

	/**
	 * {@link jp.co.cybec.cb3.util.logging.LogMessageFactory#getMessage(java.lang.String)} のためのテスト・メソッド。
	 * メッセージ識別子が追加されたメッセージを取得できることを確認する。（Coreパッケージ形式）
	 */
	@Test
	public void testGetMessageIdentifierStringCoreFormat() {
		LogMessageIdentifier.setJobProcessId("123");
		LogMessageIdentifier.setJobId(null);
		LogMessageIdentifier.setTaskId(null);
		LogMessageIdentifier.setServiceId("abc");
		LogMessageFactory MESSAGE = new LogMessageFactory(MESSAGE_FILENAME);
		String message = MESSAGE.getMessage("CB3.UTIL.001");
		Assert.assertEquals("JobProcessID:[123] ServiceID:[abc] MessageID:[CB3.UTIL.001] パラメータのないメッセージ。", message);
		LogMessageIdentifier.setJobProcessId(null);
		LogMessageIdentifier.setJobId(null);
		LogMessageIdentifier.setTaskId(null);
		LogMessageIdentifier.setServiceId(null);
	}

	/**
	 * {@link jp.co.cybec.cb3.util.logging.LogMessageFactory#getMessage(java.lang.String, java.lang.Object[])} のためのテスト・メソッド。
	 * メッセージ識別子が追加されたメッセージを取得できることを確認する。（Advancedパッケージ形式）
	 */
	@Test
	public void testGetMessageIdentifierStringObjectArrayAdvancedFormat() {
		LogMessageIdentifier.setJobProcessId("123");
		LogMessageIdentifier.setJobId("456");
		LogMessageIdentifier.setTaskId("789");
		LogMessageIdentifier.setServiceId("abc");
		LogMessageFactory MESSAGE = new LogMessageFactory(MESSAGE_FILENAME);
		String message = MESSAGE.getMessage("CB3.UTIL.002", "value1", 123);
		Assert.assertEquals("JobProcessID:[123] JobID:[456] TaskID:[789] ServiceID:[abc] MessageID:[CB3.UTIL.002] パラメータのあるメッセージ。param1=value1,param2=123", message);
		LogMessageIdentifier.setJobProcessId(null);
		LogMessageIdentifier.setJobId(null);
		LogMessageIdentifier.setTaskId(null);
		LogMessageIdentifier.setServiceId(null);
	}

	/**
	 * {@link jp.co.cybec.cb3.util.logging.LogMessageFactory#getMessage(java.lang.String, java.lang.Object[])} のためのテスト・メソッド。
	 * メッセージ識別子が追加されたメッセージを取得できることを確認する。（Coreパッケージ形式）
	 */
	@Test
	public void testGetMessageIdentifierStringObjectArrayCoreFormat() {
		LogMessageIdentifier.setJobProcessId("123");
		LogMessageIdentifier.setJobId(null);
		LogMessageIdentifier.setTaskId(null);
		LogMessageIdentifier.setServiceId("abc");
		LogMessageFactory MESSAGE = new LogMessageFactory(MESSAGE_FILENAME);
		String message = MESSAGE.getMessage("CB3.UTIL.002", "value1", 123);
		Assert.assertEquals("JobProcessID:[123] ServiceID:[abc] MessageID:[CB3.UTIL.002] パラメータのあるメッセージ。param1=value1,param2=123", message);
		LogMessageIdentifier.setJobProcessId(null);
		LogMessageIdentifier.setJobId(null);
		LogMessageIdentifier.setTaskId(null);
		LogMessageIdentifier.setServiceId(null);
	}

}
