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 NUnit.Framework;
16 using Honememo.Wptscs.Models;
17 using Honememo.Wptscs.Websites;
20 /// Translatorのテストクラスです。
23 public class TranslatorTest
28 /// Translatorテスト用のモッククラスです。
30 public class TranslatorMock : Translator
35 /// <see cref="RunBody"/>で例外を投げるか?
37 public bool exception = false;
41 #region 非公開プロパティテスト用のオーラーライドプロパティ
46 public new Logger Logger
62 public new string Text
82 /// <param name="name">記事名。</param>
83 /// <returns><c>true</c> 処理成功</returns>
84 protected override void RunBody(string name)
88 throw new ApplicationException("Dummy");
96 /// Translatorテスト用のモッククラスです。
98 public class TranslatorIgnoreMock : Translator
103 /// デフォルトコンストラクタを隠すためのダミーコンストラクタ。
105 /// <param name="dummy">ダミー。</param>
106 public TranslatorIgnoreMock(string dummy)
117 /// <param name="name">記事名。</param>
118 /// <returns><c>true</c> 処理成功</returns>
119 protected override void RunBody(string name)
127 /// Websiteテスト用のモッククラスです。
129 public class WebsiteMock : Website
136 /// <param name="title">ページタイトル。</param>
137 /// <returns>取得したページ。</returns>
138 /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
139 public override Page GetPage(string title)
152 /// ItemTableプロパティテストケース。
155 public void TestItemTable()
157 // 初期状態がnull、設定すればそのオブジェクトが返されること
158 TranslatorMock translator = new TranslatorMock();
159 Assert.IsNull(translator.ItemTable);
160 TranslationDictionary table = new TranslationDictionary("en", "ja");
161 translator.ItemTable = table;
162 Assert.AreSame(table, translator.ItemTable);
166 /// HeadingTableプロパティテストケース。
169 public void TestHeadingTable()
171 // 初期状態がnull、設定すればそのオブジェクトが返されること
172 TranslatorMock translator = new TranslatorMock();
173 Assert.IsNull(translator.HeadingTable);
174 TranslationTable table = new TranslationTable();
175 translator.HeadingTable = table;
176 Assert.AreSame(table, translator.HeadingTable);
183 public void TestLog()
186 TranslatorMock translator = new TranslatorMock();
187 Assert.IsEmpty(translator.Log);
189 // 更新時にLogUpdateイベントが実行されること
191 translator.LogUpdate += new EventHandler((object sender, EventArgs e) => { ++count; });
192 Assert.AreEqual(0, count);
193 translator.Logger.AddMessage("ログ");
194 Assert.AreEqual(1, count);
195 Assert.AreEqual("ログ" + Environment.NewLine, translator.Log);
196 translator.Logger.AddMessage("add");
197 Assert.AreEqual(2, count);
198 Assert.AreEqual("ログ" + Environment.NewLine + "add" + Environment.NewLine, translator.Log);
205 public void TestText()
208 TranslatorMock translator = new TranslatorMock();
209 Assert.IsEmpty(translator.Text);
211 // null設定時は空白が設定されること、それ以外はそのまま
212 translator.Text = null;
213 Assert.IsEmpty(translator.Text);
214 translator.Text = "test";
215 Assert.AreEqual("test", translator.Text);
219 /// CancellationPendingプロパティテストケース。
222 public void TestCancellationPending()
224 // 初期状態はfalse、設定すればそのオブジェクトが返されること
225 TranslatorMock translator = new TranslatorMock();
226 Assert.IsFalse(translator.CancellationPending);
227 translator.CancellationPending = true;
228 Assert.IsTrue(translator.CancellationPending);
229 translator.CancellationPending = false;
230 Assert.IsFalse(translator.CancellationPending);
237 public void TestFrom()
239 // 初期状態がnull、設定すればそのオブジェクトが返されること
240 TranslatorMock translator = new TranslatorMock();
241 Assert.IsNull(translator.From);
242 WebsiteMock website = new WebsiteMock();
243 translator.From = website;
244 Assert.AreSame(website, translator.From);
253 // 初期状態がnull、設定すればそのオブジェクトが返されること
254 TranslatorMock translator = new TranslatorMock();
255 Assert.IsNull(translator.To);
256 WebsiteMock website = new WebsiteMock();
257 translator.To = website;
258 Assert.AreSame(website, translator.To);
266 /// Createメソッドテストケース。
269 public void TestCreate()
271 // コンフィグの情報から対応するトランスレータが生成されること
272 Translator translator = Translator.Create(new MockFactory().GetConfig(), "en", "ja");
273 Assert.IsNotNull(translator);
274 Assert.IsInstanceOf(typeof(MediaWikiTranslator), translator);
275 Assert.IsNotNull(translator.From);
276 Assert.AreEqual("en", translator.From.Language.Code);
277 Assert.IsNotNull(translator.To);
278 Assert.AreEqual("ja", translator.To.Language.Code);
279 Assert.IsNotNull(translator.ItemTable);
280 Assert.AreEqual("en", translator.ItemTable.From);
281 Assert.AreEqual("ja", translator.ItemTable.To);
282 Assert.IsNotNull(translator.HeadingTable);
283 Assert.AreEqual("en", translator.HeadingTable.From);
284 Assert.AreEqual("ja", translator.HeadingTable.To);
288 /// Createメソッドテストケース(未対応のトランスレータクラス)。
291 [ExpectedException(typeof(NotImplementedException))]
292 public void TestCreateUnsupportedConstructor()
294 // コンフィグに引数無しのコンストラクタを持たないトランスレータクラス
295 // が指定されていない場合、例外となること
296 Config config = new MockFactory().GetConfig();
297 config.Translator = typeof(TranslatorIgnoreMock);
298 Translator.Create(config, "en", "ja");
302 /// Createメソッドテストケース(トランスレータクラス以外の指定)。
305 [ExpectedException(typeof(InvalidCastException))]
306 public void TestCreateIgnoreConstructor()
308 // コンフィグに引数無しのコンストラクタを持たないトランスレータクラス
309 // が指定されていない場合、例外となること
310 Config config = new MockFactory().GetConfig();
311 config.Translator = this.GetType();
312 Translator.Create(config, "en", "ja");
317 #region publicメソッドテストケース
323 public void TestRun()
325 TranslatorMock translator = new TranslatorMock();
326 translator.From = new WebsiteMock();
327 translator.From.Location = "file://";
328 translator.To = new WebsiteMock();
331 // また、実行ごとに結果が初期化されること
332 translator.Run("test");
333 Assert.IsEmpty(translator.Log);
334 Assert.IsEmpty(translator.Text);
335 translator.Logger.AddMessage("testlog");
336 translator.Text = "testtext";
337 translator.Run("test");
338 Assert.IsEmpty(translator.Log);
339 Assert.IsEmpty(translator.Text);
341 // 失敗はApplicationExceptionで表現、RunBodyから例外が投げられること
342 translator.Logger.AddMessage("testlog");
343 translator.Text = "testtext";
344 translator.exception = true;
347 translator.Run("test");
350 catch (ApplicationException e)
352 Assert.AreEqual("Dummy", e.Message);
355 Assert.IsEmpty(translator.Log);
356 Assert.IsEmpty(translator.Text);
360 /// Runメソッドテストケース(必須パラメータ未設定)。
363 [ExpectedException(typeof(InvalidOperationException))]
364 public void TestRunLangEmpty()
366 // From, To が未設定の場合処理不能
367 new TranslatorMock().Run("test");
371 /// Runメソッドテストケース(ping成功)。
374 public void TestRunPing()
376 TranslatorMock translator = new TranslatorMock();
377 translator.From = new WebsiteMock();
378 translator.To = new WebsiteMock();
380 // Fromにホストが指定されている場合、pingチェックが行われる
381 translator.From.Location = "http://localhost";
382 translator.Run("test");
386 /// Runメソッドテストケース(ping失敗)。
389 [ExpectedException(typeof(ApplicationException))]
390 public void TestRunPingFailed()
392 TranslatorMock translator = new TranslatorMock();
393 translator.From = new WebsiteMock();
394 translator.To = new WebsiteMock();
396 // Fromにホストが指定されている場合、pingチェックが行われる
397 translator.From.Location = "http://xxx.invalid";
398 translator.Run("test");