OSDN Git Service

svnプロパティをファイルの種類に応じたものに更新
[wptscs/wpts.git] / WptscsTest / Models / MediaWikiTest.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiのテストクラスソース。</summary>
4 //
5 // <copyright file="MediaWikiTest.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Models
12 {
13     using System;
14     using System.Collections.Generic;
15     using System.IO;
16     using System.Reflection;
17     using System.Text;
18     using System.Xml;
19     using System.Xml.Serialization;
20     using NUnit.Framework;
21     using Honememo.Utilities;
22
23     /// <summary>
24     /// MediaWikiのテストクラスです。
25     /// </summary>
26     [TestFixture]
27     public class MediaWikiTest
28     {
29         #region 定数
30
31         /// <summary>
32         /// テストデータが格納されているフォルダパス。
33         /// </summary>
34         private static readonly string testDir = "Data\\MediaWiki";
35
36         #endregion
37
38         #region テスト支援メソッド
39
40         /// <summary>
41         /// テスト用の値を設定したMediaWikiオブジェクトを返す。
42         /// </summary>
43         public MediaWiki GetTestServer(string language)
44         {
45             // ※ 下記URL生成時は、きちんとパス区切り文字を入れてやら無いとフォルダが認識されない。
46             //    また、httpで取得した場合とfileで取得した場合では先頭の大文字小文字が異なることが
47             //    あるため、それについては随時期待値を調整して対処。
48             UriBuilder b = new UriBuilder("file", "");
49             b.Path = Path.GetFullPath(testDir) + "\\";
50             MediaWiki server = new MediaWiki(new Language(language), new Uri(b.Uri, language + "/").ToString());
51             server.ExportPath = "{0}.xml";
52             server.NamespacePath = "_api.xml";
53             return server;
54         }
55
56         #endregion
57
58         #region コンストラクタテストケース
59
60         /// <summary>
61         /// コンストラクタ(MediaWiki全般)テストケース。
62         /// </summary>
63         [Test]
64         public void TestConstructorLanguageLocation()
65         {
66             MediaWiki site = new MediaWiki(new Language("en"), "test");
67             Assert.AreEqual("en", site.Language.Code);
68             Assert.AreEqual("test", site.Location);
69         }
70
71         /// <summary>
72         /// コンストラクタ(MediaWiki全般)テストケース(languageがnull)。
73         /// </summary>
74         [Test]
75         [ExpectedException(typeof(ArgumentNullException))]
76         public void TestConstructorLanguageLocationByLanguageNull()
77         {
78             MediaWiki site = new MediaWiki(null, "test");
79         }
80
81         /// <summary>
82         /// コンストラクタ(MediaWiki全般)テストケース(locationがnull)。
83         /// </summary>
84         [Test]
85         [ExpectedException(typeof(ArgumentNullException))]
86         public void TestConstructorLanguageLocationByLocationNull()
87         {
88             MediaWiki site = new MediaWiki(new Language("en"), null);
89         }
90
91         /// <summary>
92         /// コンストラクタ(Wikipedia用)テストケース。
93         /// </summary>
94         [Test]
95         public void TestConstructorLanguage()
96         {
97             MediaWiki site = new MediaWiki(new Language("en"));
98             Assert.AreEqual("en", site.Language.Code);
99             Assert.AreEqual("http://en.wikipedia.org", site.Location);
100         }
101
102         /// <summary>
103         /// コンストラクタ(Wikipedia用)テストケース(languageがnull)。
104         /// </summary>
105         [Test]
106         [ExpectedException(typeof(ArgumentNullException))]
107         public void TestConstructorLanguageByLanguageNull()
108         {
109             MediaWiki site = new MediaWiki(null);
110         }
111
112         #endregion
113
114         #region 設定ファイルに初期値を持つプロパティテストケース
115
116         /// <summary>
117         /// NamespacePathプロパティテストケース。
118         /// </summary>
119         [Test]
120         public void TestNamespacePath()
121         {
122             MediaWiki site = new MediaWiki(new Language("ja"));
123             // デフォルトでは設定ファイルの値が返される
124             Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases", site.NamespacePath);
125             // 値を設定するとその値が返る
126             site.NamespacePath = "test";
127             Assert.AreEqual("test", site.NamespacePath);
128             // 空またはnullの場合、再び設定ファイルの値が入る
129             site.NamespacePath = null;
130             Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases", site.NamespacePath);
131             site.NamespacePath = String.Empty;
132             Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases", site.NamespacePath);
133         }
134
135         /// <summary>
136         /// ExportPathプロパティテストケース。
137         /// </summary>
138         [Test]
139         public void TestExportPath()
140         {
141             MediaWiki site = new MediaWiki(new Language("ja"));
142             // デフォルトでは設定ファイルの値が返される
143             Assert.AreEqual("/wiki/Special:Export/{0}", site.ExportPath);
144             // 値を設定するとその値が返る
145             site.ExportPath = "test";
146             Assert.AreEqual("test", site.ExportPath);
147             // 空またはnullの場合、再び設定ファイルの値が入る
148             site.ExportPath = null;
149             Assert.AreEqual("/wiki/Special:Export/{0}", site.ExportPath);
150             site.ExportPath = String.Empty;
151             Assert.AreEqual("/wiki/Special:Export/{0}", site.ExportPath);
152         }
153
154         /// <summary>
155         /// Redirectプロパティテストケース。
156         /// </summary>
157         [Test]
158         public void TestRedirect()
159         {
160             MediaWiki site = new MediaWiki(new Language("ja"));
161             // デフォルトでは設定ファイルの値が返される
162             Assert.AreEqual("#REDIRECT", site.Redirect);
163             // 値を設定するとその値が返る
164             site.Redirect = "test";
165             Assert.AreEqual("test", site.Redirect);
166             // 空またはnullの場合、再び設定ファイルの値が入る
167             site.Redirect = null;
168             Assert.AreEqual("#REDIRECT", site.Redirect);
169             site.Redirect = String.Empty;
170             Assert.AreEqual("#REDIRECT", site.Redirect);
171         }
172
173         /// <summary>
174         /// TemplateNamespaceプロパティテストケース。
175         /// </summary>
176         [Test]
177         public void TestTemplateNamespace()
178         {
179             MediaWiki site = new MediaWiki(new Language("ja"));
180             // デフォルトでは設定ファイルの値が返される
181             Assert.AreEqual(10, site.TemplateNamespace);
182             // 値を設定するとその値が返る
183             site.TemplateNamespace = -1;
184             Assert.AreEqual(-1, site.TemplateNamespace);
185         }
186
187         /// <summary>
188         /// CategoryNamespaceプロパティテストケース。
189         /// </summary>
190         [Test]
191         public void TestCategoryNamespace()
192         {
193             MediaWiki site = new MediaWiki(new Language("ja"));
194             // デフォルトでは設定ファイルの値が返される
195             Assert.AreEqual(14, site.CategoryNamespace);
196             // 値を設定するとその値が返る
197             site.CategoryNamespace = -1;
198             Assert.AreEqual(-1, site.CategoryNamespace);
199         }
200
201         /// <summary>
202         /// FileNamespaceプロパティテストケース。
203         /// </summary>
204         [Test]
205         public void TestFileNamespace()
206         {
207             MediaWiki site = new MediaWiki(new Language("ja"));
208             // デフォルトでは設定ファイルの値が返される
209             Assert.AreEqual(6, site.FileNamespace);
210             // 値を設定するとその値が返る
211             site.FileNamespace = -1;
212             Assert.AreEqual(-1, site.FileNamespace);
213         }
214
215         /// <summary>
216         /// MagicWordsプロパティテストケース。
217         /// </summary>
218         [Test]
219         public void TestMagicWords()
220         {
221             MediaWiki site = new MediaWiki(new Language("ja"));
222             // デフォルトでは設定ファイルの値が返される
223             Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
224             // 値を設定するとその値が返る
225             site.MagicWords = new string[0];
226             Assert.AreEqual(0, site.MagicWords.Count);
227             // nullの場合、再び設定ファイルの値が入る
228             site.MagicWords = null;
229             Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
230         }
231
232         #endregion
233
234         #region それ以外のプロパティテストケース
235
236         /// <summary>
237         /// Namespacesプロパティテストケース。
238         /// </summary>
239         [Test]
240         public void TestNamespaces()
241         {
242             MediaWiki site = this.GetTestServer("en");
243             // デフォルトではサーバーからダウンロードした値が返される
244             IList<string> names = site.Namespaces[6];
245             Assert.AreEqual("File", names[0]);
246             Assert.AreEqual("File", names[1]);
247             Assert.AreEqual("Image", names[2]);
248             // 値を設定するとその値が返る
249             IDictionary<int, IList<string>> dic = new Dictionary<int, IList<string>>();
250             dic.Add(1, new string[]{"test"});
251             site.Namespaces = dic;
252             Assert.AreEqual(1, site.Namespaces.Count);
253             // 空の場合、再び設定ファイルの値が入る
254             site.Namespaces = new Dictionary<int, IList<string>>();
255             Assert.AreEqual("File", names[0]);
256         }
257
258         /// <summary>
259         /// Namespacesプロパティテストケース(null)。
260         /// </summary>
261         [Test]
262         [ExpectedException(typeof(ArgumentNullException))]
263         public void TestNamespacesNull()
264         {
265             MediaWiki site = new MediaWiki(new Language("ja"));
266             site.Namespaces = null;
267         }
268
269         /// <summary>
270         /// DocumentationTemplateプロパティテストケース。
271         /// </summary>
272         [Test]
273         public void TestDocumentationTemplate()
274         {
275             MediaWiki site = new MediaWiki(new Language("ja"));
276             // デフォルトでは空
277             Assert.IsNullOrEmpty(site.DocumentationTemplate);
278             // その値が返る
279             site.DocumentationTemplate = "Template:Documentation";
280             Assert.AreEqual("Template:Documentation", site.DocumentationTemplate);
281         }
282
283         /// <summary>
284         /// DocumentationTemplateDefaultPageプロパティテストケース。
285         /// </summary>
286         [Test]
287         public void TestDocumentationTemplateDefaultPage()
288         {
289             MediaWiki site = new MediaWiki(new Language("ja"));
290             // デフォルトでは空
291             Assert.IsNullOrEmpty(site.DocumentationTemplateDefaultPage);
292             // その値が返る
293             site.DocumentationTemplateDefaultPage = "/doc";
294             Assert.AreEqual("/doc", site.DocumentationTemplateDefaultPage);
295         }
296
297         #endregion
298
299         #region 公開メソッドテストケース
300
301         /// <summary>
302         /// GetPageプロパティテストケース。
303         /// </summary>
304         [Test]
305         public void TestGetPage()
306         {
307             MediaWiki site = this.GetTestServer("en");
308             Page page = site.GetPage("example");
309             Assert.IsInstanceOf(typeof(MediaWikiPage), page);
310             Assert.AreEqual("Example", page.Title);
311             Assert.AreEqual(DateTime.Parse("2010/07/13 09:49:18"), page.Timestamp);
312             Assert.IsNotEmpty(page.Text);
313             Assert.AreEqual(site, page.Website);
314         }
315
316         #endregion
317
318         #region XMLシリアライズ用メソッドテストケース
319
320         /// <summary>
321         /// XMLデシリアライズテストケース。
322         /// </summary>
323         [Test]
324         public void TestReadXml()
325         {
326             MediaWiki site;
327             using (XmlReader r = XmlReader.Create(
328                 new StringReader("<MediaWiki><Location>http://ja.wikipedia.org</Location>"
329                     + "<Language Code=\"ja\"><Names /></Language></MediaWiki>")))
330             {
331                 site = new XmlSerializer(typeof(MediaWiki)).Deserialize(r) as MediaWiki;
332             }
333
334             Assert.IsNotNull(site);
335             Assert.AreEqual("http://ja.wikipedia.org", site.Location);
336             Assert.AreEqual("ja", site.Language.Code);
337             // TODO: プロパティに値が設定されたパターンを追加すべき
338             // TODO: プロパティが空の場合、きちんとデフォルト値が参照されることも確認すべき
339         }
340
341         /// <summary>
342         /// XMLシリアライズテストケース。
343         /// </summary>
344         [Test]
345         public void TestWriteXml()
346         {
347             Language lang = new Language("ja");
348             MediaWiki site = new MediaWiki(lang);
349             XmlWriterSettings settings = new XmlWriterSettings();
350             settings.OmitXmlDeclaration = true;
351
352             StringBuilder b = new StringBuilder();
353             using (XmlWriter w = XmlWriter.Create(b, settings))
354             {
355                 new XmlSerializer(typeof(MediaWiki)).Serialize(w, site);
356             }
357
358             // プロパティはデフォルト値の場合出力しないという動作あり
359             Assert.AreEqual("<MediaWiki><Location>http://ja.wikipedia.org</Location><Language Code=\"ja\"><Names /><Bracket /></Language><NamespacePath /><ExportPath /><Redirect /><TemplateNamespace /><CategoryNamespace /><FileNamespace /><MagicWords /></MediaWiki>", b.ToString());
360             // TODO: プロパティに値が設定されたパターンを追加すべき
361         }
362
363         #endregion
364     }
365 }