1 // ================================================================================================
3 // Translatorのテストクラスソース。</summary>
5 // <copyright file="TranslatorTest.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Wptscs.Logics
14 using System.Collections.Generic;
15 using Honememo.Wptscs.Models;
16 using Honememo.Wptscs.Websites;
17 using Microsoft.VisualStudio.TestTools.UnitTesting;
20 /// <see cref="Translator"/>のテストクラスです。
23 internal class TranslatorTest
28 /// <see cref="Translator.ItemTable"/>プロパティテストケース。
31 public void TestItemTable()
33 // 初期状態がnull、設定すればそのオブジェクトが返されること
34 TranslatorMock translator = new TranslatorMock();
35 Assert.IsNull(translator.ItemTable);
36 TranslationDictionary table = new TranslationDictionary("en", "ja");
37 translator.ItemTable = table;
38 Assert.AreSame(table, translator.ItemTable);
42 /// <see cref="Translator.HeadingTable"/>プロパティテストケース。
45 public void TestHeadingTable()
47 // 初期状態がnull、設定すればそのオブジェクトが返されること
48 TranslatorMock translator = new TranslatorMock();
49 Assert.IsNull(translator.HeadingTable);
50 TranslationTable table = new TranslationTable();
51 translator.HeadingTable = table;
52 Assert.AreSame(table, translator.HeadingTable);
56 /// <see cref="Translator.Log"/>プロパティテストケース。
62 TranslatorMock translator = new TranslatorMock();
63 Assert.AreEqual(string.Empty, translator.Log);
65 // 更新時にLogUpdateイベントが実行されること
67 translator.LogUpdated += new EventHandler((object sender, EventArgs e) => { ++count; });
68 Assert.AreEqual(0, count);
69 translator.Logger.AddMessage("ログ");
70 Assert.AreEqual(1, count);
71 Assert.AreEqual("ログ" + Environment.NewLine, translator.Log);
72 translator.Logger.AddMessage("add");
73 Assert.AreEqual(2, count);
74 Assert.AreEqual("ログ" + Environment.NewLine + "add" + Environment.NewLine, translator.Log);
78 /// <see cref="Translator.Text"/>プロパティテストケース。
81 public void TestText()
84 TranslatorMock translator = new TranslatorMock();
85 Assert.AreEqual(string.Empty, translator.Text);
87 // null設定時は空白が設定されること、それ以外はそのまま
88 translator.Text = null;
89 Assert.AreEqual(string.Empty, translator.Text);
90 translator.Text = "test";
91 Assert.AreEqual("test", translator.Text);
95 /// <see cref="Translator.CancellationPending"/>プロパティテストケース。
98 public void TestCancellationPending()
100 // 初期状態はfalse、設定すればそのオブジェクトが返されること
101 TranslatorMock translator = new TranslatorMock();
102 Assert.IsFalse(translator.CancellationPending);
103 translator.CancellationPending = true;
104 Assert.IsTrue(translator.CancellationPending);
105 translator.CancellationPending = false;
106 Assert.IsFalse(translator.CancellationPending);
110 /// <see cref="Translator.From"/>プロパティテストケース。
113 public void TestFrom()
115 // 初期状態がnull、設定すればそのオブジェクトが返されること
116 TranslatorMock translator = new TranslatorMock();
117 Assert.IsNull(translator.From);
118 WebsiteMock website = new WebsiteMock();
119 translator.From = website;
120 Assert.AreSame(website, translator.From);
124 /// <see cref="Translator.To"/>プロパティテストケース。
129 // 初期状態がnull、設定すればそのオブジェクトが返されること
130 TranslatorMock translator = new TranslatorMock();
131 Assert.IsNull(translator.To);
132 WebsiteMock website = new WebsiteMock();
133 translator.To = website;
134 Assert.AreSame(website, translator.To);
142 /// <see cref="Translator.Create"/>メソッドテストケース。
145 public void TestCreate()
147 // コンフィグの情報から対応するトランスレータが生成されること
148 Translator translator = Translator.Create(new MockFactory().GetConfig(), "en", "ja");
149 Assert.IsNotNull(translator);
150 Assert.IsInstanceOfType(translator, typeof(MediaWikiTranslator));
151 Assert.IsNotNull(translator.From);
152 Assert.AreEqual("en", translator.From.Language.Code);
153 Assert.IsNotNull(translator.To);
154 Assert.AreEqual("ja", translator.To.Language.Code);
155 Assert.IsNotNull(translator.ItemTable);
156 Assert.AreEqual("en", translator.ItemTable.From);
157 Assert.AreEqual("ja", translator.ItemTable.To);
158 Assert.IsNotNull(translator.HeadingTable);
159 Assert.AreEqual("en", translator.HeadingTable.From);
160 Assert.AreEqual("ja", translator.HeadingTable.To);
164 /// <see cref="Translator.Create"/>メソッドテストケース(未対応のトランスレータクラス)。
167 [ExpectedException(typeof(NotImplementedException))]
168 public void TestCreateUnsupportedConstructor()
170 // コンフィグに引数無しのコンストラクタを持たないトランスレータクラス
171 // が指定されていない場合、例外となること
172 Config config = new MockFactory().GetConfig();
173 config.Translator = typeof(TranslatorIgnoreMock);
174 Translator.Create(config, "en", "ja");
178 /// <see cref="Translator.Create"/>メソッドテストケース(トランスレータクラス以外の指定)。
181 [ExpectedException(typeof(InvalidCastException))]
182 public void TestCreateIgnoreConstructor()
184 // コンフィグに引数無しのコンストラクタを持たないトランスレータクラス
185 // が指定されていない場合、例外となること
186 Config config = new MockFactory().GetConfig();
187 config.Translator = this.GetType();
188 Translator.Create(config, "en", "ja");
196 /// <see cref="Translator.Run"/>メソッドテストケース。
199 public void TestRun()
201 // ※ Runの処理ではpingも行っているが、そのテストについては2012年2月現在、
202 // App.configのデフォルト値がpingを行わない設定なっているため行えない
203 TranslatorMock translator = new TranslatorMock();
204 translator.From = new WebsiteMock();
205 translator.From.Location = "file://";
206 translator.To = new WebsiteMock();
209 // また、実行ごとに結果が初期化されること
210 translator.Run("test");
211 Assert.AreEqual(string.Empty, translator.Log);
212 Assert.AreEqual(string.Empty, translator.Text);
213 translator.Logger.AddMessage("testlog");
214 translator.Text = "testtext";
215 translator.Run("test");
216 Assert.AreEqual(string.Empty, translator.Log);
217 Assert.AreEqual(string.Empty, translator.Text);
219 // 失敗はApplicationExceptionで表現、RunBodyから例外が投げられること
220 translator.Logger.AddMessage("testlog");
221 translator.Text = "testtext";
222 translator.Exception = true;
225 translator.Run("test");
228 catch (ApplicationException e)
230 Assert.AreEqual("Dummy", e.Message);
233 Assert.AreEqual(string.Empty, translator.Log);
234 Assert.AreEqual(string.Empty, translator.Text);
238 /// <see cref="Translator.Run"/>メソッドテストケース(必須パラメータ未設定)。
241 [ExpectedException(typeof(InvalidOperationException))]
242 public void TestRunLangEmpty()
244 // From, To が未設定の場合処理不能
245 new TranslatorMock().Run("test");
253 /// <see cref="Translator"/>テスト用のモッククラスです。
255 private class TranslatorMock : Translator
260 /// <see cref="RunBody"/>で例外を投げるか?
262 public bool Exception
270 #region 非公開プロパティテスト用のオーラーライドプロパティ
275 public new Logger Logger
291 public new string Text
311 /// <param name="name">記事名。</param>
312 protected override void RunBody(string name)
316 throw new ApplicationException("Dummy");
324 /// <see cref="Translator"/>テスト用のモッククラスです。
326 private class TranslatorIgnoreMock : Translator
331 /// デフォルトコンストラクタを隠すためのダミーコンストラクタ。
333 /// <param name="dummy">ダミー。</param>
334 public TranslatorIgnoreMock(string dummy)
345 /// <param name="name">記事名。</param>
346 protected override void RunBody(string name)
354 /// <see cref="Translator"/>テスト用のモッククラスです。
356 private class WebsiteMock : Website
363 /// <param name="title">ページタイトル。</param>
364 /// <returns>取得したページ。</returns>
365 /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
366 public override Page GetPage(string title)