Piotr Caban : msxml3: Added XMLView IPersistMoniker_Load test.
Alexandre Julliard
julliard at winehq.org
Tue Mar 13 13:50:37 CDT 2012
Module: wine
Branch: master
Commit: 7a6494e2272ec2c7f522413ed896e4bddfcbf0b8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7a6494e2272ec2c7f522413ed896e4bddfcbf0b8
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Mar 12 20:42:06 2012 +0100
msxml3: Added XMLView IPersistMoniker_Load test.
---
dlls/msxml3/tests/Makefile.in | 2 +
dlls/msxml3/tests/rsrc.rc | 23 +++++
dlls/msxml3/tests/xmlview.c | 190 +++++++++++++++++++++++++++++++++++++++++
dlls/msxml3/tests/xmlview.xml | 12 +++
dlls/msxml3/tests/xmlview.xsl | 26 ++++++
5 files changed, 253 insertions(+), 0 deletions(-)
diff --git a/dlls/msxml3/tests/Makefile.in b/dlls/msxml3/tests/Makefile.in
index 22103cd..05c4f50 100644
--- a/dlls/msxml3/tests/Makefile.in
+++ b/dlls/msxml3/tests/Makefile.in
@@ -9,4 +9,6 @@ C_SRCS = \
xmlparser.c \
xmlview.c
+RC_SRCS = rsrc.rc
+
@MAKE_TEST_RULES@
diff --git a/dlls/msxml3/tests/rsrc.rc b/dlls/msxml3/tests/rsrc.rc
new file mode 100644
index 0000000..94d8bc8
--- /dev/null
+++ b/dlls/msxml3/tests/rsrc.rc
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2012 Piotr Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* @makedep: xmlview.xml */
+xmlview.xml XML "xmlview.xml"
+
+/* @makedep: xmlview.xsl */
+xmlview.xsl XML "xmlview.xsl"
diff --git a/dlls/msxml3/tests/xmlview.c b/dlls/msxml3/tests/xmlview.c
index 65c991e..b238d69 100644
--- a/dlls/msxml3/tests/xmlview.c
+++ b/dlls/msxml3/tests/xmlview.c
@@ -24,14 +24,128 @@
#include "windows.h"
#include "ole2.h"
#include "mshtml.h"
+#include "mshtmdid.h"
#include "initguid.h"
#include "perhist.h"
#include "docobj.h"
+#include "urlmon.h"
#include "wine/test.h"
DEFINE_GUID(CLSID_XMLView, 0x48123bc4, 0x99d9, 0x11d1, 0xa6,0xb3, 0x00,0xc0,0x4f,0xd9,0x15,0x55);
+HRESULT (WINAPI *pCreateURLMoniker)(IMoniker*, LPCWSTR, IMoniker**);
+
+static const char xmlview_html[] =
+"\r\n"
+"<BODY><H2>Generated HTML</H2>\r\n"
+"<TABLE>\r\n"
+"<TBODY>\r\n"
+"<TR bgColor=green>\r\n"
+"<TH>Title</TH>\r\n"
+"<TH>Value</TH></TR>\r\n"
+"<TR>\r\n"
+"<TD>title1</TD>\r\n"
+"<TD>value1</TD></TR>\r\n"
+"<TR>\r\n"
+"<TD>title2</TD>\r\n"
+"<TD>value2</TD></TR></TBODY></TABLE></BODY>";
+
+IHTMLDocument2 *html_doc;
+BOOL loaded;
+
+static int html_src_compare(LPCWSTR strw, const char *stra)
+{
+ char buf[2048], *p1;
+ const char *p2;
+
+ WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
+
+ p1 = buf;
+ p2 = stra;
+ while(1) {
+ while(*p1=='\r' || *p1=='\n' || *p1=='\"') p1++;
+ while(*p2=='\r' || *p2=='\n') p2++;
+
+ if(!*p1 || !*p2 || tolower(*p1)!=tolower(*p2))
+ break;
+
+ p1++;
+ p2++;
+ }
+
+ return *p1 != *p2;
+}
+
+static HRESULT WINAPI HTMLEvents_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
+{
+ if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid)) {
+ *ppv = iface;
+ return S_OK;
+ }
+
+ ok(0, "Unexpected call\n");
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI HTMLEvents_AddRef(IDispatch *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI HTMLEvents_Release(IDispatch *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI HTMLEvents_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLEvents_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
+ ITypeInfo **ppTInfo)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLEvents_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
+ UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLEvents_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
+ LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+ if(dispIdMember == DISPID_HTMLDOCUMENTEVENTS2_ONREADYSTATECHANGE) {
+ static const WCHAR completeW[] = {'c','o','m','p','l','e','t','e',0};
+ BSTR state;
+
+ IHTMLDocument2_get_readyState(html_doc, &state);
+ if(!memcmp(state, completeW, sizeof(completeW)))
+ loaded = TRUE;
+ }
+
+ return S_OK;
+}
+
+static const IDispatchVtbl HTMLEventsVtbl = {
+ HTMLEvents_QueryInterface,
+ HTMLEvents_AddRef,
+ HTMLEvents_Release,
+ HTMLEvents_GetTypeInfoCount,
+ HTMLEvents_GetTypeInfo,
+ HTMLEvents_GetIDsOfNames,
+ HTMLEvents_Invoke
+};
+
+static IDispatch HTMLEvents = { &HTMLEventsVtbl };
+
static void test_QueryInterface(void)
{
IUnknown *xmlview, *unk;
@@ -73,9 +187,85 @@ static void test_QueryInterface(void)
IUnknown_Release(xmlview);
}
+static void test_Load(void)
+{
+ static const WCHAR xmlview_xmlW[] = {'/','x','m','l','/','x','m','l','v','i','e','w','.','x','m','l',0};
+ static const WCHAR res[] = {'r','e','s',':','/','/',0};
+
+ WCHAR buf[1024];
+ IPersistMoniker *pers_mon;
+ IConnectionPointContainer *cpc;
+ IConnectionPoint *cp;
+ IMoniker *mon;
+ IBindCtx *bctx;
+ IHTMLElement *elem;
+ HRESULT hres;
+ MSG msg;
+ BSTR source;
+
+ lstrcpyW(buf, res);
+ GetModuleFileNameW(NULL, buf+lstrlenW(buf), (sizeof(buf)-sizeof(res))/sizeof(WCHAR));
+ lstrcatW(buf, xmlview_xmlW);
+
+ if(!pCreateURLMoniker) {
+ win_skip("CreateURLMoniker not available\n");
+ return;
+ }
+
+ hres = CoCreateInstance(&CLSID_XMLView, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
+ &IID_IPersistMoniker, (void**)&pers_mon);
+ if(FAILED(hres)) {
+ win_skip("Failed to create XMLView instance\n");
+ return;
+ }
+ ok(hres == S_OK, "CoCreateInstance returned %x, expected S_OK\n", hres);
+
+ hres = IPersistMoniker_QueryInterface(pers_mon, &IID_IHTMLDocument2, (void**)&html_doc);
+ ok(hres == S_OK, "QueryInterface(HTMLDocument2) returned %x, expected S_OK\n", hres);
+ hres = IPersistMoniker_QueryInterface(pers_mon, &IID_IConnectionPointContainer, (void**)&cpc);
+ ok(hres == S_OK, "QueryInterface(IConnectionPointContainer) returned %x, expected S_OK\n", hres);
+ hres = IConnectionPointContainer_FindConnectionPoint(cpc, &IID_IDispatch, &cp);
+ ok(hres == S_OK, "FindConnectionPoint returned %x, expected S_OK\n", hres);
+ hres = IConnectionPoint_Advise(cp, (IUnknown*)&HTMLEvents, NULL);
+ ok(hres == S_OK, "Advise returned %x, expected S_OK\n", hres);
+ IConnectionPoint_Release(cp);
+ IConnectionPointContainer_Release(cpc);
+
+ hres = CreateBindCtx(0, &bctx);
+ ok(hres == S_OK, "CreateBindCtx returned %x, expected S_OK\n", hres);
+ hres = pCreateURLMoniker(NULL, buf, &mon);
+ ok(hres == S_OK, "CreateUrlMoniker returned %x, expected S_OK\n", hres);
+ loaded = FALSE;
+ hres = IPersistMoniker_Load(pers_mon, TRUE, mon, bctx, 0);
+ ok(hres == S_OK, "Load returned %x, expected S_OK\n", hres);
+ IBindCtx_Release(bctx);
+ IMoniker_Release(mon);
+
+ while(!loaded && GetMessage(&msg, NULL, 0, 0)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ hres = IHTMLDocument2_get_body(html_doc, &elem);
+ ok(hres == S_OK, "get_body returned %x, expected S_OK\n", hres);
+ hres = IHTMLElement_get_outerHTML(elem, &source);
+ ok(hres == S_OK, "get_outerHTML returned %x, expected S_OK\n", hres);
+ ok(!html_src_compare(source, xmlview_html), "Incorrect HTML source: %s\n", wine_dbgstr_w(source));
+ IHTMLElement_Release(elem);
+ SysFreeString(source);
+
+ IHTMLDocument2_Release(html_doc);
+ html_doc = NULL;
+ IPersistMoniker_Release(pers_mon);
+}
+
START_TEST(xmlview)
{
+ HMODULE urlmon = LoadLibraryA("urlmon.dll");
+ pCreateURLMoniker = (void*)GetProcAddress(urlmon, "CreateURLMoniker");
+
CoInitialize(NULL);
test_QueryInterface();
+ test_Load();
CoUninitialize();
}
diff --git a/dlls/msxml3/tests/xmlview.xml b/dlls/msxml3/tests/xmlview.xml
new file mode 100644
index 0000000..a3c4bf4
--- /dev/null
+++ b/dlls/msxml3/tests/xmlview.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml-stylesheet type="text/xsl" href="xmlview.xsl"?>
+<test>
+ <field>
+ <title>title1</title>
+ <value>value1</value>
+ </field>
+ <field>
+ <title>title2</title>
+ <value>value2</value>
+ </field>
+</test>
diff --git a/dlls/msxml3/tests/xmlview.xsl b/dlls/msxml3/tests/xmlview.xsl
new file mode 100644
index 0000000..1b20f35
--- /dev/null
+++ b/dlls/msxml3/tests/xmlview.xsl
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<xsl:template match="/">
+ <html>
+ <body>
+ <h2>Generated HTML</h2>
+ <table>
+ <tr bgcolor="green">
+ <th>Title</th>
+ <th>Value</th>
+ </tr>
+ <xsl:for-each select="test/field">
+ <tr>
+ <td><xsl:value-of select="title"/></td>
+ <td><xsl:value-of select="value"/></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+</xsl:stylesheet>
More information about the wine-cvs
mailing list