OSDN Git Service

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