Nikolay Sivov : msxml3: Added a simple test for CDATA processing with SAX reader.

Alexandre Julliard julliard at winehq.org
Tue Mar 12 14:21:48 CDT 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Mar 12 12:45:54 2013 +0400

msxml3: Added a simple test for CDATA processing with SAX reader.

---

 dlls/msxml3/tests/saxreader.c |  103 ++++++++++++++++++++++++++++++++++++----
 1 files changed, 92 insertions(+), 11 deletions(-)

diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index 06fd56a..da662bb 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -168,9 +168,11 @@ typedef enum _CH {
     CH_IGNORABLEWHITESPACE,
     CH_PROCESSINGINSTRUCTION,
     CH_SKIPPEDENTITY,
+    LH_STARTCDATA,
+    LH_ENDCDATA,
     EH_ERROR,
     EH_FATALERROR,
-    EG_IGNORABLEWARNING,
+    EH_IGNORABLEWARNING,
     EVENT_LAST
 } CH;
 
@@ -187,6 +189,8 @@ static const char *event_names[EVENT_LAST] = {
     "ignorableWhitespace",
     "processingInstruction",
     "skippedEntity",
+    "startCDATA",
+    "endCDATA",
     "error",
     "fatalError",
     "ignorableWarning"
@@ -410,6 +414,8 @@ static void ok_sequence_(struct call_sequence **seq, int sequence_index,
             case CH_PUTDOCUMENTLOCATOR:
             case CH_STARTDOCUMENT:
             case CH_ENDDOCUMENT:
+            case LH_STARTCDATA:
+            case LH_ENDCDATA:
                 break;
             case CH_STARTPREFIXMAPPING:
                 /* prefix, uri */
@@ -459,7 +465,7 @@ static void ok_sequence_(struct call_sequence **seq, int sequence_index,
                          context, get_event_name(actual->id), expected->ret, actual->ret);
                 break;
             case EH_ERROR:
-            case EG_IGNORABLEWARNING:
+            case EH_IGNORABLEWARNING:
             default:
                 ok(0, "%s: callback not handled, %s\n", context, get_event_name(actual->id));
             }
@@ -570,6 +576,10 @@ static const char test_attributes[] =
 "<node1 xmlns:p=\"test\" />"
 "</document>\n";
 
+static const char test_cdata_xml[] =
+"<?xml version=\"1.0\" ?>"
+"<a><![CDATA[Some \r\ntext\n\rdata\n]]></a>";
+
 static struct call_entry content_handler_test1[] = {
     { CH_PUTDOCUMENTLOCATOR, 0, 0, S_OK },
     { CH_STARTDOCUMENT, 0, 0, S_OK },
@@ -894,6 +904,37 @@ static struct call_entry attribute_norm_alt[] = {
     { CH_ENDTEST }
 };
 
+static struct call_entry cdata_test[] = {
+    { CH_PUTDOCUMENTLOCATOR, 0, 0, S_OK },
+    { CH_STARTDOCUMENT, 0, 0, S_OK },
+    { CH_STARTELEMENT, 1, 26, S_OK, "", "a", "a" },
+    { LH_STARTCDATA, 1, 35, S_OK },
+    { CH_CHARACTERS, 1, 35, S_OK, "Some \n" },
+    { CH_CHARACTERS, 1, 42, S_OK, "text\n\n" },
+    { CH_CHARACTERS, 4, 1, S_OK,  "data\n" },
+    { LH_ENDCDATA, 4, 1, S_OK },
+    { CH_ENDELEMENT, 4, 6, S_OK, "", "a", "a" },
+    { CH_ENDDOCUMENT, 0, 0, S_OK },
+    { CH_ENDTEST }
+};
+
+/* this is what MSXML6 does */
+static struct call_entry cdata_test_alt[] = {
+    { CH_PUTDOCUMENTLOCATOR, 1, 0, S_OK },
+    { CH_STARTDOCUMENT, 1, 22, S_OK },
+    { CH_STARTELEMENT, 1, 25, S_OK, "", "a", "a" },
+    { LH_STARTCDATA, 1, 34, S_OK },
+    { CH_CHARACTERS, 1, 40, S_OK, "Some " },
+    { CH_CHARACTERS, 2, 0, S_OK, "\n" },
+    { CH_CHARACTERS, 3, 1, S_OK, "text\n" },
+    { CH_CHARACTERS, 4, 0, S_OK, "\n" },
+    { CH_CHARACTERS, 5, 3, S_OK, "data\n" },
+    { LH_ENDCDATA, 5, 3, S_OK },
+    { CH_ENDELEMENT, 5, 7, S_OK, "", "a", "a" },
+    { CH_ENDDOCUMENT, 5, 7, S_OK },
+    { CH_ENDTEST }
+};
+
 static const char xmlspace_attr[] =
     "<?xml version=\"1.0\" encoding=\"UTF-16\"?>"
     "<a xml:space=\"preserve\"> Some text data </a>";
@@ -1275,7 +1316,7 @@ static HRESULT WINAPI isaxerrorHandler_fatalError(
     return S_OK;
 }
 
-static HRESULT WINAPI isaxerrorHanddler_ignorableWarning(
+static HRESULT WINAPI isaxerrorHandler_ignorableWarning(
         ISAXErrorHandler* iface,
         ISAXLocator *pLocator,
         const WCHAR *pErrorMessage,
@@ -1292,7 +1333,7 @@ static const ISAXErrorHandlerVtbl errorHandlerVtbl =
     isaxerrorHandler_Release,
     isaxerrorHandler_error,
     isaxerrorHandler_fatalError,
-    isaxerrorHanddler_ignorableWarning
+    isaxerrorHandler_ignorableWarning
 };
 
 static ISAXErrorHandler errorHandler = { &errorHandlerVtbl };
@@ -1583,14 +1624,24 @@ static HRESULT WINAPI isaxlexical_endEntity(ISAXLexicalHandler *iface,
 
 static HRESULT WINAPI isaxlexical_startCDATA(ISAXLexicalHandler *iface)
 {
-    ok(0, "call not expected\n");
-    return E_NOTIMPL;
+    struct call_entry call;
+
+    init_call_entry(locator, &call);
+    call.id = LH_STARTCDATA;
+    add_call(sequences, CONTENT_HANDLER_INDEX, &call);
+
+    return get_expected_ret();
 }
 
 static HRESULT WINAPI isaxlexical_endCDATA(ISAXLexicalHandler *iface)
 {
-    ok(0, "call not expected\n");
-    return E_NOTIMPL;
+    struct call_entry call;
+
+    init_call_entry(locator, &call);
+    call.id = LH_ENDCDATA;
+    add_call(sequences, CONTENT_HANDLER_INDEX, &call);
+
+    return get_expected_ret();
 }
 
 static HRESULT WINAPI isaxlexical_comment(ISAXLexicalHandler *iface,
@@ -1880,6 +1931,9 @@ static struct msxmlsupported_data_t reader_support_data[] =
     { NULL }
 };
 
+static struct saxlexicalhandler lexicalhandler;
+static struct saxdeclhandler declhandler;
+
 static void test_saxreader(void)
 {
     const struct msxmlsupported_data_t *table = reader_support_data;
@@ -2230,6 +2284,36 @@ static void test_saxreader(void)
         hr = ISAXXMLReader_putEntityResolver(reader, NULL);
         ok(hr == S_OK || broken(hr == E_FAIL), "got 0x%08x\n", hr);
 
+        /* CDATA sections */
+        CreateStreamOnHGlobal(NULL, TRUE, &stream);
+        size.QuadPart = strlen(test_cdata_xml);
+        IStream_SetSize(stream, size);
+        IStream_Write(stream, test_cdata_xml, strlen(test_cdata_xml), &written);
+        pos.QuadPart = 0;
+        IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL);
+
+        init_saxlexicalhandler(&lexicalhandler, S_OK);
+
+        V_VT(&var) = VT_UNKNOWN;
+        V_UNKNOWN(&var) = (IUnknown*)&lexicalhandler.ISAXLexicalHandler_iface;
+        hr = ISAXXMLReader_putProperty(reader, _bstr_("http://xml.org/sax/properties/lexical-handler"), var);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+        V_VT(&var) = VT_UNKNOWN;
+        V_UNKNOWN(&var) = (IUnknown*)stream;
+
+        if (IsEqualGUID(table->clsid, &CLSID_SAXXMLReader60))
+            test_seq = cdata_test_alt;
+        else
+            test_seq = cdata_test;
+
+        set_expected_seq(test_seq);
+        hr = ISAXXMLReader_parse(reader, var);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+        ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "cdata test", TRUE);
+
+        IStream_Release(stream);
+
         ISAXXMLReader_Release(reader);
         table++;
     }
@@ -2243,9 +2327,6 @@ struct saxreader_props_test_t
     IUnknown   *iface;
 };
 
-static struct saxlexicalhandler lexicalhandler;
-static struct saxdeclhandler declhandler;
-
 static const struct saxreader_props_test_t props_test_data[] = {
     { "http://xml.org/sax/properties/lexical-handler", (IUnknown*)&lexicalhandler.ISAXLexicalHandler_iface },
     { "http://xml.org/sax/properties/declaration-handler", (IUnknown*)&declhandler.ISAXDeclHandler_iface },




More information about the wine-cvs mailing list