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