OSDN Git Service

#30840 言語間リンクの取得をMediaWiki APIより行うよう変更,
[wptscs/wpts.git] / WptscsTest / Websites / MediaWikiPageTest.cs
index 714b06b..036ff3a 100644 (file)
@@ -3,7 +3,7 @@
 //      MediaWikiPageのテストクラスソース。</summary>
 //
 // <copyright file="MediaWikiPageTest.cs" company="honeplusのメモ帳">
-//      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
+//      Copyright (C) 2013 Honeplus. All rights reserved.</copyright>
 // <author>
 //      Honeplus</author>
 // ================================================================================================
@@ -12,6 +12,8 @@ namespace Honememo.Wptscs.Websites
 {
     using System;
     using System.Collections.Generic;
+    using System.IO;
+    using System.Xml.Linq;
     using Honememo.Parsers;
     using Honememo.Utilities;
     using Honememo.Wptscs.Models;
@@ -24,216 +26,262 @@ namespace Honememo.Wptscs.Websites
     [TestClass]
     public class MediaWikiPageTest
     {
-        #region コンストラクタテストケース
+        #region 定数
 
         /// <summary>
-        /// コンストラクタテストケース
+        /// example.xmlのページ本文
         /// </summary>
-        [TestMethod]
-        public void TestConstructorWebsiteTitleTextTimestamp()
-        {
-            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);
-        }
-
+        private static readonly string exampleText
+            = "[[File:Example.png|thumb|Wikipedia's example image. (Example.png)]]\n{{wiktionary}}\n{{wikiquote}}\n"
+                + "'''Example''' may refer to:\n\n*[[Example (rapper)]], a British rapper\n*[[example.com]], "
+                + "[[example.net]], [[example.org]]  and [[.example]], domain names reserved for use in documentation "
+                + "as examples \n\n==See also==\n*[[Exemplum]], medieval collections of short stories to be told in "
+                + "sermons\n*[[Exemplar]], a prototype or model which others can use to understand a topic better\n\n"
+                + "{{disambig}}\n\n[[fr:Example]]\n[[ksh:Example (Watt ėßß datt?)]]";
+        
         /// <summary>
-        /// コンストラクタテストケース(タイムスタンプ無し)
+        /// example.xmlのページ本文
         /// </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);
-        }
+        private static readonly DateTime exampleTimestamp = DateTime.Parse("2010-07-13T00:49:18Z");
+
+        #endregion
+
+        #region プロパティテストケース
 
         /// <summary>
-        /// コンストラクタテストケース(本文・タイムスタンプ無し)
+        /// <see cref="MediaWikiPage.Text"/>プロパティテストケース
         /// </summary>
         [TestMethod]
-        public void TestConstructorWebsiteTitle()
+        public void TestText()
         {
-            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);
+            // 何も値が設定されていない場合、記事名からデータを読み込みその本文を返す
+            // 同時にタイムスタンプ, URIも設定される
+            // ※ 異常系については、MediaWiki側の実装なのでそちらでテストする
+            MediaWiki site = new MockFactory().GetMediaWiki("en");
+            Uri uri = new Uri(new Uri(site.Location), StringUtils.FormatDollarVariable(site.ExportPath, "example"));
+            MediaWikiPageMock page = new MediaWikiPageMock(site, "example");
             Assert.IsNull(page.Uri);
-        }
 
-        /// <summary>
-        /// コンストラクタテストケース(ウェブサイトがnull)。
-        /// </summary>
-        [TestMethod]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void TestConstructorWebsiteNull()
-        {
-            new MediaWikiPage(null, "TestTitle");
+            Assert.AreEqual(MediaWikiPageTest.exampleText, page.Text);
+            Assert.AreEqual(MediaWikiPageTest.exampleTimestamp, page.Timestamp);
+            Assert.AreEqual(uri, page.Uri);
+
+            // 一度読み込むと、次回以降はその値が設定されている
+            page.Title = "new name";
+            Assert.AreEqual(MediaWikiPageTest.exampleText, page.Text);
+            Assert.AreEqual(MediaWikiPageTest.exampleTimestamp, page.Timestamp);
+
+            // 値が設定されている状態では、設定された値が返る
+            page = new MediaWikiPageMock(site, "example");
+            page.Text = "test body";
+            Assert.AreEqual("test body", page.Text);
+            Assert.IsNull(page.Uri);
         }
 
         /// <summary>
-        /// コンストラクタテストケース(タイトルが空)
+        /// <see cref="MediaWikiPage.Timestamp"/>プロパティテストケース
         /// </summary>
         [TestMethod]
-        [ExpectedException(typeof(ArgumentException))]
-        public void TestConstructorTitleBlank()
+        public void TestTimestamp()
         {
-            new MediaWikiPage(new MediaWiki(new Language("en")), "  ");
+            // 何も値が設定されていない場合、記事名からデータを読み込みそのタイムスタンプを返す
+            // 同時にページ本文, URIも設定される
+            // ※ 異常系については、MediaWiki側の実装なのでそちらでテストする
+            MediaWiki site = new MockFactory().GetMediaWiki("en");
+            Uri uri = new Uri(new Uri(site.Location), StringUtils.FormatDollarVariable(site.ExportPath, "example"));
+            MediaWikiPageMock page = new MediaWikiPageMock(site, "example");
+            Assert.IsNull(page.Uri);
+
+            Assert.AreEqual(MediaWikiPageTest.exampleTimestamp, page.Timestamp);
+            Assert.AreEqual(MediaWikiPageTest.exampleText, page.Text);
+            Assert.AreEqual(uri, page.Uri);
+
+            // 一度読み込むと、次回以降はその値が設定されている
+            page.Title = "new name";
+            Assert.AreEqual(MediaWikiPageTest.exampleTimestamp, page.Timestamp);
+            Assert.AreEqual(MediaWikiPageTest.exampleText, page.Text);
+
+            // 値が設定されている状態では、設定された値が返る
+            page = new MediaWikiPageMock(site, "example");
+            DateTime now = DateTime.Now;
+            page.Timestamp = now;
+            Assert.AreEqual(now, page.Timestamp);
+            Assert.IsNull(page.Uri);
         }
 
         #endregion
 
-        #region プロパティテストケース
+        #region 静的メソッドテストケース
 
         /// <summary>
-        /// <see cref="MediaWikiPage.Redirect"/>プロパティテストケース(正常系)
+        /// <see cref="MediaWikiPage.GetFromQuery"/>メソッドテストケース
         /// </summary>
         [TestMethod]
-        public void TestRedirect()
+        public void TestGetFromQuery()
         {
-            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());
+            // XMLを変えつつ、クエリーから想定通りのパラメータが読み込まれていることを確認
+            // ※ ページ本文とタイムスタンプはnullだが遅延読み込みされるので、ここではチェックしない
+            // ※ XMLはいろんなパターンがありえるが、パターンが増えすぎるので使う項目しかテストしていない。
+            //    ここ以外の項目は、基本的に影響していない・・・はず。
+
+            // 必要最小限のパターン
+            MediaWiki website = new MockFactory().GetMediaWiki("en");
+            XElement pe = new XElement("page", new XAttribute("title", "Test page"));
+            XElement query = new XElement("query", new XElement("pages", pe));
+            MediaWikiPage page = MediaWikiPage.GetFromQuery(website, null, query);
+            Assert.AreSame(website, page.Website);
+            Assert.IsNull(page.Uri);
+            Assert.AreEqual("Test page", page.Title);
+            Assert.IsNull(page.GetInterlanguage("ja"));
+            Assert.IsNull(page.GetInterlanguage("de"));
+            Assert.IsNull(page.Redirect);
+
+            // URI
+            Uri uri = new Uri("http://example.com/");
+            page = MediaWikiPage.GetFromQuery(website, uri, query);
+            Assert.AreSame(website, page.Website);
+            Assert.AreSame(uri, page.Uri);
+            Assert.AreEqual("Test page", page.Title);
+            Assert.IsNull(page.GetInterlanguage("ja"));
+            Assert.IsNull(page.GetInterlanguage("de"));
+            Assert.IsNull(page.Redirect);
+
+            // 言語間リンク枠だけ、上と変わらず
+            XElement les = new XElement("langlinks");
+            pe.Add(les);
+            page = MediaWikiPage.GetFromQuery(website, uri, query);
+            Assert.AreSame(website, page.Website);
+            Assert.AreSame(uri, page.Uri);
+            Assert.AreEqual("Test page", page.Title);
+            Assert.IsNull(page.GetInterlanguage("ja"));
+            Assert.IsNull(page.GetInterlanguage("de"));
+            Assert.IsNull(page.Redirect);
+
+            // 言語間リンク
+            les.Add(new XElement("ll", new XAttribute("lang", "ja"), "テストページ"));
+            page = MediaWikiPage.GetFromQuery(website, uri, query);
+            Assert.AreSame(website, page.Website);
+            Assert.AreSame(uri, page.Uri);
+            Assert.AreEqual("Test page", page.Title);
+            Assert.AreEqual("テストページ", page.GetInterlanguage("ja"));
+            Assert.IsNull(page.GetInterlanguage("de"));
+            Assert.IsNull(page.Redirect);
+
+            // 言語間リンク複数も可
+            les.Add(new XElement("ll", new XAttribute("lang", "de"), "Test de page"));
+            page = MediaWikiPage.GetFromQuery(website, uri, query);
+            Assert.AreSame(website, page.Website);
+            Assert.AreSame(uri, page.Uri);
+            Assert.AreEqual("Test page", page.Title);
+            Assert.AreEqual("テストページ", page.GetInterlanguage("ja"));
+            Assert.AreEqual("Test de page", page.GetInterlanguage("de"));
+            Assert.IsNull(page.Redirect);
+
+            // リダイレクト
+            query.Add(new XElement("redirects", new XElement("r", new XAttribute("from", "from Redirect"))));
+            page = MediaWikiPage.GetFromQuery(website, uri, query);
+            Assert.AreSame(website, page.Website);
+            Assert.AreSame(uri, page.Uri);
+            Assert.AreEqual("Test page", page.Title);
+            Assert.AreEqual("テストページ", page.GetInterlanguage("ja"));
+            Assert.AreEqual("Test de page", page.GetInterlanguage("de"));
+            Assert.AreEqual("from Redirect", page.Redirect);
         }
 
         /// <summary>
-        /// <see cref="MediaWikiPage.Redirect"/>プロパティテストケース(Text未設定)。
+        /// <see cref="MediaWikiPage.GetFromQuery"/>メソッドテストケース(サイトが<c>null</c>)。
         /// </summary>
         [TestMethod]
-        [ExpectedException(typeof(InvalidOperationException))]
-        public void TestRedirectTextNull()
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestGetFromQueryAboutWebsiteIsNull()
         {
-            MediaWikiLink dummy = new MediaWikiPage(new MockFactory().GetMediaWiki("en"), "TestTitle").Redirect;
+            MediaWikiPage.GetFromQuery(
+                null,
+                null,
+                new XElement(
+                    "query",
+                    new XElement(
+                        "pages",
+                        new XElement("page", new XAttribute("title", "Test page")))));
         }
 
-        #endregion
-
-        #region 公開メソッドテストケース
-
         /// <summary>
-        /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(通常ページ)。
+        /// <see cref="MediaWikiPage.GetFromQuery"/>メソッドテストケース(XML不正)。
         /// </summary>
         [TestMethod]
-        public void TestGetInterlanguage()
+        [ExpectedException(typeof(InvalidOperationException))]
+        public void TestGetFromQueryAboutPageElementIsNotFound()
         {
-            // 普通のページ
-            MediaWikiPage page = new MediaWikiPage(
+            MediaWikiPage.GetFromQuery(
                 new MockFactory().GetMediaWiki("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"));
+                null,
+                new XElement("query", new XElement("pages")));
         }
 
         /// <summary>
-        /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(通常ページ実データ使用)。
+        /// <see cref="MediaWikiPage.GetFromQuery"/>メソッドテストケース(ページなし)。
         /// </summary>
-        [TestMethod, Timeout(20000)]
-        public void TestGetInterlanguageDiscoveryChannel()
+        [TestMethod]
+        [ExpectedException(typeof(FileNotFoundException))]
+        public void TestGetFromQueryAboutMissingPage()
         {
-            MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Discovery Channel");
-            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"));
+            MediaWikiPage.GetFromQuery(
+                new MockFactory().GetMediaWiki("en"),
+                null,
+                new XElement(
+                    "query",
+                    new XElement(
+                        "pages",
+                        new XElement(
+                            "page",
+                            new XAttribute("title", "Test page"),
+                            new XAttribute("missing", string.Empty)))));
         }
 
-        /// <summary>
-        /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(テンプレートページ実データ使用)。
-        /// </summary>
-        [TestMethod, Timeout(20000)]
-        public void TestGetInterlanguagePlanetboxBegin()
-        {
-            MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Template:Planetbox begin");
-            Assert.AreEqual("[[ja:Template:Planetbox begin]]", page.GetInterlanguage("ja").ToString());
-            Assert.AreEqual("[[ru:Шаблон:Planetbox begin]]", page.GetInterlanguage("ru").ToString());
-            Assert.IsNull(page.GetInterlanguage("zh"));
-        }
+        #endregion
+
+        #region 公開メソッドテストケース
 
         /// <summary>
-        /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(Template:Documentation使用ページ)
+        /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース。
         /// </summary>
         [TestMethod]
-        public void TestGetInterlanguageDocumentation()
+        public void TestGetInterlanguage()
         {
-            // Template:Documentation を使ってるページ
-            MediaWiki site = new DummySite(new Language("en"));
-            new MockFactory().SetMockConfig(site);
-            site.DocumentationTemplates.Add("Template:Documentation");
-            site.DocumentationTemplateDefaultPage = "/doc";
-            MediaWikiPage page = new MediaWikiPage(site, "Template:Test", "TestText{{Documentation}}");
-
-            Assert.AreEqual("[[ja:テストページ]]", page.GetInterlanguage("ja").ToString());
-            Assert.AreEqual("[[fr:Test_Fr]]", page.GetInterlanguage("fr").ToString());
+            MediaWikiPageMock page = new MediaWikiPageMock(
+                new MockFactory().GetMediaWiki("en"),
+                "TestTitle");
+            page.Interlanguages.Add("ja", "テストページ");
+            page.Interlanguages.Add("fr", "Test_Fr");
+            Assert.AreEqual("テストページ", page.GetInterlanguage("ja"));
+            Assert.AreEqual("Test_Fr", page.GetInterlanguage("fr"));
             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>
         /// <see cref="MediaWikiPage.IsRedirect"/>メソッドテストケース。
         /// </summary>
         [TestMethod]
         public void TestIsRedirect()
         {
             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);
-
-            page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
+            MediaWikiPage page = new MediaWikiPage(site, "TestTitle");
             Assert.IsFalse(page.IsRedirect());
+            Assert.IsNull(page.Redirect);
 
-            site.Redirect = "#転送";
-            page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
+            page.Redirect = "Test Redirect";
             Assert.IsTrue(page.IsRedirect());
-            Assert.AreEqual("Test Redirect2", page.Redirect.Title);
+            Assert.AreEqual("Test Redirect", page.Redirect);
 
-            page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect3]]");
+            page.Redirect = string.Empty;
             Assert.IsTrue(page.IsRedirect());
-            Assert.AreEqual("Test Redirect3", page.Redirect.Title);
+            Assert.AreEqual(string.Empty, page.Redirect);
 
-            page = new MediaWikiPage(site, "TestTitle", "#redirect [[Test Redirect4]]");
-            Assert.IsTrue(page.IsRedirect());
-            Assert.AreEqual("Test Redirect4", page.Redirect.Title);
+            page.Redirect = null;
+            Assert.IsFalse(page.IsRedirect());
+            Assert.IsNull(page.Redirect);
         }
 
         /// <summary>
@@ -267,101 +315,47 @@ namespace Honememo.Wptscs.Websites
 
         #endregion
 
-        #region 内部処理用メソッドテストケース
-
-        // 非公開メソッドについてはprotected以上、またはやりたい部分だけ実施
-
-        /// <summary>
-        /// <see cref="MediaWikiPage.ValidateIncomplete"/>メソッドテストケース(正常系)。
-        /// </summary>
-        [TestMethod]
-        public void TestValidateIncomplete()
-        {
-            // Textが空の場合例外発生、正常系は例外が発生しなければOK
-            MediaWikiPageMock page = new MediaWikiPageMock(new MediaWiki(new Language("en")), "TestTitle");
-            page.Text = "TestText";
-            page.ValidateIncomplete();
-        }
-
-        /// <summary>
-        /// <see cref="MediaWikiPage.ValidateIncomplete"/>メソッドテストケース(異常系)。
-        /// </summary>
-        [TestMethod]
-        [ExpectedException(typeof(InvalidOperationException))]
-        public void TestValidateIncompleteNg()
-        {
-            // Textが空の場合例外発生
-            new MediaWikiPageMock(new MediaWiki(new Language("en")), "TestTitle").ValidateIncomplete();
-        }
-
-        #endregion
-
         #region モッククラス
 
         /// <summary>
         /// <see cref="MediaWikiPage"/>テスト用のモッククラスです。
         /// </summary>
-        private class DummySite : MediaWiki
+        private class MediaWikiPageMock : MediaWikiPage
         {
             #region コンストラクタ
 
             /// <summary>
             /// コンストラクタ。
+            /// ページの本文, タイムスタンプには<c>null</c>を設定。
             /// </summary>
-            /// <param name="lang">ウェブサイトの言語。</param>
-            public DummySite(Language lang)
-                : base(lang)
+            /// <param name="website">ページが所属するウェブサイト。</param>
+            /// <param name="title">ページタイトル。</param>
+            public MediaWikiPageMock(MediaWiki website, string title)
+                : base(website, title)
             {
             }
 
             #endregion
 
-            #region ダミーメソッド
+            #region 非公開プロパティテスト用のオーラーライドプロパティ
+
 
             /// <summary>
-            /// ã\83\9aã\83¼ã\82¸ã\82\92å\8f\96å¾\97ã\80\82<paramref name="title"/>ã\81«å¿\9cã\81\98ã\81¦ã\83\86ã\82¹ã\83\88ç\94¨ã\81®çµ\90æ\9e\9cã\82\92è¿\94ã\81\99
+            /// ã\83\9aã\83¼ã\82¸ã\82¿ã\82¤ã\83\88ã\83«
             /// </summary>
-            /// <param name="title">ページタイトル。</param>
-            /// <returns>取得したページ。</returns>
-            /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
-            public override Page GetPage(string title)
+            public new string Title
             {
-                if (title == "Template:Test/doc")
+                get
                 {
-                    return new MediaWikiPage(
-                        this,
-                        title,
-                        "[[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
+                    return base.Title;
                 }
 
-                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)
-            {
+                set
+                {
+                    base.Title = value;
+                }
             }
 
-            #endregion
-
-            #region 非公開プロパティテスト用のオーラーライドプロパティ
-
             /// <summary>
             /// ページの本文。
             /// </summary>
@@ -378,18 +372,31 @@ namespace Honememo.Wptscs.Websites
                 }
             }
 
-            #endregion
+            /// <summary>
+            /// ページのタイムスタンプ。
+            /// </summary>
+            public new DateTime? Timestamp
+            {
+                get
+                {
+                    return base.Timestamp;
+                }
 
-            #region 非公開メソッドテスト用のオーラーライドメソッド
+                set
+                {
+                    base.Timestamp = value;
+                }
+            }
 
             /// <summary>
-            /// オブジェクトがメソッドの実行に不完全な状態でないか検証する。
-            /// 不完全な場合、例外をスローする。
+            /// 言語間リンクの対応表。
             /// </summary>
-            /// <exception cref="InvalidOperationException">オブジェクトは不完全。</exception>
-            public new void ValidateIncomplete()
+            public new IDictionary<string, string> Interlanguages
             {
-                base.ValidateIncomplete();
+                get
+                {
+                    return base.Interlanguages;
+                }
             }
 
             #endregion