{
using System;
using System.Collections.Generic;
- using NUnit.Framework;
- using Honememo.Tests;
+ using Honememo.Parsers;
using Honememo.Utilities;
using Honememo.Wptscs.Models;
+ using Honememo.Wptscs.Parsers;
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
/// <summary>
- /// MediaWikiPageのテストクラスです。
+ /// <see cref="MediaWikiPage"/>のテストクラスです。
/// </summary>
- [TestFixture]
- public class MediaWikiPageTest
+ [TestClass]
+ internal class MediaWikiPageTest
{
- #region ã\83¢ã\83\83ã\82¯ã\82¯ã\83©ス
+ #region ã\82³ã\83³ã\82¹ã\83\88ã\83©ã\82¯ã\82¿ã\83\86ã\82¹ã\83\88ã\82±ã\83¼ス
/// <summary>
- /// Websiteテスト用のモッククラスです。
+ /// コンストラクタテストケース。
/// </summary>
- public class DummySite : MediaWiki
+ [TestMethod]
+ public void TestConstructorWebsiteTitleTextTimestamp()
{
- #region コンストラクタ
+ DateTime t = DateTime.Now;
+ Uri uri = new Uri("http://wikipedia.example");
+ MediaWiki s = new MediaWiki(new Language("en"));
+ MediaWikiPage page = new MediaWikiPage(s, "TestTitle", "TestText", t, uri);
+ Assert.AreSame(s, page.Website);
+ Assert.AreEqual("TestTitle", page.Title);
+ Assert.AreEqual("TestText", page.Text);
+ Assert.AreEqual(t, page.Timestamp);
+ Assert.AreSame(uri, page.Uri);
+ }
- /// <summary>
- /// コンストラクタ。
- /// </summary>
- /// <param name="lang">ウェブサイトの言語。</param>
- public DummySite(Language lang)
- : base(lang)
- {
- }
+ /// <summary>
+ /// コンストラクタテストケース(タイムスタンプ無し)。
+ /// </summary>
+ [TestMethod]
+ public void TestConstructorWebsiteTitleText()
+ {
+ MediaWiki s = new MediaWiki(new Language("en"));
+ MediaWikiPage page = new MediaWikiPage(s, "TestTitle", "TestText");
+ Assert.AreEqual(s, page.Website);
+ Assert.AreEqual("TestTitle", page.Title);
+ Assert.AreEqual("TestText", page.Text);
+ Assert.IsNull(page.Timestamp);
+ Assert.IsNull(page.Uri);
+ }
- #endregion
+ /// <summary>
+ /// コンストラクタテストケース(本文・タイムスタンプ無し)。
+ /// </summary>
+ [TestMethod]
+ public void TestConstructorWebsiteTitle()
+ {
+ MediaWiki s = new MediaWiki(new Language("en"));
+ MediaWikiPage page = new MediaWikiPage(s, "TestTitle");
+ Assert.AreEqual(s, page.Website);
+ Assert.AreEqual("TestTitle", page.Title);
+ Assert.IsNull(page.Text);
+ Assert.IsNull(page.Timestamp);
+ Assert.IsNull(page.Uri);
+ }
- #region ダミーメソッド
+ /// <summary>
+ /// コンストラクタテストケース(ウェブサイトがnull)。
+ /// </summary>
+ [TestMethod]
+ [ExpectedException(typeof(ArgumentNullException))]
+ public void TestConstructorWebsiteNull()
+ {
+ new MediaWikiPage(null, "TestTitle");
+ }
- /// <summary>
- /// ページを取得。
- /// </summary>
- /// <param name="title">ページタイトル。</param>
- /// <returns>取得したページ。</returns>
- /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
- public override Page GetPage(string title)
- {
- System.Diagnostics.Debug.WriteLine(title);
- if (title == "Template:Test/doc")
- {
- return new MediaWikiPage(
- this,
- title,
- "[[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
- }
+ /// <summary>
+ /// コンストラクタテストケース(タイトルが空)。
+ /// </summary>
+ [TestMethod]
+ [ExpectedException(typeof(ArgumentException))]
+ public void TestConstructorTitleBlank()
+ {
+ new MediaWikiPage(new MediaWiki(new Language("en")), " ");
+ }
- return base.GetPage(title);
- }
+ #endregion
- #endregion
+ #region プロパティテストケース
+
+ /// <summary>
+ /// <see cref="MediaWikiPage.Redirect"/>プロパティテストケース(正常系)。
+ /// </summary>
+ [TestMethod]
+ public void TestRedirect()
+ {
+ MediaWiki site;
+
+ site = new MockFactory().GetMediaWiki("en");
+ Assert.IsNull(new MediaWikiPage(site, "TestTitle", "[[TestLink]]").Redirect);
+ Assert.IsNotNull(new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect);
+ Assert.AreEqual("[[TestLink]]", new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect.ToString());
+ Assert.IsNull(new MediaWikiPage(site, "TestTitle", "#転送 [[TestLink]]").Redirect);
+
+ site = new MockFactory().GetMediaWiki("ja");
+ Assert.IsNull(new MediaWikiPage(site, "TestTitle", "[[TestLink]]").Redirect);
+ Assert.IsNotNull(new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect);
+ Assert.AreEqual("[[TestLink]]", new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect.ToString());
+ Assert.IsNotNull(new MediaWikiPage(site, "TestTitle", "#転送 [[TestLink]]").Redirect);
+ Assert.AreEqual("[[TestLink]]", new MediaWikiPage(site, "TestTitle", "#転送 [[TestLink]]").Redirect.ToString());
+ }
+
+ /// <summary>
+ /// <see cref="MediaWikiPage.Redirect"/>プロパティテストケース(Text未設定)。
+ /// </summary>
+ [TestMethod]
+ [ExpectedException(typeof(InvalidOperationException))]
+ public void TestRedirectTextNull()
+ {
+ MediaWikiLink dummy = new MediaWikiPage(new MockFactory().GetMediaWiki("en"), "TestTitle").Redirect;
}
#endregion
- // TODO: いっぱい足らない
-
- #region 公開インスタンスメソッドテストケース
+ #region 公開メソッドテストケース
/// <summary>
- /// GetInterWikiメソッドテストケース(通常ページ)。
+ /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(通常ページ)。
/// </summary>
- [Test]
- public void TestGetInterWiki()
+ [TestMethod]
+ public void TestGetInterlanguage()
{
// 普通のページ
- MediaWikiPage page = new MediaWikiPage(new DummySite(new Language("en")), "TestTitle", "TestText\n"
- + " [[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
- Assert.AreEqual("テストページ", page.GetInterWiki("ja"));
- Assert.AreEqual("Test_Fr", page.GetInterWiki("fr"));
- Assert.IsEmpty(page.GetInterWiki("de"));
- Assert.IsEmpty(page.GetInterWiki("ru"));
- Assert.IsEmpty(page.GetInterWiki("zh"));
+ MediaWikiPage page = new MediaWikiPage(
+ new MediaWiki(new Language("en")),
+ "TestTitle",
+ "TestText\n [[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
+ Assert.AreEqual("[[ja:テストページ]]", page.GetInterlanguage("ja").ToString());
+ Assert.AreEqual("[[fr:Test_Fr]]", page.GetInterlanguage("fr").ToString());
+ Assert.IsNull(page.GetInterlanguage("de"));
+ Assert.IsNull(page.GetInterlanguage("ru"));
+ Assert.IsNull(page.GetInterlanguage("zh"));
}
/// <summary>
- /// GetInterWikiメソッドテストケース(通常ページ実データ使用)。
+ /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(通常ページ実データ使用)。
/// </summary>
- [Test, Timeout(20000)]
- public void TestGetInterWikiDiscoveryChannel()
+ [TestMethod, Timeout(20000)]
+ public void TestGetInterlanguageDiscoveryChannel()
{
MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Discovery Channel");
- Assert.AreEqual("ディスカバリーチャンネル", page.GetInterWiki("ja"));
- Assert.AreEqual("Discovery Channel (Italia)", page.GetInterWiki("it"));
- Assert.AreEqual("Discovery Channel", page.GetInterWiki("simple"));
- Assert.AreEqual("Discovery (телеканал)", page.GetInterWiki("ru"));
- Assert.IsEmpty(page.GetInterWiki("io"));
+ Assert.AreEqual("[[ja:ディスカバリーチャンネル]]", page.GetInterlanguage("ja").ToString());
+ Assert.AreEqual("[[it:Discovery Channel (Italia)]]", page.GetInterlanguage("it").ToString());
+ Assert.AreEqual("[[simple:Discovery Channel]]", page.GetInterlanguage("simple").ToString());
+ Assert.AreEqual("[[ru:Discovery (телеканал)]]", page.GetInterlanguage("ru").ToString());
+ Assert.IsNull(page.GetInterlanguage("io"));
}
/// <summary>
- /// GetInterWikiメソッドテストケース(テンプレートページ実データ使用)。
+ /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(テンプレートページ実データ使用)。
/// </summary>
- [Test, Timeout(20000)]
- public void TestGetInterWikiPlanetboxBegin()
+ [TestMethod, Timeout(20000)]
+ public void TestGetInterlanguagePlanetboxBegin()
{
MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Template:Planetbox begin");
- Assert.AreEqual("Template:Planetbox begin", page.GetInterWiki("ja"));
- Assert.AreEqual("Шаблон:Planetbox begin", page.GetInterWiki("ru"));
- Assert.IsEmpty(page.GetInterWiki("zh"));
+ Assert.AreEqual("[[ja:Template:Planetbox begin]]", page.GetInterlanguage("ja").ToString());
+ Assert.AreEqual("[[ru:Шаблон:Planetbox begin]]", page.GetInterlanguage("ru").ToString());
+ Assert.IsNull(page.GetInterlanguage("zh"));
}
/// <summary>
- /// GetInterWikiメソッドテストケース(Template:Documentation使用ページ)。
+ /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(Template:Documentation使用ページ)。
/// </summary>
- [Test]
- public void TestGetInterWikiDocumentation()
+ [TestMethod]
+ public void TestGetInterlanguageDocumentation()
{
// Template:Documentation を使ってるページ
MediaWiki site = new DummySite(new Language("en"));
site.DocumentationTemplateDefaultPage = "/doc";
MediaWikiPage page = new MediaWikiPage(site, "Template:Test", "TestText{{Documentation}}");
- Assert.AreEqual("テストページ", page.GetInterWiki("ja"));
- Assert.AreEqual("Test_Fr", page.GetInterWiki("fr"));
- Assert.IsEmpty(page.GetInterWiki("de"));
- Assert.IsEmpty(page.GetInterWiki("ru"));
- Assert.IsEmpty(page.GetInterWiki("zh"));
+ Assert.AreEqual("[[ja:テストページ]]", page.GetInterlanguage("ja").ToString());
+ Assert.AreEqual("[[fr:Test_Fr]]", page.GetInterlanguage("fr").ToString());
+ Assert.IsNull(page.GetInterlanguage("de"));
+ Assert.IsNull(page.GetInterlanguage("ru"));
+ Assert.IsNull(page.GetInterlanguage("zh"));
+ }
+
+ /// <summary>
+ /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(Template:Documentationにnoincludeで囲まれた言語間リンクが存在)。
+ /// </summary>
+ [TestMethod]
+ public void TestGetInterlanguagePartial()
+ {
+ MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Template:Partial");
+ Assert.AreEqual("[[ja:Template:Partial]]", page.GetInterlanguage("ja").ToString());
+ Assert.IsNull(page.GetInterlanguage("ru"));
}
/// <summary>
- /// IsRedirectメソッドテストケース。
+ /// <see cref="MediaWikiPage.IsRedirect"/>メソッドテストケース。
/// </summary>
- [Test]
+ [TestMethod]
public void TestIsRedirect()
{
- MediaWiki site = new DummySite(new Language("en"));
+ MediaWiki site = new MediaWiki(new Language("en"));
MediaWikiPage page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect]]");
Assert.IsTrue(page.IsRedirect());
Assert.AreEqual("Test Redirect", page.Redirect.Title);
Assert.AreEqual("Test Redirect4", page.Redirect.Title);
}
+ /// <summary>
+ /// <see cref="MediaWikiPage.Normalize"/>メソッドテストケース。
+ /// </summary>
+ [TestMethod]
+ public void TestNormalize()
+ {
+ MediaWiki site = new MediaWiki(new Language("en"));
+ MediaWikiPage page = new MediaWikiPage(site, "A/b/c");
+
+ // サブページの正規化
+ Assert.AreEqual("Normal page", page.Normalize(new MediaWikiLink("Normal page")));
+ Assert.AreEqual("A/b/c/s", page.Normalize(new MediaWikiLink("/s")));
+ Assert.AreEqual("A/b/c/s", page.Normalize(new MediaWikiLink("/s/")));
+ Assert.AreEqual("A/b", page.Normalize(new MediaWikiLink("../")));
+ Assert.AreEqual("A", page.Normalize(new MediaWikiLink("../../")));
+ Assert.AreEqual("A/b/s", page.Normalize(new MediaWikiLink("../s")));
+ Assert.AreEqual("A/b/s", page.Normalize(new MediaWikiLink("../s/")));
+ Assert.AreEqual("A/s", page.Normalize(new MediaWikiLink("../../s")));
+ Assert.AreEqual("A/s", page.Normalize(new MediaWikiLink("../../s/")));
+
+ // テンプレートの正規化
+ Assert.AreEqual("Template:Template page", page.Normalize(new MediaWikiTemplate("Template page")));
+ Assert.AreEqual("Normal page", page.Normalize(new MediaWikiTemplate("Normal page") { IsColon = true }));
+ Assert.AreEqual("Wikipedia:Help page", page.Normalize(new MediaWikiTemplate("Wikipedia:Help page")));
+ Assert.AreEqual("template:Template page", page.Normalize(new MediaWikiTemplate("template:Template page")));
+ Assert.AreEqual("A/b/c/Doc", page.Normalize(new MediaWikiTemplate("/Doc")));
+ Assert.AreEqual("CURRENTYEAR", page.Normalize(new MediaWikiTemplate("CURRENTYEAR")));
+ }
+
#endregion
- #region å\86\85é\83¨å\87¦ç\90\86ç\94¨ã\82¤ã\83³ã\82¹ã\82¿ã\83³ã\82¹ã\83¡ã\82½ã\83\83ã\83\89ã\83\86ã\82¹ã\83\88ã\82±ã\83¼ã\82¹
+ #region 内部処理用メソッドテストケース
// 非公開メソッドについてはprotected以上、またはやりたい部分だけ実施
/// <summary>
- /// ValidateIncompleteメソッドテストケース(正常系)。
+ /// <see cref="MediaWikiPage.ValidateIncomplete"/>メソッドテストケース(正常系)。
/// </summary>
- [Test]
+ [TestMethod]
public void TestValidateIncomplete()
{
- // 正常系は例外が発生しなければOK
- PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(
- new MediaWikiPage(
- new MediaWiki(new Language("en")),
- "TestTitle",
- "TestText"));
- acc.SetMethod("ValidateIncomplete", new Type[0]);
- acc.Invoke(new object[0]);
+ // Textが空の場合例外発生、正常系は例外が発生しなければOK
+ MediaWikiPageMock page = new MediaWikiPageMock(new MediaWiki(new Language("en")), "TestTitle");
+ page.Text = "TestText";
+ page.ValidateIncomplete();
}
/// <summary>
- /// ValidateIncompleteメソッドテストケース(異常系)。
+ /// <see cref="MediaWikiPage.ValidateIncomplete"/>メソッドテストケース(異常系)。
/// </summary>
- [Test]
+ [TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void TestValidateIncompleteNg()
{
- // 正常系は例外が発生しなければOK
- PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(
- new MediaWikiPage(new MediaWiki(new Language("en")), "TestTitle"));
- acc.SetMethod("ValidateIncomplete");
- acc.Invoke();
+ // Textが空の場合例外発生
+ new MediaWikiPageMock(new MediaWiki(new Language("en")), "TestTitle").ValidateIncomplete();
+ }
+
+ #endregion
+
+ #region モッククラス
+
+ /// <summary>
+ /// <see cref="MediaWikiPage"/>テスト用のモッククラスです。
+ /// </summary>
+ private class DummySite : MediaWiki
+ {
+ #region コンストラクタ
+
+ /// <summary>
+ /// コンストラクタ。
+ /// </summary>
+ /// <param name="lang">ウェブサイトの言語。</param>
+ public DummySite(Language lang)
+ : base(lang)
+ {
+ }
+
+ #endregion
+
+ #region ダミーメソッド
+
+ /// <summary>
+ /// ページを取得。<paramref name="title"/>に応じてテスト用の結果を返す。
+ /// </summary>
+ /// <param name="title">ページタイトル。</param>
+ /// <returns>取得したページ。</returns>
+ /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
+ public override Page GetPage(string title)
+ {
+ if (title == "Template:Test/doc")
+ {
+ return new MediaWikiPage(
+ this,
+ title,
+ "[[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
+ }
+
+ return base.GetPage(title);
+ }
+
+ #endregion
+ }
+
+ /// <summary>
+ /// <see cref="MediaWikiPage"/>テスト用のモッククラスです。
+ /// </summary>
+ private class MediaWikiPageMock : MediaWikiPage
+ {
+ #region コンストラクタ
+
+ /// <summary>
+ /// コンストラクタ。
+ /// ページの本文, タイムスタンプには<c>null</c>を設定。
+ /// </summary>
+ /// <param name="website">ページが所属するウェブサイト。</param>
+ /// <param name="title">ページタイトル。</param>
+ public MediaWikiPageMock(MediaWiki website, string title)
+ : base(website, title)
+ {
+ }
+
+ #endregion
+
+ #region 非公開プロパティテスト用のオーラーライドプロパティ
+
+ /// <summary>
+ /// ページの本文。
+ /// </summary>
+ public new string Text
+ {
+ get
+ {
+ return base.Text;
+ }
+
+ set
+ {
+ base.Text = value;
+ }
+ }
+
+ #endregion
+
+ #region 非公開メソッドテスト用のオーラーライドメソッド
+
+ /// <summary>
+ /// オブジェクトがメソッドの実行に不完全な状態でないか検証する。
+ /// 不完全な場合、例外をスローする。
+ /// </summary>
+ /// <exception cref="InvalidOperationException">オブジェクトは不完全。</exception>
+ public new void ValidateIncomplete()
+ {
+ base.ValidateIncomplete();
+ }
+
+ #endregion
}
#endregion