Thomas Mullaly : msxml3/tests: Added IStream tests for IMXWriter.

Alexandre Julliard julliard at winehq.org
Tue Aug 23 12:44:56 CDT 2011


Module: wine
Branch: master
Commit: ae36cd5f35a7cb4cb77d7661b990c3f301d18e78
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ae36cd5f35a7cb4cb77d7661b990c3f301d18e78

Author: Thomas Mullaly <thomas.mullaly at gmail.com>
Date:   Fri Aug 12 19:11:30 2011 -0400

msxml3/tests: Added IStream tests for IMXWriter.

---

 dlls/msxml3/tests/saxreader.c |  244 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 244 insertions(+), 0 deletions(-)

diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index 4e021c6..ad350db 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -2,6 +2,7 @@
  * XML test
  *
  * Copyright 2008 Piotr Caban
+ * Copyright 2011 Thomas Mullaly
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -96,6 +97,17 @@ static const WCHAR szCarriageRetTest[] = {
 '<','/','B','a','n','k','A','c','c','o','u','n','t','>','\0'
 };
 
+static const WCHAR szUtf16XML[] = {
+'<','?','x','m','l',' ','v','e','r','s','i','o','n','=','"','1','.','0','"',' ',
+'e','n','c','o','d','i','n','g','=','"','U','T','F','-','1','6','"',' ',
+'s','t','a','n','d','a','l','o','n','e','=','"','n','o','"','?','>','\r','\n'
+};
+
+static const CHAR szUtf16BOM[] = {0xff, 0xfe};
+
+static const CHAR szUtf8XML[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n";
+
 static const CHAR szTestXML[] =
 "<?xml version=\"1.0\" ?>\n"
 "<BankAccount>\n"
@@ -696,6 +708,152 @@ static const ISAXAttributesVtbl SAXAttributesVtbl =
 
 static ISAXAttributes saxattributes = { &SAXAttributesVtbl };
 
+typedef struct mxwriter_write_test_t {
+    BOOL        last;
+    const BYTE  *data;
+    DWORD       cb;
+    BOOL        null_written;
+} mxwriter_write_test;
+
+typedef struct mxwriter_stream_test_t {
+    VARIANT_BOOL        bom;
+    const char          *encoding;
+    mxwriter_write_test expected_writes[4];
+} mxwriter_stream_test;
+
+static const mxwriter_write_test *current_write_test;
+static DWORD current_stream_test_index;
+
+static HRESULT WINAPI istream_QueryInterface(IStream *iface, REFIID riid, void **ppvObject)
+{
+    *ppvObject = NULL;
+
+    if(IsEqualGUID(riid, &IID_IStream) || IsEqualGUID(riid, &IID_IUnknown))
+        *ppvObject = iface;
+    else
+        return E_NOINTERFACE;
+
+    return S_OK;
+}
+
+static ULONG WINAPI istream_AddRef(IStream *iface)
+{
+    return 2;
+}
+
+static ULONG WINAPI istream_Release(IStream *iface)
+{
+    return 1;
+}
+
+static HRESULT WINAPI istream_Read(IStream *iface, void *pv, ULONG cb, ULONG *pcbRead)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Write(IStream *iface, const void *pv, ULONG cb, ULONG *pcbWritten)
+{
+    ok(pv != NULL, "pv == NULL\n");
+
+    if(current_write_test->last) {
+        ok(0, "Too many Write calls made on test %d\n", current_stream_test_index);
+        return E_FAIL;
+    }
+
+    ok(current_write_test->cb == cb, "Expected %d, but got %d on test %d\n",
+        current_write_test->cb, cb, current_stream_test_index);
+
+    if(!pcbWritten)
+        ok(current_write_test->null_written, "pcbWritten was NULL on test %d\n", current_stream_test_index);
+    else
+        ok(!memcmp(current_write_test->data, pv, cb), "Unexpected data on test %d\n", current_stream_test_index);
+
+    ++current_write_test;
+
+    if(pcbWritten)
+        *pcbWritten = cb;
+
+    return S_OK;
+}
+
+static HRESULT WINAPI istream_Seek(IStream *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin,
+        ULARGE_INTEGER *plibNewPosition)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_SetSize(IStream *iface, ULARGE_INTEGER libNewSize)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_CopyTo(IStream *iface, IStream *pstm, ULARGE_INTEGER cb,
+        ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *plibWritten)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Commit(IStream *iface, DWORD grfCommitFlags)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Revert(IStream *iface)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_LockRegion(IStream *iface, ULARGE_INTEGER libOffset,
+        ULARGE_INTEGER cb, DWORD dwLockType)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_UnlockRegion(IStream *iface, ULARGE_INTEGER libOffset,
+        ULARGE_INTEGER cb, DWORD dwLockType)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Stat(IStream *iface, STATSTG *pstatstg, DWORD grfStatFlag)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI istream_Clone(IStream *iface, IStream **ppstm)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static const IStreamVtbl StreamVtbl = {
+    istream_QueryInterface,
+    istream_AddRef,
+    istream_Release,
+    istream_Read,
+    istream_Write,
+    istream_Seek,
+    istream_SetSize,
+    istream_CopyTo,
+    istream_Commit,
+    istream_Revert,
+    istream_LockRegion,
+    istream_UnlockRegion,
+    istream_Stat,
+    istream_Clone
+};
+
+static IStream mxstream = { &StreamVtbl };
+
 static void test_saxreader(void)
 {
     HRESULT hr;
@@ -1349,6 +1507,91 @@ static void test_mxwriter_characters(void)
     free_bstrs();
 }
 
+static const mxwriter_stream_test mxwriter_stream_tests[] = {
+    {
+        VARIANT_TRUE,"UTF-16",
+        {
+            {FALSE,(const BYTE*)szUtf16BOM,sizeof(szUtf16BOM),TRUE},
+            {FALSE,(const BYTE*)szUtf16XML,sizeof(szUtf16XML)},
+            {TRUE}
+        }
+    },
+    {
+        VARIANT_FALSE,"UTF-16",
+        {
+            {FALSE,(const BYTE*)szUtf16XML,sizeof(szUtf16XML)},
+            {TRUE}
+        }
+    },
+    {
+        VARIANT_TRUE,"UTF-8",
+        {
+            {FALSE,(const BYTE*)szUtf8XML,sizeof(szUtf8XML)-1},
+            /* For some reason Windows makes an empty write call when UTF-8 encoding is used
+             * and the writer is released.
+             */
+            {FALSE,NULL,0},
+            {TRUE}
+        }
+    },
+    {
+        VARIANT_TRUE,"UTF-16",
+        {
+            {FALSE,(const BYTE*)szUtf16BOM,sizeof(szUtf16BOM),TRUE},
+            {FALSE,(const BYTE*)szUtf16XML,sizeof(szUtf16XML)},
+            {TRUE}
+        }
+    }
+};
+
+static void test_mxwriter_stream(void)
+{
+    DWORD test_count = sizeof(mxwriter_stream_tests)/sizeof(mxwriter_stream_tests[0]);
+
+    for(current_stream_test_index = 0; current_stream_test_index < test_count; ++current_stream_test_index) {
+        const mxwriter_stream_test *test = mxwriter_stream_tests+current_stream_test_index;
+        IMXWriter *writer;
+        ISAXContentHandler *content;
+        HRESULT hr;
+        VARIANT dest;
+
+        hr = CoCreateInstance(&CLSID_MXXMLWriter, NULL, CLSCTX_INPROC_SERVER,
+                &IID_IMXWriter, (void**)&writer);
+        ok(hr == S_OK, "CoCreateInstance failed: %08x\n", hr);
+
+        hr = IMXWriter_QueryInterface(writer, &IID_ISAXContentHandler, (void**)&content);
+        ok(hr == S_OK, "QueryInterface(ISAXContentHandler) failed: %08x\n", hr);
+
+        hr = IMXWriter_put_encoding(writer, _bstr_(test->encoding));
+        ok(hr == S_OK, "put_encoding failed with %08x on test %d\n", hr, current_stream_test_index);
+
+        V_VT(&dest) = VT_UNKNOWN;
+        V_UNKNOWN(&dest) = (IUnknown*)&mxstream;
+        hr = IMXWriter_put_output(writer, dest);
+        ok(hr == S_OK, "put_output failed with %08x on test %d\n", hr, current_stream_test_index);
+        VariantClear(&dest);
+
+        hr = IMXWriter_put_byteOrderMark(writer, test->bom);
+        ok(hr == S_OK, "put_byteOrderMark failed with %08x on test %d\n", hr, current_stream_test_index);
+
+        current_write_test = test->expected_writes;
+
+        hr = ISAXContentHandler_startDocument(content);
+        ok(hr == S_OK, "startDocument failed with %08x on test %d\n", hr, current_stream_test_index);
+
+        hr = ISAXContentHandler_endDocument(content);
+        todo_wine ok(hr == S_OK, "endDocument failed with %08x on test %d\n", hr, current_stream_test_index);
+
+        ISAXContentHandler_Release(content);
+        IMXWriter_Release(writer);
+
+        todo_wine ok(current_write_test->last, "The last %d write calls on test %d were missed\n",
+            current_write_test-test->expected_writes, current_stream_test_index);
+    }
+
+    free_bstrs();
+}
+
 START_TEST(saxreader)
 {
     ISAXXMLReader *reader;
@@ -1384,6 +1627,7 @@ START_TEST(saxreader)
         test_mxwriter_characters();
         test_mxwriter_properties();
         test_mxwriter_flush();
+        test_mxwriter_stream();
     }
     else
         win_skip("MXXMLWriter not supported\n");




More information about the wine-cvs mailing list