OSDN Git Service

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