<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>