OSDN Git Service

e456f0254fc04095d9c585f572f78a4545f63021
[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 NUnit.Framework;
16     using Honememo.Wptscs.Models;
17     using Honememo.Wptscs.Websites;
18
19     /// <summary>
20     /// Translatorのテストクラスです。
21     /// </summary>
22     [TestFixture]
23     public class TranslatorTest
24     {
25         #region モッククラス
26
27         /// <summary>
28         /// Translatorテスト用のモッククラスです。
29         /// </summary>
30         public class TranslatorMock : Translator
31         {
32             #region テスト支援用パラメータ
33
34             /// <summary>
35             /// <see cref="RunBody"/>で例外を投げるか?
36             /// </summary>
37             public bool exception = false;
38
39             #endregion
40
41             #region 非公開プロパティテスト用のオーラーライドプロパティ
42
43             /// <summary>
44             /// ログテキスト生成用ロガー。
45             /// </summary>
46             public new Logger Logger
47             {
48                 get
49                 {
50                     return base.Logger;
51                 }
52
53                 set
54                 {
55                     base.Logger = value;
56                 }
57             }
58
59             /// <summary>
60             /// 変換後テキスト。
61             /// </summary>
62             public new string Text
63             {
64                 get
65                 {
66                     return base.Text;
67                 }
68
69                 set
70                 {
71                     base.Text = value;
72                 }
73             }
74
75             #endregion
76
77             #region ダミーメソッド
78
79             /// <summary>
80             /// 翻訳支援処理実行部の本体。
81             /// </summary>
82             /// <param name="name">記事名。</param>
83             /// <returns><c>true</c> 処理成功</returns>
84             protected override void RunBody(string name)
85             {
86                 if (exception)
87                 {
88                     throw new ApplicationException("Dummy");
89                 }
90             }
91
92             #endregion
93         }
94
95         /// <summary>
96         /// Translatorテスト用のモッククラスです。
97         /// </summary>
98         public class TranslatorIgnoreMock : Translator
99         {
100             #region コンストラクタ
101
102             /// <summary>
103             /// デフォルトコンストラクタを隠すためのダミーコンストラクタ。
104             /// </summary>
105             /// <param name="dummy">ダミー。</param>
106             public TranslatorIgnoreMock(string dummy)
107             {
108             }
109
110             #endregion
111
112             #region ダミーメソッド
113
114             /// <summary>
115             /// 翻訳支援処理実行部の本体。
116             /// </summary>
117             /// <param name="name">記事名。</param>
118             /// <returns><c>true</c> 処理成功</returns>
119             protected override void RunBody(string name)
120             {
121             }
122
123             #endregion
124         }
125
126         /// <summary>
127         /// Websiteテスト用のモッククラスです。
128         /// </summary>
129         public class WebsiteMock : Website
130         {
131             #region ダミーメソッド
132
133             /// <summary>
134             /// ページを取得。
135             /// </summary>
136             /// <param name="title">ページタイトル。</param>
137             /// <returns>取得したページ。</returns>
138             /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
139             public override Page GetPage(string title)
140             {
141                 return null;
142             }
143
144             #endregion
145         }
146
147         #endregion
148
149         #region プロパティテストケース
150
151         /// <summary>
152         /// ItemTableプロパティテストケース。
153         /// </summary>
154         [Test]
155         public void TestItemTable()
156         {
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);
163         }
164
165         /// <summary>
166         /// HeadingTableプロパティテストケース。
167         /// </summary>
168         [Test]
169         public void TestHeadingTable()
170         {
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);
177         }
178
179         /// <summary>
180         /// Logプロパティテストケース。
181         /// </summary>
182         [Test]
183         public void TestLog()
184         {
185             // 初期状態は空
186             TranslatorMock translator = new TranslatorMock();
187             Assert.IsEmpty(translator.Log);
188
189             // 更新時にLogUpdateイベントが実行されること
190             int count = 0;
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);
199         }
200
201         /// <summary>
202         /// Textプロパティテストケース。
203         /// </summary>
204         [Test]
205         public void TestText()
206         {
207             // 初期状態は空
208             TranslatorMock translator = new TranslatorMock();
209             Assert.IsEmpty(translator.Text);
210
211             // null設定時は空白が設定されること、それ以外はそのまま
212             translator.Text = null;
213             Assert.IsEmpty(translator.Text);
214             translator.Text = "test";
215             Assert.AreEqual("test", translator.Text);
216         }
217
218         /// <summary>
219         /// CancellationPendingプロパティテストケース。
220         /// </summary>
221         [Test]
222         public void TestCancellationPending()
223         {
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);
231         }
232
233         /// <summary>
234         /// Fromプロパティテストケース。
235         /// </summary>
236         [Test]
237         public void TestFrom()
238         {
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);
245         }
246
247         /// <summary>
248         /// Toプロパティテストケース。
249         /// </summary>
250         [Test]
251         public void TestTo()
252         {
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);
259         }
260
261         #endregion
262
263         #region 静的メソッドテストケース
264
265         /// <summary>
266         /// Createメソッドテストケース。
267         /// </summary>
268         [Test]
269         public void TestCreate()
270         {
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);
285         }
286
287         /// <summary>
288         /// Createメソッドテストケース(未対応のトランスレータクラス)。
289         /// </summary>
290         [Test]
291         [ExpectedException(typeof(NotImplementedException))]
292         public void TestCreateUnsupportedConstructor()
293         {
294             // コンフィグに引数無しのコンストラクタを持たないトランスレータクラス
295             // が指定されていない場合、例外となること
296             Config config = new MockFactory().GetConfig();
297             config.Translator = typeof(TranslatorIgnoreMock);
298             Translator.Create(config, "en", "ja");
299         }
300
301         /// <summary>
302         /// Createメソッドテストケース(トランスレータクラス以外の指定)。
303         /// </summary>
304         [Test]
305         [ExpectedException(typeof(InvalidCastException))]
306         public void TestCreateIgnoreConstructor()
307         {
308             // コンフィグに引数無しのコンストラクタを持たないトランスレータクラス
309             // が指定されていない場合、例外となること
310             Config config = new MockFactory().GetConfig();
311             config.Translator = this.GetType();
312             Translator.Create(config, "en", "ja");
313         }
314
315         #endregion
316
317         #region publicメソッドテストケース
318
319         /// <summary>
320         /// Runメソッドテストケース。
321         /// </summary>
322         [Test]
323         public void TestRun()
324         {
325             TranslatorMock translator = new TranslatorMock();
326             translator.From = new WebsiteMock();
327             translator.From.Location = "file://";
328             translator.To = new WebsiteMock();
329
330             // 正常に実行が行えること
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);
340
341             // 失敗はApplicationExceptionで表現、RunBodyから例外が投げられること
342             translator.Logger.AddMessage("testlog");
343             translator.Text = "testtext";
344             translator.exception = true;
345             try
346             {
347                 translator.Run("test");
348                 Assert.Fail();
349             }
350             catch (ApplicationException e)
351             {
352                 Assert.AreEqual("Dummy", e.Message);
353             }
354
355             Assert.IsEmpty(translator.Log);
356             Assert.IsEmpty(translator.Text);
357         }
358
359         /// <summary>
360         /// Runメソッドテストケース(必須パラメータ未設定)。
361         /// </summary>
362         [Test]
363         [ExpectedException(typeof(InvalidOperationException))]
364         public void TestRunLangEmpty()
365         {
366             // From, To が未設定の場合処理不能
367             new TranslatorMock().Run("test");
368         }
369
370         /// <summary>
371         /// Runメソッドテストケース(ping成功)。
372         /// </summary>
373         [Test]
374         public void TestRunPing()
375         {
376             TranslatorMock translator = new TranslatorMock();
377             translator.From = new WebsiteMock();
378             translator.To = new WebsiteMock();
379
380             // Fromにホストが指定されている場合、pingチェックが行われる
381             translator.From.Location = "http://localhost";
382             translator.Run("test");
383         }
384
385         /// <summary>
386         /// Runメソッドテストケース(ping失敗)。
387         /// </summary>
388         [Test]
389         [ExpectedException(typeof(ApplicationException))]
390         public void TestRunPingFailed()
391         {
392             TranslatorMock translator = new TranslatorMock();
393             translator.From = new WebsiteMock();
394             translator.To = new WebsiteMock();
395
396             // Fromにホストが指定されている場合、pingチェックが行われる
397             translator.From.Location = "http://xxx.invalid";
398             translator.Run("test");
399         }
400
401         #endregion
402     }
403 }