OSDN Git Service

#30244 Visual Studioの自動テストはテストクラスがinternalだと実行されていなかったので修正,
[wptscs/wpts.git] / WptscsTest / Parsers / MediaWikiVariableParserTest.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiVariableParserのテストクラスソース。</summary>
4 //
5 // <copyright file="MediaWikiVariableParserTest.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="MediaWikiVariableParser"/>のテストクラスです。
22     /// </summary>
23     [TestClass]
24     public class MediaWikiVariableParserTest
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             mediaWikiParsers["ja"] = new MediaWikiParser(new MockFactory().GetMediaWiki("ja"));
47         }
48
49         /// <summary>
50         /// テストの後処理。
51         /// </summary>
52         /// <remarks><see cref="MediaWikiParser.Dispose"/>が必要な<see cref="MediaWikiParser"/>の解放。</remarks>
53         [ClassCleanup]
54         public static void TearDownAfterClass()
55         {
56             foreach (IDisposable parser in mediaWikiParsers.Values)
57             {
58                 parser.Dispose();
59             }
60
61             mediaWikiParsers.Clear();
62         }
63
64         #endregion
65
66         #region インタフェース実装メソッドテストケース
67
68         /// <summary>
69         /// <see cref="MediaWikiVariableParser.TryParse"/>メソッドテストケース(基本的な構文)。
70         /// </summary>
71         [TestMethod]
72         public void TestTryParseBasic()
73         {
74             IElement element;
75             MediaWikiVariable variable;
76             MediaWikiVariableParser parser = new MediaWikiVariableParser(mediaWikiParsers["en"]);
77
78             // 変数のみ
79             Assert.IsTrue(parser.TryParse("{{{変数名}}}", out element));
80             variable = (MediaWikiVariable)element;
81             Assert.AreEqual("変数名", variable.Variable);
82             Assert.IsNull(variable.Value);
83
84             // タイトルとパイプ後の文字列
85             Assert.IsTrue(parser.TryParse("{{{変数名|デフォルト値}}}", out element));
86             variable = (MediaWikiVariable)element;
87             Assert.AreEqual("変数名", variable.Variable);
88             Assert.AreEqual("デフォルト値", variable.Value.ToString());
89
90             // よく見かけるパイプがあって後ろが無い奴
91             Assert.IsTrue(parser.TryParse("{{{変数名|}}}", out element));
92             variable = (MediaWikiVariable)element;
93             Assert.AreEqual("変数名", variable.Variable);
94             Assert.IsNotNull(variable.Value);
95             Assert.AreEqual(string.Empty, variable.Value.ToString());
96
97             // コメントについてはあっても特に問題ない
98             Assert.IsTrue(parser.TryParse("{{{変数名<!--必要に応じて変更1-->|デフォルト値<!--必要に応じて変更2-->}}}", out element));
99             variable = (MediaWikiVariable)element;
100             Assert.AreEqual("変数名<!--必要に応じて変更1-->", variable.Variable);
101             Assert.AreEqual("デフォルト値<!--必要に応じて変更2-->", variable.Value.ToString());
102         }
103
104         /// <summary>
105         /// <see cref="MediaWikiVariableParser.TryParse"/>メソッドテストケース(NGパターン)。
106         /// </summary>
107         [TestMethod]
108         public void TestTryParseNg()
109         {
110             IElement element;
111             MediaWikiVariableParser parser = new MediaWikiVariableParser(mediaWikiParsers["en"]);
112
113             // 開始タグが無い
114             Assert.IsFalse(parser.TryParse("変数名}}}", out element));
115
116             // 閉じタグが無い
117             Assert.IsFalse(parser.TryParse("{{{変数名", out element));
118
119             // 先頭が開始タグではない
120             Assert.IsFalse(parser.TryParse(" {{{変数名}}}", out element));
121
122             // 外部リンクタグ
123             Assert.IsFalse(parser.TryParse("[変数名]", out element));
124
125             // 内部リンクタグ
126             Assert.IsFalse(parser.TryParse("[[変数名]]", out element));
127
128             // テンプレートリンクタグ
129             Assert.IsFalse(parser.TryParse("{{変数名}}", out element));
130
131             // 空・null
132             Assert.IsFalse(parser.TryParse(string.Empty, out element));
133             Assert.IsFalse(parser.TryParse(null, out element));
134         }
135
136         /// <summary>
137         /// <see cref="MediaWikiVariableParser.TryParse"/>メソッドテストケース(入れ子)。
138         /// </summary>
139         [TestMethod]
140         public void TestTryParseNested()
141         {
142             IElement element;
143             MediaWikiVariable variable;
144             MediaWikiVariableParser parser = new MediaWikiVariableParser(mediaWikiParsers["ja"]);
145
146             // 入れ子もあり
147             Assert.IsTrue(parser.TryParse("{{{変数名|[[内部リンク]]{{ref-en}}}}}", out element));
148             variable = (MediaWikiVariable)element;
149             Assert.AreEqual("変数名", variable.Variable);
150             Assert.AreEqual("[[内部リンク]]{{ref-en}}", variable.Value.ToString());
151             Assert.IsInstanceOfType(variable.Value, typeof(ListElement));
152             ListElement list = (ListElement)variable.Value;
153             Assert.AreEqual(2, list.Count);
154             Assert.IsInstanceOfType(list[0], typeof(MediaWikiLink));
155             Assert.AreEqual("[[内部リンク]]", list[0].ToString());
156             Assert.IsInstanceOfType(list[1], typeof(MediaWikiTemplate));
157             Assert.AreEqual("{{ref-en}}", list[1].ToString());
158         }
159         
160         #endregion
161     }
162 }