jasmine 1.0.2.0 → 1.0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/HOW_TO_TEST.markdown +4 -6
- data/generators/jasmine/templates/lib/tasks/jasmine.rake +8 -2
- data/generators/jasmine/templates/spec/javascripts/support/jasmine-rails.yml +1 -1
- data/jasmine.gemspec +4 -5
- data/jasmine/Gemfile +2 -2
- data/jasmine/HowToRelease.markdown +29 -0
- data/jasmine/MIT.LICENSE +1 -1
- data/jasmine/README.markdown +37 -15
- data/jasmine/Rakefile +42 -58
- data/jasmine/example/spec/SpecHelper.js +3 -3
- data/jasmine/images/jasmine_favicon.png +0 -0
- data/jasmine/jshint/jshint.js +5919 -0
- data/jasmine/jshint/run.js +98 -0
- data/jasmine/lib/jasmine-html.js +5 -3
- data/jasmine/lib/jasmine.js +56 -32
- data/jasmine/spec/node_suite.js +233 -0
- data/jasmine/spec/runner.html +4 -2
- data/jasmine/spec/suites/EnvSpec.js +1 -1
- data/jasmine/spec/suites/ExceptionsSpec.js +2 -2
- data/jasmine/spec/suites/JsApiReporterSpec.js +1 -1
- data/jasmine/spec/suites/MatchersSpec.js +9 -9
- data/jasmine/spec/suites/MultiReporterSpec.js +3 -3
- data/jasmine/spec/suites/SpecRunningSpec.js +1 -1
- data/jasmine/spec/suites/SpecSpec.js +1 -1
- data/jasmine/spec/suites/TrivialConsoleReporterSpec.js +431 -0
- data/jasmine/spec/suites/UtilSpec.js +0 -1
- data/jasmine/spec/suites/WaitsForBlockSpec.js +32 -1
- data/jasmine/src/Env.js +2 -2
- data/jasmine/src/Matchers.js +3 -3
- data/jasmine/src/PrettyPrinter.js +2 -1
- data/jasmine/src/WaitsBlock.js +3 -1
- data/jasmine/src/WaitsForBlock.js +4 -2
- data/jasmine/src/base.js +39 -20
- data/jasmine/src/console/TrivialConsoleReporter.js +144 -0
- data/jasmine/src/html/TrivialReporter.js +5 -3
- data/jasmine/src/util.js +1 -1
- data/jasmine/src/version.json +2 -2
- data/lib/generators/jasmine/install/templates/spec/javascripts/support/jasmine.yml +1 -1
- data/lib/generators/jasmine/templates/spec/javascripts/support/jasmine-rails.yml +1 -1
- data/lib/jasmine.rb +1 -20
- data/lib/jasmine/railtie.rb +20 -0
- data/lib/jasmine/run.html.erb +2 -1
- data/lib/jasmine/version.rb +2 -2
- data/spec/spec_helper.rb +0 -2
- metadata +16 -58
- data/install.rb +0 -2
- data/jasmine/images/fail-16.png +0 -0
- data/jasmine/images/fail.png +0 -0
- data/jasmine/images/go-16.png +0 -0
- data/jasmine/images/go.png +0 -0
- data/jasmine/images/pending-16.png +0 -0
- data/jasmine/images/pending.png +0 -0
- data/jasmine/images/question-bk.png +0 -0
- data/jasmine/images/questionbk-16.png +0 -0
- data/jasmine/images/spinner.gif +0 -0
- data/lib/jasmine/generator.rb +0 -9
@@ -0,0 +1,98 @@
|
|
1
|
+
var fs = require("fs");
|
2
|
+
var sys = require("sys");
|
3
|
+
var path = require("path");
|
4
|
+
var JSHINT = require("./jshint").JSHINT;
|
5
|
+
|
6
|
+
function isExcluded(fullPath) {
|
7
|
+
var fileName = path.basename(fullPath);
|
8
|
+
var excludeFiles = ["json2.js", "jshint.js", "publish.js", "node_suite.js", "jasmine.js", "jasmine-html.js"];
|
9
|
+
for (var i = 0; i < excludeFiles.length; i++) {
|
10
|
+
if (fileName == excludeFiles[i]) {
|
11
|
+
return true;
|
12
|
+
}
|
13
|
+
}
|
14
|
+
return false;
|
15
|
+
}
|
16
|
+
|
17
|
+
// DWF TODO: This function could/should be re-written
|
18
|
+
function allJasmineJsFiles(rootDir) {
|
19
|
+
var files = [];
|
20
|
+
fs.readdirSync(rootDir).filter(function(filename) {
|
21
|
+
|
22
|
+
var fullPath = rootDir + "/" + filename;
|
23
|
+
if (fs.statSync(fullPath).isDirectory() && !fullPath.match(/pages/)) {
|
24
|
+
var subDirFiles = allJasmineJsFiles(fullPath);
|
25
|
+
if (subDirFiles.length > 0) {
|
26
|
+
files = files.concat();
|
27
|
+
return true;
|
28
|
+
}
|
29
|
+
} else {
|
30
|
+
if (fullPath.match(/\.js$/) && !isExcluded(fullPath)) {
|
31
|
+
files.push(fullPath);
|
32
|
+
return true;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
return false;
|
36
|
+
});
|
37
|
+
|
38
|
+
return files;
|
39
|
+
}
|
40
|
+
|
41
|
+
var jasmineJsFiles = allJasmineJsFiles(".");
|
42
|
+
jasmineJsFiles.reverse(); //cheap way to do the stuff in src stuff first
|
43
|
+
|
44
|
+
var jasmineJsHintConfig = {
|
45
|
+
|
46
|
+
forin:true, //while it's possible that we could be
|
47
|
+
//considering unwanted prototype methods, mostly
|
48
|
+
//we're doing this because the jsobjects are being
|
49
|
+
//used as maps.
|
50
|
+
|
51
|
+
loopfunc:true //we're fine with functions defined inside loops (setTimeout functions, etc)
|
52
|
+
|
53
|
+
};
|
54
|
+
|
55
|
+
var jasmineGlobals = {};
|
56
|
+
|
57
|
+
|
58
|
+
//jasmine.undefined is a jasmine-ism, let's let it go...
|
59
|
+
function removeJasmineUndefinedErrors(errors) {
|
60
|
+
var keepErrors = [];
|
61
|
+
for (var i = 0; i < errors.length; i++) {
|
62
|
+
if (!(errors[i] &&
|
63
|
+
errors[i].raw &&
|
64
|
+
errors[i].evidence &&
|
65
|
+
( errors[i].evidence.match(/jasmine\.undefined/) ||
|
66
|
+
errors[i].evidence.match(/diz be undefined yo/) )
|
67
|
+
)) {
|
68
|
+
keepErrors.push(errors[i]);
|
69
|
+
}
|
70
|
+
}
|
71
|
+
return keepErrors;
|
72
|
+
}
|
73
|
+
|
74
|
+
(function() {
|
75
|
+
var ansi = {
|
76
|
+
green: '\033[32m',
|
77
|
+
red: '\033[31m',
|
78
|
+
yellow: '\033[33m',
|
79
|
+
none: '\033[0m'
|
80
|
+
};
|
81
|
+
|
82
|
+
for (var i = 0; i < jasmineJsFiles.length; i++) {
|
83
|
+
var file = jasmineJsFiles[i];
|
84
|
+
JSHINT(fs.readFileSync(file, "utf8"), jasmineJsHintConfig);
|
85
|
+
var errors = JSHINT.data().errors || [];
|
86
|
+
errors = removeJasmineUndefinedErrors(errors);
|
87
|
+
|
88
|
+
if (errors.length >= 1) {
|
89
|
+
console.log(ansi.red + "Jasmine JSHint failure: " + ansi.none);
|
90
|
+
console.log(file);
|
91
|
+
console.log(errors);
|
92
|
+
process.exit(1);
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
console.log(ansi.green + "Jasmine JSHint PASSED." + ansi.none);
|
97
|
+
})();
|
98
|
+
|
data/jasmine/lib/jasmine-html.js
CHANGED
@@ -110,7 +110,7 @@ jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
|
|
110
110
|
jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
|
111
111
|
var results = suite.results();
|
112
112
|
var status = results.passed() ? 'passed' : 'failed';
|
113
|
-
if (results.totalCount
|
113
|
+
if (results.totalCount === 0) { // todo: change this to check results.skipped
|
114
114
|
status = 'skipped';
|
115
115
|
}
|
116
116
|
this.suiteDivs[suite.id].className += " " + status;
|
@@ -183,6 +183,8 @@ jasmine.TrivialReporter.prototype.specFilter = function(spec) {
|
|
183
183
|
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
|
184
184
|
}
|
185
185
|
|
186
|
-
if (!paramMap
|
187
|
-
|
186
|
+
if (!paramMap.spec) {
|
187
|
+
return true;
|
188
|
+
}
|
189
|
+
return spec.getFullName().indexOf(paramMap.spec) === 0;
|
188
190
|
};
|
data/jasmine/lib/jasmine.js
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
var isCommonJS = typeof window == "undefined";
|
2
|
+
|
1
3
|
/**
|
2
4
|
* Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
|
3
5
|
*
|
4
6
|
* @namespace
|
5
7
|
*/
|
6
8
|
var jasmine = {};
|
7
|
-
|
9
|
+
if (isCommonJS) exports.jasmine = jasmine;
|
8
10
|
/**
|
9
11
|
* @private
|
10
12
|
*/
|
@@ -20,6 +22,12 @@ jasmine.unimplementedMethod_ = function() {
|
|
20
22
|
*/
|
21
23
|
jasmine.undefined = jasmine.___undefined___;
|
22
24
|
|
25
|
+
/**
|
26
|
+
* Show diagnostic messages in the console if set to true
|
27
|
+
*
|
28
|
+
*/
|
29
|
+
jasmine.VERBOSE = false;
|
30
|
+
|
23
31
|
/**
|
24
32
|
* Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed.
|
25
33
|
*
|
@@ -106,7 +114,8 @@ jasmine.ExpectationResult.prototype.passed = function () {
|
|
106
114
|
* Getter for the Jasmine environment. Ensures one gets created
|
107
115
|
*/
|
108
116
|
jasmine.getEnv = function() {
|
109
|
-
|
117
|
+
var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();
|
118
|
+
return env;
|
110
119
|
};
|
111
120
|
|
112
121
|
/**
|
@@ -169,7 +178,7 @@ jasmine.pp = function(value) {
|
|
169
178
|
* @returns {Boolean}
|
170
179
|
*/
|
171
180
|
jasmine.isDomNode = function(obj) {
|
172
|
-
return obj
|
181
|
+
return obj.nodeType > 0;
|
173
182
|
};
|
174
183
|
|
175
184
|
/**
|
@@ -405,7 +414,7 @@ jasmine.isSpy = function(putativeSpy) {
|
|
405
414
|
* @param {Array} methodNames array of names of methods to make spies
|
406
415
|
*/
|
407
416
|
jasmine.createSpyObj = function(baseName, methodNames) {
|
408
|
-
if (!jasmine.isArray_(methodNames) || methodNames.length
|
417
|
+
if (!jasmine.isArray_(methodNames) || methodNames.length === 0) {
|
409
418
|
throw new Error('createSpyObj requires a non-empty array of method names to create spies for');
|
410
419
|
}
|
411
420
|
var obj = {};
|
@@ -443,6 +452,7 @@ jasmine.log = function() {
|
|
443
452
|
var spyOn = function(obj, methodName) {
|
444
453
|
return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
|
445
454
|
};
|
455
|
+
if (isCommonJS) exports.spyOn = spyOn;
|
446
456
|
|
447
457
|
/**
|
448
458
|
* Creates a Jasmine spec that will be added to the current suite.
|
@@ -460,6 +470,7 @@ var spyOn = function(obj, methodName) {
|
|
460
470
|
var it = function(desc, func) {
|
461
471
|
return jasmine.getEnv().it(desc, func);
|
462
472
|
};
|
473
|
+
if (isCommonJS) exports.it = it;
|
463
474
|
|
464
475
|
/**
|
465
476
|
* Creates a <em>disabled</em> Jasmine spec.
|
@@ -472,6 +483,7 @@ var it = function(desc, func) {
|
|
472
483
|
var xit = function(desc, func) {
|
473
484
|
return jasmine.getEnv().xit(desc, func);
|
474
485
|
};
|
486
|
+
if (isCommonJS) exports.xit = xit;
|
475
487
|
|
476
488
|
/**
|
477
489
|
* Starts a chain for a Jasmine expectation.
|
@@ -484,6 +496,7 @@ var xit = function(desc, func) {
|
|
484
496
|
var expect = function(actual) {
|
485
497
|
return jasmine.getEnv().currentSpec.expect(actual);
|
486
498
|
};
|
499
|
+
if (isCommonJS) exports.expect = expect;
|
487
500
|
|
488
501
|
/**
|
489
502
|
* Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs.
|
@@ -493,6 +506,7 @@ var expect = function(actual) {
|
|
493
506
|
var runs = function(func) {
|
494
507
|
jasmine.getEnv().currentSpec.runs(func);
|
495
508
|
};
|
509
|
+
if (isCommonJS) exports.runs = runs;
|
496
510
|
|
497
511
|
/**
|
498
512
|
* Waits a fixed time period before moving to the next block.
|
@@ -503,6 +517,7 @@ var runs = function(func) {
|
|
503
517
|
var waits = function(timeout) {
|
504
518
|
jasmine.getEnv().currentSpec.waits(timeout);
|
505
519
|
};
|
520
|
+
if (isCommonJS) exports.waits = waits;
|
506
521
|
|
507
522
|
/**
|
508
523
|
* Waits for the latchFunction to return true before proceeding to the next block.
|
@@ -514,6 +529,7 @@ var waits = function(timeout) {
|
|
514
529
|
var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
|
515
530
|
jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
|
516
531
|
};
|
532
|
+
if (isCommonJS) exports.waitsFor = waitsFor;
|
517
533
|
|
518
534
|
/**
|
519
535
|
* A function that is called before each spec in a suite.
|
@@ -525,6 +541,7 @@ var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout
|
|
525
541
|
var beforeEach = function(beforeEachFunction) {
|
526
542
|
jasmine.getEnv().beforeEach(beforeEachFunction);
|
527
543
|
};
|
544
|
+
if (isCommonJS) exports.beforeEach = beforeEach;
|
528
545
|
|
529
546
|
/**
|
530
547
|
* A function that is called after each spec in a suite.
|
@@ -536,6 +553,7 @@ var beforeEach = function(beforeEachFunction) {
|
|
536
553
|
var afterEach = function(afterEachFunction) {
|
537
554
|
jasmine.getEnv().afterEach(afterEachFunction);
|
538
555
|
};
|
556
|
+
if (isCommonJS) exports.afterEach = afterEach;
|
539
557
|
|
540
558
|
/**
|
541
559
|
* Defines a suite of specifications.
|
@@ -555,6 +573,7 @@ var afterEach = function(afterEachFunction) {
|
|
555
573
|
var describe = function(description, specDefinitions) {
|
556
574
|
return jasmine.getEnv().describe(description, specDefinitions);
|
557
575
|
};
|
576
|
+
if (isCommonJS) exports.describe = describe;
|
558
577
|
|
559
578
|
/**
|
560
579
|
* Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development.
|
@@ -565,27 +584,27 @@ var describe = function(description, specDefinitions) {
|
|
565
584
|
var xdescribe = function(description, specDefinitions) {
|
566
585
|
return jasmine.getEnv().xdescribe(description, specDefinitions);
|
567
586
|
};
|
587
|
+
if (isCommonJS) exports.xdescribe = xdescribe;
|
568
588
|
|
569
589
|
|
570
590
|
// Provide the XMLHttpRequest class for IE 5.x-6.x:
|
571
591
|
jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() {
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
return
|
578
|
-
} catch(e) {
|
592
|
+
function tryIt(f) {
|
593
|
+
try {
|
594
|
+
return f();
|
595
|
+
} catch(e) {
|
596
|
+
}
|
597
|
+
return null;
|
579
598
|
}
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
599
|
+
|
600
|
+
var xhr = tryIt(function(){return new ActiveXObject("Msxml2.XMLHTTP.6.0");}) ||
|
601
|
+
tryIt(function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0");}) ||
|
602
|
+
tryIt(function(){return new ActiveXObject("Msxml2.XMLHTTP");}) ||
|
603
|
+
tryIt(function(){return new ActiveXObject("Microsoft.XMLHTTP");});
|
604
|
+
|
605
|
+
if (!xhr) throw new Error("This browser does not support XMLHttpRequest.");
|
606
|
+
|
607
|
+
return xhr;
|
589
608
|
} : XMLHttpRequest;
|
590
609
|
/**
|
591
610
|
* @namespace
|
@@ -606,7 +625,7 @@ jasmine.util.inherit = function(childClass, parentClass) {
|
|
606
625
|
var subclass = function() {
|
607
626
|
};
|
608
627
|
subclass.prototype = parentClass.prototype;
|
609
|
-
childClass.prototype = new subclass;
|
628
|
+
childClass.prototype = new subclass();
|
610
629
|
};
|
611
630
|
|
612
631
|
jasmine.util.formatException = function(e) {
|
@@ -828,7 +847,7 @@ jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchVal
|
|
828
847
|
b.__Jasmine_been_here_before__ = a;
|
829
848
|
|
830
849
|
var hasKey = function(obj, keyName) {
|
831
|
-
return obj
|
850
|
+
return obj !== null && obj[keyName] !== jasmine.undefined;
|
832
851
|
};
|
833
852
|
|
834
853
|
for (var property in b) {
|
@@ -854,7 +873,7 @@ jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchVal
|
|
854
873
|
|
855
874
|
delete a.__Jasmine_been_here_before__;
|
856
875
|
delete b.__Jasmine_been_here_before__;
|
857
|
-
return (mismatchKeys.length
|
876
|
+
return (mismatchKeys.length === 0 && mismatchValues.length === 0);
|
858
877
|
};
|
859
878
|
|
860
879
|
jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
|
@@ -1302,7 +1321,7 @@ jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
|
|
1302
1321
|
throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
|
1303
1322
|
}
|
1304
1323
|
this.message = function() {
|
1305
|
-
if (this.actual.callCount
|
1324
|
+
if (this.actual.callCount === 0) {
|
1306
1325
|
// todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
|
1307
1326
|
return [
|
1308
1327
|
"Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.",
|
@@ -1333,7 +1352,7 @@ jasmine.Matchers.prototype.wasNotCalledWith = function() {
|
|
1333
1352
|
return [
|
1334
1353
|
"Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was",
|
1335
1354
|
"Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was"
|
1336
|
-
]
|
1355
|
+
];
|
1337
1356
|
};
|
1338
1357
|
|
1339
1358
|
return !this.env.contains_(this.actual.argsForCall, expectedArgs);
|
@@ -1390,7 +1409,7 @@ jasmine.Matchers.prototype.toThrow = function(expected) {
|
|
1390
1409
|
|
1391
1410
|
this.message = function() {
|
1392
1411
|
if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
|
1393
|
-
return ["Expected function " + not + "to throw", expected ? expected.message || expected : "
|
1412
|
+
return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' ');
|
1394
1413
|
} else {
|
1395
1414
|
return "Expected function to throw an exception.";
|
1396
1415
|
}
|
@@ -1602,7 +1621,8 @@ jasmine.PrettyPrinter.prototype.format = function(value) {
|
|
1602
1621
|
jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) {
|
1603
1622
|
for (var property in obj) {
|
1604
1623
|
if (property == '__Jasmine_been_here_before__') continue;
|
1605
|
-
fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property)
|
1624
|
+
fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined &&
|
1625
|
+
obj.__lookupGetter__(property) !== null) : false);
|
1606
1626
|
}
|
1607
1627
|
};
|
1608
1628
|
|
@@ -2172,7 +2192,9 @@ jasmine.WaitsBlock = function(env, timeout, spec) {
|
|
2172
2192
|
jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block);
|
2173
2193
|
|
2174
2194
|
jasmine.WaitsBlock.prototype.execute = function (onComplete) {
|
2175
|
-
|
2195
|
+
if (jasmine.VERBOSE) {
|
2196
|
+
this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...');
|
2197
|
+
}
|
2176
2198
|
this.env.setTimeout(function () {
|
2177
2199
|
onComplete();
|
2178
2200
|
}, this.timeout);
|
@@ -2200,7 +2222,9 @@ jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block);
|
|
2200
2222
|
jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10;
|
2201
2223
|
|
2202
2224
|
jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
|
2203
|
-
|
2225
|
+
if (jasmine.VERBOSE) {
|
2226
|
+
this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen'));
|
2227
|
+
}
|
2204
2228
|
var latchFunctionResult;
|
2205
2229
|
try {
|
2206
2230
|
latchFunctionResult = this.latchFunction.apply(this.spec);
|
@@ -2415,7 +2439,7 @@ jasmine.getGlobal().clearInterval = function(timeoutKey) {
|
|
2415
2439
|
|
2416
2440
|
jasmine.version_= {
|
2417
2441
|
"major": 1,
|
2418
|
-
"minor":
|
2419
|
-
"build":
|
2420
|
-
"revision":
|
2442
|
+
"minor": 1,
|
2443
|
+
"build": 0,
|
2444
|
+
"revision": 1304737707
|
2421
2445
|
};
|
@@ -0,0 +1,233 @@
|
|
1
|
+
var fs = require('fs');
|
2
|
+
var sys = require('sys');
|
3
|
+
var path = require('path');
|
4
|
+
|
5
|
+
// yes, really keep this here to keep us honest, but only for jasmine's own runner! [xw]
|
6
|
+
// undefined = "diz be undefined yo";
|
7
|
+
|
8
|
+
var jasmineGlobals = require("../src/base");
|
9
|
+
for(var k in jasmineGlobals) {global[k] = jasmineGlobals[k];}
|
10
|
+
|
11
|
+
//load jasmine src files based on the order in runner.html
|
12
|
+
var srcFilesInProperRequireOrder = [];
|
13
|
+
var runnerHtmlLines = fs.readFileSync("spec/runner.html", "utf8").split("\n");
|
14
|
+
var srcFileLines = [];
|
15
|
+
for (var i=0; i<runnerHtmlLines.length; i++)
|
16
|
+
if (runnerHtmlLines[i].match(/script(.*?)\/src\//))
|
17
|
+
srcFileLines.push(runnerHtmlLines[i]);
|
18
|
+
for (i=0; i<srcFileLines.length; i++) srcFilesInProperRequireOrder.push(srcFileLines[i].match(/src=\"(.*?)\"/)[1]);
|
19
|
+
for (i=0; i<srcFilesInProperRequireOrder.length; i++) require(srcFilesInProperRequireOrder[i]);
|
20
|
+
|
21
|
+
|
22
|
+
/*
|
23
|
+
Pulling in code from jasmine-node.
|
24
|
+
|
25
|
+
We can't just depend on jasmine-node because it has its own jasmine that it uses.
|
26
|
+
*/
|
27
|
+
|
28
|
+
global.window = {
|
29
|
+
setTimeout: setTimeout,
|
30
|
+
clearTimeout: clearTimeout,
|
31
|
+
setInterval: setInterval,
|
32
|
+
clearInterval: clearInterval
|
33
|
+
};
|
34
|
+
|
35
|
+
delete global.window;
|
36
|
+
|
37
|
+
function noop(){}
|
38
|
+
|
39
|
+
jasmine.executeSpecs = function(specs, done, isVerbose, showColors){
|
40
|
+
var log = [];
|
41
|
+
var columnCounter = 0;
|
42
|
+
var start = 0;
|
43
|
+
var elapsed = 0;
|
44
|
+
var verbose = isVerbose || false;
|
45
|
+
var colors = showColors || false;
|
46
|
+
|
47
|
+
var ansi = {
|
48
|
+
green: '\033[32m',
|
49
|
+
red: '\033[31m',
|
50
|
+
yellow: '\033[33m',
|
51
|
+
none: '\033[0m'
|
52
|
+
};
|
53
|
+
|
54
|
+
for (var i = 0, len = specs.length; i < len; ++i){
|
55
|
+
var filename = specs[i];
|
56
|
+
require(filename.replace(/\.\w+$/, ""));
|
57
|
+
}
|
58
|
+
|
59
|
+
var jasmineEnv = jasmine.getEnv();
|
60
|
+
jasmineEnv.reporter = {
|
61
|
+
log: function(str){
|
62
|
+
},
|
63
|
+
|
64
|
+
reportSpecStarting: function(runner) {
|
65
|
+
},
|
66
|
+
|
67
|
+
reportRunnerStarting: function(runner) {
|
68
|
+
sys.puts('Started');
|
69
|
+
start = new Date().getTime();
|
70
|
+
},
|
71
|
+
|
72
|
+
reportSuiteResults: function(suite) {
|
73
|
+
var specResults = suite.results();
|
74
|
+
var path = [];
|
75
|
+
while(suite) {
|
76
|
+
path.unshift(suite.description);
|
77
|
+
suite = suite.parentSuite;
|
78
|
+
}
|
79
|
+
var description = path.join(' ');
|
80
|
+
|
81
|
+
if (verbose)
|
82
|
+
log.push('Spec ' + description);
|
83
|
+
|
84
|
+
specResults.items_.forEach(function(spec){
|
85
|
+
if (spec.failedCount > 0 && spec.description) {
|
86
|
+
if (!verbose)
|
87
|
+
log.push(description);
|
88
|
+
log.push(' it ' + spec.description);
|
89
|
+
spec.items_.forEach(function(result){
|
90
|
+
log.push(' ' + result.trace.stack + '\n');
|
91
|
+
});
|
92
|
+
}
|
93
|
+
});
|
94
|
+
},
|
95
|
+
|
96
|
+
reportSpecResults: function(spec) {
|
97
|
+
var result = spec.results();
|
98
|
+
var msg = '';
|
99
|
+
if (result.passed())
|
100
|
+
{
|
101
|
+
msg = (colors) ? (ansi.green + '.' + ansi.none) : '.';
|
102
|
+
// } else if (result.skipped) { TODO: Research why "result.skipped" returns false when "xit" is called on a spec?
|
103
|
+
// msg = (colors) ? (ansi.yellow + '*' + ansi.none) : '*';
|
104
|
+
} else {
|
105
|
+
msg = (colors) ? (ansi.red + 'F' + ansi.none) : 'F';
|
106
|
+
}
|
107
|
+
sys.print(msg);
|
108
|
+
if (columnCounter++ < 50) return;
|
109
|
+
columnCounter = 0;
|
110
|
+
sys.print('\n');
|
111
|
+
},
|
112
|
+
|
113
|
+
|
114
|
+
reportRunnerResults: function(runner) {
|
115
|
+
elapsed = (new Date().getTime() - start) / 1000;
|
116
|
+
sys.puts('\n');
|
117
|
+
log.forEach(function(log){
|
118
|
+
sys.puts(log);
|
119
|
+
});
|
120
|
+
sys.puts('Finished in ' + elapsed + ' seconds');
|
121
|
+
|
122
|
+
var summary = jasmine.printRunnerResults(runner);
|
123
|
+
if(colors)
|
124
|
+
{
|
125
|
+
if(runner.results().failedCount === 0 )
|
126
|
+
sys.puts(ansi.green + summary + ansi.none);
|
127
|
+
else
|
128
|
+
sys.puts(ansi.red + summary + ansi.none);
|
129
|
+
} else {
|
130
|
+
sys.puts(summary);
|
131
|
+
}
|
132
|
+
(done||noop)(runner, log);
|
133
|
+
}
|
134
|
+
};
|
135
|
+
jasmineEnv.execute();
|
136
|
+
};
|
137
|
+
|
138
|
+
jasmine.getAllSpecFiles = function(dir, matcher){
|
139
|
+
var specs = [];
|
140
|
+
|
141
|
+
if (fs.statSync(dir).isFile() && dir.match(matcher)) {
|
142
|
+
specs.push(dir);
|
143
|
+
} else {
|
144
|
+
var files = fs.readdirSync(dir);
|
145
|
+
for (var i = 0, len = files.length; i < len; ++i){
|
146
|
+
var filename = dir + '/' + files[i];
|
147
|
+
if (fs.statSync(filename).isFile() && filename.match(matcher)){
|
148
|
+
specs.push(filename);
|
149
|
+
}else if (fs.statSync(filename).isDirectory()){
|
150
|
+
var subfiles = this.getAllSpecFiles(filename, matcher);
|
151
|
+
subfiles.forEach(function(result){
|
152
|
+
specs.push(result);
|
153
|
+
});
|
154
|
+
}
|
155
|
+
}
|
156
|
+
}
|
157
|
+
|
158
|
+
return specs;
|
159
|
+
};
|
160
|
+
|
161
|
+
jasmine.printRunnerResults = function(runner){
|
162
|
+
var results = runner.results();
|
163
|
+
var suites = runner.suites();
|
164
|
+
var msg = '';
|
165
|
+
msg += suites.length + ' spec' + ((suites.length === 1) ? '' : 's') + ', ';
|
166
|
+
msg += results.totalCount + ' expectation' + ((results.totalCount === 1) ? '' : 's') + ', ';
|
167
|
+
msg += results.failedCount + ' failure' + ((results.failedCount === 1) ? '' : 's') + '\n';
|
168
|
+
return msg;
|
169
|
+
};
|
170
|
+
|
171
|
+
function now(){
|
172
|
+
return new Date().getTime();
|
173
|
+
}
|
174
|
+
|
175
|
+
jasmine.asyncSpecWait = function(){
|
176
|
+
var wait = jasmine.asyncSpecWait;
|
177
|
+
wait.start = now();
|
178
|
+
wait.done = false;
|
179
|
+
(function innerWait(){
|
180
|
+
waits(10);
|
181
|
+
runs(function() {
|
182
|
+
if (wait.start + wait.timeout < now()) {
|
183
|
+
expect('timeout waiting for spec').toBeNull();
|
184
|
+
} else if (wait.done) {
|
185
|
+
wait.done = false;
|
186
|
+
} else {
|
187
|
+
innerWait();
|
188
|
+
}
|
189
|
+
});
|
190
|
+
})();
|
191
|
+
};
|
192
|
+
jasmine.asyncSpecWait.timeout = 4 * 1000;
|
193
|
+
jasmine.asyncSpecDone = function(){
|
194
|
+
jasmine.asyncSpecWait.done = true;
|
195
|
+
};
|
196
|
+
|
197
|
+
for ( var key in jasmine) {
|
198
|
+
exports[key] = jasmine[key];
|
199
|
+
}
|
200
|
+
|
201
|
+
/*
|
202
|
+
End jasmine-node runner
|
203
|
+
*/
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
var isVerbose = false;
|
210
|
+
var showColors = true;
|
211
|
+
process.argv.forEach(function(arg){
|
212
|
+
switch(arg) {
|
213
|
+
case '--color': showColors = true; break;
|
214
|
+
case '--noColor': showColors = false; break;
|
215
|
+
case '--verbose': isVerbose = true; break;
|
216
|
+
}
|
217
|
+
});
|
218
|
+
|
219
|
+
var specs = jasmine.getAllSpecFiles(__dirname + '/suites', new RegExp(".js$"));
|
220
|
+
var domIndependentSpecs = [];
|
221
|
+
for(var i=0; i<specs.length; i++) {
|
222
|
+
if (fs.readFileSync(specs[i], "utf8").indexOf("document.createElement")<0) {
|
223
|
+
domIndependentSpecs.push(specs[i]);
|
224
|
+
}
|
225
|
+
}
|
226
|
+
|
227
|
+
jasmine.executeSpecs(domIndependentSpecs, function(runner, log){
|
228
|
+
if (runner.results().failedCount === 0) {
|
229
|
+
process.exit(0);
|
230
|
+
} else {
|
231
|
+
process.exit(1);
|
232
|
+
}
|
233
|
+
}, isVerbose, showColors);
|