1 // Copyright (c) 2011 Google, Inc.
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * @fileoverview Mocked-out jstestdriver api that lets me test locally.
24 * @author konigsberg@google.com (Robert Konigsberg)
29 announce_
: function(name
, args
) {
30 for (var idx
= 0; idx
< jstestdriver
.listeners_
.length
; idx
++) {
31 var listener
= jstestdriver
.listeners_
[idx
];
33 listener
[name
].apply(null, args
);
37 attachListener
: function(listener
) {
38 jstestdriver
.listeners_
.push(listener
);
51 include
: function(name
) {
52 this.sucker("Not including " + name
);
54 sucker
: function(text
) {
55 console
.log(text
+ ", sucker!");
59 var testCaseList
= [];
61 function TestCase(name
) {
62 var testCase
= function() { return this; };
64 testCase
.toString
= function() {
65 return "Fake test case " + name
;
68 testCase
.prototype.setUp
= function() { };
69 testCase
.prototype.tearDown
= function() { };
70 testCase
.prototype.name
= name
;
72 * name can be a string, which is looked up in this object, or it can be a
73 * function, in which case it's run.
76 * var tc = new MyTestCase();
77 * tc.runTest("testThis");
78 * tc.runTest(tc.testThis);
80 * The duplication tc in runTest is irritating, but it plays well with
81 * Chrome's console completion.
83 testCase
.prototype.runTest
= function(func
) {
86 var name
= typeof(func
) == "string" ? func
: "(anonymous function)";
87 jstestdriver
.announce_("start", [this, name
]);
89 result
= this.runTest_(func
);
93 jstestdriver
.announce_("finish", [this, name
, result
, ex
]);
94 return result
; // TODO(konigsberg): Remove this, and return value from runAllTests.
97 testCase
.prototype.runTest_
= function(func
) {
101 var parameterType
= typeof(func
);
102 if (typeof(func
) == "function") {
104 } else if (typeof(func
) == "string") {
107 fail("can't supply " + typeof(func
) + " to runTest");
115 testCase
.prototype.runAllTests
= function() {
117 var names
= this.getTestNames();
118 for (var idx
in names
) {
119 var name
= names
[idx
];
120 console
.log("Running " + name
);
121 var result
= this.runTest(name
);
122 results
[name
] = result
;
124 console
.log(prettyPrintEntity_(results
));
128 testCase
.prototype.getTestNames
= function() {
129 // what's better than for ... in for non-array objects?
131 for (var name
in this) {
132 if (name
.indexOf('test') == 0 && typeof(this[name
]) == 'function') {
139 testCaseList
.push({name
: name
, testCase
: testCase
});
143 // Note: this creates a bunch of global variables intentionally.
144 function addGlobalTestSymbols() {
145 globalTestDb
= {}; // maps test name -> test function wrapper
148 for (var i
= 0; i
< testCaseList
.length
; i
++) {
149 var tc_class
= testCaseList
[i
].testCase
;
150 for (var name
in tc_class
.prototype) {
151 if (name
.indexOf('test') == 0 && typeof(tc_class
.prototype[name
]) == 'function') {
152 if (globalTestDb
.hasOwnProperty(name
)) {
153 console
.log('Duplicated test name: ' + name
);
155 globalTestDb
[name
] = function(name
, tc_class
) {
157 var tc
= new tc_class
;
158 return tc
.runTest(name
);
161 eval(name
+ " = globalTestDb['" + name
+ "'];");
167 console
.log('Loaded ' + num_tests
+ ' tests in ' +
168 testCaseList
.length
+ ' test cases');
171 function getAllTestCases() {
175 jstestdriver
.attachListener({
176 finish
: function(tc
, name
, result
, e
) {
180 console
.log(e
.stack
);