source: Dev/branches/rest-dojo-ui/client/dojox/widget/DocTester.js @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

File size: 3.3 KB
Line 
1dojo.provide("dojox.widget.DocTester");
2
3dojo.require("dojo.string");
4dojo.require("dijit._Widget");
5dojo.require("dijit._Templated");
6dojo.require("dojox.form.BusyButton");
7dojo.require("dojox.testing.DocTest");
8
9dojo.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(/&amp;/gm, "&").replace(/&lt;/gm, "<")
82                                .replace(/&gt;/gm, ">").replace(/&quot;/gm, '"');
83                        return str; // string
84                }
85        }
86);
Note: See TracBrowser for help on using the repository browser.