Nikolay Sivov : xmllite: Support streams starting with comments, simplify tests.

Alexandre Julliard julliard at winehq.org
Mon Jan 7 13:42:20 CST 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Jan  6 02:42:02 2013 +0400

xmllite: Support streams starting with comments, simplify tests.

---

 dlls/xmllite/reader.c       |    8 +++-
 dlls/xmllite/tests/reader.c |   76 +++++++++++++++++++-----------------------
 2 files changed, 40 insertions(+), 44 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 8940a0e..5ca0350 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -403,7 +403,9 @@ static HRESULT readerinput_detectencoding(xmlreaderinput *readerinput, xml_encod
 {
     encoded_buffer *buffer = &readerinput->buffer->encoded;
     static char startA[] = {'<','?'};
+    static char commentA[] = {'<','!'};
     static WCHAR startW[] = {'<','?'};
+    static WCHAR commentW[] = {'<','!'};
     static char utf8bom[] = {0xef,0xbb,0xbf};
     static char utf16lebom[] = {0xff,0xfe};
 
@@ -413,9 +415,11 @@ static HRESULT readerinput_detectencoding(xmlreaderinput *readerinput, xml_encod
 
     /* try start symbols if we have enough data to do that, input buffer should contain
        first chunk already */
-    if (!memcmp(buffer->data, startA, sizeof(startA)))
+    if (!memcmp(buffer->data, startA, sizeof(startA)) ||
+        !memcmp(buffer->data, commentA, sizeof(commentA)))
         *enc = XmlEncoding_UTF8;
-    else if (!memcmp(buffer->data, startW, sizeof(startW)))
+    else if (!memcmp(buffer->data, startW, sizeof(startW)) ||
+             !memcmp(buffer->data, commentW, sizeof(commentW)))
         *enc = XmlEncoding_UTF16;
     /* try with BOM now */
     else if (!memcmp(buffer->data, utf8bom, sizeof(utf8bom)))
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 7709e25..9f44ba6 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -701,61 +701,53 @@ todo_wine {
     IXmlReader_Release(reader);
 }
 
-static const char xml_comment[] = "\xef\xbb\xbf<!-- comment -->";
-static const char xml_comment1[] = "\xef\xbb\xbf<!-- - comment-->";
-static const char xml_comment2[] = "\xef\xbb\xbf<!-- -- comment-->";
+struct test_entry {
+    const char *xml;
+    HRESULT hr;
+    HRESULT hr_broken; /* this is set to older version results */
+};
+
+static struct test_entry comment_tests[] = {
+    { "<!-- comment -->", S_OK },
+    { "<!-- - comment-->", S_OK },
+    { "<!-- -- comment-->", WC_E_COMMENT, WC_E_GREATERTHAN },
+    { NULL }
+};
 
 static void test_read_comment(void)
 {
-    HRESULT hr;
-    IStream *stream;
+    struct test_entry *test = comment_tests;
     IXmlReader *reader;
-    XmlNodeType type;
+    HRESULT hr;
 
     hr = pCreateXmlReader(&IID_IXmlReader, (void**)&reader, NULL);
     ok(hr == S_OK, "S_OK, got %08x\n", hr);
 
-    stream = create_stream_on_data(xml_comment, sizeof(xml_comment));
-    hr = IXmlReader_SetInput(reader, (IUnknown*)stream);
-    ok(hr == S_OK, "got %08x\n", hr);
-
-    type = XmlNodeType_None;
-    hr = IXmlReader_Read(reader, &type);
-    ok(hr == S_OK, "got %08x\n", hr);
-    ok(type == XmlNodeType_Comment, "got %d\n", type);
-
-    IStream_Release(stream);
-
-    stream = create_stream_on_data(xml_comment1, sizeof(xml_comment1));
-    hr = IXmlReader_SetInput(reader, (IUnknown*)stream);
-    ok(hr == S_OK, "got %08x\n", hr);
-
-    type = XmlNodeType_None;
-    hr = IXmlReader_Read(reader, &type);
-    ok(hr == S_OK, "got %08x\n", hr);
-    ok(type == XmlNodeType_Comment, "got %d\n", type);
+    while (test->xml)
+    {
+        XmlNodeType type;
+        IStream *stream;
 
-    IStream_Release(stream);
+        stream = create_stream_on_data(test->xml, strlen(test->xml)+1);
+        hr = IXmlReader_SetInput(reader, (IUnknown*)stream);
+        ok(hr == S_OK, "got %08x\n", hr);
 
-    stream = create_stream_on_data(xml_comment2, sizeof(xml_comment2));
-    hr = IXmlReader_SetInput(reader, (IUnknown*)stream);
-    ok(hr == S_OK, "got %08x\n", hr);
+        type = XmlNodeType_None;
+        hr = IXmlReader_Read(reader, &type);
+        if (test->hr_broken)
+            ok(hr == test->hr || broken(hr == test->hr_broken), "got %08x for %s\n", hr, test->xml);
+        else
+            ok(hr == test->hr, "got %08x for %s\n", hr, test->xml);
+        if (hr == S_OK)
+            ok(type == XmlNodeType_Comment, "got %d for %s\n", type, test->xml);
 
-    type = XmlNodeType_None;
-    hr = IXmlReader_Read(reader, &type);
-    ok(hr == WC_E_COMMENT || broken(hr == WC_E_GREATERTHAN), "got %08x\n", hr);
-    ok(type == XmlNodeType_None, "got %d\n", type);
-    IStream_Release(stream);
+        IStream_Release(stream);
+        test++;
+    }
 
     IXmlReader_Release(reader);
 }
 
-struct test_entry {
-    const char *xml;
-    HRESULT hr;
-    HRESULT hr_broken; /* this is set to older version results */
-};
-
 static struct test_entry pi_tests[] = {
     { "<?pi?>", S_OK },
     { "<?pi ?>", S_OK },




More information about the wine-cvs mailing list