DocTester.js 4.1 KB

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