OSDN Git Service

9dc931db55d8474dd14f584692eda549781918f8
[wptscs/wpts.git] / WptscsTest / Logics / TranslatorTest.cs
1 // ================================================================================================
2 // <summary>
3 //      Translatorのテストクラスソース。</summary>
4 //
5 // <copyright file="TranslatorTest.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Logics
12 {
13     using System;
14     using System.Collections.Generic;
15     using Honememo.Wptscs.Models;
16     using Honememo.Wptscs.Websites;
17     using NUnit.Framework;
18
19     /// <summary>
20     /// <see cref="Translator"/>のテストクラスです。
21     /// </summary>
22     [TestFixture]
23     class TranslatorTest
24     {
25         #region プロパティテストケース
26
27         /// <summary>
28         /// <see cref="Translator.ItemTable"/>プロパティテストケース。
29         /// </summary>
30         [Test]
31         public void TestItemTable()
32         {
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);
39         }
40
41         /// <summary>
42         /// <see cref="Translator.HeadingTable"/>プロパティテストケース。
43         /// </summary>
44         [Test]
45         public void TestHeadingTable()
46         {
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);
53         }
54
55         /// <summary>
56         /// <see cref="Translator.Log"/>プロパティテストケース。
57         /// </summary>
58         [Test]
59         public void TestLog()
60         {
61             // 初期状態は空
62             TranslatorMock translator = new TranslatorMock();
63             Assert.IsEmpty(translator.Log);
64
65             // 更新時にLogUpdateイベントが実行されること
66             int count = 0;
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);
75         }
76
77         /// <summary>
78         /// <see cref="Translator.Text"/>プロパティテストケース。
79         /// </summary>
80         [Test]
81         public void TestText()
82         {
83             // 初期状態は空
84             TranslatorMock translator = new TranslatorMock();
85             Assert.IsEmpty(translator.Text);
86
87             // null設定時は空白が設定されること、それ以外はそのまま
88             translator.Text = null;
89             Assert.IsEmpty(translator.Text);
90             translator.Text = "test";
91             Assert.AreEqual("test", translator.Text);
92         }
93
94         /// <summary>
95         /// <see cref="Translator.CancellationPending"/>プロパティテストケース。
96         /// </summary>
97         [Test]
98         public void TestCancellationPending()
99         {
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);
107         }
108
109         /// <summary>
110         /// <see cref="Translator.From"/>プロパティテストケース。
111         /// </summary>
112         [Test]
113         public void TestFrom()
114         {
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);
121         }
122
123         /// <summary>
124         /// <see cref="Translator.To"/>プロパティテストケース。
125         /// </summary>
126         [Test]
127         public void TestTo()
128         {
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);
135         }
136
137         #endregion
138
139         #region 静的メソッドテストケース
140
141         /// <summary>
142         /// <see cref="Translator.Create"/>メソッドテストケース。
143         /// </summary>
144         [Test]
145         public void TestCreate()
146         {
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);
161         }
162
163         /// <summary>
164         /// <see cref="Translator.Create"/>メソッドテストケース(未対応のトランスレータクラス)。
165         /// </summary>
166         [Test]
167         [ExpectedException(typeof(NotImplementedException))]
168         public void TestCreateUnsupportedConstructor()
169         {
170             // コンフィグに引数無しのコンストラクタを持たないトランスレータクラス
171             // が指定されていない場合、例外となること
172             Config config = new MockFactory().GetConfig();
173             config.Translator = typeof(TranslatorIgnoreMock);
174             Translator.Create(config, "en", "ja");
175         }
176
177         /// <summary>
178         /// <see cref="Translator.Create"/>メソッドテストケース(トランスレータクラス以外の指定)。
179         /// </summary>
180         [Test]
181         [ExpectedException(typeof(InvalidCastException))]
182         public void TestCreateIgnoreConstructor()
183         {
184             // コンフィグに引数無しのコンストラクタを持たないトランスレータクラス
185             // が指定されていない場合、例外となること
186             Config config = new MockFactory().GetConfig();
187             config.Translator = this.GetType();
188             Translator.Create(config, "en", "ja");
189         }
190
191         #endregion
192
193         #region publicメソッドテストケース
194
195         /// <summary>
196         /// <see cref="Translator.Run"/>メソッドテストケース。
197         /// </summary>
198         [Test]
199         public void TestRun()
200         {
201             TranslatorMock translator = new TranslatorMock();
202             translator.From = new WebsiteMock();
203             translator.From.Location = "file://";
204             translator.To = new WebsiteMock();
205
206             // 正常に実行が行えること
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);
216
217             // 失敗はApplicationExceptionで表現、RunBodyから例外が投げられること
218             translator.Logger.AddMessage("testlog");
219             translator.Text = "testtext";
220             translator.Exception = true;
221             try
222             {
223                 translator.Run("test");
224                 Assert.Fail();
225             }
226             catch (ApplicationException e)
227             {
228                 Assert.AreEqual("Dummy", e.Message);
229             }
230
231             Assert.IsEmpty(translator.Log);
232             Assert.IsEmpty(translator.Text);
233         }
234
235         /// <summary>
236         /// <see cref="Translator.Run"/>メソッドテストケース(必須パラメータ未設定)。
237         /// </summary>
238         [Test]
239         [ExpectedException(typeof(InvalidOperationException))]
240         public void TestRunLangEmpty()
241         {
242             // From, To が未設定の場合処理不能
243             new TranslatorMock().Run("test");
244         }
245
246         /// <summary>
247         /// <see cref="Translator.Run"/>メソッドテストケース(ping成功)。
248         /// </summary>
249         [Test]
250         public void TestRunPing()
251         {
252             TranslatorMock translator = new TranslatorMock();
253             translator.From = new WebsiteMock();
254             translator.To = new WebsiteMock();
255
256             // Fromにホストが指定されている場合、pingチェックが行われる
257             translator.From.Location = "http://localhost";
258             translator.Run("test");
259         }
260
261         /// <summary>
262         /// <see cref="Translator.Run"/>メソッドテストケース(ping失敗)。
263         /// </summary>
264         [Test]
265         [ExpectedException(typeof(ApplicationException))]
266         public void TestRunPingFailed()
267         {
268             TranslatorMock translator = new TranslatorMock();
269             translator.From = new WebsiteMock();
270             translator.To = new WebsiteMock();
271
272             // Fromにホストが指定されている場合、pingチェックが行われる
273             translator.From.Location = "http://xxx.invalid";
274             translator.Run("test");
275         }
276
277         #endregion
278
279         #region モッククラス
280
281         /// <summary>
282         /// <see cref="Translator"/>テスト用のモッククラスです。
283         /// </summary>
284         private class TranslatorMock : Translator
285         {
286             #region テスト支援用プロパティ
287
288             /// <summary>
289             /// <see cref="RunBody"/>で例外を投げるか?
290             /// </summary>
291             public bool Exception
292             {
293                 get;
294                 set;
295             }
296
297             #endregion
298
299             #region 非公開プロパティテスト用のオーラーライドプロパティ
300
301             /// <summary>
302             /// ログテキスト生成用ロガー。
303             /// </summary>
304             public new Logger Logger
305             {
306                 get
307                 {
308                     return base.Logger;
309                 }
310
311                 set
312                 {
313                     base.Logger = value;
314                 }
315             }
316
317             /// <summary>
318             /// 変換後テキスト。
319             /// </summary>
320             public new string Text
321             {
322                 get
323                 {
324                     return base.Text;
325                 }
326
327                 set
328                 {
329                     base.Text = value;
330                 }
331             }
332
333             #endregion
334
335             #region ダミーメソッド
336
337             /// <summary>
338             /// 翻訳支援処理実行部の本体。
339             /// </summary>
340             /// <param name="name">記事名。</param>
341             protected override void RunBody(string name)
342             {
343                 if (this.Exception)
344                 {
345                     throw new ApplicationException("Dummy");
346                 }
347             }
348
349             #endregion
350         }
351
352         /// <summary>
353         /// <see cref="Translator"/>テスト用のモッククラスです。
354         /// </summary>
355         private class TranslatorIgnoreMock : Translator
356         {
357             #region コンストラクタ
358
359             /// <summary>
360             /// デフォルトコンストラクタを隠すためのダミーコンストラクタ。
361             /// </summary>
362             /// <param name="dummy">ダミー。</param>
363             public TranslatorIgnoreMock(string dummy)
364             {
365             }
366
367             #endregion
368
369             #region ダミーメソッド
370
371             /// <summary>
372             /// 翻訳支援処理実行部の本体。
373             /// </summary>
374             /// <param name="name">記事名。</param>
375             protected override void RunBody(string name)
376             {
377             }
378
379             #endregion
380         }
381
382         /// <summary>
383         /// <see cref="Translator"/>テスト用のモッククラスです。
384         /// </summary>
385         private class WebsiteMock : Website
386         {
387             #region ダミーメソッド
388
389             /// <summary>
390             /// ページを取得。
391             /// </summary>
392             /// <param name="title">ページタイトル。</param>
393             /// <returns>取得したページ。</returns>
394             /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
395             public override Page GetPage(string title)
396             {
397                 return null;
398             }
399
400             #endregion
401         }
402
403         #endregion
404     }
405 }