OSDN Git Service

75348d8a0419828aa7d469cf0fd3e13bff94f8b5
[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 Microsoft.VisualStudio.TestTools.UnitTesting;
18
19     /// <summary>
20     /// <see cref="Translator"/>のテストクラスです。
21     /// </summary>
22     [TestClass]
23     internal class TranslatorTest
24     {
25         #region プロパティテストケース
26
27         /// <summary>
28         /// <see cref="Translator.ItemTable"/>プロパティテストケース。
29         /// </summary>
30         [TestMethod]
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         [TestMethod]
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         [TestMethod]
59         public void TestLog()
60         {
61             // 初期状態は空
62             TranslatorMock translator = new TranslatorMock();
63             Assert.AreEqual(string.Empty, 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         [TestMethod]
81         public void TestText()
82         {
83             // 初期状態は空
84             TranslatorMock translator = new TranslatorMock();
85             Assert.AreEqual(string.Empty, translator.Text);
86
87             // null設定時は空白が設定されること、それ以外はそのまま
88             translator.Text = null;
89             Assert.AreEqual(string.Empty, translator.Text);
90             translator.Text = "test";
91             Assert.AreEqual("test", translator.Text);
92         }
93
94         /// <summary>
95         /// <see cref="Translator.CancellationPending"/>プロパティテストケース。
96         /// </summary>
97         [TestMethod]
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         [TestMethod]
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         [TestMethod]
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         [TestMethod]
145         public void TestCreate()
146         {
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);
161         }
162
163         /// <summary>
164         /// <see cref="Translator.Create"/>メソッドテストケース(未対応のトランスレータクラス)。
165         /// </summary>
166         [TestMethod]
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         [TestMethod]
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 公開メソッドテストケース
194
195         /// <summary>
196         /// <see cref="Translator.Run"/>メソッドテストケース。
197         /// </summary>
198         [TestMethod]
199         public void TestRun()
200         {
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();
207
208             // 正常に実行が行えること
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);
218
219             // 失敗はApplicationExceptionで表現、RunBodyから例外が投げられること
220             translator.Logger.AddMessage("testlog");
221             translator.Text = "testtext";
222             translator.Exception = true;
223             try
224             {
225                 translator.Run("test");
226                 Assert.Fail();
227             }
228             catch (ApplicationException e)
229             {
230                 Assert.AreEqual("Dummy", e.Message);
231             }
232
233             Assert.AreEqual(string.Empty, translator.Log);
234             Assert.AreEqual(string.Empty, translator.Text);
235         }
236
237         /// <summary>
238         /// <see cref="Translator.Run"/>メソッドテストケース(必須パラメータ未設定)。
239         /// </summary>
240         [TestMethod]
241         [ExpectedException(typeof(InvalidOperationException))]
242         public void TestRunLangEmpty()
243         {
244             // From, To が未設定の場合処理不能
245             new TranslatorMock().Run("test");
246         }
247
248         #endregion
249
250         #region モッククラス
251
252         /// <summary>
253         /// <see cref="Translator"/>テスト用のモッククラスです。
254         /// </summary>
255         private class TranslatorMock : Translator
256         {
257             #region テスト支援用プロパティ
258
259             /// <summary>
260             /// <see cref="RunBody"/>で例外を投げるか?
261             /// </summary>
262             public bool Exception
263             {
264                 get;
265                 set;
266             }
267
268             #endregion
269
270             #region 非公開プロパティテスト用のオーラーライドプロパティ
271
272             /// <summary>
273             /// ログテキスト生成用ロガー。
274             /// </summary>
275             public new Logger Logger
276             {
277                 get
278                 {
279                     return base.Logger;
280                 }
281
282                 set
283                 {
284                     base.Logger = value;
285                 }
286             }
287
288             /// <summary>
289             /// 変換後テキスト。
290             /// </summary>
291             public new string Text
292             {
293                 get
294                 {
295                     return base.Text;
296                 }
297
298                 set
299                 {
300                     base.Text = value;
301                 }
302             }
303
304             #endregion
305
306             #region ダミーメソッド
307
308             /// <summary>
309             /// 翻訳支援処理実行部の本体。
310             /// </summary>
311             /// <param name="name">記事名。</param>
312             protected override void RunBody(string name)
313             {
314                 if (this.Exception)
315                 {
316                     throw new ApplicationException("Dummy");
317                 }
318             }
319
320             #endregion
321         }
322
323         /// <summary>
324         /// <see cref="Translator"/>テスト用のモッククラスです。
325         /// </summary>
326         private class TranslatorIgnoreMock : Translator
327         {
328             #region コンストラクタ
329
330             /// <summary>
331             /// デフォルトコンストラクタを隠すためのダミーコンストラクタ。
332             /// </summary>
333             /// <param name="dummy">ダミー。</param>
334             public TranslatorIgnoreMock(string dummy)
335             {
336             }
337
338             #endregion
339
340             #region ダミーメソッド
341
342             /// <summary>
343             /// 翻訳支援処理実行部の本体。
344             /// </summary>
345             /// <param name="name">記事名。</param>
346             protected override void RunBody(string name)
347             {
348             }
349
350             #endregion
351         }
352
353         /// <summary>
354         /// <see cref="Translator"/>テスト用のモッククラスです。
355         /// </summary>
356         private class WebsiteMock : Website
357         {
358             #region ダミーメソッド
359
360             /// <summary>
361             /// ページを取得。
362             /// </summary>
363             /// <param name="title">ページタイトル。</param>
364             /// <returns>取得したページ。</returns>
365             /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
366             public override Page GetPage(string title)
367             {
368                 return null;
369             }
370
371             #endregion
372         }
373
374         #endregion
375     }
376 }