Fix protocol test on winxp.
[wine] / dlls / msxml3 / tests / domdoc.c
1 /*
2  * XML test
3  *
4  * Copyright 2005 Mike McCormack for CodeWeavers
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21
22 #define COBJMACROS
23
24 #include "windows.h"
25 #include "ole2.h"
26 #include "msxml.h"
27 #include "xmldom.h"
28 #include <stdio.h>
29
30 #include "wine/test.h"
31
32 void test_domdoc( void )
33 {
34     HRESULT r;
35     IXMLDOMDocument *doc = NULL;
36     IXMLDOMElement *element = NULL;
37     static const GUID CLSID_DOMDocument = 
38         { 0x2933BF90, 0x7B36, 0x11d2, {0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
39     static const GUID IID_IXMLDOMDocument = 
40         { 0x2933BF81, 0x7B36, 0x11d2, {0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
41     VARIANT_BOOL b;
42     BSTR str;
43     static const WCHAR szEmpty[] = { 0 };
44     static const WCHAR szIncomplete[] = {
45         '<','?','x','m','l',' ',
46         'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',0
47     };
48     static const WCHAR szComplete1[] = {
49         '<','?','x','m','l',' ',
50         'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
51         '<','o','p','e','n','>','<','/','o','p','e','n','>','\n',0
52     };
53     static const WCHAR szComplete2[] = {
54         '<','?','x','m','l',' ',
55         'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
56         '<','o','>','<','/','o','>','\n',0
57     };
58     static const WCHAR szComplete3[] = {
59         '<','?','x','m','l',' ',
60         'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
61         '<','a','>','<','/','a','>','\n',0
62     };
63     static const WCHAR szComplete4[] = {
64         '<','?','x','m','l',' ',
65         'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>',
66         '<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>',
67         '<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ',
68         's','z','=','\'','1','2','3','4','\'','>','f','n','1','.','t','x','t','<','/','b','s','>',
69         '<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ',
70         'v','r','=','\'','1','.','2','.','3','\'',' ',
71         'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>',
72         'f','n','2','.','t','x','t','<','/','p','r','>',
73         '<','/','l','c','>','\n',0
74     };
75     static const WCHAR szOpen[] = { 'o','p','e','n',0 };
76
77     r = CoInitialize( NULL );
78     ok( r == S_OK, "failed to init com\n");
79
80     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
81         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
82     /* ok( r == S_OK, "failed to create an xml dom doc\n" ); */
83     if( r != S_OK )
84         return;
85
86     /* try some stupid things */
87     r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
88     ok( r == S_FALSE, "loadXML failed\n");
89
90     b = VARIANT_TRUE;
91     r = IXMLDOMDocument_loadXML( doc, NULL, &b );
92     ok( r == S_FALSE, "loadXML failed\n");
93     ok( b == VARIANT_FALSE, "failed to load XML string\n");
94
95     /* try load an empty document */
96     b = VARIANT_TRUE;
97     str = SysAllocString( szEmpty );
98     r = IXMLDOMDocument_loadXML( doc, str, &b );
99     ok( r == S_FALSE, "loadXML failed\n");
100     ok( b == VARIANT_FALSE, "failed to load XML string\n");
101     SysFreeString( str );
102
103     /* check that there's no document element */
104     element = NULL;
105     r = IXMLDOMDocument_get_documentElement( doc, &element );
106     ok( r == S_FALSE, "should be no document element\n");
107
108     b = VARIANT_TRUE;
109     str = SysAllocString( szIncomplete );
110     r = IXMLDOMDocument_loadXML( doc, str, &b );
111     ok( r == S_FALSE, "loadXML failed\n");
112     ok( b == VARIANT_FALSE, "failed to load XML string\n");
113     SysFreeString( str );
114
115     /* check that there's no document element */
116     element = (IXMLDOMElement*)1;
117     r = IXMLDOMDocument_get_documentElement( doc, &element );
118     ok( r == S_FALSE, "should be no document element\n");
119     ok( element == NULL, "Element should be NULL\n");
120
121     /* try to load something valid */
122     b = VARIANT_FALSE;
123     str = SysAllocString( szComplete1 );
124     r = IXMLDOMDocument_loadXML( doc, str, &b );
125     ok( r == S_OK, "loadXML failed\n");
126     ok( b == VARIANT_TRUE, "failed to load XML string\n");
127     SysFreeString( str );
128
129     /* try with a null out pointer - crashes */
130     if (0)
131     {
132         r = IXMLDOMDocument_get_documentElement( doc, NULL );
133         ok( r == S_OK, "should be no document element\n");
134     }
135
136     /* check that there's no document element */
137     element = NULL;
138     r = IXMLDOMDocument_get_documentElement( doc, &element );
139     ok( r == S_OK, "should be a document element\n");
140     if( element )
141     {
142         BSTR tag = NULL;
143
144         /* check if the tag is correct */
145         r = IXMLDOMElement_get_tagName( element, &tag );
146         ok( r == S_OK, "couldn't get tag name\n");
147         ok( tag != NULL, "tag was null\n");
148         ok( !lstrcmpW( tag, szOpen ), "incorrect tag name\n");
149         SysFreeString( tag );
150
151         /* figure out what happens if we try to reload the document */
152         str = SysAllocString( szComplete2 );
153         r = IXMLDOMDocument_loadXML( doc, str, &b );
154         ok( r == S_OK, "loadXML failed\n");
155         ok( b == VARIANT_TRUE, "failed to load XML string\n");
156         SysFreeString( str );
157
158         /* check if the tag is still correct */
159         tag = NULL;
160         r = IXMLDOMElement_get_tagName( element, &tag );
161         ok( r == S_OK, "couldn't get tag name\n");
162         ok( tag != NULL, "tag was null\n");
163         ok( !lstrcmpW( tag, szOpen ), "incorrect tag name\n");
164         SysFreeString( tag );
165
166         IXMLDOMElement_Release( element );
167         element = NULL;
168     }
169
170     /* as soon as we call loadXML again, the document element will disappear */
171     b = 2;
172     r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
173     ok( r == S_FALSE, "loadXML failed\n");
174     ok( b == 2, "variant modified\n");
175     r = IXMLDOMDocument_get_documentElement( doc, &element );
176     ok( r == S_FALSE, "should be no document element\n");
177
178     /* try to load something else simple and valid */
179     b = VARIANT_FALSE;
180     str = SysAllocString( szComplete3 );
181     r = IXMLDOMDocument_loadXML( doc, str, &b );
182     ok( r == S_OK, "loadXML failed\n");
183     ok( b == VARIANT_TRUE, "failed to load XML string\n");
184     SysFreeString( str );
185
186     /* try something a little more complicated */
187     b = FALSE;
188     str = SysAllocString( szComplete4 );
189     r = IXMLDOMDocument_loadXML( doc, str, &b );
190     ok( r == S_OK, "loadXML failed\n");
191     ok( b == VARIANT_TRUE, "failed to load XML string\n");
192     SysFreeString( str );
193
194     r = IXMLDocument_Release( doc );
195     ok( r == 0, "document ref count incorrect\n");
196
197     CoUninitialize();
198     ok( r == S_OK, "failed to uninit com\n");
199 }
200
201 START_TEST(domdoc)
202 {
203     test_domdoc();
204 }