[PATCH 3/3] Add test for XML declaration parsing
Nikolay Sivov
bunglehead at gmail.com
Mon Jan 25 07:09:36 CST 2010
---
dlls/xmllite/reader.c | 24 ++++++-
dlls/xmllite/tests/reader.c | 141 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 161 insertions(+), 4 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 4410f02..031689e 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -45,6 +45,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
@@ -133,6 +134,8 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input)
This->stream = NULL;
}
+ This->line = This->pos = 0;
+
/* just reset current input */
if (!input)
{
@@ -299,14 +302,26 @@ 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;
+
+ return S_OK;
}
static HRESULT WINAPI xmlreader_GetAttributeCount(IXmlReader* iface, UINT *attributeCount)
@@ -448,6 +463,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
--=-R6du0Y2o3DC7FIxqQRuW--
More information about the wine-patches
mailing list