1 Event.simulateMouse=function(D,B){var C=Object.extend({pointerX:0,pointerY:0,buttons:0,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},arguments[2]||{});var A=document.createEvent("MouseEvents");A.initMouseEvent(B,true,true,document.defaultView,C.buttons,C.pointerX,C.pointerY,C.pointerX,C.pointerY,C.ctrlKey,C.altKey,C.shiftKey,C.metaKey,0,$(D));if(this.mark){Element.remove(this.mark)}this.mark=document.createElement("div");this.mark.appendChild(document.createTextNode(" "));document.body.appendChild(this.mark);this.mark.style.position="absolute";this.mark.style.top=C.pointerY+"px";this.mark.style.left=C.pointerX+"px";this.mark.style.width="5px";this.mark.style.height="5px;";this.mark.style.borderTop="1px solid red;";this.mark.style.borderLeft="1px solid red;";if(this.step){alert("["+new Date().getTime().toString()+"] "+B+"/"+Test.Unit.inspect(C))}$(D).dispatchEvent(A)};Event.simulateKey=function(D,B){var C=Object.extend({ctrlKey:false,altKey:false,shiftKey:false,metaKey:false,keyCode:0,charCode:0},arguments[2]||{});var A=document.createEvent("KeyEvents");A.initKeyEvent(B,true,true,window,C.ctrlKey,C.altKey,C.shiftKey,C.metaKey,C.keyCode,C.charCode);$(D).dispatchEvent(A)};Event.simulateKeys=function(B,C){for(var A=0;A<C.length;A++){Event.simulateKey(B,"keypress",{charCode:C.charCodeAt(A)})}};var Test={};Test.Unit={};Test.Unit.inspect=Object.inspect;Test.Unit.Logger=Class.create();Test.Unit.Logger.prototype={initialize:function(A){this.log=$(A);if(this.log){this._createLogTable()}},start:function(A){if(!this.log){return }this.testName=A;this.lastLogLine=document.createElement("tr");this.statusCell=document.createElement("td");this.nameCell=document.createElement("td");this.nameCell.className="nameCell";this.nameCell.appendChild(document.createTextNode(A));this.messageCell=document.createElement("td");this.lastLogLine.appendChild(this.statusCell);this.lastLogLine.appendChild(this.nameCell);this.lastLogLine.appendChild(this.messageCell);this.loglines.appendChild(this.lastLogLine)},finish:function(A,B){if(!this.log){return }this.lastLogLine.className=A;this.statusCell.innerHTML=A;this.messageCell.innerHTML=this._toHTML(B);this.addLinksToResults()},message:function(A){if(!this.log){return }this.messageCell.innerHTML=this._toHTML(A)},summary:function(A){if(!this.log){return }this.logsummary.innerHTML=this._toHTML(A)},_createLogTable:function(){this.log.innerHTML='<div id="logsummary"></div><table id="logtable"><thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead><tbody id="loglines"></tbody></table>';this.logsummary=$("logsummary");this.loglines=$("loglines")},_toHTML:function(A){return A.escapeHTML().replace(/\n/g,"<br/>")},addLinksToResults:function(){$$("tr.failed .nameCell").each(function(A){A.title="Run only this test";Event.observe(A,"click",function(){window.location.search="?tests="+A.innerHTML})});$$("tr.passed .nameCell").each(function(A){A.title="Run all tests";Event.observe(A,"click",function(){window.location.search=""})})}};Test.Unit.Runner=Class.create();Test.Unit.Runner.prototype={initialize:function(A){this.options=Object.extend({testLog:"testlog"},arguments[1]||{});this.options.resultsURL=this.parseResultsURLQueryParameter();this.options.tests=this.parseTestsQueryParameter();if(this.options.testLog){this.options.testLog=$(this.options.testLog)||null}if(this.options.tests){this.tests=[];for(var C=0;C<this.options.tests.length;C++){if(/^test/.test(this.options.tests[C])){this.tests.push(new Test.Unit.Testcase(this.options.tests[C],A[this.options.tests[C]],A.setup,A.teardown))}}}else{if(this.options.test){this.tests=[new Test.Unit.Testcase(this.options.test,A[this.options.test],A.setup,A.teardown)]}else{this.tests=[];for(var B in A){if(/^test/.test(B)){this.tests.push(new Test.Unit.Testcase(this.options.context?" -> "+this.options.titles[B]:B,A[B],A.setup,A.teardown))}}}}this.currentTest=0;this.logger=new Test.Unit.Logger(this.options.testLog);setTimeout(this.runTests.bind(this),1000)},parseResultsURLQueryParameter:function(){return window.location.search.parseQuery()["resultsURL"]},parseTestsQueryParameter:function(){if(window.location.search.parseQuery()["tests"]){return window.location.search.parseQuery()["tests"].split(",")}},getResult:function(){var B=false;for(var A=0;A<this.tests.length;A++){if(this.tests[A].errors>0){return"ERROR"}if(this.tests[A].failures>0){B=true}}if(B){return"FAILURE"}else{return"SUCCESS"}},postResults:function(){if(this.options.resultsURL){new Ajax.Request(this.options.resultsURL,{method:"get",parameters:"result="+this.getResult(),asynchronous:false})}},runTests:function(){var A=this.tests[this.currentTest];if(!A){this.postResults();this.logger.summary(this.summary());return }if(!A.isWaiting){this.logger.start(A.name)}A.run();if(A.isWaiting){this.logger.message("Waiting for "+A.timeToWait+"ms");setTimeout(this.runTests.bind(this),A.timeToWait||1000)}else{this.logger.finish(A.status(),A.summary());this.currentTest++;this.runTests()}},summary:function(){var D=0;var B=0;var E=0;var C=[];for(var A=0;A<this.tests.length;A++){D+=this.tests[A].assertions;B+=this.tests[A].failures;E+=this.tests[A].errors}return((this.options.context?this.options.context+": ":"")+this.tests.length+" tests, "+D+" assertions, "+B+" failures, "+E+" errors")}};Test.Unit.Assertions=Class.create();Test.Unit.Assertions.prototype={initialize:function(){this.assertions=0;this.failures=0;this.errors=0;this.messages=[]},summary:function(){return(this.assertions+" assertions, "+this.failures+" failures, "+this.errors+" errors\n"+this.messages.join("\n"))},pass:function(){this.assertions++},fail:function(A){this.failures++;this.messages.push("Failure: "+A)},info:function(A){this.messages.push("Info: "+A)},error:function(A){this.errors++;this.messages.push(A.name+": "+A.message+"("+Test.Unit.inspect(A)+")")},status:function(){if(this.failures>0){return"failed"}if(this.errors>0){return"error"}return"passed"},assert:function(C){var A=arguments[1]||'assert: got "'+Test.Unit.inspect(C)+'"';try{C?this.pass():this.fail(A)}catch(B){this.error(B)}},assertEqual:function(B,D){var A=arguments[2]||"assertEqual";try{(B==D)?this.pass():this.fail(A+': expected "'+Test.Unit.inspect(B)+'", actual "'+Test.Unit.inspect(D)+'"')}catch(C){this.error(C)}},assertInspect:function(B,D){var A=arguments[2]||"assertInspect";try{(B==D.inspect())?this.pass():this.fail(A+': expected "'+Test.Unit.inspect(B)+'", actual "'+Test.Unit.inspect(D)+'"')}catch(C){this.error(C)}},assertEnumEqual:function(B,D){var A=arguments[2]||"assertEnumEqual";try{$A(B).length==$A(D).length&&B.zip(D).all(function(E){return E[0]==E[1]})?this.pass():this.fail(A+": expected "+Test.Unit.inspect(B)+", actual "+Test.Unit.inspect(D))}catch(C){this.error(C)}},assertNotEqual:function(B,D){var A=arguments[2]||"assertNotEqual";try{(B!=D)?this.pass():this.fail(A+': got "'+Test.Unit.inspect(D)+'"')}catch(C){this.error(C)}},assertIdentical:function(B,D){var A=arguments[2]||"assertIdentical";try{(B===D)?this.pass():this.fail(A+': expected "'+Test.Unit.inspect(B)+'", actual "'+Test.Unit.inspect(D)+'"')}catch(C){this.error(C)}},assertNotIdentical:function(B,D){var A=arguments[2]||"assertNotIdentical";try{!(B===D)?this.pass():this.fail(A+': expected "'+Test.Unit.inspect(B)+'", actual "'+Test.Unit.inspect(D)+'"')}catch(C){this.error(C)}},assertNull:function(C){var A=arguments[1]||"assertNull";try{(C==null)?this.pass():this.fail(A+': got "'+Test.Unit.inspect(C)+'"')}catch(B){this.error(B)}},assertMatch:function(C,E){var B=arguments[2]||"assertMatch";var A=new RegExp(C);try{(A.exec(E))?this.pass():this.fail(B+' : regex: "'+Test.Unit.inspect(C)+" did not match: "+Test.Unit.inspect(E)+'"')}catch(D){this.error(D)}},assertHidden:function(A){var B=arguments[1]||"assertHidden";this.assertEqual("none",A.style.display,B)},assertNotNull:function(A){var B=arguments[1]||"assertNotNull";this.assert(A!=null,B)},assertType:function(B,D){var A=arguments[2]||"assertType";try{(D.constructor==B)?this.pass():this.fail(A+': expected "'+Test.Unit.inspect(B)+'", actual "'+(D.constructor)+'"')}catch(C){this.error(C)}},assertNotOfType:function(B,D){var A=arguments[2]||"assertNotOfType";try{(D.constructor!=B)?this.pass():this.fail(A+': expected "'+Test.Unit.inspect(B)+'", actual "'+(D.constructor)+'"')}catch(C){this.error(C)}},assertInstanceOf:function(B,D){var A=arguments[2]||"assertInstanceOf";try{(D instanceof B)?this.pass():this.fail(A+": object was not an instance of the expected type")}catch(C){this.error(C)}},assertNotInstanceOf:function(B,D){var A=arguments[2]||"assertNotInstanceOf";try{!(D instanceof B)?this.pass():this.fail(A+": object was an instance of the not expected type")}catch(C){this.error(C)}},assertRespondsTo:function(D,C){var A=arguments[2]||"assertRespondsTo";try{(C[D]&&typeof C[D]=="function")?this.pass():this.fail(A+": object doesn't respond to ["+D+"]")}catch(B){this.error(B)}},assertReturnsTrue:function(E,D){var B=arguments[2]||"assertReturnsTrue";try{var A=D[E];if(!A){A=D["is"+E.charAt(0).toUpperCase()+E.slice(1)]}A()?this.pass():this.fail(B+": method returned false")}catch(C){this.error(C)}},assertReturnsFalse:function(E,D){var B=arguments[2]||"assertReturnsFalse";try{var A=D[E];if(!A){A=D["is"+E.charAt(0).toUpperCase()+E.slice(1)]}!A()?this.pass():this.fail(B+": method returned true")}catch(C){this.error(C)}},assertRaise:function(A,D){var B=arguments[2]||"assertRaise";try{D();this.fail(B+": exception expected but none was raised")}catch(C){((A==null)||(C.name==A))?this.pass():this.error(C)}},assertElementsMatch:function(){var A=$A(arguments),B=$A(A.shift());if(B.length!=A.length){this.fail("assertElementsMatch: size mismatch: "+B.length+" elements, "+A.length+" expressions");return false}B.zip(A).all(function(F,C){var D=$(F.first()),E=F.last();if(D.match(E)){return true}this.fail("assertElementsMatch: (in index "+C+") expected "+E.inspect()+" but got "+D.inspect())}.bind(this))&&this.pass()},assertElementMatches:function(A,B){this.assertElementsMatch([A],B)},benchmark:function(C,D){var B=new Date();(D||1).times(C);var A=((new Date())-B);this.info((arguments[2]||"Operation")+" finished "+D+" iterations in "+(A/1000)+"s");return A},_isVisible:function(A){A=$(A);if(!A.parentNode){return true}this.assertNotNull(A);if(A.style&&Element.getStyle(A,"display")=="none"){return false}return this._isVisible(A.parentNode)},assertNotVisible:function(A){this.assert(!this._isVisible(A),Test.Unit.inspect(A)+" was not hidden and didn't have a hidden parent either. "+(""||arguments[1]))},assertVisible:function(A){this.assert(this._isVisible(A),Test.Unit.inspect(A)+" was not visible. "+(""||arguments[1]))},benchmark:function(C,D){var B=new Date();(D||1).times(C);var A=((new Date())-B);this.info((arguments[2]||"Operation")+" finished "+D+" iterations in "+(A/1000)+"s");return A}};Test.Unit.Testcase=Class.create();Object.extend(Object.extend(Test.Unit.Testcase.prototype,Test.Unit.Assertions.prototype),{initialize:function(name,test,setup,teardown){Test.Unit.Assertions.prototype.initialize.bind(this)();this.name=name;if(typeof test=="string"){test=test.gsub(/(\.should[^\(]+\()/,"#{0}this,");test=test.gsub(/(\.should[^\(]+)\(this,\)/,"#{1}(this)");this.test=function(){eval("with(this){"+test+"}")}}else{this.test=test||function(){}}this.setup=setup||function(){};this.teardown=teardown||function(){};this.isWaiting=false;this.timeToWait=1000},wait:function(B,A){this.isWaiting=true;this.test=A;this.timeToWait=B},run:function(){try{try{if(!this.isWaiting){this.setup.bind(this)()}this.isWaiting=false;this.test.bind(this)()}finally{if(!this.isWaiting){this.teardown.bind(this)()}}}catch(A){this.error(A)}}});Test.setupBDDExtensionMethods=function(){var B={shouldEqual:"assertEqual",shouldNotEqual:"assertNotEqual",shouldEqualEnum:"assertEnumEqual",shouldBeA:"assertType",shouldNotBeA:"assertNotOfType",shouldBeAn:"assertType",shouldNotBeAn:"assertNotOfType",shouldBeNull:"assertNull",shouldNotBeNull:"assertNotNull",shouldBe:"assertReturnsTrue",shouldNotBe:"assertReturnsFalse",shouldRespondTo:"assertRespondsTo"};var A=function(C,E,D){this[C].apply(this,(E||[]).concat([D]))};Test.BDDMethods={};$H(B).each(function(C){Test.BDDMethods[C.key]=function(){var D=$A(arguments);var E=D.shift();A.apply(E,[C.value,D,this])}});[Array.prototype,String.prototype,Number.prototype,Boolean.prototype].each(function(C){Object.extend(C,Test.BDDMethods)})};Test.context=function(D,C,F){Test.setupBDDExtensionMethods();var E={};var G={};for(specName in C){switch(specName){case"setup":case"teardown":E[specName]=C[specName];break;default:var B="test"+specName.gsub(/\s+/,"-").camelize();var A=C[specName].toString().split("\n").slice(1);if(/^\{/.test(A[0])){A=A.slice(1)}A.pop();A=A.map(function(H){return H.strip()});E[B]=A.join("\n");G[B]=specName}}new Test.Unit.Runner(E,{titles:G,testLog:F||"testlog",context:D})};