|
1 <?xml version="1.0"?> |
|
2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?> |
|
3 <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?> |
|
4 |
|
5 <!-- |
|
6 tests for templates with invalid syntax |
|
7 --> |
|
8 |
|
9 <window title="XUL Invalid Template Tests" width="500" height="600" |
|
10 onload="runTest();" |
|
11 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> |
|
12 <script type="application/javascript" |
|
13 src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> |
|
14 |
|
15 <body xmlns="http://www.w3.org/1999/xhtml" style="height: 300px; overflow: auto;"/> |
|
16 |
|
17 <script> |
|
18 <![CDATA[ |
|
19 SimpleTest.waitForExplicitFinish(); |
|
20 |
|
21 var consoleService = Components.classes["@mozilla.org/consoleservice;1"]. |
|
22 getService(Components.interfaces.nsIConsoleService); |
|
23 |
|
24 function checkConsole(expectedError) |
|
25 { |
|
26 var message = consoleService.getMessageArray()[0].message; |
|
27 is(message, expectedError, "logged message " + expectedError); |
|
28 } |
|
29 |
|
30 // each test consists of a pre function executed before the template build, an |
|
31 // expected error message, and a post function executed after the template build |
|
32 var tests = [ |
|
33 |
|
34 // <queryset> used in invalid location |
|
35 { |
|
36 pre: function(template) template.insertBefore(document.createElement("queryset"), template.lastChild), |
|
37 error: "Error parsing template: unexpected <queryset> element", |
|
38 post: function(queryset) queryset.parentNode.removeChild(queryset) |
|
39 }, |
|
40 |
|
41 // no member variable found |
|
42 { |
|
43 pre: function(template) $("action").firstChild.removeAttribute("uri"), |
|
44 error: "Error parsing template: no member variable found. Action body should have an element with uri attribute", |
|
45 post: function() $("action").firstChild.setAttribute("uri", "?child") |
|
46 }, |
|
47 |
|
48 // bad binding subject |
|
49 { |
|
50 pre: function(template) $("binding").removeAttribute("subject"), |
|
51 error: "Error parsing template: <binding> requires a variable for its subject attribute", |
|
52 post: function() $("binding").setAttribute("subject", "?child"), |
|
53 }, |
|
54 |
|
55 // bad binding predicate |
|
56 { |
|
57 pre: function(template) $("binding").removeAttribute("predicate"), |
|
58 error: "Error parsing template: <binding> element is missing a predicate attribute", |
|
59 post: function() $("binding").setAttribute("predicate", "http://www.some-fictitious-zoo.com/rdf#name"), |
|
60 }, |
|
61 |
|
62 // bad binding object |
|
63 { |
|
64 pre: function(template) $("binding").setAttribute("object", "blah"), |
|
65 error: "Error parsing template: <binding> requires a variable for its object attribute", |
|
66 post: function() $("binding").setAttribute("object", "?name"), |
|
67 }, |
|
68 |
|
69 // where condition missing a subject |
|
70 { |
|
71 pre: function(template) { var rule = $("rule"); |
|
72 var where = document.createElement("where"); |
|
73 where.setAttribute("subject", ""); |
|
74 where.setAttribute("rel", "equals"); |
|
75 where.setAttribute("value", "Raven"); |
|
76 rule.appendChild(where); |
|
77 return where; }, |
|
78 error: "Error parsing template: <where> element is missing a subject attribute", |
|
79 post: function(where) { where.parentNode.removeChild(where); } |
|
80 }, |
|
81 |
|
82 // where condition missing a rel |
|
83 { |
|
84 pre: function(template) { var rule = $("rule"); |
|
85 var where = document.createElement("where"); |
|
86 where.setAttribute("subject", "?name"); |
|
87 where.setAttribute("rel", ""); |
|
88 where.setAttribute("value", "Raven"); |
|
89 rule.appendChild(where); |
|
90 return where; }, |
|
91 error: "Error parsing template: <where> element is missing a rel attribute", |
|
92 post: function(where) { where.parentNode.removeChild(where); } |
|
93 }, |
|
94 |
|
95 // where condition missing a value |
|
96 { |
|
97 pre: function(template) { var rule = $("rule"); |
|
98 var where = document.createElement("where"); |
|
99 where.setAttribute("subject", "?name"); |
|
100 where.setAttribute("rel", "equals"); |
|
101 where.setAttribute("value", ""); |
|
102 rule.appendChild(where); |
|
103 return where; }, |
|
104 error: "Error parsing template: <where> element is missing a value attribute", |
|
105 post: function(where) { where.parentNode.removeChild(where); } |
|
106 }, |
|
107 |
|
108 // where condition missing a variable |
|
109 { |
|
110 pre: function(template) { var rule = $("rule"); |
|
111 var where = document.createElement("where"); |
|
112 where.setAttribute("subject", "name"); |
|
113 where.setAttribute("rel", "equals"); |
|
114 where.setAttribute("value", "Raven"); |
|
115 rule.appendChild(where); |
|
116 return where; }, |
|
117 error: "Error parsing template: <where> element must have at least one variable as a subject or value", |
|
118 post: function(where) { where.parentNode.removeChild(where); } |
|
119 }, |
|
120 |
|
121 // bad member container |
|
122 { |
|
123 pre: function(template) $("member").setAttribute("container", "blah"), |
|
124 error: "Error parsing template: <member> requires a variable for its container attribute", |
|
125 post: function() $("member").setAttribute("container", "?uri"), |
|
126 }, |
|
127 |
|
128 // bad member child |
|
129 { |
|
130 pre: function(template) $("member").setAttribute("child", "blah"), |
|
131 error: "Error parsing template: <member> requires a variable for its child attribute", |
|
132 post: function() $("member").setAttribute("child", "?child"), |
|
133 }, |
|
134 |
|
135 // bad triple subject |
|
136 { |
|
137 pre: function(template) $("triple").removeAttribute("subject"), |
|
138 error: "Error parsing template: <triple> requires a variable for its subject attribute", |
|
139 post: function() $("triple").setAttribute("subject", "?child"), |
|
140 }, |
|
141 |
|
142 // missing triple predicate |
|
143 { |
|
144 pre: function(template) $("triple").removeAttribute("predicate"), |
|
145 error: "Error parsing template: <triple> should have a non-variable value as a predicate", |
|
146 post: function() $("triple").setAttribute("predicate", "http://www.some-fictitious-zoo.com/rdf#name"), |
|
147 }, |
|
148 |
|
149 // bad triple predicate |
|
150 { |
|
151 pre: function(template) $("triple").setAttribute("predicate", "?predicate"), |
|
152 error: "Error parsing template: <triple> should have a non-variable value as a predicate", |
|
153 post: function() $("triple").setAttribute("predicate", "http://www.some-fictitious-zoo.com/rdf#name"), |
|
154 }, |
|
155 |
|
156 // bad triple object |
|
157 { |
|
158 pre: function(template) $("triple").removeAttribute("object"), |
|
159 error: "Error parsing template: <triple> requires a variable for its object attribute", |
|
160 post: function() $("triple").setAttribute("object", "?name"), |
|
161 }, |
|
162 |
|
163 // content not first element in query |
|
164 { |
|
165 pre: function(template) { var content = $("content"); content.parentNode.appendChild(content); return content; }, |
|
166 error: "Error parsing template: expected <content> to be first", |
|
167 post: function(content) content.parentNode.insertBefore(content, content.parentNode.firstChild), |
|
168 }, |
|
169 |
|
170 // member container variable not bound |
|
171 { |
|
172 pre: function(template) $("member").removeAttribute("container"), |
|
173 error: "Error parsing template: neither container or child variables of <member> has a value", |
|
174 post: function() $("member").setAttribute("container", "?uri"), |
|
175 }, |
|
176 |
|
177 // neither triple subject or object variable are bound |
|
178 { |
|
179 pre: function(template) $("triple").setAttribute("subject", "?blah"), |
|
180 error: "Error parsing template: neither subject or object variables of <triple> has a value", |
|
181 post: function() $("triple").setAttribute("subject", "?child"), |
|
182 }, |
|
183 |
|
184 // neither triple subject or object variable are bound |
|
185 { |
|
186 pre: function(template) { var triple = $("triple"); triple.setAttribute("subject", "blah"); |
|
187 triple.setAttribute("object", "blah"); }, |
|
188 error: "Error parsing template: <triple> should have at least one variable as a subject or object", |
|
189 post: function() { var triple = $("triple"); triple.setAttribute("subject", "?uri"); |
|
190 triple.setAttribute("object", "?uri") } |
|
191 }, |
|
192 |
|
193 // could not parse xml query expression |
|
194 { |
|
195 firstXMLTest: true, |
|
196 pre: function(template) { $("query").setAttribute("expr", "something()"); }, |
|
197 error: "Error parsing template: XPath expression in query could not be parsed", |
|
198 post: function() { } |
|
199 }, |
|
200 |
|
201 // could not parse xml assign expression |
|
202 { |
|
203 pre: function(template) { var query = $("query"); |
|
204 query.setAttribute("expr", "*"); |
|
205 var assign = document.createElement("assign"); |
|
206 assign.setAttribute("var", "?name"); |
|
207 assign.setAttribute("expr", "something()"); |
|
208 query.appendChild(assign); |
|
209 return assign; }, |
|
210 error: "Error parsing template: XPath expression in <assign> could not be parsed", |
|
211 post: function(assign) { assign.parentNode.removeChild(assign); } |
|
212 }, |
|
213 |
|
214 // could not parse xml binding expression |
|
215 { |
|
216 pre: function(template) { $("binding").setAttribute("predicate", "something()"); }, |
|
217 error: "Error parsing template: XPath expression in <binding> could not be parsed", |
|
218 post: function() { $("binding").setAttribute("predicate", "[name]"); }, |
|
219 }, |
|
220 |
|
221 ]; |
|
222 |
|
223 function runTest() |
|
224 { |
|
225 var root = $("root"); |
|
226 var template = $("template"); |
|
227 while (test = tests.shift()) { |
|
228 consoleService.reset(); |
|
229 var context = test.pre(template); |
|
230 root.builder.rebuild(); |
|
231 checkConsole(test.error); |
|
232 test.post(context); |
|
233 |
|
234 // preload and set up for the xml datasource query error tests |
|
235 if (tests.length && tests[0].firstXMLTest) { |
|
236 var src = window.location.href.replace(/test_tmpl.*xul/, "animals.xml"); |
|
237 xmlDoc = new XMLHttpRequest(); |
|
238 xmlDoc.open("get", src, false); |
|
239 xmlDoc.send(null); |
|
240 |
|
241 var root = $("root"); |
|
242 root.setAttribute("querytype", "xml"); |
|
243 root.setAttribute("datasources", "animals.xml"); |
|
244 $("binding").setAttribute("predicate", "[name]"); |
|
245 |
|
246 function waitForDatasource() { |
|
247 // wait for the datasource to be available before continuing the test |
|
248 if (root.builder.datasource instanceof XMLDocument) |
|
249 runTest(); |
|
250 else |
|
251 setTimeout(waitForDatasource, 100); |
|
252 } |
|
253 |
|
254 setTimeout(waitForDatasource, 0); |
|
255 return; |
|
256 } |
|
257 } |
|
258 SimpleTest.finish(); |
|
259 } |
|
260 |
|
261 ]]> |
|
262 </script> |
|
263 |
|
264 <vbox id="root" datasources="animals.rdf" ref="http://www.some-fictitious-zoo.com/birds"> |
|
265 <template id="template"> |
|
266 <query id="query"> |
|
267 <content id="content" uri="?uri"/> |
|
268 <member id="member" container="?uri" child="?child"/> |
|
269 <triple id="triple" subject="?child" predicate="http://www.some-fictitious-zoo.com/rdf#name" object="?name"/> |
|
270 </query> |
|
271 <rule id="rule"> |
|
272 <binding id="binding" subject="?child" predicate="http://www.some-fictitious-zoo.com/rdf#name" object="?name"/> |
|
273 <action id="action"> |
|
274 <label uri="?child" value="?name"/> |
|
275 </action> |
|
276 </rule> |
|
277 </template> |
|
278 </vbox> |
|
279 |
|
280 </window> |