jsdk-offical
Version:
JSDK is the most comprehensive TypeScript framework, like JDK.
3 lines (2 loc) • 9.37 kB
JavaScript
//JSDK 2.7.0 MIT
var JS;(function(JS){let unit;(function(unit){class TestFailure{constructor(failed,error){this._method=failed;this._error=error}failedMethod(){return this._method}thrownError(){return this._error}isFailure(){return this.thrownError()instanceof AssertError}}unit.TestFailure=TestFailure})(unit=JS.unit||(JS.unit={}))})(JS||(JS={}));var TestFailure=JS.unit.TestFailure;var JS;(function(JS){let unit;(function(unit){class TestResult{constructor(){this._fails={};this._errors={};this._failCount=0;this._errorCount=0;this._listeners=[];this._isStoped=false;this._runCount=0}isSuccessTestMethod(methodName,caseName){let name=`${caseName}.${methodName}`;return this._errors[name]||this._fails[name]?false:true}errors(){return this._errors}failures(){return this._fails}runCount(){return this._runCount}shouldStop(){return this._isStoped}addListener(listener){this._listeners.push(listener)}removeListener(listener){this._listeners.remove(it=>{return it==listener})}addError(e,method,test){this._errors[test.getName()+"."+method.name]=new unit.TestFailure(method,e);this._errorCount++;this._listeners.forEach(li=>{li.addError(e,method,test)})}addFailure(e,method,test){this._fails[test.getName()+"."+method.name]=new unit.TestFailure(method,e);this._failCount++;this._listeners.forEach(li=>{li.addFailure(e,method,test)})}endTest(method,test){this._listeners.forEach(li=>{li.endTest(method,test)})}startTest(method,test){this._runCount++;this._listeners.forEach(li=>{li.startTest(method,test)})}stop(){this._isStoped=true}failureCount(){return this._failCount}errorCount(){return this._errorCount}wasSuccessful(){return this.failureCount()==0&&this.errorCount()==0}run(test){let methods=test.getTestMethods();Jsons.forEach(methods,(m,name)=>{this.startTest(m,test);try{test.runMethod(name)}catch(e){if(e instanceof AssertError){this.addFailure(e,m,test)}else if(e instanceof Error){this.addError(e,m,test)}}this.endTest(m,test)})}}unit.TestResult=TestResult})(unit=JS.unit||(JS.unit={}))})(JS||(JS={}));var TestResult=JS.unit.TestResult;var __decorate=this&&this.__decorate||function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)if(d=decorators[i])r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r;return c>3&&r&&Object.defineProperty(target,key,r),r};var __metadata=this&&this.__metadata||function(k,v){if(typeof Reflect==="object"&&typeof Reflect.metadata==="function")return Reflect.metadata(k,v)};var JS;(function(JS){let unit;(function(unit){let TestCase=class TestCase{constructor(name){this._count=0;this._methods={};this.name=name||this.className;this._addTestMethods()}getName(){return this.name}setUp(){}tearDown(){}countTests(){return this._count}_createResult(){return new unit.TestResult}run(result){let rst=result?result:this._createResult();rst.run(this);return rst}runMethod(name){let ept=null;this.setUp();try{this._methods[name].invoke(this)}catch(e){ept=e}finally{try{this.tearDown()}catch(e2){if(ept==null)ept=e2}}if(ept!=null)throw ept}getTestMethods(){return this._methods}_addTestMethods(){let methods=this.getClass().methods();methods.forEach(m=>{if(!m.isStatic&&m.name.startsWith("test")){this.addTestMethod(m)}})}addTestMethod(method){this._methods[method.name]=method;this._count++}};TestCase=__decorate([klass("JS.unit.TestCase"),__metadata("design:paramtypes",[String])],TestCase);unit.TestCase=TestCase})(unit=JS.unit||(JS.unit={}))})(JS||(JS={}));var TestCase=JS.unit.TestCase;var JS;(function(JS){let unit;(function(unit){var TestSuite_1;let Y=Types;let TestSuite=TestSuite_1=class TestSuite{constructor(name){this._cases=[];if(Y.isString(name)){this._name=name}else{this.addTest(name)}this._addTestMethods();this._name=this._name||this.className}getTestCases(){return this._cases}getName(){return this._name}countTests(){let count=0;this._cases.forEach(tc=>{count+=tc.countTests()});return count}run(result){this._cases.some(t=>{if(result.shouldStop())return true;this.runTest(t,result)})}runTest(test,result){test.run(result)}addTest(test){if(!test)return;if(Y.isArray(test)){test.forEach(clazz=>{this._addTest(clazz)})}else{this._addTest(test)}}_addTest(test){if(!test)return;let m=this;if(Y.ofKlass(test,TestSuite_1)){m._cases=m._cases.concat(test.getTestCases())}else if(Y.ofKlass(test,unit.TestCase)){m._cases[m._cases.length]=test}else if(test.subclassOf(TestSuite_1.class)){m._cases=m._cases.concat(Class.newInstance(test.name).getTestCases())}else if(test.subclassOf(unit.TestCase.class)){m._cases[m._cases.length]=Class.newInstance(test.name)}}_addTestMethods(){let methods=this.getClass().methods(),tc=null;methods.forEach(m=>{if(!m.isStatic&&m.name.startsWith("test")){if(tc==null)tc=new unit.TestCase(this.className);tc.addTestMethod(m)}});if(tc)this._cases.push(tc)}};TestSuite=TestSuite_1=__decorate([klass("JS.unit.TestSuite"),__metadata("design:paramtypes",[Object])],TestSuite);unit.TestSuite=TestSuite})(unit=JS.unit||(JS.unit={}))})(JS||(JS={}));var TestSuite=JS.unit.TestSuite;var JS;(function(JS){let unit;(function(unit){class TestRunner{constructor(){this._ui=new JS.unit.TestUI(this)}doRun(test){this._suite=(!test||Types.isKlass(test,unit.TestSuite)?test:new unit.TestSuite(test))||this._suite;this._result=new unit.TestResult;this._result.addListener(this._ui);this._ui.startSuite(this._suite,this._result);this._suite.run(this._result);this._ui.endSuite();return this._result}doStop(){this._result.stop()}static addTests(tests){tests.forEach(test=>{this._test.addTest(test)})}static run(test){let runner=new TestRunner;return runner.doRun(test||this._test)}static load(url,tests){let urls=typeof url=="string"?[url]:url,tasks=[];urls.forEach(u=>{tasks.push(Promises.newPlan(Loader.js,[u]))});Promises.order(tasks).then(()=>{if(tests)this.addTests(tests);this.run()})}}TestRunner._test=new unit.TestSuite;unit.TestRunner=TestRunner})(unit=JS.unit||(JS.unit={}))})(JS||(JS={}));var TestRunner=JS.unit.TestRunner;var JS;(function(JS){let unit;(function(unit){class TestUI{constructor(runner){this._startTime=0;this._COLORS={red:"firebrick",green:"forestgreen",current:"black"};this._FLAGS={red:"✘ ",green:"✔ ",current:"▸ "};$1("#btnRun").off().on("click",()=>{runner.doRun()});$1("#btnStop").off().on("click",()=>{runner.doStop()})}addError(){$1("#errors").innerHTML=this._result.errorCount()+""}addFailure(){$1("#failures").innerHTML=this._result.failureCount()+""}endTest(method,test){let p=this._result.runCount()/this._suite.countTests()*100,pro=$1("#progress");pro.style.width=p+"%";pro.style.backgroundColor=this._result.isSuccessTestMethod(method.name,test.getName())?"forestgreen":"firebrick";pro.attr("title",this._result.runCount()+"/"+this._suite.countTests());this._renderOption(`${test.getName()}.${method.name}`,this._result.isSuccessTestMethod(method.name,test.getName())?"green":"red")}startTest(method,test){$1("#runs").innerHTML=this._result.runCount()+"/"+this._suite.countTests();this._renderOption(`${test.getName()}.${method.name}`,"current")}endSuite(){let time=Number((System.highResTime()-this._startTime)/1e3).round(6);$1("#info").innerHTML=`All tests was completed in ${time} seconds.`;$1("#progress").style.backgroundColor=this._result.wasSuccessful()?"forestgreen":"firebrick";$1("#btnRun").removeAttribute("disabled")}startSuite(suite,result){this._suite=suite;this._result=result;this._init(suite);$1("#btnRun").attr("disabled","disabled");this._startTime=System.highResTime()}_renderOption(testName,type){let option=$1("#tests").querySelector(`option[value="${testName}"]`);option.style.color=this._COLORS[type];option.textContent=this._FLAGS[type]+option.attr("rawText")}_addOption(optgroup,text,value){let txt=Strings.escapeHTML(text);optgroup["append"](`<option rawText="${txt}" value="${value?value:""}">${txt}</option>`)}_printTrace(testName){$1("#trace").off().innerHTML="";let failure=this._result.errors()[testName]||this._result.failures()[testName];if(!failure)return;let error=failure.thrownError();this._addOption($1("#trace"),`${failure.isFailure()?"AssertError":error.name}: ${error.message}`);let stack=error.stack;if(stack){stack.split("\n").forEach((line,index)=>{if(index>0)this._addOption($1("#trace"),line)})}}_printTestCase(tc){let tests=$1("#tests"),optgroup=document.createElement("optgroup"),methods=tc.getTestMethods();Jsons.forEach(methods,m=>{this._addOption(optgroup,m.name,`${tc.getName()}.${m.name}`)});tests["append"](optgroup.attr("label","▷ "+tc.getName()))}_init(suite){let sys=System.info();$1("#env").innerHTML=`${sys.browser.name} ${sys.browser.version||""} / ${sys.os.name} ${sys.os.version||""} / ${sys.device.type}`;$1("#info").innerHTML="";let pro=$1("#progress"),sty=pro.style;sty.width="0%";sty.backgroundColor="forestgreen";pro.attr("title","");$1("#runs").innerHTML="0/0";$1("#errors").innerHTML="0";$1("#failures").innerHTML="0";$1("#trace").off().innerHTML="";let tests=$1("#tests"),cases=suite.getTestCases();tests.off().innerHTML="";cases.forEach(tc=>{this._printTestCase(tc)});let me=this;tests.on("change",function(){let testName=this.find("option:checked").attr("value");me._printTrace(testName)})}}unit.TestUI=TestUI})(unit=JS.unit||(JS.unit={}))})(JS||(JS={}));