[PATCH 1/4] Add test for XML declaration parsing

Nikolay Sivov bunglehead at gmail.com
Mon Jan 25 12:55:02 CST 2010


---
 dlls/xmllite/reader.c       |   26 +++++++-
 dlls/xmllite/tests/reader.c |  141 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 163 insertions(+), 4 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index ee4a00c..89dcf1d 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -44,6 +44,7 @@ typedef struct _xmlreader
     ISequentialStream *stream;/* stored as sequential stream, cause currently
                                  optimizations possible with IStream aren't implemented */
     XmlReadState state;
+    UINT line, pos;           /* reader position in XML stream */
 } xmlreader;
 
 typedef struct _xmlreaderinput
@@ -132,6 +133,8 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input)
         This->stream = NULL;
     }
 
+    This->line = This->pos = 0;
+
     /* just reset current input */
     if (!input)
     {
@@ -298,14 +301,28 @@ static BOOL WINAPI xmlreader_IsEmptyElement(IXmlReader* iface)
 
 static HRESULT WINAPI xmlreader_GetLineNumber(IXmlReader* iface, UINT *lineNumber)
 {
-    FIXME("(%p %p): stub\n", iface, lineNumber);
-    return E_NOTIMPL;
+    xmlreader *This = impl_from_IXmlReader(iface);
+
+    TRACE("(%p %p)\n", This, lineNumber);
+
+    if (!lineNumber) return E_INVALIDARG;
+
+    *lineNumber = This->line;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI xmlreader_GetLinePosition(IXmlReader* iface, UINT *linePosition)
 {
-    FIXME("(%p %p): stub\n", iface, linePosition);
-    return E_NOTIMPL;
+    xmlreader *This = impl_from_IXmlReader(iface);
+
+    TRACE("(%p %p)\n", This, linePosition);
+
+    if (!linePosition) return E_INVALIDARG;
+
+    *linePosition = This->pos;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI xmlreader_GetAttributeCount(IXmlReader* iface, UINT *attributeCount)
@@ -447,6 +464,7 @@ HRESULT WINAPI CreateXmlReader(REFIID riid, void **pObject, IMalloc *pMalloc)
     reader->stream = NULL;
     reader->input = NULL;
     reader->state = XmlReadState_Closed;
+    reader->line  = reader->pos = 0;
 
     *pObject = &reader->lpVtbl;
 
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 18ae499..c594d48 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -51,6 +51,51 @@ static const char *debugstr_guid(REFIID riid)
     return buf;
 }
 
+static const char xmldecl_full[] = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+
+static IStream *create_stream_on_data(const char *data, int size)
+{
+    IStream *stream = NULL;
+    HGLOBAL hglobal;
+    void *ptr;
+    HRESULT hr;
+
+    hglobal = GlobalAlloc(GHND, size);
+    ptr = GlobalLock(hglobal);
+
+    memcpy(ptr, data, size);
+
+    hr = CreateStreamOnHGlobal(hglobal, TRUE, &stream);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok(stream != NULL, "Expected non-NULL stream\n");
+
+    GlobalUnlock(hglobal);
+
+    return stream;
+}
+
+static void ok_pos_(IXmlReader *reader, int line, int pos, int todo, int _line_)
+{
+    UINT l, p;
+    HRESULT hr;
+
+    hr = IXmlReader_GetLineNumber(reader, &l);
+    ok_(__FILE__, _line_)(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    hr = IXmlReader_GetLinePosition(reader, &p);
+    ok_(__FILE__, _line_)(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+    if (todo)
+        todo_wine
+        ok_(__FILE__, _line_)(l == line && pos == p,
+                            "Expected (%d,%d), got (%d,%d)\n", line, pos, l, p);
+    else
+    {
+        ok_(__FILE__, _line_)(l == line && pos == p,
+                            "Expected (%d,%d), got (%d,%d)\n", line, pos, l, p);
+    }
+}
+#define ok_pos(reader, l, p, todo) ok_pos_(reader, l, p, todo, __LINE__)
+
 typedef struct input_iids_t {
     IID iids[10];
     int count;
@@ -132,6 +177,43 @@ static const char *state_to_str(XmlReadState state)
     }
 }
 
+static const char *type_to_str(XmlNodeType type)
+{
+    static const char* type_names[] = {
+        "XmlNodeType_None",
+        "XmlNodeType_Element",
+        "XmlNodeType_Attribute",
+        "XmlNodeType_Text",
+        "XmlNodeType_CDATA",
+        "XmlNodeType_ProcessingInstruction",
+        "XmlNodeType_Comment",
+        "XmlNodeType_DocumentType",
+        "XmlNodeType_Whitespace",
+        "XmlNodeType_EndElement",
+        "XmlNodeType_XmlDeclaration"
+    };
+
+    static const char unknown[] = "unknown";
+
+    switch (type)
+    {
+    case XmlNodeType_None:
+    case XmlNodeType_Element:
+    case XmlNodeType_Attribute:
+    case XmlNodeType_Text:
+    case XmlNodeType_CDATA:
+    case XmlNodeType_ProcessingInstruction:
+    case XmlNodeType_Comment:
+    case XmlNodeType_DocumentType:
+    case XmlNodeType_Whitespace:
+    case XmlNodeType_EndElement:
+    case XmlNodeType_XmlDeclaration:
+        return type_names[type];
+    default:
+        return unknown;
+    }
+}
+
 static void test_read_state_(IXmlReader *reader, XmlReadState expected, int todo, int line)
 {
     XmlReadState state;
@@ -438,6 +520,64 @@ static void test_reader_state(void)
     IXmlReader_Release(reader);
 }
 
+static void test_read_xmldeclaration(void)
+{
+    IXmlReader *reader;
+    IStream *stream;
+    HRESULT hr;
+    XmlNodeType type;
+    UINT count = 0;
+
+    hr = pCreateXmlReader(&IID_IXmlReader, (LPVOID*)&reader, NULL);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+    /* position methods with Null args */
+    hr = IXmlReader_GetLineNumber(reader, NULL);
+    ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
+
+    hr = IXmlReader_GetLinePosition(reader, NULL);
+    ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
+
+    stream = create_stream_on_data(xmldecl_full, sizeof(xmldecl_full));
+
+    hr = IXmlReader_SetInput(reader, (IUnknown*)stream);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+    ok_pos(reader, 0, 0, FALSE);
+
+    type = -1;
+    hr = IXmlReader_Read(reader, &type);
+todo_wine {
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok(type == XmlNodeType_XmlDeclaration,
+                     "Expected XmlNodeType_XmlDeclaration, got %s\n", type_to_str(type));
+}
+    ok_pos(reader, 1, 55, TRUE);
+
+    /* check attributes */
+    hr = IXmlReader_MoveToNextAttribute(reader);
+    todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok_pos(reader, 1, 55, TRUE);
+
+    hr = IXmlReader_MoveToFirstAttribute(reader);
+    todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok_pos(reader, 1, 55, TRUE);
+
+    hr = IXmlReader_GetAttributeCount(reader, &count);
+todo_wine {
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok(count == 3, "Expected 3, got %d\n", count);
+}
+    hr = IXmlReader_GetDepth(reader, &count);
+todo_wine {
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok(count == 1, "Expected 1, got %d\n", count);
+}
+
+    IStream_Release(stream);
+    IXmlReader_Release(reader);
+}
+
 START_TEST(reader)
 {
     HRESULT r;
@@ -454,6 +594,7 @@ START_TEST(reader)
     test_reader_create();
     test_readerinput();
     test_reader_state();
+    test_read_xmldeclaration();
 
     CoUninitialize();
 }
-- 
1.5.6.5


--=-PBGCQQCvMMujtKEbeXwK--




More information about the wine-patches mailing list