Commit 4c0f142e authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

xmllite: Support streams starting with comments, simplify tests.

parent 65bcdb2c
...@@ -403,7 +403,9 @@ static HRESULT readerinput_detectencoding(xmlreaderinput *readerinput, xml_encod ...@@ -403,7 +403,9 @@ static HRESULT readerinput_detectencoding(xmlreaderinput *readerinput, xml_encod
{ {
encoded_buffer *buffer = &readerinput->buffer->encoded; encoded_buffer *buffer = &readerinput->buffer->encoded;
static char startA[] = {'<','?'}; static char startA[] = {'<','?'};
static char commentA[] = {'<','!'};
static WCHAR startW[] = {'<','?'}; static WCHAR startW[] = {'<','?'};
static WCHAR commentW[] = {'<','!'};
static char utf8bom[] = {0xef,0xbb,0xbf}; static char utf8bom[] = {0xef,0xbb,0xbf};
static char utf16lebom[] = {0xff,0xfe}; static char utf16lebom[] = {0xff,0xfe};
...@@ -413,9 +415,11 @@ static HRESULT readerinput_detectencoding(xmlreaderinput *readerinput, xml_encod ...@@ -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 /* try start symbols if we have enough data to do that, input buffer should contain
first chunk already */ 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; *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; *enc = XmlEncoding_UTF16;
/* try with BOM now */ /* try with BOM now */
else if (!memcmp(buffer->data, utf8bom, sizeof(utf8bom))) else if (!memcmp(buffer->data, utf8bom, sizeof(utf8bom)))
......
...@@ -701,61 +701,53 @@ todo_wine { ...@@ -701,61 +701,53 @@ todo_wine {
IXmlReader_Release(reader); IXmlReader_Release(reader);
} }
static const char xml_comment[] = "\xef\xbb\xbf<!-- comment -->"; struct test_entry {
static const char xml_comment1[] = "\xef\xbb\xbf<!-- - comment-->"; const char *xml;
static const char xml_comment2[] = "\xef\xbb\xbf<!-- -- comment-->"; 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) static void test_read_comment(void)
{ {
HRESULT hr; struct test_entry *test = comment_tests;
IStream *stream;
IXmlReader *reader; IXmlReader *reader;
XmlNodeType type; HRESULT hr;
hr = pCreateXmlReader(&IID_IXmlReader, (void**)&reader, NULL); hr = pCreateXmlReader(&IID_IXmlReader, (void**)&reader, NULL);
ok(hr == S_OK, "S_OK, got %08x\n", hr); ok(hr == S_OK, "S_OK, got %08x\n", hr);
stream = create_stream_on_data(xml_comment, sizeof(xml_comment)); while (test->xml)
hr = IXmlReader_SetInput(reader, (IUnknown*)stream); {
ok(hr == S_OK, "got %08x\n", hr); XmlNodeType type;
IStream *stream;
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);
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)); type = XmlNodeType_None;
hr = IXmlReader_SetInput(reader, (IUnknown*)stream); hr = IXmlReader_Read(reader, &type);
ok(hr == S_OK, "got %08x\n", hr); 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; IStream_Release(stream);
hr = IXmlReader_Read(reader, &type); test++;
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);
IXmlReader_Release(reader); 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[] = { static struct test_entry pi_tests[] = {
{ "<?pi?>", S_OK }, { "<?pi?>", S_OK },
{ "<?pi ?>", S_OK }, { "<?pi ?>", S_OK },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment