OSDN Git Service

a81ad85e9558de979518c85f384064ee7f94ec4e
[wptscs/wpts.git] / WptscsTest / Parsers / MediaWikiHeadingParserTest.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiHeadingParserのテストクラスソース。</summary>
4 //
5 // <copyright file="MediaWikiHeadingParserTest.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 System.Collections.Generic;
15     using Honememo.Parsers;
16     using Honememo.Wptscs.Models;
17     using Honememo.Wptscs.Websites;
18     using NUnit.Framework;
19
20     /// <summary>
21     /// MediaWikiHeadingParserのテストクラスです。
22     /// </summary>
23     [TestFixture]
24     public class MediaWikiHeadingParserTest
25     {
26         #region private変数
27
28         /// <summary>
29         /// 前処理・後処理で生成/解放される言語別のMediaWikiParser。
30         /// </summary>
31         private IDictionary<string, MediaWikiParser> mediaWikiParsers = new Dictionary<string, MediaWikiParser>();
32
33         #endregion
34
35         #region 前処理・後処理
36
37         /// <summary>
38         /// テストの前処理。
39         /// </summary>
40         [TestFixtureSetUp]
41         public void SetUpBeforeClass()
42         {
43             // Disposeが必要なMediaWikiParserの生成/解放
44             this.mediaWikiParsers["en"] = new MediaWikiParser(new MockFactory().GetMediaWiki("en"));
45         }
46
47         /// <summary>
48         /// テストの後処理。
49         /// </summary>
50         [TestFixtureTearDown]
51         public void TearDownAfterClass()
52         {
53             // Disposeが必要なMediaWikiParserの生成/解放
54             foreach (MediaWikiParser parser in this.mediaWikiParsers.Values)
55             {
56                 parser.Dispose();
57             }
58
59             this.mediaWikiParsers.Clear();
60         }
61
62         #endregion
63
64         #region コンストラクタテストケース
65
66         /// <summary>
67         /// コンストラクタテストケース。
68         /// </summary>
69         [Test]
70         public void TestConstructor()
71         {
72             // TODO: ちゃんと設定されているかも確認する?
73             MediaWikiHeadingParser parser = new MediaWikiHeadingParser(
74                 new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
75         }
76
77         #endregion
78
79         #region インタフェース実装メソッドテストケース
80
81         /// <summary>
82         /// TryParseメソッドテストケース。
83         /// </summary>
84         [Test]
85         public void TestTryParse()
86         {
87             IElement element;
88             MediaWikiHeading heading;
89             MediaWikiHeadingParser parser = new MediaWikiHeadingParser(this.mediaWikiParsers["en"]);
90
91             // 基本形
92             Assert.IsTrue(parser.TryParse("==test==", out element));
93             Assert.IsInstanceOf(typeof(MediaWikiHeading), element);
94             heading = (MediaWikiHeading)element;
95             Assert.AreEqual("==test==", heading.ToString());
96             Assert.AreEqual(2, heading.Level);
97             Assert.AreEqual(1, heading.Count);
98             Assert.AreEqual("test", heading[0].ToString());
99
100             // 後ろが改行
101             Assert.IsTrue(parser.TryParse("== test == \r\ntest", out element));
102             Assert.IsInstanceOf(typeof(MediaWikiHeading), element);
103             heading = (MediaWikiHeading)element;
104             Assert.AreEqual("== test == ", heading.ToString());
105             Assert.AreEqual(2, heading.Level);
106             Assert.AreEqual(1, heading.Count);
107             Assert.AreEqual(" test ", heading[0].ToString());
108
109             // 改行以外はNG
110             Assert.IsFalse(parser.TryParse("== test == test", out element));
111             Assert.IsNull(element);
112
113             // 複数の要素を含む
114             Assert.IsTrue(parser.TryParse("===[[test]] and sample===", out element));
115             Assert.IsInstanceOf(typeof(MediaWikiHeading), element);
116             heading = (MediaWikiHeading)element;
117             Assert.AreEqual("===[[test]] and sample===", heading.ToString());
118             Assert.AreEqual(3, heading.Level);
119             Assert.AreEqual(2, heading.Count);
120             Assert.AreEqual("[[test]]", heading[0].ToString());
121             Assert.IsInstanceOf(typeof(MediaWikiLink), heading[0]);
122             Assert.AreEqual(" and sample", heading[1].ToString());
123
124             // 前後で数が違うのはOK、少ない側の階層と判定
125             Assert.IsTrue(parser.TryParse("=test==", out element));
126             Assert.IsInstanceOf(typeof(MediaWikiHeading), element);
127             heading = (MediaWikiHeading)element;
128             Assert.AreEqual("=test==", heading.ToString());
129             Assert.AreEqual(1, heading.Level);
130
131             // 前後で数が違うの逆パターン
132             Assert.IsTrue(parser.TryParse("====test==", out element));
133             Assert.IsInstanceOf(typeof(MediaWikiHeading), element);
134             heading = (MediaWikiHeading)element;
135             Assert.AreEqual("====test==", heading.ToString());
136             Assert.AreEqual(2, heading.Level);
137
138             // 先頭が = 以外はNG
139             Assert.IsFalse(parser.TryParse(" ==test==", out element));
140             Assert.IsNull(element);
141
142             // 内部要素に改行を含むのはOK
143             Assert.IsTrue(parser.TryParse("== {{lang\n|ja|見出し}} ==\n", out element));
144             Assert.IsInstanceOf(typeof(MediaWikiHeading), element);
145             heading = (MediaWikiHeading)element;
146             Assert.AreEqual("== {{lang\n|ja|見出し}} ==", heading.ToString());
147             Assert.AreEqual(2, heading.Level);
148             Assert.AreEqual(3, heading.Count);
149             Assert.AreEqual(" ", heading[0].ToString());
150             Assert.AreEqual("{{lang\n|ja|見出し}}", heading[1].ToString());
151             Assert.IsInstanceOf(typeof(MediaWikiTemplate), heading[1]);
152             Assert.AreEqual(" ", heading[2].ToString());
153         }
154
155         /// <summary>
156         /// TryParseメソッドテストケース(コメント)。
157         /// </summary>
158         [Test]
159         public void TestTryParseComment()
160         {
161             IElement element;
162             MediaWikiHeading heading;
163             MediaWikiHeadingParser parser = new MediaWikiHeadingParser(this.mediaWikiParsers["en"]);
164
165             // ↓1.01以前のバージョンで対応していたコメント、中のコメントが認識されなかった
166             // // こんな無茶なコメントも一応対応
167             // Assert.IsTrue(parser.TryParse("<!--test-->=<!--test-->=関連項目<!--test-->==<!--test-->\n", out element));
168             // Assert.IsInstanceOf(typeof(MediaWikiHeading), element);
169             // heading = (MediaWikiHeading)element;
170             // Assert.AreEqual("<!--test-->=<!--test-->=関連項目<!--test-->==<!--test-->", heading.ToString());
171             // Assert.AreEqual(2, heading.Level);
172             // // TODO: 本当は2でコメントも見つけるべきだが、コメントは中も除外しているので現状1
173             // // Assert.AreEqual(2, heading.Count);
174             // // Assert.AreEqual("関連項目", heading[0].ToString());
175             // // Assert.AreEqual("<!--test-->", heading[1].ToString());
176             // Assert.AreEqual(1, heading.Count);
177             // Assert.AreEqual("関連項目", heading[0].ToString());
178             // ↓1.10改修後での動作
179             Assert.IsFalse(parser.TryParse("<!--test-->=<!--test-->=関連項目<!--test-->==<!--test-->\n", out element));
180             Assert.IsTrue(parser.TryParse("=<!--test-->=関連項目<!--test-->==\n", out element));
181             Assert.IsInstanceOf(typeof(MediaWikiHeading), element);
182             heading = (MediaWikiHeading)element;
183             Assert.AreEqual(1, heading.Level);
184             Assert.AreEqual(4, heading.Count);
185             Assert.AreEqual("<!--test-->", heading[0].ToString());
186             Assert.AreEqual("=関連項目", heading[1].ToString());
187             Assert.AreEqual("<!--test-->", heading[2].ToString());
188             Assert.AreEqual("=", heading[3].ToString());
189             Assert.IsFalse(parser.TryParse("==関連項目<!--test-->==<!--test-->\n", out element));
190
191             // ↓1.10改修後に対応しているコメント、変なところのコメントは駄目だが中のものを認識する
192             Assert.IsTrue(parser.TryParse("==<!--test1-->関連項目<!--test2-->==\n", out element));
193             Assert.IsInstanceOf(typeof(MediaWikiHeading), element);
194             heading = (MediaWikiHeading)element;
195             Assert.AreEqual("==<!--test1-->関連項目<!--test2-->==", heading.ToString());
196             Assert.AreEqual(2, heading.Level);
197             Assert.AreEqual(3, heading.Count);
198             Assert.AreEqual("<!--test1-->", heading[0].ToString());
199             Assert.IsInstanceOf(typeof(XmlCommentElement), heading[0]);
200             Assert.AreEqual("関連項目", heading[1].ToString());
201             Assert.AreEqual("<!--test2-->", heading[2].ToString());
202         }
203
204         #endregion
205     }
206 }