OSDN Git Service

#27621 言語間リンク取得時に<includeonly>, <noinclude>を考慮するよう修正,
[wptscs/wpts.git] / WptscsTest / Parsers / MediaWikiParserTest.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiParserのテストクラスソース。</summary>
4 //
5 // <copyright file="MediaWikiParserTest.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Parsers
12 {
13     using System;
14     using Honememo.Parsers;
15     using Honememo.Wptscs.Models;
16     using Honememo.Wptscs.Websites;
17     using NUnit.Framework;
18
19     /// <summary>
20     /// <see cref="MediaWikiParser"/>のテストクラスです。
21     /// </summary>
22     [TestFixture]
23     class MediaWikiParserTest
24     {
25         #region 公開プロパティテストケース
26
27         /// <summary>
28         /// <see cref="MediaWikiParser.Website"/>プロパティテストケース。
29         /// </summary>
30         [Test]
31         public void TestWebsite()
32         {
33             MediaWiki site = new MediaWiki(new Language("en"));
34             using (MediaWikiParser parser = new MediaWikiParser(site))
35             {
36                 // コンストラクタで指定したオブジェクトが格納されていること
37                 Assert.AreSame(site, parser.Website);
38
39                 // 設定すればそのオブジェクトが入ること
40                 site = new MediaWiki(new Language("ja"));
41                 parser.Website = site;
42                 Assert.AreSame(site, parser.Website);
43             }
44         }
45
46         /// <summary>
47         /// <see cref="MediaWikiParser.Website"/>プロパティテストケース(null)。
48         /// </summary>
49         [Test]
50         [ExpectedException(typeof(ArgumentNullException))]
51         public void TestWebsiteNull()
52         {
53             using (MediaWikiParser parser = new MediaWikiParser(new MockFactory().GetMediaWiki("en")))
54             {
55                 parser.Website = null;
56             }
57         }
58
59         #endregion
60
61         #region ITextParserインタフェース実装メソッドテストケース
62
63         /// <summary>
64         /// <see cref="MediaWikiParser.TryParseToEndCondition"/>
65         /// メソッドテストケース(実際のデータを想定)。
66         /// </summary>
67         [Test]
68         public void TestTryParseToEndCondition()
69         {
70             string text = "'''Article Name''' is [[xxx]]\r\n==test head==\r\n<p>test</p><nowiki>[[test]]</nowiki><!--comment-->{{reflist}}";
71             IElement element;
72             using (MediaWikiParser parser = new MediaWikiParser(new MockFactory().GetMediaWiki("en")))
73             {
74                 // 実際に想定されるようなデータ
75                 Assert.IsTrue(parser.TryParseToEndCondition(text, null, out element));
76             }
77
78             Assert.AreEqual(text, element.ToString());
79             Assert.IsInstanceOf(typeof(ListElement), element);
80             ListElement list = (ListElement)element;
81             Assert.AreEqual(8, list.Count);
82             Assert.AreEqual("'''Article Name''' is ", list[0].ToString());
83             Assert.AreEqual("[[xxx]]", list[1].ToString());
84             Assert.AreEqual("\r\n", list[2].ToString());
85             Assert.AreEqual("==test head==", list[3].ToString());
86             Assert.AreEqual("\r\n<p>test</p>", list[4].ToString());
87             Assert.AreEqual("<nowiki>[[test]]</nowiki>", list[5].ToString());
88             Assert.AreEqual("<!--comment-->", list[6].ToString());
89             Assert.AreEqual("{{reflist}}", list[7].ToString());
90         }
91
92         /// <summary>
93         /// <see cref="MediaWikiParser.TryParseToEndCondition"/>
94         /// メソッドテストケース(その他のケース)。
95         /// </summary>
96         [Test]
97         public void TestTryParseToEndConditionEmpty()
98         {
99             IElement element;
100             using (MediaWikiParser parser = new MediaWikiParser(new MockFactory().GetMediaWiki("en")))
101             {
102                 // 空文字列、一応解析成功となる
103                 Assert.IsTrue(parser.TryParseToEndCondition(String.Empty, null, out element));
104                 Assert.AreEqual(String.Empty, element.ToString());
105                 Assert.IsInstanceOf(typeof(TextElement), element);
106
107                 // nullは解析失敗
108                 Assert.IsFalse(parser.TryParseToEndCondition(null, null, out element));
109                 Assert.IsNull(element);
110             }
111         }
112
113         /// <summary>
114         /// <see cref="MediaWikiParser.TryParseToEndCondition"/>
115         /// メソッドテストケース(終了条件)。
116         /// </summary>
117         [Test]
118         public void TestTryParseToEndConditionCondition()
119         {
120             // 親クラスにあった終了条件で停止する動作が継承先でも動作していること
121             string text = "'''Article Name''' is [[xxx]]\r\n==test head==\r\n<p>test</p><nowiki>[[test]]</nowiki><!--comment-->{{reflist}}";
122             IElement element;
123             using (MediaWikiParser parser = new MediaWikiParser(new MockFactory().GetMediaWiki("en")))
124             {
125                 Assert.IsTrue(parser.TryParseToEndCondition(text, (string s, int index) => s[index] == '/', out element));
126             }
127
128             Assert.AreEqual("'''Article Name''' is [[xxx]]\r\n==test head==\r\n<p>test<", element.ToString());
129             Assert.IsInstanceOf(typeof(ListElement), element);
130             ListElement list = (ListElement)element;
131             Assert.AreEqual(5, list.Count);
132         }
133
134         /// <summary>
135         /// <see cref="MediaWikiParser.TryParseToEndCondition"/>
136         /// メソッドテストケース(テンプレートページ実データ使用)。
137         /// </summary>
138         /// <remarks>
139         /// Ver 1.11にて解析失敗時のリトライにより極端に時間がかかっていたデータ。
140         /// 中身についてはほぼ処理できない類のものだが、現実的な時間で解析が終わることだけ検証。
141         /// </remarks>
142         [Test, Timeout(20000)]
143         public void TestTryParseToEndConditionTemplateContext()
144         {
145             IElement element;
146             using (MediaWikiParser parser = new MediaWikiParser(new MockFactory().GetMediaWiki("en")))
147             {
148                 string text = parser.Website.GetPage("Template:context").Text;
149                 Assert.IsTrue(parser.TryParseToEndCondition(text, null, out element));
150                 Assert.IsInstanceOf(typeof(ListElement), element);
151                 Assert.AreEqual(text, element.ToString());
152             }
153         }
154
155         /// <summary>
156         /// <see cref="MediaWikiParser.TryParseToEndCondition"/>
157         /// メソッドテストケース(Dispose)。
158         /// </summary>
159         [Test]
160         [ExpectedException(typeof(ObjectDisposedException))]
161         public void TestTryParseToEndConditionDispose()
162         {
163             MediaWikiParser parser = new MediaWikiParser(new MockFactory().GetMediaWiki("en"));
164             parser.Dispose();
165             IElement result;
166             parser.TryParseToEndCondition(String.Empty, null, out result);
167         }
168
169         #endregion
170     }
171 }