OSDN Git Service

#30244 Visual Studioの自動テストはテストクラスがinternalだと実行されていなかったので修正,
[wptscs/wpts.git] / WptscsTest / Websites / MediaWikiTest.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiのテストクラスソース。</summary>
4 //
5 // <copyright file="MediaWikiTest.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Websites
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 Honememo.Models;
21     using Honememo.Utilities;
22     using Honememo.Wptscs.Models;
23     using Microsoft.VisualStudio.TestTools.UnitTesting;
24
25     /// <summary>
26     /// <see cref="MediaWiki"/>のテストクラスです。
27     /// </summary>
28     [TestClass]
29     public class MediaWikiTest
30     {
31         #region 定数
32
33         /// <summary>
34         /// テストデータが格納されているフォルダパス。
35         /// </summary>
36         private static readonly string TestDir = "Data\\MediaWiki";
37
38         /// <summary>
39         /// XMLインポート/エクスポートで用いるテストデータ。
40         /// </summary>
41         private static readonly string TestXml = "<MediaWiki><Location>http://ja.wikipedia.org</Location>"
42             + "<Language Code=\"ja\"><Names /><Bracket /></Language>"
43             + "<MetaApi>_api.xml</MetaApi><ExportPath>/export/$1</ExportPath><Redirect>#飛ばす</Redirect>"
44             + "<TemplateNamespace>100</TemplateNamespace><CategoryNamespace>101</CategoryNamespace><FileNamespace>200</FileNamespace>"
45             + "<MagicWords><Variable>特別</Variable><Variable>マジックワード</Variable></MagicWords>"
46             + "<InterwikiPrefixs><Prefix>外部ウィキ</Prefix><Prefix>ニュース</Prefix></InterwikiPrefixs>"
47             + "<DocumentationTemplates><DocumentationTemplate DefaultPage=\"/サブページ\">Template:ドキュメント</DocumentationTemplate>"
48             + "<DocumentationTemplate DefaultPage=\"/サブページ\">テンプレート:Doc</DocumentationTemplate></DocumentationTemplates>"
49             + "<LinkInterwikiFormat>{{仮リンク|$1|$2|$3|label=$4}}</LinkInterwikiFormat>"
50             + "<LangFormat>{{Lang|$1|$2}}</LangFormat>"
51             + "<HasLanguagePage>True</HasLanguagePage></MediaWiki>";
52
53         #endregion
54
55         #region テスト支援メソッド
56
57         /// <summary>
58         /// テスト用の値を設定した<see cref="MediaWiki"/>オブジェクトを返す。
59         /// </summary>
60         /// <param name="language">言語コード。</param>
61         /// <returns>テスト用の値を設定したオブジェクト。</returns>
62         public MediaWiki GetTestServer(string language)
63         {
64             // ※ 下記URL生成時は、きちんとパス区切り文字を入れてやら無いとフォルダが認識されない。
65             //    また、httpで取得した場合とfileで取得した場合では先頭の大文字小文字が異なることが
66             //    あるため、それについては随時期待値を調整して対処。
67             UriBuilder b = new UriBuilder("file", string.Empty);
68             b.Path = Path.GetFullPath(TestDir) + "\\";
69             MediaWiki server = new MediaWiki(new Language(language), new Uri(b.Uri, language + "/").ToString());
70             server.ExportPath = "$1.xml";
71             server.MetaApi = "_api.xml";
72             return server;
73         }
74
75         #endregion
76
77         #region コンストラクタテストケース
78
79         /// <summary>
80         /// コンストラクタ(MediaWiki全般)テストケース。
81         /// </summary>
82         [TestMethod]
83         public void TestConstructorLanguageLocation()
84         {
85             MediaWiki site = new MediaWiki(new Language("en"), "test");
86             Assert.AreEqual("en", site.Language.Code);
87             Assert.AreEqual("test", site.Location);
88         }
89
90         /// <summary>
91         /// コンストラクタ(MediaWiki全般)テストケース(languageがnull)。
92         /// </summary>
93         [TestMethod]
94         [ExpectedException(typeof(ArgumentNullException))]
95         public void TestConstructorLanguageLocationByLanguageNull()
96         {
97             MediaWiki site = new MediaWiki(null, "test");
98         }
99
100         /// <summary>
101         /// コンストラクタ(MediaWiki全般)テストケース(locationがnull)。
102         /// </summary>
103         [TestMethod]
104         [ExpectedException(typeof(ArgumentNullException))]
105         public void TestConstructorLanguageLocationByLocationNull()
106         {
107             MediaWiki site = new MediaWiki(new Language("en"), null);
108         }
109
110         /// <summary>
111         /// コンストラクタ(Wikipedia用)テストケース。
112         /// </summary>
113         [TestMethod]
114         public void TestConstructorLanguage()
115         {
116             MediaWiki site = new MediaWiki(new Language("en"));
117             Assert.AreEqual("en", site.Language.Code);
118             Assert.AreEqual("http://en.wikipedia.org", site.Location);
119         }
120
121         /// <summary>
122         /// コンストラクタ(Wikipedia用)テストケース(languageがnull)。
123         /// </summary>
124         [TestMethod]
125         [ExpectedException(typeof(ArgumentNullException))]
126         public void TestConstructorLanguageByLanguageNull()
127         {
128             MediaWiki site = new MediaWiki(null);
129         }
130
131         #endregion
132
133         #region 設定ファイルに初期値を持つプロパティテストケース
134
135         /// <summary>
136         /// <see cref="MediaWiki.MetaApi"/>プロパティテストケース。
137         /// </summary>
138         [TestMethod]
139         public void TestMetaApi()
140         {
141             MediaWiki site = new MediaWiki(new Language("ja"));
142
143             // デフォルトでは設定ファイルの値が返される
144             Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases|interwikimap", site.MetaApi);
145
146             // 値を設定するとその値が返る
147             site.MetaApi = "test";
148             Assert.AreEqual("test", site.MetaApi);
149
150             // 空またはnullの場合、再び設定ファイルの値が入る
151             site.MetaApi = null;
152             Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases|interwikimap", site.MetaApi);
153             site.MetaApi = string.Empty;
154             Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases|interwikimap", site.MetaApi);
155         }
156
157         /// <summary>
158         /// <see cref="MediaWiki.ExportPath"/>プロパティテストケース。
159         /// </summary>
160         [TestMethod]
161         public void TestExportPath()
162         {
163             MediaWiki site = new MediaWiki(new Language("ja"));
164
165             // デフォルトでは設定ファイルの値が返される
166             Assert.AreEqual("/wiki/Special:Export/$1", site.ExportPath);
167
168             // 値を設定するとその値が返る
169             site.ExportPath = "test";
170             Assert.AreEqual("test", site.ExportPath);
171
172             // 空またはnullの場合、再び設定ファイルの値が入る
173             site.ExportPath = null;
174             Assert.AreEqual("/wiki/Special:Export/$1", site.ExportPath);
175             site.ExportPath = string.Empty;
176             Assert.AreEqual("/wiki/Special:Export/$1", site.ExportPath);
177         }
178
179         /// <summary>
180         /// <see cref="MediaWiki.Redirect"/>プロパティテストケース。
181         /// </summary>
182         [TestMethod]
183         public void TestRedirect()
184         {
185             MediaWiki site = new MediaWiki(new Language("ja"));
186
187             // デフォルトでは設定ファイルの値が返される
188             Assert.AreEqual("#REDIRECT", site.Redirect);
189
190             // 値を設定するとその値が返る
191             site.Redirect = "test";
192             Assert.AreEqual("test", site.Redirect);
193
194             // 空またはnullの場合、再び設定ファイルの値が入る
195             site.Redirect = null;
196             Assert.AreEqual("#REDIRECT", site.Redirect);
197             site.Redirect = string.Empty;
198             Assert.AreEqual("#REDIRECT", site.Redirect);
199         }
200
201         /// <summary>
202         /// <see cref="MediaWiki.TemplateNamespace"/>プロパティテストケース。
203         /// </summary>
204         [TestMethod]
205         public void TestTemplateNamespace()
206         {
207             MediaWiki site = new MediaWiki(new Language("ja"));
208
209             // デフォルトでは設定ファイルの値が返される
210             Assert.AreEqual(10, site.TemplateNamespace);
211
212             // 値を設定するとその値が返る
213             site.TemplateNamespace = -1;
214             Assert.AreEqual(-1, site.TemplateNamespace);
215         }
216
217         /// <summary>
218         /// <see cref="MediaWiki.CategoryNamespace"/>プロパティテストケース。
219         /// </summary>
220         [TestMethod]
221         public void TestCategoryNamespace()
222         {
223             MediaWiki site = new MediaWiki(new Language("ja"));
224
225             // デフォルトでは設定ファイルの値が返される
226             Assert.AreEqual(14, site.CategoryNamespace);
227
228             // 値を設定するとその値が返る
229             site.CategoryNamespace = -1;
230             Assert.AreEqual(-1, site.CategoryNamespace);
231         }
232
233         /// <summary>
234         /// <see cref="MediaWiki.FileNamespace"/>プロパティテストケース。
235         /// </summary>
236         [TestMethod]
237         public void TestFileNamespace()
238         {
239             MediaWiki site = new MediaWiki(new Language("ja"));
240
241             // デフォルトでは設定ファイルの値が返される
242             Assert.AreEqual(6, site.FileNamespace);
243
244             // 値を設定するとその値が返る
245             site.FileNamespace = -1;
246             Assert.AreEqual(-1, site.FileNamespace);
247         }
248
249         /// <summary>
250         /// <see cref="MediaWiki.MagicWords"/>プロパティテストケース。
251         /// </summary>
252         [TestMethod]
253         public void TestMagicWords()
254         {
255             MediaWiki site = new MediaWiki(new Language("ja"));
256
257             // デフォルトでは設定ファイルの値が返される
258             Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
259
260             // 値を設定するとその値が返る
261             site.MagicWords = new HashSet<string>();
262             Assert.AreEqual(0, site.MagicWords.Count);
263
264             // nullの場合、再び設定ファイルの値が入る
265             site.MagicWords = null;
266             Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
267         }
268
269         #endregion
270
271         #region サーバーから値を取得するプロパティテストケース
272
273         /// <summary>
274         /// <see cref="MediaWiki.Namespaces"/>プロパティテストケース。
275         /// </summary>
276         [TestMethod]
277         public void TestNamespaces()
278         {
279             MediaWiki site = this.GetTestServer("en");
280
281             // サーバーからダウンロードした値が返される
282             ISet<string> names = site.Namespaces[6];
283             Assert.IsNotNull(site.Namespaces);
284             Assert.IsTrue(site.Namespaces.Count > 0);
285             Assert.IsTrue(names.Contains("File"));
286             Assert.IsTrue(names.Contains("Image"));
287         }
288
289         /// <summary>
290         /// <see cref="MediaWiki.InterwikiPrefixs"/>プロパティテストケース。
291         /// </summary>
292         [TestMethod]
293         public void TestInterwikiPrefixs()
294         {
295             MediaWiki site = this.GetTestServer("en");
296
297             // デフォルトではサーバーからダウンロードした値+設定ファイルの値が返される
298             Assert.IsNotNull(site.InterwikiPrefixs);
299             Assert.IsTrue(site.InterwikiPrefixs.Count > 0);
300             Assert.IsTrue(site.InterwikiPrefixs.Contains("ja"));
301             Assert.IsTrue(site.InterwikiPrefixs.Contains("w"));
302             Assert.IsTrue(site.InterwikiPrefixs.Contains("wikipedia"));
303             Assert.IsTrue(site.InterwikiPrefixs.Contains("commons"));
304
305             // 値を設定すると設定ファイルの値の代わりにその値が返る
306             IgnoreCaseSet prefixs = new IgnoreCaseSet();
307             prefixs.Add("testtesttest");
308             site.InterwikiPrefixs = prefixs;
309             Assert.IsFalse(site.InterwikiPrefixs.Contains("wikipedia"));
310             Assert.IsTrue(site.InterwikiPrefixs.Contains("testtesttest"));
311
312             // 空の場合、再び設定ファイルの値が入る
313             site.InterwikiPrefixs = null;
314             Assert.AreNotSame(prefixs, site.InterwikiPrefixs);
315             Assert.IsTrue(site.InterwikiPrefixs.Contains("wikipedia"));
316             Assert.IsFalse(site.InterwikiPrefixs.Contains("testtesttest"));
317         }
318
319         #endregion
320
321         #region それ以外のプロパティテストケース
322
323         /// <summary>
324         /// <see cref="MediaWiki.DocumentationTemplates"/>プロパティテストケース。
325         /// </summary>
326         [TestMethod]
327         public void TestDocumentationTemplates()
328         {
329             MediaWiki site = new MediaWiki(new Language("ja"));
330
331             // デフォルトでは空
332             Assert.IsNotNull(site.DocumentationTemplates);
333             Assert.AreEqual(0, site.DocumentationTemplates.Count);
334
335             // 値を設定するとそのオブジェクトが返る
336             string[] templates = new string[] { "Template:Documentation" };
337             site.DocumentationTemplates = templates;
338             Assert.AreEqual(1, site.DocumentationTemplates.Count);
339             Assert.AreEqual("Template:Documentation", site.DocumentationTemplates[0]);
340             Assert.AreSame(templates, site.DocumentationTemplates);
341
342             // nullを設定すると初期化
343             site.DocumentationTemplates = null;
344             Assert.IsNotNull(site.DocumentationTemplates);
345             Assert.AreEqual(0, site.DocumentationTemplates.Count);
346         }
347
348         /// <summary>
349         /// <see cref="MediaWiki.DocumentationTemplateDefaultPage"/>プロパティテストケース。
350         /// </summary>
351         [TestMethod]
352         public void TestDocumentationTemplateDefaultPage()
353         {
354             MediaWiki site = new MediaWiki(new Language("ja"));
355
356             // デフォルトでは空
357             Assert.AreEqual(string.Empty, StringUtils.DefaultString(site.DocumentationTemplateDefaultPage));
358
359             // 値を設定するとその値が返る
360             site.DocumentationTemplateDefaultPage = "/doc";
361             Assert.AreEqual("/doc", site.DocumentationTemplateDefaultPage);
362             site.DocumentationTemplateDefaultPage = null;
363             Assert.AreEqual(string.Empty, StringUtils.DefaultString(site.DocumentationTemplateDefaultPage));
364         }
365
366         /// <summary>
367         /// <see cref="MediaWiki.LinkInterwikiFormat"/>プロパティテストケース。
368         /// </summary>
369         [TestMethod]
370         public void TestLinkInterwikiFormat()
371         {
372             MediaWiki site = new MediaWiki(new Language("ja"));
373
374             // デフォルトでは空
375             Assert.AreEqual(string.Empty, StringUtils.DefaultString(site.LinkInterwikiFormat));
376
377             // 値を設定するとその値が返る
378             site.LinkInterwikiFormat = "{{仮リンク|$1|$2|$3|label=$4}}";
379             Assert.AreEqual("{{仮リンク|$1|$2|$3|label=$4}}", site.LinkInterwikiFormat);
380             site.LinkInterwikiFormat = null;
381             Assert.AreEqual(string.Empty, StringUtils.DefaultString(site.LinkInterwikiFormat));
382         }
383
384         /// <summary>
385         /// <see cref="MediaWiki.LangFormat"/>プロパティテストケース。
386         /// </summary>
387         [TestMethod]
388         public void TestLangFormat()
389         {
390             MediaWiki site = new MediaWiki(new Language("ja"));
391
392             // デフォルトでは空
393             Assert.AreEqual(string.Empty, StringUtils.DefaultString(site.LangFormat));
394
395             // 値を設定するとその値が返る
396             site.LangFormat = "{{Lang|$1|$2}}";
397             Assert.AreEqual("{{Lang|$1|$2}}", site.LangFormat);
398             site.LangFormat = null;
399             Assert.AreEqual(string.Empty, StringUtils.DefaultString(site.LangFormat));
400         }
401
402         /// <summary>
403         /// <see cref="MediaWiki.HasLanguagePage"/>プロパティテストケース。
404         /// </summary>
405         [TestMethod]
406         public void TestHasLanguagePage()
407         {
408             MediaWiki site = new MediaWiki(new Language("ja"));
409
410             // デフォルトではfalse
411             Assert.IsFalse(site.HasLanguagePage);
412
413             // 値を設定するとその値が返る
414             site.HasLanguagePage = true;
415             Assert.IsTrue(site.HasLanguagePage);
416             site.HasLanguagePage = false;
417             Assert.IsFalse(site.HasLanguagePage);
418         }
419
420         #endregion
421
422         #region 公開メソッドテストケース
423
424         /// <summary>
425         /// <see cref="MediaWiki.GetPage"/>メソッドテストケース。
426         /// </summary>
427         [TestMethod]
428         public void TestGetPage()
429         {
430             MediaWiki site = this.GetTestServer("en");
431             Page page = site.GetPage("example");
432             Assert.IsInstanceOfType(page, typeof(MediaWikiPage));
433             Assert.AreEqual("Example", page.Title);
434             Assert.AreEqual(DateTime.Parse("2010/07/13T00:49:18Z"), page.Timestamp);
435             Assert.IsTrue(page.Text.Length > 0);
436             Assert.AreEqual(site, page.Website);
437         }
438
439         /// <summary>
440         /// <see cref="MediaWiki.IsMagicWord"/>メソッドテストケース。
441         /// </summary>
442         [TestMethod]
443         public void TestIsMagicWord()
444         {
445             MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
446             site.MagicWords = new HashSet<string>();
447
448             // 値が設定されていなければ一致しない
449             Assert.IsFalse(site.IsMagicWord("CURRENTYEAR"));
450             Assert.IsFalse(site.IsMagicWord("ns:1"));
451
452             // 値が一致、大文字小文字は区別する
453             site.MagicWords.Add("CURRENTYEAR");
454             Assert.IsTrue(site.IsMagicWord("CURRENTYEAR"));
455             Assert.IsFalse(site.IsMagicWord("currentyear"));
456             Assert.IsFalse(site.IsMagicWord("ns:1"));
457
458             // コロンが入るものは、その前の部分までで判定
459             site.MagicWords.Add("ns");
460             Assert.IsTrue(site.IsMagicWord("CURRENTYEAR"));
461             Assert.IsTrue(site.IsMagicWord("ns:1"));
462         }
463
464         /// <summary>
465         /// <see cref="MediaWiki.IsInterwiki"/>メソッドテストケース。
466         /// </summary>
467         [TestMethod]
468         public void TestIsInterwiki()
469         {
470             MediaWiki site = this.GetTestServer("en");
471             site.InterwikiPrefixs = new IgnoreCaseSet();
472
473             // 値が存在しなければ一致しない
474             Assert.IsFalse(site.IsInterwiki("commons:test"));
475             Assert.IsFalse(site.IsInterwiki("commons:"));
476             Assert.IsFalse(site.IsInterwiki("common:"));
477             Assert.IsFalse(site.IsInterwiki("zzz:zzz語版記事"));
478             Assert.IsFalse(site.IsInterwiki("ZZZ:zzz語版記事"));
479
480             // 値が設定されていれば、前方一致で一致する、大文字小文字は区別しない
481             site.InterwikiPrefixs.Add("commons");
482             site.InterwikiPrefixs.Add("zzz");
483             Assert.IsTrue(site.IsInterwiki("commons:test"));
484             Assert.IsTrue(site.IsInterwiki("commons:"));
485             Assert.IsFalse(site.IsInterwiki("common:"));
486             Assert.IsTrue(site.IsInterwiki("zzz:zzz語版記事"));
487             Assert.IsTrue(site.IsInterwiki("ZZZ:zzz語版記事"));
488
489             // 名前空間名と被るときはそちらが優先、ウィキ間リンクとは判定されない
490             site.InterwikiPrefixs.Add("File");
491             Assert.IsFalse(site.IsInterwiki("File:zzz語版記事"));
492         }
493
494         /// <summary>
495         /// <see cref="MediaWiki.IsNamespace"/>メソッドテストケース。
496         /// </summary>
497         [TestMethod]
498         public void TestIsNamespace()
499         {
500             MediaWiki site = this.GetTestServer("en");
501
502             // 値が設定されていれば、前方一致で一致する、大文字小文字は区別しない
503             Assert.IsFalse(site.IsNamespace("page"));
504             Assert.IsTrue(site.IsNamespace("File:image.png"));
505             Assert.IsTrue(site.IsNamespace("file:image.png"));
506             Assert.IsFalse(site.IsNamespace("画像:image.png"));
507         }
508
509         /// <summary>
510         /// <see cref="MediaWiki.FormatLinkInterwiki"/>メソッドテストケース。
511         /// </summary>
512         [TestMethod]
513         public void TestFormatLinkInterwiki()
514         {
515             MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
516
517             // LinkInterwikiFormatが空の場合、nullが返る
518             site.LinkInterwikiFormat = null;
519             Assert.IsNull(site.FormatLinkInterwiki("記事名", "言語", "他言語版記事名", "表示名"));
520             site.LinkInterwikiFormat = string.Empty;
521             Assert.IsNull(site.FormatLinkInterwiki("記事名", "言語", "他言語版記事名", "表示名"));
522
523             // 値が設定されている場合、パラメータを埋め込んで書式化される
524             site.LinkInterwikiFormat = "{{仮リンク|$1|$2|$3|label=$4}}";
525             Assert.AreEqual("{{仮リンク|記事名1|言語1|他言語版記事名1|label=表示名1}}", site.FormatLinkInterwiki("記事名1", "言語1", "他言語版記事名1", "表示名1"));
526             site.LinkInterwikiFormat = "{{日本語版にない記事リンク|$1|$2|$3}}";
527             Assert.AreEqual("{{日本語版にない記事リンク|記事名2|言語2|他言語版記事名2}}", site.FormatLinkInterwiki("記事名2", "言語2", "他言語版記事名2", "表示名2"));
528             site.LinkInterwikiFormat = "[[:$2:$3|$4]]";
529             Assert.AreEqual("[[:言語3:他言語版記事名3|表示名3]]", site.FormatLinkInterwiki("記事名3", "言語3", "他言語版記事名3", "表示名3"));
530             site.LinkInterwikiFormat = "xxx";
531             Assert.AreEqual("xxx", site.FormatLinkInterwiki("記事名", "言語", "他言語版記事名", "表示名"));
532
533             // 値がnull等でも特に制限はない
534             site.LinkInterwikiFormat = "{{仮リンク|$1|$2|$3|label=$4}}";
535             Assert.AreEqual("{{仮リンク||||label=}}", site.FormatLinkInterwiki(null, null, null, null));
536         }
537
538         /// <summary>
539         /// <see cref="MediaWiki.FormatLang"/>メソッドテストケース。
540         /// </summary>
541         [TestMethod]
542         public void TestFormatLang()
543         {
544             MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
545
546             // LangFormatが空の場合、nullが返る
547             site.LangFormat = null;
548             Assert.IsNull(site.FormatLang("ja", "日本語テキスト"));
549             site.LangFormat = string.Empty;
550             Assert.IsNull(site.FormatLang("ja", "日本語テキスト"));
551
552             // 値が設定されている場合、パラメータを埋め込んで書式化される
553             site.LangFormat = "{{Lang|$1|$2}}";
554             Assert.AreEqual("{{Lang|ja|日本語テキスト}}", site.FormatLang("ja", "日本語テキスト"));
555             site.LangFormat = "xxx";
556             Assert.AreEqual("xxx", site.FormatLang("ja", "日本語テキスト"));
557
558             // 値がnull等でも特に制限はない
559             site.LangFormat = "{{Lang|$1|$2}}";
560             Assert.AreEqual("{{Lang||}}", site.FormatLang(null, null));
561         }
562
563         #endregion
564
565         #region XMLシリアライズ用メソッドテストケース
566
567         /// <summary>
568         /// XMLデシリアライズテストケース。
569         /// </summary>
570         [TestMethod]
571         public void TestReadXml()
572         {
573             // ほぼ空の状態での読み込み
574             MediaWiki site;
575             using (XmlReader r = XmlReader.Create(
576                 new StringReader("<MediaWiki><Location>http://ja.wikipedia.org</Location>"
577                     + "<Language Code=\"ja\"><Names /></Language></MediaWiki>")))
578             {
579                 site = new XmlSerializer(typeof(MediaWiki)).Deserialize(r) as MediaWiki;
580             }
581
582             Assert.IsNotNull(site);
583             Assert.AreEqual("http://ja.wikipedia.org", site.Location);
584             Assert.AreEqual("ja", site.Language.Code);
585             Assert.AreEqual(0, site.DocumentationTemplates.Count);
586             Assert.AreEqual(string.Empty, StringUtils.DefaultString(site.DocumentationTemplateDefaultPage));
587             Assert.AreEqual(string.Empty, StringUtils.DefaultString(site.LinkInterwikiFormat));
588             Assert.AreEqual(string.Empty, StringUtils.DefaultString(site.LangFormat));
589             Assert.IsFalse(site.HasLanguagePage);
590
591             // 下記プロパティは、空の場合デフォルト値が返る
592             // ※ Namespacesは空の場合サーバーからデフォルト値を取得するため、ここではテストしない
593             // ※ InterwikiPrefixsのgetは常にサーバーからも値を取得するため、ここではテストしない
594             Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases|interwikimap", site.MetaApi);
595             Assert.AreEqual("/wiki/Special:Export/$1", site.ExportPath);
596             Assert.AreEqual("#REDIRECT", site.Redirect);
597             Assert.AreEqual(10, site.TemplateNamespace);
598             Assert.AreEqual(14, site.CategoryNamespace);
599             Assert.AreEqual(6, site.FileNamespace);
600             Assert.IsTrue(site.MagicWords.Count > 10);
601
602             // プロパティに値が設定された状態での読み込み
603             using (XmlReader r = XmlReader.Create(new StringReader(TestXml)))
604             {
605                 site = new XmlSerializer(typeof(MediaWiki)).Deserialize(r) as MediaWiki;
606             }
607
608             // ※ InterwikiPrefixsのgetは常にサーバーからも値を取得するため、ここではテストしない
609             Assert.IsNotNull(site);
610             Assert.AreEqual("http://ja.wikipedia.org", site.Location);
611             Assert.AreEqual("ja", site.Language.Code);
612             Assert.AreEqual("_api.xml", site.MetaApi);
613             Assert.AreEqual("/export/$1", site.ExportPath);
614             Assert.AreEqual("#飛ばす", site.Redirect);
615             Assert.AreEqual(100, site.TemplateNamespace);
616             Assert.AreEqual(101, site.CategoryNamespace);
617             Assert.AreEqual(200, site.FileNamespace);
618             Assert.AreEqual(2, site.MagicWords.Count);
619             Assert.IsTrue(site.MagicWords.Contains("特別"));
620             Assert.IsTrue(site.MagicWords.Contains("マジックワード"));
621             Assert.AreEqual(2, site.DocumentationTemplates.Count);
622             Assert.IsTrue(site.DocumentationTemplates.Contains("Template:ドキュメント"));
623             Assert.IsTrue(site.DocumentationTemplates.Contains("テンプレート:Doc"));
624             Assert.AreEqual("/サブページ", site.DocumentationTemplateDefaultPage);
625             Assert.AreEqual("{{仮リンク|$1|$2|$3|label=$4}}", site.LinkInterwikiFormat);
626             Assert.AreEqual("{{Lang|$1|$2}}", site.LangFormat);
627             Assert.IsTrue(site.HasLanguagePage);
628         }
629
630         /// <summary>
631         /// XMLシリアライズテストケース。
632         /// </summary>
633         [TestMethod]
634         public void TestWriteXml()
635         {
636             MediaWiki site = new MediaWiki(new Language("ja"));
637             StringBuilder b;
638             XmlWriterSettings settings = new XmlWriterSettings();
639             settings.OmitXmlDeclaration = true;
640
641             // ほぼ空の状態での出力
642             // 設定ファイルに初期値を持つプロパティはデフォルト値の場合出力しないという動作あり
643             b = new StringBuilder();
644             using (XmlWriter w = XmlWriter.Create(b, settings))
645             {
646                 new XmlSerializer(typeof(MediaWiki)).Serialize(w, site);
647             }
648
649             Assert.AreEqual(
650                 "<MediaWiki><Location>http://ja.wikipedia.org</Location><Language Code=\"ja\"><Names /><Bracket /></Language>"
651                 + "<MetaApi /><ExportPath /><Redirect /><TemplateNamespace /><CategoryNamespace /><FileNamespace />"
652                 + "<MagicWords /><InterwikiPrefixs /><DocumentationTemplates /><LinkInterwikiFormat /><LangFormat />"
653                 + "<HasLanguagePage>False</HasLanguagePage></MediaWiki>",
654                 b.ToString());
655
656             // プロパティに値が設定された場合の出力
657             site.MetaApi = "_api.xml";
658             site.ExportPath = "/export/$1";
659             site.Redirect = "#飛ばす";
660             site.TemplateNamespace = 100;
661             site.CategoryNamespace = 101;
662             site.FileNamespace = 200;
663             site.MagicWords = new HashSet<string>(new string[] { "特別", "マジックワード" });
664             site.InterwikiPrefixs = new IgnoreCaseSet(new string[] { "外部ウィキ", "ニュース" });
665             site.DocumentationTemplates = new string[] { "Template:ドキュメント", "テンプレート:Doc" };
666             site.DocumentationTemplateDefaultPage = "/サブページ";
667             site.LinkInterwikiFormat = "{{仮リンク|$1|$2|$3|label=$4}}";
668             site.LangFormat = "{{Lang|$1|$2}}";
669             site.HasLanguagePage = true;
670
671             b = new StringBuilder();
672             using (XmlWriter w = XmlWriter.Create(b, settings))
673             {
674                 new XmlSerializer(typeof(MediaWiki)).Serialize(w, site);
675             }
676
677             Assert.AreEqual(TestXml, b.ToString());
678         }
679
680         #endregion
681     }
682 }