OSDN Git Service

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