// ================================================================================================
//
// Translatorのテストクラスソース。
//
//
// Copyright (C) 2012 Honeplus. All rights reserved.
//
// Honeplus
// ================================================================================================
namespace Honememo.Wptscs.Logics
{
using System;
using System.Collections.Generic;
using Honememo.Wptscs.Models;
using Honememo.Wptscs.Websites;
using NUnit.Framework;
///
/// のテストクラスです。
///
[TestFixture]
class TranslatorTest
{
#region プロパティテストケース
///
/// プロパティテストケース。
///
[Test]
public void TestItemTable()
{
// 初期状態がnull、設定すればそのオブジェクトが返されること
TranslatorMock translator = new TranslatorMock();
Assert.IsNull(translator.ItemTable);
TranslationDictionary table = new TranslationDictionary("en", "ja");
translator.ItemTable = table;
Assert.AreSame(table, translator.ItemTable);
}
///
/// プロパティテストケース。
///
[Test]
public void TestHeadingTable()
{
// 初期状態がnull、設定すればそのオブジェクトが返されること
TranslatorMock translator = new TranslatorMock();
Assert.IsNull(translator.HeadingTable);
TranslationTable table = new TranslationTable();
translator.HeadingTable = table;
Assert.AreSame(table, translator.HeadingTable);
}
///
/// プロパティテストケース。
///
[Test]
public void TestLog()
{
// 初期状態は空
TranslatorMock translator = new TranslatorMock();
Assert.IsEmpty(translator.Log);
// 更新時にLogUpdateイベントが実行されること
int count = 0;
translator.LogUpdated += new EventHandler((object sender, EventArgs e) => { ++count; });
Assert.AreEqual(0, count);
translator.Logger.AddMessage("ログ");
Assert.AreEqual(1, count);
Assert.AreEqual("ログ" + Environment.NewLine, translator.Log);
translator.Logger.AddMessage("add");
Assert.AreEqual(2, count);
Assert.AreEqual("ログ" + Environment.NewLine + "add" + Environment.NewLine, translator.Log);
}
///
/// プロパティテストケース。
///
[Test]
public void TestText()
{
// 初期状態は空
TranslatorMock translator = new TranslatorMock();
Assert.IsEmpty(translator.Text);
// null設定時は空白が設定されること、それ以外はそのまま
translator.Text = null;
Assert.IsEmpty(translator.Text);
translator.Text = "test";
Assert.AreEqual("test", translator.Text);
}
///
/// プロパティテストケース。
///
[Test]
public void TestCancellationPending()
{
// 初期状態はfalse、設定すればそのオブジェクトが返されること
TranslatorMock translator = new TranslatorMock();
Assert.IsFalse(translator.CancellationPending);
translator.CancellationPending = true;
Assert.IsTrue(translator.CancellationPending);
translator.CancellationPending = false;
Assert.IsFalse(translator.CancellationPending);
}
///
/// プロパティテストケース。
///
[Test]
public void TestFrom()
{
// 初期状態がnull、設定すればそのオブジェクトが返されること
TranslatorMock translator = new TranslatorMock();
Assert.IsNull(translator.From);
WebsiteMock website = new WebsiteMock();
translator.From = website;
Assert.AreSame(website, translator.From);
}
///
/// プロパティテストケース。
///
[Test]
public void TestTo()
{
// 初期状態がnull、設定すればそのオブジェクトが返されること
TranslatorMock translator = new TranslatorMock();
Assert.IsNull(translator.To);
WebsiteMock website = new WebsiteMock();
translator.To = website;
Assert.AreSame(website, translator.To);
}
#endregion
#region 静的メソッドテストケース
///
/// メソッドテストケース。
///
[Test]
public void TestCreate()
{
// コンフィグの情報から対応するトランスレータが生成されること
Translator translator = Translator.Create(new MockFactory().GetConfig(), "en", "ja");
Assert.IsNotNull(translator);
Assert.IsInstanceOf(typeof(MediaWikiTranslator), translator);
Assert.IsNotNull(translator.From);
Assert.AreEqual("en", translator.From.Language.Code);
Assert.IsNotNull(translator.To);
Assert.AreEqual("ja", translator.To.Language.Code);
Assert.IsNotNull(translator.ItemTable);
Assert.AreEqual("en", translator.ItemTable.From);
Assert.AreEqual("ja", translator.ItemTable.To);
Assert.IsNotNull(translator.HeadingTable);
Assert.AreEqual("en", translator.HeadingTable.From);
Assert.AreEqual("ja", translator.HeadingTable.To);
}
///
/// メソッドテストケース(未対応のトランスレータクラス)。
///
[Test]
[ExpectedException(typeof(NotImplementedException))]
public void TestCreateUnsupportedConstructor()
{
// コンフィグに引数無しのコンストラクタを持たないトランスレータクラス
// が指定されていない場合、例外となること
Config config = new MockFactory().GetConfig();
config.Translator = typeof(TranslatorIgnoreMock);
Translator.Create(config, "en", "ja");
}
///
/// メソッドテストケース(トランスレータクラス以外の指定)。
///
[Test]
[ExpectedException(typeof(InvalidCastException))]
public void TestCreateIgnoreConstructor()
{
// コンフィグに引数無しのコンストラクタを持たないトランスレータクラス
// が指定されていない場合、例外となること
Config config = new MockFactory().GetConfig();
config.Translator = this.GetType();
Translator.Create(config, "en", "ja");
}
#endregion
#region publicメソッドテストケース
///
/// メソッドテストケース。
///
[Test]
public void TestRun()
{
TranslatorMock translator = new TranslatorMock();
translator.From = new WebsiteMock();
translator.From.Location = "file://";
translator.To = new WebsiteMock();
// 正常に実行が行えること
// また、実行ごとに結果が初期化されること
translator.Run("test");
Assert.IsEmpty(translator.Log);
Assert.IsEmpty(translator.Text);
translator.Logger.AddMessage("testlog");
translator.Text = "testtext";
translator.Run("test");
Assert.IsEmpty(translator.Log);
Assert.IsEmpty(translator.Text);
// 失敗はApplicationExceptionで表現、RunBodyから例外が投げられること
translator.Logger.AddMessage("testlog");
translator.Text = "testtext";
translator.Exception = true;
try
{
translator.Run("test");
Assert.Fail();
}
catch (ApplicationException e)
{
Assert.AreEqual("Dummy", e.Message);
}
Assert.IsEmpty(translator.Log);
Assert.IsEmpty(translator.Text);
}
///
/// メソッドテストケース(必須パラメータ未設定)。
///
[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void TestRunLangEmpty()
{
// From, To が未設定の場合処理不能
new TranslatorMock().Run("test");
}
///
/// メソッドテストケース(ping成功)。
///
[Test]
public void TestRunPing()
{
TranslatorMock translator = new TranslatorMock();
translator.From = new WebsiteMock();
translator.To = new WebsiteMock();
// Fromにホストが指定されている場合、pingチェックが行われる
translator.From.Location = "http://localhost";
translator.Run("test");
}
///
/// メソッドテストケース(ping失敗)。
///
[Test]
[ExpectedException(typeof(ApplicationException))]
public void TestRunPingFailed()
{
TranslatorMock translator = new TranslatorMock();
translator.From = new WebsiteMock();
translator.To = new WebsiteMock();
// Fromにホストが指定されている場合、pingチェックが行われる
translator.From.Location = "http://xxx.invalid";
translator.Run("test");
}
#endregion
#region モッククラス
///
/// テスト用のモッククラスです。
///
private class TranslatorMock : Translator
{
#region テスト支援用プロパティ
///
/// で例外を投げるか?
///
public bool Exception
{
get;
set;
}
#endregion
#region 非公開プロパティテスト用のオーラーライドプロパティ
///
/// ログテキスト生成用ロガー。
///
public new Logger Logger
{
get
{
return base.Logger;
}
set
{
base.Logger = value;
}
}
///
/// 変換後テキスト。
///
public new string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}
#endregion
#region ダミーメソッド
///
/// 翻訳支援処理実行部の本体。
///
/// 記事名。
protected override void RunBody(string name)
{
if (this.Exception)
{
throw new ApplicationException("Dummy");
}
}
#endregion
}
///
/// テスト用のモッククラスです。
///
private class TranslatorIgnoreMock : Translator
{
#region コンストラクタ
///
/// デフォルトコンストラクタを隠すためのダミーコンストラクタ。
///
/// ダミー。
public TranslatorIgnoreMock(string dummy)
{
}
#endregion
#region ダミーメソッド
///
/// 翻訳支援処理実行部の本体。
///
/// 記事名。
protected override void RunBody(string name)
{
}
#endregion
}
///
/// テスト用のモッククラスです。
///
private class WebsiteMock : Website
{
#region ダミーメソッド
///
/// ページを取得。
///
/// ページタイトル。
/// 取得したページ。
/// 取得できない場合(通信エラーなど)は例外を投げる。
public override Page GetPage(string title)
{
return null;
}
#endregion
}
#endregion
}
}