gecko/content/xul/templates/tests/chrome/test_tmpl_errors.xul

281 lines
11 KiB
XML

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
<!--
tests for templates with invalid syntax
-->
<window title="XUL Invalid Template Tests" width="500" height="600"
onload="runTest();"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<body xmlns="http://www.w3.org/1999/xhtml" style="height: 300px; overflow: auto;"/>
<script>
<![CDATA[
SimpleTest.waitForExplicitFinish();
var consoleService = Components.classes["@mozilla.org/consoleservice;1"].
getService(Components.interfaces.nsIConsoleService);
function checkConsole(expectedError)
{
var message = consoleService.getMessageArray()[0].message;
is(message, expectedError, "logged message " + expectedError);
}
// each test consists of a pre function executed before the template build, an
// expected error message, and a post function executed after the template build
var tests = [
// <queryset> used in invalid location
{
pre: function(template) template.insertBefore(document.createElement("queryset"), template.lastChild),
error: "Error parsing template: unexpected <queryset> element",
post: function(queryset) queryset.parentNode.removeChild(queryset)
},
// no member variable found
{
pre: function(template) $("action").firstChild.removeAttribute("uri"),
error: "Error parsing template: no member variable found. Action body should have an element with uri attribute",
post: function() $("action").firstChild.setAttribute("uri", "?child")
},
// bad binding subject
{
pre: function(template) $("binding").removeAttribute("subject"),
error: "Error parsing template: <binding> requires a variable for its subject attribute",
post: function() $("binding").setAttribute("subject", "?child"),
},
// bad binding predicate
{
pre: function(template) $("binding").removeAttribute("predicate"),
error: "Error parsing template: <binding> element is missing a predicate attribute",
post: function() $("binding").setAttribute("predicate", "http://www.some-fictitious-zoo.com/rdf#name"),
},
// bad binding object
{
pre: function(template) $("binding").setAttribute("object", "blah"),
error: "Error parsing template: <binding> requires a variable for its object attribute",
post: function() $("binding").setAttribute("object", "?name"),
},
// where condition missing a subject
{
pre: function(template) { var rule = $("rule");
var where = document.createElement("where");
where.setAttribute("subject", "");
where.setAttribute("rel", "equals");
where.setAttribute("value", "Raven");
rule.appendChild(where);
return where; },
error: "Error parsing template: <where> element is missing a subject attribute",
post: function(where) { where.parentNode.removeChild(where); }
},
// where condition missing a rel
{
pre: function(template) { var rule = $("rule");
var where = document.createElement("where");
where.setAttribute("subject", "?name");
where.setAttribute("rel", "");
where.setAttribute("value", "Raven");
rule.appendChild(where);
return where; },
error: "Error parsing template: <where> element is missing a rel attribute",
post: function(where) { where.parentNode.removeChild(where); }
},
// where condition missing a value
{
pre: function(template) { var rule = $("rule");
var where = document.createElement("where");
where.setAttribute("subject", "?name");
where.setAttribute("rel", "equals");
where.setAttribute("value", "");
rule.appendChild(where);
return where; },
error: "Error parsing template: <where> element is missing a value attribute",
post: function(where) { where.parentNode.removeChild(where); }
},
// where condition missing a variable
{
pre: function(template) { var rule = $("rule");
var where = document.createElement("where");
where.setAttribute("subject", "name");
where.setAttribute("rel", "equals");
where.setAttribute("value", "Raven");
rule.appendChild(where);
return where; },
error: "Error parsing template: <where> element must have at least one variable as a subject or value",
post: function(where) { where.parentNode.removeChild(where); }
},
// bad member container
{
pre: function(template) $("member").setAttribute("container", "blah"),
error: "Error parsing template: <member> requires a variable for its container attribute",
post: function() $("member").setAttribute("container", "?uri"),
},
// bad member child
{
pre: function(template) $("member").setAttribute("child", "blah"),
error: "Error parsing template: <member> requires a variable for its child attribute",
post: function() $("member").setAttribute("child", "?child"),
},
// bad triple subject
{
pre: function(template) $("triple").removeAttribute("subject"),
error: "Error parsing template: <triple> requires a variable for its subject attribute",
post: function() $("triple").setAttribute("subject", "?child"),
},
// missing triple predicate
{
pre: function(template) $("triple").removeAttribute("predicate"),
error: "Error parsing template: <triple> should have a non-variable value as a predicate",
post: function() $("triple").setAttribute("predicate", "http://www.some-fictitious-zoo.com/rdf#name"),
},
// bad triple predicate
{
pre: function(template) $("triple").setAttribute("predicate", "?predicate"),
error: "Error parsing template: <triple> should have a non-variable value as a predicate",
post: function() $("triple").setAttribute("predicate", "http://www.some-fictitious-zoo.com/rdf#name"),
},
// bad triple object
{
pre: function(template) $("triple").removeAttribute("object"),
error: "Error parsing template: <triple> requires a variable for its object attribute",
post: function() $("triple").setAttribute("object", "?name"),
},
// content not first element in query
{
pre: function(template) { var content = $("content"); content.parentNode.appendChild(content); return content; },
error: "Error parsing template: expected <content> to be first",
post: function(content) content.parentNode.insertBefore(content, content.parentNode.firstChild),
},
// member container variable not bound
{
pre: function(template) $("member").removeAttribute("container"),
error: "Error parsing template: neither container or child variables of <member> has a value",
post: function() $("member").setAttribute("container", "?uri"),
},
// neither triple subject or object variable are bound
{
pre: function(template) $("triple").setAttribute("subject", "?blah"),
error: "Error parsing template: neither subject or object variables of <triple> has a value",
post: function() $("triple").setAttribute("subject", "?child"),
},
// neither triple subject or object variable are bound
{
pre: function(template) { var triple = $("triple"); triple.setAttribute("subject", "blah");
triple.setAttribute("object", "blah"); },
error: "Error parsing template: <triple> should have at least one variable as a subject or object",
post: function() { var triple = $("triple"); triple.setAttribute("subject", "?uri");
triple.setAttribute("object", "?uri") }
},
// could not parse xml query expression
{
firstXMLTest: true,
pre: function(template) { $("query").setAttribute("expr", "something()"); },
error: "Error parsing template: XPath expression in query could not be parsed",
post: function() { }
},
// could not parse xml assign expression
{
pre: function(template) { var query = $("query");
query.setAttribute("expr", "*");
var assign = document.createElement("assign");
assign.setAttribute("var", "?name");
assign.setAttribute("expr", "something()");
query.appendChild(assign);
return assign; },
error: "Error parsing template: XPath expression in <assign> could not be parsed",
post: function(assign) { assign.parentNode.removeChild(assign); }
},
// could not parse xml binding expression
{
pre: function(template) { $("binding").setAttribute("predicate", "something()"); },
error: "Error parsing template: XPath expression in <binding> could not be parsed",
post: function() { $("binding").setAttribute("predicate", "[name]"); },
},
];
function runTest()
{
var root = $("root");
var template = $("template");
while (test = tests.shift()) {
consoleService.reset();
var context = test.pre(template);
root.builder.rebuild();
checkConsole(test.error);
test.post(context);
// preload and set up for the xml datasource query error tests
if (tests.length && tests[0].firstXMLTest) {
var src = window.location.href.replace(/test_tmpl.*xul/, "animals.xml");
xmlDoc = new XMLHttpRequest();
xmlDoc.open("get", src, false);
xmlDoc.send(null);
var root = $("root");
root.setAttribute("querytype", "xml");
root.setAttribute("datasources", "animals.xml");
$("binding").setAttribute("predicate", "[name]");
function waitForDatasource() {
// wait for the datasource to be available before continuing the test
if (root.builder.datasource instanceof XMLDocument)
runTest();
else
setTimeout(waitForDatasource, 100);
}
setTimeout(waitForDatasource, 0);
return;
}
}
SimpleTest.finish();
}
]]>
</script>
<vbox id="root" datasources="animals.rdf" ref="http://www.some-fictitious-zoo.com/birds">
<template id="template">
<query id="query">
<content id="content" uri="?uri"/>
<member id="member" container="?uri" child="?child"/>
<triple id="triple" subject="?child" predicate="http://www.some-fictitious-zoo.com/rdf#name" object="?name"/>
</query>
<rule id="rule">
<binding id="binding" subject="?child" predicate="http://www.some-fictitious-zoo.com/rdf#name" object="?name"/>
<action id="action">
<label uri="?child" value="?name"/>
</action>
</rule>
</template>
</vbox>
</window>