242 lines
7.1 KiB
HTML
242 lines
7.1 KiB
HTML
|
<html>
|
||
|
<head>
|
||
|
<title>Parser Unit Test</title>
|
||
|
<style type="text/css">
|
||
|
@import "../resources/dojo.css";
|
||
|
</style>
|
||
|
<script type="text/javascript"
|
||
|
src="../dojo.js"
|
||
|
djConfig="isDebug: true, parseOnLoad: true"></script>
|
||
|
<script type="text/javascript">
|
||
|
dojo.require("dojo.parser");
|
||
|
dojo.require("doh.runner");
|
||
|
|
||
|
dojo.declare("tests.parser.Class1", null, {
|
||
|
constructor: function(args, node){ dojo.mixin(this, args); },
|
||
|
preambleTestProp: 1,
|
||
|
preamble: function(){
|
||
|
this.preambleTestProp++;
|
||
|
},
|
||
|
intProp: 1,
|
||
|
callCount: 0, // for connect testing
|
||
|
callInc: function(){ this.callCount++; },
|
||
|
callCount2: 0, // for assignment testing
|
||
|
strProp1: "original1",
|
||
|
strProp2: "original2",
|
||
|
arrProp: [],
|
||
|
boolProp1: false,
|
||
|
boolProp2: true,
|
||
|
boolProp3: false,
|
||
|
boolProp4: true,
|
||
|
dateProp1: dojo.date.stamp.fromISOString('2007-01-01'),
|
||
|
dateProp2: dojo.date.stamp.fromISOString('2007-01-01'),
|
||
|
dateProp3: dojo.date.stamp.fromISOString('2007-01-01'),
|
||
|
funcProp: function(){},
|
||
|
funcProp2: function(){},
|
||
|
funcProp3: function(){},
|
||
|
onclick: function(){ this.prototypeOnclick=true; }
|
||
|
// FIXME: have to test dates!!
|
||
|
// FIXME: need to test the args property!!
|
||
|
});
|
||
|
|
||
|
dojo.declare("tests.parser.Class2", null, {
|
||
|
constructor: function(){
|
||
|
this.fromMarkup = false;
|
||
|
},
|
||
|
fromMarkup: false,
|
||
|
markupFactory: function(args, node, classCtor){
|
||
|
var i = new tests.parser.Class2();
|
||
|
i.fromMarkup = true;
|
||
|
return i;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
|
||
|
dojo.declare("tests.parser.Class3", tests.parser.Class2, {
|
||
|
fromMarkup: false,
|
||
|
markupFactory: function(args, node, classCtor){
|
||
|
var i = new classCtor();
|
||
|
i.classCtor = classCtor;
|
||
|
return i;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
dojo.declare("tests.parser.inputClass", null, {
|
||
|
constructor: function(args, node){ dojo.mixin(this, args); },
|
||
|
// these attributes are special in HTML, they don't have a value specified
|
||
|
disabled: false,
|
||
|
checked: false
|
||
|
});
|
||
|
|
||
|
deepTestProp = {
|
||
|
blah: {
|
||
|
thinger: 1
|
||
|
}
|
||
|
};
|
||
|
|
||
|
dojo.addOnLoad(function(){
|
||
|
doh.register("t",
|
||
|
[
|
||
|
function testJsId(t){
|
||
|
// console.debug(obj);
|
||
|
t.t(typeof obj == "object");
|
||
|
},
|
||
|
|
||
|
// Attribute parsing tests
|
||
|
function testStrProp(t){
|
||
|
// normal string parameter
|
||
|
t.t(dojo.isString(obj.strProp1));
|
||
|
t.is("text", obj.strProp1);
|
||
|
|
||
|
// make sure that you override a string value like "foo" to a blank value
|
||
|
t.t(dojo.isString(obj.strProp2));
|
||
|
t.is("", obj.strProp2);
|
||
|
},
|
||
|
function testIntProp(t){
|
||
|
t.is("number", (typeof obj.intProp));
|
||
|
t.is(5, obj.intProp);
|
||
|
},
|
||
|
function testArrProp(t){
|
||
|
t.is(3, obj.arrProp.length);
|
||
|
t.is(3, obj.arrProp[1].length);
|
||
|
t.is(["foo", "bar", "baz"], obj.arrProp);
|
||
|
},
|
||
|
function testBoolProp(t){
|
||
|
// make sure that both true and false get read correctly,
|
||
|
// and that unspecified attributes' values don't change
|
||
|
|
||
|
// boolProp1 specified at true
|
||
|
t.is("boolean", (typeof obj.boolProp1));
|
||
|
t.t(obj.boolProp1);
|
||
|
|
||
|
// boolProp2 specified as false
|
||
|
t.is("boolean", (typeof obj.boolProp2));
|
||
|
t.f(obj.boolProp2);
|
||
|
|
||
|
// boolProp3 not specified (prototype says false)
|
||
|
t.is("boolean", (typeof obj.boolProp3));
|
||
|
t.f(obj.boolProp3);
|
||
|
|
||
|
// boolProp4 not specified (prototype says true)
|
||
|
t.is("boolean", (typeof obj.boolProp4));
|
||
|
t.t(obj.boolProp4);
|
||
|
},
|
||
|
function testDateProp(t){
|
||
|
// dateProp1 specified as 2006-1-1
|
||
|
t.is("2006-01-01", dojo.date.stamp.toISOString(obj.dateProp1, {selector: 'date'}));
|
||
|
|
||
|
// dateProp2="", should map to NaN (a blank value on DateTextBox)
|
||
|
t.t(isNaN(obj.dateProp2));
|
||
|
|
||
|
// dateProp3="now", should map to current date
|
||
|
t.is(dojo.date.stamp.toISOString(new Date(), {selector: 'date'}),
|
||
|
dojo.date.stamp.toISOString(obj.dateProp3, {selector: 'date'}));
|
||
|
},
|
||
|
function testDisabledFlag(t){
|
||
|
t.is("boolean", (typeof disabledObj.disabled));
|
||
|
t.t(disabledObj.disabled);
|
||
|
t.f(disabledObj.checked);
|
||
|
},
|
||
|
function testCheckedFlag(t){
|
||
|
t.is("boolean", (typeof checkedObj.checked));
|
||
|
t.f(checkedObj.disabled);
|
||
|
t.t(checkedObj.checked);
|
||
|
},
|
||
|
function testFunctionProp(t){
|
||
|
// make sure that unspecified functions (even with common names)
|
||
|
// don't get overridden (bug #3074)
|
||
|
obj.onclick();
|
||
|
t.t(obj.prototypeOnclick);
|
||
|
|
||
|
// funcProp2="foo"
|
||
|
obj.funcProp2();
|
||
|
t.t(obj.fooCalled);
|
||
|
|
||
|
// funcProp3="this.func3Called=true;"
|
||
|
obj.funcProp3();
|
||
|
t.t(obj.func3Called);
|
||
|
},
|
||
|
|
||
|
// test <script> tags inside innerHTML of source node
|
||
|
"t.is(4, obj.preambleTestProp);",
|
||
|
"t.is(deepTestProp, obj.deepProp);",
|
||
|
function testConnect(t){
|
||
|
obj.callInc();
|
||
|
t.is(2, obj.callCount);
|
||
|
},
|
||
|
function testFunctionAssignment(t){
|
||
|
obj.callInc2();
|
||
|
t.is(1, obj.callCount2);
|
||
|
},
|
||
|
function testSubNodeParse(t){
|
||
|
t.f(dojo.exists("obj2"));
|
||
|
var toParse = dojo.byId("toParse");
|
||
|
toParse.setAttribute("dojoType", toParse.getAttribute("type"));
|
||
|
dojo.parser.parse(toParse.parentNode);
|
||
|
t.t(dojo.exists("obj2"));
|
||
|
t.is("tests.parser.Class1", obj2.declaredClass);
|
||
|
},
|
||
|
function testMarkupFactory(t){
|
||
|
t.t(dojo.exists("obj3"));
|
||
|
t.t(obj3.fromMarkup);
|
||
|
},
|
||
|
function testMarkupFactoryClass(t){
|
||
|
t.t(dojo.exists("obj4"));
|
||
|
t.is(obj4.classCtor, tests.parser.Class3);
|
||
|
t.t(obj4 instanceof tests.parser.Class3);
|
||
|
t.t(obj4 instanceof tests.parser.Class2);
|
||
|
},
|
||
|
function testDisabledFlag(t){
|
||
|
t.t(disabledObj.disabled);
|
||
|
t.f(disabledObj.checked);
|
||
|
},
|
||
|
function testCheckedFlag(t){
|
||
|
t.f(checkedObj.disabled);
|
||
|
t.t(checkedObj.checked);
|
||
|
}
|
||
|
]
|
||
|
);
|
||
|
doh.run();
|
||
|
})
|
||
|
</script>
|
||
|
</head>
|
||
|
<body>
|
||
|
<h1>Parser Unit Test</h1>
|
||
|
<script>
|
||
|
function foo(){ this.fooCalled=true; }
|
||
|
</script>
|
||
|
<div dojoType="tests.parser.Class1" jsId="obj"
|
||
|
strProp1="text" strProp2=""
|
||
|
intProp="5"
|
||
|
arrProp="foo, bar, baz"
|
||
|
boolProp1="true" boolProp2="false"
|
||
|
dateProp1="2006-01-01" dateProp2="" dateProp3="now"
|
||
|
funcProp2="foo" funcProp3="this.func3Called=true;"
|
||
|
>
|
||
|
<script type="dojo/method" event="preamble">
|
||
|
this.preambleTestProp = 3;
|
||
|
</script>
|
||
|
<script type="dojo/method">
|
||
|
// this should be run immediately
|
||
|
this.deepProp = deepTestProp;
|
||
|
</script>
|
||
|
<script type="dojo/connect" event="callInc">
|
||
|
this.callCount++;
|
||
|
</script>
|
||
|
<script type="dojo/method" event="callInc2">
|
||
|
this.callCount2++;
|
||
|
</script>
|
||
|
</div>
|
||
|
<div>
|
||
|
<div type="tests.parser.Class1" jsId="obj2" id="toParse">
|
||
|
</div>
|
||
|
</div>
|
||
|
<div dojoType="tests.parser.Class2" jsId="obj3">
|
||
|
</div>
|
||
|
<div dojoType="tests.parser.Class3" jsId="obj4">
|
||
|
</div>
|
||
|
<input dojoType="tests.parser.inputClass" jsId="checkedObj" checked type="checkbox">
|
||
|
<button dojoType="tests.parser.inputClass" jsId="disabledObj" disabled>hi</button>
|
||
|
</body>
|
||
|
</html>
|