// ================================================================================================ // // 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 } }