DocTester.js 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
  3. Available via Academic Free License >= 2.1 OR the modified BSD license.
  4. see: http://dojotoolkit.org/license for details
  5. */
  6. if(!dojo._hasResource["dojox.widget.DocTester"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
  7. dojo._hasResource["dojox.widget.DocTester"] = true;
  8. dojo.provide("dojox.widget.DocTester");
  9. dojo.require("dojo.string");
  10. dojo.require("dijit._Widget");
  11. dojo.require("dijit._Templated");
  12. dojo.require("dojox.form.BusyButton");
  13. dojo.require("dojox.testing.DocTest");
  14. dojo.declare('dojox.widget.DocTester',
  15. [dijit._Widget, dijit._Templated],
  16. {
  17. // summary: A widget to run DocTests inside an HTML page.
  18. //
  19. templateString: dojo.cache("dojox.widget", "DocTester/DocTester.html", "<div dojoAttachPoint=\"domNode\" class=\"dojoxDocTester\">\n\t<div dojoAttachPoint=\"containerNode\"></div>\n\t<button dojoType=\"dojox.form.BusyButton\" busyLabel=\"Testing...\" dojoAttachPoint=\"runButtonNode\">Run tests</button>\n\t<button dojoType=\"dijit.form.Button\" dojoAttachPoint=\"resetButtonNode\" style=\"display:none;\">Reset</button>\n\t<span>\n\t\t<span dojoAttachPoint=\"numTestsNode\">0</span> tests,\n\t\t<span dojoAttachPoint=\"numTestsOkNode\">0</span> passed,\n\t\t<span dojoAttachPoint=\"numTestsNokNode\">0</span> failed\n\t</span>\n</div>\n"),
  20. widgetsInTemplate: true,
  21. _fillContent:function(/*DomNode*/source){
  22. // summary: Overridden from _Templates.js, which actually just takes care of filling the containerNode.
  23. var src = source.innerHTML;
  24. this.doctests = new dojox.testing.DocTest();
  25. this.tests = this.doctests.getTestsFromString(this._unescapeHtml(src));
  26. var lineNumbers = dojo.map(this.tests, 'return item.line-1');
  27. var lines = src.split("\n");
  28. var actualResultHtml = '<div class="actualResult">FAILED, actual result was: <span class="result"></span></div>';
  29. var content = '<pre class="testCase testNum0 odd">';
  30. for (var i=0; i<lines.length; i++){
  31. var index = dojo.indexOf(lineNumbers, i);
  32. if (index>0 && index!=-1){
  33. var evenOdd = index%2 ? "even" : "odd";
  34. content += actualResultHtml;
  35. content += '</pre><pre class="testCase testNum'+ index +' '+evenOdd+'">';
  36. }
  37. content += lines[i].replace(/^\s+/, "")+"\n";
  38. }
  39. content += actualResultHtml + '</pre>';
  40. this.containerNode.innerHTML = content;
  41. },
  42. postCreate:function(){
  43. this.inherited("postCreate", arguments);
  44. dojo.connect(this.runButtonNode, "onClick", dojo.hitch(this, "runTests"));
  45. dojo.connect(this.resetButtonNode, "onClick", dojo.hitch(this, "reset"));
  46. this.numTestsNode.innerHTML = this.tests.length;
  47. },
  48. runTests:function(){
  49. var results = {ok:0, nok:0};
  50. for (var i=0; i<this.tests.length; i++){
  51. var ret = this.doctests.runTest(this.tests[i].commands, this.tests[i].expectedResult);
  52. dojo.query(".testNum"+i, this.domNode).addClass(ret.success ? "resultOk" : "resultNok");
  53. if (!ret.success){
  54. results.nok++;
  55. this.numTestsNokNode.innerHTML = results.nok;
  56. var act = dojo.query(".testNum"+i+" .actualResult", this.domNode)[0];
  57. dojo.style(act, "display", "inline");
  58. dojo.query(".result", act)[0].innerHTML = dojo.toJson(ret.actualResult);
  59. } else {
  60. results.ok++;
  61. this.numTestsOkNode.innerHTML = results.ok;
  62. }
  63. }
  64. this.runButtonNode.cancel();
  65. dojo.style(this.runButtonNode.domNode, "display", "none");
  66. dojo.style(this.resetButtonNode.domNode, "display", "");
  67. },
  68. reset:function(){
  69. // summary: Reset the DocTester visuals and enable the "Run tests" button again.
  70. dojo.style(this.runButtonNode.domNode, "display", "");
  71. dojo.style(this.resetButtonNode.domNode, "display", "none");
  72. this.numTestsOkNode.innerHTML = "0";
  73. this.numTestsNokNode.innerHTML = "0";
  74. dojo.query(".actualResult", this.domNode).style("display", "none");
  75. dojo.query(".testCase", this.domNode).removeClass("resultOk").removeClass("resultNok");
  76. },
  77. _unescapeHtml:function(/*string*/str){
  78. // TODO Should become dojo.html.unentities() or so, when exists use instead
  79. // summary:
  80. // Adds escape sequences for special characters in XML: &<>"'
  81. str = String(str).replace(/&amp;/gm, "&").replace(/&lt;/gm, "<")
  82. .replace(/&gt;/gm, ">").replace(/&quot;/gm, '"');
  83. return str; // string
  84. }
  85. }
  86. );
  87. }