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 NUnit.Framework;
20 /// <see cref="Translator"/>のテストクラスです。
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.IsEmpty(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.IsEmpty(translator.Text);
87 // null設定時は空白が設定されること、それ以外はそのまま
88 translator.Text = null;
89 Assert.IsEmpty(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.IsInstanceOf(typeof(MediaWikiTranslator), translator);
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");
193 #region publicメソッドテストケース
196 /// <see cref="Translator.Run"/>メソッドテストケース。
199 public void TestRun()
201 TranslatorMock translator = new TranslatorMock();
202 translator.From = new WebsiteMock();
203 translator.From.Location = "file://";
204 translator.To = new WebsiteMock();
207 // また、実行ごとに結果が初期化されること
208 translator.Run("test");
209 Assert.IsEmpty(translator.Log);
210 Assert.IsEmpty(translator.Text);
211 translator.Logger.AddMessage("testlog");
212 translator.Text = "testtext";
213 translator.Run("test");
214 Assert.IsEmpty(translator.Log);
215 Assert.IsEmpty(translator.Text);
217 // 失敗はApplicationExceptionで表現、RunBodyから例外が投げられること
218 translator.Logger.AddMessage("testlog");
219 translator.Text = "testtext";
220 translator.Exception = true;
223 translator.Run("test");
226 catch (ApplicationException e)
228 Assert.AreEqual("Dummy", e.Message);
231 Assert.IsEmpty(translator.Log);
232 Assert.IsEmpty(translator.Text);
236 /// <see cref="Translator.Run"/>メソッドテストケース(必須パラメータ未設定)。
239 [ExpectedException(typeof(InvalidOperationException))]
240 public void TestRunLangEmpty()
242 // From, To が未設定の場合処理不能
243 new TranslatorMock().Run("test");
247 /// <see cref="Translator.Run"/>メソッドテストケース(ping成功)。
250 public void TestRunPing()
252 TranslatorMock translator = new TranslatorMock();
253 translator.From = new WebsiteMock();
254 translator.To = new WebsiteMock();
256 // Fromにホストが指定されている場合、pingチェックが行われる
257 translator.From.Location = "http://localhost";
258 translator.Run("test");
262 /// <see cref="Translator.Run"/>メソッドテストケース(ping失敗)。
265 [ExpectedException(typeof(ApplicationException))]
266 public void TestRunPingFailed()
268 TranslatorMock translator = new TranslatorMock();
269 translator.From = new WebsiteMock();
270 translator.To = new WebsiteMock();
272 // Fromにホストが指定されている場合、pingチェックが行われる
273 translator.From.Location = "http://xxx.invalid";
274 translator.Run("test");
282 /// <see cref="Translator"/>テスト用のモッククラスです。
284 private class TranslatorMock : Translator
289 /// <see cref="RunBody"/>で例外を投げるか?
291 public bool Exception
299 #region 非公開プロパティテスト用のオーラーライドプロパティ
304 public new Logger Logger
320 public new string Text
340 /// <param name="name">記事名。</param>
341 protected override void RunBody(string name)
345 throw new ApplicationException("Dummy");
353 /// <see cref="Translator"/>テスト用のモッククラスです。
355 private class TranslatorIgnoreMock : Translator
360 /// デフォルトコンストラクタを隠すためのダミーコンストラクタ。
362 /// <param name="dummy">ダミー。</param>
363 public TranslatorIgnoreMock(string dummy)
374 /// <param name="name">記事名。</param>
375 protected override void RunBody(string name)
383 /// <see cref="Translator"/>テスト用のモッククラスです。
385 private class WebsiteMock : Website
392 /// <param name="title">ページタイトル。</param>
393 /// <returns>取得したページ。</returns>
394 /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
395 public override Page GetPage(string title)