1 | /*
|
---|
2 | EnvJasmine: Jasmine test runner for EnvJS.
|
---|
3 |
|
---|
4 | EnvJasmine allows you to run headless JavaScript tests.
|
---|
5 |
|
---|
6 | Based on info from:
|
---|
7 | http://agile.dzone.com/news/javascript-bdd-jasmine-without
|
---|
8 | http://www.mozilla.org/rhino/
|
---|
9 | http://www.envjs.com/
|
---|
10 | http://pivotal.github.com/jasmine/
|
---|
11 | https://github.com/velesin/jasmine-jquery
|
---|
12 | */
|
---|
13 |
|
---|
14 | importPackage(java.lang);
|
---|
15 | importPackage(java.io);
|
---|
16 | importPackage(org.mozilla.javascript);
|
---|
17 |
|
---|
18 | // Create the EnvJasmine namespace
|
---|
19 | if (!this.EnvJasmine) {
|
---|
20 | this.EnvJasmine = {};
|
---|
21 | }
|
---|
22 |
|
---|
23 | EnvJasmine.cx = Context.getCurrentContext();
|
---|
24 | EnvJasmine.cx.setOptimizationLevel(-1);
|
---|
25 | EnvJasmine.topLevelScope = this;
|
---|
26 |
|
---|
27 | EnvJasmine.about = function () {
|
---|
28 | print("usage: envjasmine.js [options] [spec_file...]");
|
---|
29 | print("");
|
---|
30 | print("options:");
|
---|
31 | print(" --configFile=<File> Set a config file to run before specs are executed");
|
---|
32 | print(" --disableColor Disable console colors (colors are not available in Windows)");
|
---|
33 | print(" --environment=<WIN|UNIX> Set the environment to UNIX or Windows");
|
---|
34 | print(" --help This list");
|
---|
35 | print(" --incrementalOutput Disable the ./F output and print results for each spec file");
|
---|
36 | print(" --rootDir=<Dir> Set the EnvJasmine root directory (REQUIRED)");
|
---|
37 | print(" --suppressConsoleMsgs Suppress window.console messages");
|
---|
38 | print(" --testDir=<Dir> Set the directory with the specs/ directory (REQUIRED)");
|
---|
39 | print(" --customSpecsDir=<Dir> Sets the name of the specs directory, default is 'specs'");
|
---|
40 | };
|
---|
41 |
|
---|
42 | EnvJasmine.normalizePath = function(path) {
|
---|
43 | var endsInSlash = (path.slice(-1) == "/");
|
---|
44 |
|
---|
45 | if (path.slice(0, 1) == ".") {
|
---|
46 | path = EnvJasmine.rootDir + "/" + path;
|
---|
47 | }
|
---|
48 |
|
---|
49 | return File(path).getCanonicalPath() + (endsInSlash ? "/" : "");
|
---|
50 | };
|
---|
51 |
|
---|
52 | EnvJasmine.loadFactory = function(scope) {
|
---|
53 | return function (path) {
|
---|
54 | var fileIn,
|
---|
55 | normalizedPath = EnvJasmine.normalizePath(path);
|
---|
56 |
|
---|
57 | try {
|
---|
58 | fileIn = new FileReader(normalizedPath);
|
---|
59 | EnvJasmine.cx.evaluateReader(scope, fileIn, normalizedPath, 0, null);
|
---|
60 | } catch (e) {
|
---|
61 | print('Could not read file: ' + normalizedPath );
|
---|
62 | } finally {
|
---|
63 | fileIn.close();
|
---|
64 | }
|
---|
65 | };
|
---|
66 | };
|
---|
67 | EnvJasmine.loadGlobal = EnvJasmine.loadFactory(EnvJasmine.topLevelScope);
|
---|
68 |
|
---|
69 | EnvJasmine.setRootDir = function (rootDir) {
|
---|
70 | // These are standard directories in the EnvJasmine project.
|
---|
71 | EnvJasmine.rootDir = EnvJasmine.normalizePath(rootDir);
|
---|
72 | EnvJasmine.libDir = EnvJasmine.normalizePath(EnvJasmine.rootDir + "/lib/");
|
---|
73 | EnvJasmine.includeDir = EnvJasmine.normalizePath(EnvJasmine.rootDir + "/include/");
|
---|
74 |
|
---|
75 | // This is the standard spec suffix
|
---|
76 | EnvJasmine.specSuffix = new RegExp(/.spec.js$/);
|
---|
77 |
|
---|
78 | // Load the default dirs and files, these can be overridden with command line options
|
---|
79 | EnvJasmine.configFile = EnvJasmine.normalizePath(EnvJasmine.includeDir + "dependencies.js");
|
---|
80 | };
|
---|
81 |
|
---|
82 | EnvJasmine.setTestDir = function (testDir, override) {
|
---|
83 | if (typeof EnvJasmine.testDir === "undefined" || !EnvJasmine.testDir || override) {
|
---|
84 | EnvJasmine.testDir = EnvJasmine.normalizePath(testDir);
|
---|
85 | EnvJasmine.mocksDir = EnvJasmine.normalizePath(EnvJasmine.testDir + "/mocks/");
|
---|
86 | EnvJasmine.specsDir = EnvJasmine.normalizePath(EnvJasmine.testDir + "/specs/");
|
---|
87 | }
|
---|
88 | };
|
---|
89 |
|
---|
90 | // Process command line options
|
---|
91 |
|
---|
92 | (function(argumentList) {
|
---|
93 | var arg, nameValue, spec = "", specLoc;
|
---|
94 |
|
---|
95 | EnvJasmine.specs = [];
|
---|
96 | EnvJasmine.passedCount = 0;
|
---|
97 | EnvJasmine.failedCount = 0;
|
---|
98 | EnvJasmine.totalCount = 0;
|
---|
99 |
|
---|
100 | for (var i = 0; i < argumentList.length; i++) {
|
---|
101 | arg = argumentList[i];
|
---|
102 |
|
---|
103 | if (arg.slice(0, 2) == "--") {
|
---|
104 | nameValue = arg.slice(2).split('=');
|
---|
105 |
|
---|
106 | switch(nameValue[0]) {
|
---|
107 | case "testDir":
|
---|
108 | EnvJasmine.setTestDir(nameValue[1], true);
|
---|
109 | break;
|
---|
110 | case "rootDir":
|
---|
111 | EnvJasmine.setRootDir(nameValue[1]);
|
---|
112 | EnvJasmine.setTestDir(nameValue[1]); // Set the root as the default testDir.
|
---|
113 | break;
|
---|
114 | case "environment":
|
---|
115 | EnvJasmine.environment = nameValue[1];
|
---|
116 | break;
|
---|
117 | case "configFile":
|
---|
118 | EnvJasmine.configFile = EnvJasmine.normalizePath(nameValue[1]);
|
---|
119 | break;
|
---|
120 | case "disableColor":
|
---|
121 | EnvJasmine.disableColorOverride = true;
|
---|
122 | break;
|
---|
123 | case "incrementalOutput":
|
---|
124 | EnvJasmine.incrementalOutput = true;
|
---|
125 | break;
|
---|
126 | case "suppressConsoleMsgs":
|
---|
127 | EnvJasmine.suppressConsoleMsgs = true;
|
---|
128 | break;
|
---|
129 | case "customSpecsDir":
|
---|
130 | EnvJasmine.customSpecsDir = nameValue[1];
|
---|
131 | break;
|
---|
132 | case "help":
|
---|
133 | EnvJasmine.about();
|
---|
134 | System.exit(0);
|
---|
135 | default:
|
---|
136 | print("Unknown option: " + arg);
|
---|
137 | break;
|
---|
138 | }
|
---|
139 | } else {
|
---|
140 | if (arg.slice(-3) !== ".js") {
|
---|
141 | spec += arg + " ";
|
---|
142 | } else {
|
---|
143 | spec += arg;
|
---|
144 | if (arg[0] === "/" || (arg[1] === ":" && arg[2] === "\\")) {
|
---|
145 | specLoc = spec;
|
---|
146 | } else {
|
---|
147 | specLoc = EnvJasmine.testDir + "/" + spec
|
---|
148 | }
|
---|
149 | print(specLoc);
|
---|
150 | EnvJasmine.specs.push(EnvJasmine.normalizePath(specLoc));
|
---|
151 | spec = "";
|
---|
152 | }
|
---|
153 | }
|
---|
154 | }
|
---|
155 | }(arguments));
|
---|
156 |
|
---|
157 | if (typeof EnvJasmine.customSpecsDir !== "undefined") {
|
---|
158 | EnvJasmine.specsDir = EnvJasmine.normalizePath(EnvJasmine.testDir + EnvJasmine.customSpecsDir);
|
---|
159 | }
|
---|
160 |
|
---|
161 | if (typeof EnvJasmine.rootDir == "undefined" || typeof EnvJasmine.environment == "undefined") {
|
---|
162 | EnvJasmine.about();
|
---|
163 | System.exit(1);
|
---|
164 | }
|
---|
165 |
|
---|
166 | EnvJasmine.SEPARATOR = (function (env) {
|
---|
167 | if (env == "UNIX") {
|
---|
168 | return "/";
|
---|
169 | } else if (env == "WIN") {
|
---|
170 | return "\\";
|
---|
171 | } else {
|
---|
172 | EnvJasmine.about();
|
---|
173 | System.exit(1);
|
---|
174 | }
|
---|
175 | }(EnvJasmine.environment));
|
---|
176 |
|
---|
177 | EnvJasmine.disableColor = (function (env) {
|
---|
178 | return EnvJasmine.disableColorOverride || (env == "WIN");
|
---|
179 | }(EnvJasmine.environment));
|
---|
180 |
|
---|
181 | (function() {
|
---|
182 | if (EnvJasmine.disableColor) {
|
---|
183 | EnvJasmine.green = function(msg) { return msg; };
|
---|
184 | EnvJasmine.red = function(msg) { return msg; };
|
---|
185 | EnvJasmine.plain = function(msg) { return msg; };
|
---|
186 | } else {
|
---|
187 | var green = "\033[32m",
|
---|
188 | red = "\033[31m",
|
---|
189 | end = "\033[0m";
|
---|
190 |
|
---|
191 | EnvJasmine.green = function(msg) { return green + msg + end; };
|
---|
192 | EnvJasmine.red = function(msg) { return red + msg + end; };
|
---|
193 | EnvJasmine.plain = function(msg) { return msg; };
|
---|
194 | }
|
---|
195 | }());
|
---|
196 | EnvJasmine.results = [];
|
---|
197 |
|
---|
198 | EnvJasmine.loadConfig = function () {
|
---|
199 | EnvJasmine.loadGlobal(EnvJasmine.configFile);
|
---|
200 | };
|
---|
201 |
|
---|
202 | (function() {
|
---|
203 | var i, fileIn, len;
|
---|
204 |
|
---|
205 | EnvJasmine.loadConfig();
|
---|
206 |
|
---|
207 | if (typeof EnvJasmine.reporterClass === "undefined") {
|
---|
208 | // Use the standard reporter
|
---|
209 | EnvJasmine.reporterClass = RhinoReporter;
|
---|
210 | }
|
---|
211 |
|
---|
212 |
|
---|
213 | jasmine.getEnv().addReporter(new EnvJasmine.reporterClass());
|
---|
214 |
|
---|
215 | if (EnvJasmine.suppressConsoleMsgs === true) {
|
---|
216 | // suppress console messages
|
---|
217 | window.console = $.extend({}, window.console, {
|
---|
218 | info: jasmine.createSpy(),
|
---|
219 | log: jasmine.createSpy(),
|
---|
220 | debug: jasmine.createSpy(),
|
---|
221 | warning: jasmine.createSpy(),
|
---|
222 | error: jasmine.createSpy()
|
---|
223 | });
|
---|
224 | }
|
---|
225 |
|
---|
226 | EnvJasmine.loadGlobal(EnvJasmine.libDir + "spanDir/spanDir.js");
|
---|
227 | if (EnvJasmine.specs.length == 0) {
|
---|
228 | spanDir(EnvJasmine.specsDir, function(spec) {
|
---|
229 | if (EnvJasmine.specSuffix.test(spec)) {
|
---|
230 | EnvJasmine.specs.push(spec);
|
---|
231 | }
|
---|
232 | });
|
---|
233 | }
|
---|
234 |
|
---|
235 | for (i = 0, len = EnvJasmine.specs.length >>> 0; i < len; i += 1) {
|
---|
236 | try {
|
---|
237 | EnvJasmine.currentScope = {};
|
---|
238 | EnvJasmine.load = EnvJasmine.loadFactory(EnvJasmine.currentScope);
|
---|
239 | EnvJasmine.specFile = EnvJasmine.specs[i];
|
---|
240 | fileIn = new FileReader(EnvJasmine.specFile);
|
---|
241 | EnvJasmine.cx.evaluateReader(EnvJasmine.currentScope, fileIn, EnvJasmine.specs[i], 0, null);
|
---|
242 | EnvJasmine.cx.evaluateString(EnvJasmine.currentScope, 'window.location.assign(["file://", EnvJasmine.libDir, "envjasmine.html"].join(EnvJasmine.SEPARATOR));', 'Executing '+EnvJasmine.specs[i], 0, null);
|
---|
243 | }
|
---|
244 | finally {
|
---|
245 | fileIn.close();
|
---|
246 | }
|
---|
247 | }
|
---|
248 |
|
---|
249 | if (EnvJasmine.results.length > 0) {
|
---|
250 | print("\n");
|
---|
251 | print(EnvJasmine.red(EnvJasmine.results.join("\n\n")));
|
---|
252 | }
|
---|
253 |
|
---|
254 | print();
|
---|
255 | print(EnvJasmine[EnvJasmine.passedCount ? 'green' : 'plain']("Passed: " + EnvJasmine.passedCount));
|
---|
256 | print(EnvJasmine[EnvJasmine.failedCount ? 'red' : 'plain']("Failed: " + EnvJasmine.failedCount));
|
---|
257 | print(EnvJasmine.plain("Total : " + EnvJasmine.totalCount));
|
---|
258 |
|
---|
259 | if (EnvJasmine.failedCount > 0) {
|
---|
260 | System.exit(1);
|
---|
261 | }
|
---|
262 | }());
|
---|