1 // ================================================================================================
3 // MediaWikiHeadingParserのテストクラスソース。</summary>
5 // <copyright file="MediaWikiHeadingParserTest.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Wptscs.Parsers
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;
21 /// <see cref="MediaWikiHeadingParser"/>のテストクラスです。
24 internal class MediaWikiHeadingParserTest
29 /// 前処理・後処理で生成/解放される言語別の<see cref="MediaWikiParser"/>。
31 private static IDictionary<string, MediaWikiParser> mediaWikiParsers = new Dictionary<string, MediaWikiParser>();
40 /// <param name="context">テスト用情報。</param>
41 /// <remarks><see cref="MediaWikiParser.Dispose"/>が必要な<see cref="MediaWikiParser"/>の生成。</remarks>
43 public static void SetUpBeforeClass(TestContext context)
45 mediaWikiParsers["en"] = new MediaWikiParser(new MockFactory().GetMediaWiki("en"));
51 /// <remarks><see cref="MediaWikiParser.Dispose"/>が必要な<see cref="MediaWikiParser"/>の解放。</remarks>
53 public static void TearDownAfterClass()
55 foreach (IDisposable parser in mediaWikiParsers.Values)
60 mediaWikiParsers.Clear();
71 public void TestConstructor()
73 // TODO: ちゃんと設定されているかも確認する?
74 MediaWikiHeadingParser parser = new MediaWikiHeadingParser(
75 new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
80 #region インタフェース実装メソッドテストケース
83 /// <see cref="MediaWikiHeadingParser.TryParse"/>メソッドテストケース。
86 public void TestTryParse()
89 MediaWikiHeading heading;
90 MediaWikiHeadingParser parser = new MediaWikiHeadingParser(mediaWikiParsers["en"]);
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());
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());
111 Assert.IsFalse(parser.TryParse("== test == test", out element));
112 Assert.IsNull(element);
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());
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);
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);
140 Assert.IsFalse(parser.TryParse(" ==test==", out element));
141 Assert.IsNull(element);
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());
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);
163 /// <see cref="MediaWikiHeadingParser.TryParse"/>メソッドテストケース(コメント)。
166 public void TestTryParseComment()
169 MediaWikiHeading heading;
170 MediaWikiHeadingParser parser = new MediaWikiHeadingParser(mediaWikiParsers["en"]);
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());
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));
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());