Index: xword/ContentFiltering/ContentFiltering.csproj =================================================================== --- xword/ContentFiltering/ContentFiltering.csproj (revision 22455) +++ xword/ContentFiltering/ContentFiltering.csproj (working copy) @@ -124,6 +124,7 @@ + Index: xword/ContentFiltering/Test/Office/Word/Filters/WebToLocalStyleFilterTest.cs =================================================================== --- xword/ContentFiltering/Test/Office/Word/Filters/WebToLocalStyleFilterTest.cs (revision 0) +++ xword/ContentFiltering/Test/Office/Word/Filters/WebToLocalStyleFilterTest.cs (revision 0) @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using ContentFiltering.Office.Word.Filters; +using XWiki.Office.Word; +using ContentFiltering.Test.Util; +using System.Xml; + +namespace ContentFiltering.Test.Office.Word.Filters +{ + /// + /// Test class for WebToLocalStyleFilter. + /// + [TestFixture] + public class WebToLocalStyleFilterTest + { + private ConversionManager manager; + private string initialHTML; + private string expectedHTML; + private XmlDocument initialXmlDoc; + private XmlDocument expectedXmlDoc; + + /// + /// Default constructor. + /// + public WebToLocalStyleFilterTest() + { + manager = ConversionManagerTestUtil.DummyConversionManager(); + initialHTML = ""; + expectedHTML = ""; + initialXmlDoc = new XmlDocument(); + expectedXmlDoc = new XmlDocument(); + } + + /// + /// Tests the Filter method from WebToLocalStyleFilter. + /// + [Test] + public void TestFilter() + { + initialXmlDoc = new XmlDocument(); + expectedXmlDoc = new XmlDocument(); + + initialHTML = "TITLE" + + "" + + "

Text0

" + + "

Text1

" + + "" + + ""; + + + expectedHTML = "TITLE" + + //the 'style' node should be inserted in the head section + + "" + + "" + + //the CSS should be inlined + + "

Text0

" + + "

Text1

" + + + "" + + ""; + + initialXmlDoc.LoadXml(initialHTML); + expectedXmlDoc.LoadXml(expectedHTML); + + WebToLocalStyleFilter filter = new WebToLocalStyleFilter(manager); + filter.Filter(ref initialXmlDoc); + + Assert.IsTrue(XmlDocComparator.AreIdentical(initialXmlDoc, expectedXmlDoc)); + } + } +} Index: xword/ContentFiltering/Test/Util/XWikiClientUtil.cs =================================================================== --- xword/ContentFiltering/Test/Util/XWikiClientUtil.cs (revision 22455) +++ xword/ContentFiltering/Test/Util/XWikiClientUtil.cs (working copy) @@ -4,11 +4,24 @@ using System.Text; using XWiki.Clients; using NUnit.Mocks; +using XWiki.XmlRpc; +using CookComputing.XmlRpc; namespace ContentFiltering.Test.Util { public class XWikiClientTestUtil { + const string SSX_CLASS_NAME = "XWiki.StyleSheetExtension"; + const string XOFFICE_SSX = "XOfficeStyle"; + const string PAGE_FULL_NAME = "docFullName"; + + public const string CSS_PROPERTIES_XOFFICE0 = "font-family:sans-serif;"; + public const string CSS_CONTENT_XOFFICE0 = ".xoffice0 {" + CSS_PROPERTIES_XOFFICE0 + "}"; + + public const string CSS_PROPERTIES_ID1 = "color:red;"; + public const string CSS_CONTENT_ID1 = "#id1 {" + CSS_PROPERTIES_ID1 + "}"; + + /// /// Returns an IXWikiClient mock implementation to be used by unit tests. /// @@ -20,11 +33,66 @@ myXWikiClientMock.ExpectAndReturn("GetAvailableSyntaxes", new List() { "XWiki 2.0", "XHTML" }); myXWikiClientMock.ExpectAndReturn("GetPagesNames", new List() { "Page1" }, new object[1]); myXWikiClientMock.ExpectAndReturn("SavePageHTML", true,new object[3]); - myXWikiClientMock.ExpectAndReturn("AddAttachment", true, new object[2] { "docFullName", "localFolder\\Document1_TempExport_files/image002.jpg" }); - myXWikiClientMock.ExpectAndReturn("GetAttachmentURL", "http://127.0.0.1:8080/xwiki/bin/download/Main/Page1/image002.jpg", new object[] { "docFullName","image002.jpg" }); + myXWikiClientMock.ExpectAndReturn("AddAttachment", true, new object[2] { PAGE_FULL_NAME, "localFolder\\Document1_TempExport_files/image002.jpg" }); + myXWikiClientMock.ExpectAndReturn("GetAttachmentURL", "http://127.0.0.1:8080/xwiki/bin/download/Main/Page1/image002.jpg", new object[] { PAGE_FULL_NAME,"image002.jpg" }); + + SetObjSummariesForGetObjects(ref myXWikiClientMock); + + SetObjForGetObject(ref myXWikiClientMock); + return (IXWikiClient)myXWikiClientMock.MockInstance; } + + + /// + /// Sets the "ExpectAndReturn" for "GetObjects" method: one 'SomeClass' and one SSX object summaries. + /// + /// A reference to a DynamicMock. + private static void SetObjSummariesForGetObjects(ref DynamicMock myXWikiClientMock) + { + XWikiObjectSummary xos1 = new XWikiObjectSummary(); + xos1.className = "SomeClass"; + xos1.id = 1; + xos1.pageId = PAGE_FULL_NAME; + + XWikiObjectSummary xos2 = new XWikiObjectSummary(); + xos2.className = SSX_CLASS_NAME; + xos2.id = 1; + xos2.pageId = PAGE_FULL_NAME; + + XWikiObjectSummary[] objSummaries = new XWikiObjectSummary[] + { + xos1, + xos2 + }; + + myXWikiClientMock.ExpectAndReturn("GetObjects", objSummaries, new object[1]{PAGE_FULL_NAME}); + } + + /// + /// Sets the "ExpectAndReturn" for "GetObject" method. + /// The returned SSX object has: name='XOfficeStyle', use='onDemand', parse='0' and the 'code' is + /// some CSS for '.xoffice0' class and '#id1" id. + /// + /// A reference to a DynamicMock. + private static void SetObjForGetObject(ref DynamicMock myXWikiClientMock) + { + XmlRpcStruct dictionary = new XmlRpcStruct(); + dictionary.Add("code", CSS_CONTENT_XOFFICE0+CSS_CONTENT_ID1); + dictionary.Add("name", "XOfficeStyle"); + dictionary.Add("use", "onDemand"); + dictionary.Add("parse", "0"); + + XWikiObject xo2 = new XWikiObject(); + xo2.className = SSX_CLASS_NAME; + xo2.id = 1; + xo2.pageId = PAGE_FULL_NAME; + xo2.prettyName = "XOfficeStyle"; + xo2.objectDictionary = dictionary; + + myXWikiClientMock.ExpectAndReturn("GetObject", xo2, new object[3]{PAGE_FULL_NAME,SSX_CLASS_NAME,1}); + } }