+ IStream_Release(stream);
+
+ /* test short variant */
+ stream = create_stream_on_data(xmldecl_short, sizeof(xmldecl_short));
+
+ hr = IXmlReader_SetInput(reader, (IUnknown *)stream);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+
+ type = -1;
+ hr = IXmlReader_Read(reader, &type);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+ ok(type == XmlNodeType_XmlDeclaration, "expected XmlDeclaration, got %s\n", type_to_str(type));
+ ok_pos(reader, 1, 3, 1, 21, TRUE);
+ test_read_state(reader, XmlReadState_Interactive, -1, TRUE);
+
+ hr = IXmlReader_GetAttributeCount(reader, &count);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+ ok(count == 1, "expected 1, got %d\n", count);
+
+ ret = IXmlReader_IsEmptyElement(reader);
+ ok(!ret, "element should not be empty\n");
+
+ hr = IXmlReader_GetValue(reader, &val, NULL);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+ ok(*val == 0, "got %s\n", wine_dbgstr_w(val));
+
+ hr = IXmlReader_GetLocalName(reader, &val, NULL);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+todo_wine
+ ok(!lstrcmpW(val, xmlW), "got %s\n", wine_dbgstr_w(val));
+
+ /* check attributes */
+ hr = IXmlReader_MoveToNextAttribute(reader);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+
+ type = -1;
+ hr = IXmlReader_GetNodeType(reader, &type);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+ ok(type == XmlNodeType_Attribute, "got %d\n", type);
+ ok_pos(reader, 1, 7, 1, 21, TRUE);
+
+ /* try to move from last attribute */
+ hr = IXmlReader_MoveToNextAttribute(reader);
+ ok(hr == S_FALSE, "expected S_FALSE, got %08x\n", hr);
+
+ type = -1;
+ hr = IXmlReader_Read(reader, &type);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+ ok(type == XmlNodeType_Element, "expected Element, got %s\n", type_to_str(type));
+ ok_pos(reader, 1, 23, 1, 40, TRUE);
+ test_read_state(reader, XmlReadState_Interactive, -1, TRUE);
+
+ hr = IXmlReader_GetAttributeCount(reader, &count);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+ ok(count == 0, "expected 0, got %d\n", count);
+
+ ret = IXmlReader_IsEmptyElement(reader);
+ ok(ret, "element should be empty\n");
+
+ hr = IXmlReader_GetValue(reader, &val, NULL);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+todo_wine
+ ok(*val == 0, "got %s\n", wine_dbgstr_w(val));
+
+ hr = IXmlReader_GetLocalName(reader, &val, NULL);
+ ok(hr == S_OK, "expected S_OK, got %08x\n", hr);
+ ok(!lstrcmpW(val, RegistrationInfoW), "got %s\n", wine_dbgstr_w(val));
+
+ type = -1;
+ hr = IXmlReader_Read(reader, &type);
+todo_wine
+ ok(hr == WC_E_SYNTAX || hr == WC_E_XMLCHARACTER /* XP */, "expected WC_E_SYNTAX, got %08x\n", hr);
+todo_wine
+ ok(type == XmlNodeType_None, "expected None, got %s\n", type_to_str(type));
+ ok_pos(reader, 1, 41, -1, -1, TRUE);
+ test_read_state(reader, XmlReadState_Error, -1, TRUE);
+