jasmine 0.11.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +11 -5
- data/generators/jasmine/templates/jasmine-example/SpecRunner.html +1 -1
- data/generators/jasmine/templates/lib/tasks/jasmine.rake +1 -1
- data/jasmine/example/SpecRunner.html +1 -1
- data/jasmine/lib/jasmine-html.js +1 -1
- data/jasmine/lib/jasmine.js +123 -45
- data/lib/jasmine/base.rb +1 -5
- data/lib/jasmine/command_line_tool.rb +8 -7
- data/lib/jasmine/config.rb +33 -39
- data/lib/jasmine/server.rb +0 -1
- data/spec/config_spec.rb +2 -22
- data/spec/jasmine_command_line_tool_spec.rb +5 -2
- data/spec/rails_generator_spec.rb +3 -2
- data/spec/spec_helper.rb +12 -0
- metadata +50 -45
- data/jasmine/lib/consolex.js +0 -28
data/README.markdown
CHANGED
@@ -1,19 +1,23 @@
|
|
1
1
|
jasmine-gem
|
2
2
|
============
|
3
3
|
|
4
|
-
Jasmine Gem dynamically serves
|
4
|
+
Jasmine Gem dynamically serves and runs suites for [Jasmine](http://github.com/pivotal/jasmine).
|
5
5
|
|
6
6
|
To use:
|
7
7
|
|
8
|
-
`
|
8
|
+
`gem install jasmine`
|
9
9
|
|
10
10
|
Post-installation:
|
11
11
|
|
12
|
-
For
|
12
|
+
For Rails2 support, use
|
13
13
|
|
14
14
|
`script/generate jasmine`
|
15
15
|
|
16
|
-
For
|
16
|
+
For Rails3 support, use
|
17
|
+
|
18
|
+
`bundle exec jasmine init`
|
19
|
+
|
20
|
+
For other Ruby projects (including Merb), use
|
17
21
|
|
18
22
|
`jasmine init`
|
19
23
|
|
@@ -27,7 +31,7 @@ You may also
|
|
27
31
|
|
28
32
|
`rake jasmine:ci`
|
29
33
|
|
30
|
-
which will run your Jasmine suites using selenium and rspec. This task is suitable for running in continuous integration environments.
|
34
|
+
which will run your Jasmine suites using selenium and rspec. This task is suitable for running in continuous integration environments. There is currently a known issue using this rake task with RSpec2 beta.
|
31
35
|
|
32
36
|
Simple Configuration:
|
33
37
|
|
@@ -35,3 +39,5 @@ Customize `spec/javascripts/support/jasmine.yml` to enumerate the source files,
|
|
35
39
|
You may use dir glob strings.
|
36
40
|
|
37
41
|
It is also possible to add overrides into the `spec/javascripts/support/jasmine_config.rb` file directly if you require further customization.
|
42
|
+
|
43
|
+
Copyright (c) 2008-2010 Pivotal Labs. This software is licensed under the MIT License.
|
@@ -17,6 +17,7 @@
|
|
17
17
|
|
18
18
|
</head>
|
19
19
|
<body>
|
20
|
+
<div id="REMOVE_THIS_LINE_FROM_BUILD"><p>You must be trying to look at examples in the Jasmine source tree.</p><p>Please download a distribution version of Jasmine at <a href="http://pivotal.github.com/jasmine/">http://pivotal.github.com/jasmine/</a>.</p></div>
|
20
21
|
<script type="text/javascript">
|
21
22
|
jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
|
22
23
|
jasmine.getEnv().execute();
|
@@ -24,4 +25,3 @@
|
|
24
25
|
|
25
26
|
</body>
|
26
27
|
</html>
|
27
|
-
|
@@ -1,2 +1,2 @@
|
|
1
1
|
require 'jasmine'
|
2
|
-
load 'jasmine/tasks/jasmine.rake'
|
2
|
+
load 'jasmine/tasks/jasmine.rake'
|
@@ -17,6 +17,7 @@
|
|
17
17
|
|
18
18
|
</head>
|
19
19
|
<body>
|
20
|
+
<div id="REMOVE_THIS_LINE_FROM_BUILD"><p>You must be trying to look at examples in the Jasmine source tree.</p><p>Please download a distribution version of Jasmine at <a href="http://pivotal.github.com/jasmine/">http://pivotal.github.com/jasmine/</a>.</p></div>
|
20
21
|
<script type="text/javascript">
|
21
22
|
jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
|
22
23
|
jasmine.getEnv().execute();
|
@@ -24,4 +25,3 @@
|
|
24
25
|
|
25
26
|
</body>
|
26
27
|
</html>
|
27
|
-
|
data/jasmine/lib/jasmine-html.js
CHANGED
@@ -34,7 +34,7 @@ jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
|
|
34
34
|
this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
|
35
35
|
this.createDom('div', { className: 'banner' },
|
36
36
|
this.createDom('div', { className: 'logo' },
|
37
|
-
"Jasmine",
|
37
|
+
this.createDom('a', { href: 'http://pivotal.github.com/jasmine/', target: "_blank" }, "Jasmine"),
|
38
38
|
this.createDom('span', { className: 'version' }, runner.env.versionString())),
|
39
39
|
this.createDom('div', { className: 'options' },
|
40
40
|
"Show ",
|
data/jasmine/lib/jasmine.js
CHANGED
@@ -21,11 +21,16 @@ jasmine.unimplementedMethod_ = function() {
|
|
21
21
|
jasmine.undefined = jasmine.___undefined___;
|
22
22
|
|
23
23
|
/**
|
24
|
-
* Default interval for event loop yields. Small values here may result in slow test running. Zero means no updates until all tests have completed.
|
24
|
+
* 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
25
|
*
|
26
26
|
*/
|
27
27
|
jasmine.DEFAULT_UPDATE_INTERVAL = 250;
|
28
28
|
|
29
|
+
/**
|
30
|
+
* Default timeout interval in milliseconds for waitsFor() blocks.
|
31
|
+
*/
|
32
|
+
jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
|
33
|
+
|
29
34
|
jasmine.getGlobal = function() {
|
30
35
|
function getGlobal() {
|
31
36
|
return this;
|
@@ -490,22 +495,24 @@ var runs = function(func) {
|
|
490
495
|
};
|
491
496
|
|
492
497
|
/**
|
493
|
-
* Waits
|
494
|
-
*
|
498
|
+
* Waits a fixed time period before moving to the next block.
|
499
|
+
*
|
500
|
+
* @deprecated Use waitsFor() instead
|
501
|
+
* @param {Number} timeout milliseconds to wait
|
495
502
|
*/
|
496
503
|
var waits = function(timeout) {
|
497
504
|
jasmine.getEnv().currentSpec.waits(timeout);
|
498
505
|
};
|
499
506
|
|
500
507
|
/**
|
501
|
-
* Waits for the latchFunction to return true before proceeding to the next
|
508
|
+
* Waits for the latchFunction to return true before proceeding to the next block.
|
502
509
|
*
|
503
|
-
* @param {Number} timeout
|
504
510
|
* @param {Function} latchFunction
|
505
|
-
* @param {String}
|
511
|
+
* @param {String} optional_timeoutMessage
|
512
|
+
* @param {Number} optional_timeout
|
506
513
|
*/
|
507
|
-
var waitsFor = function(
|
508
|
-
jasmine.getEnv().currentSpec.waitsFor(
|
514
|
+
var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
|
515
|
+
jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
|
509
516
|
};
|
510
517
|
|
511
518
|
/**
|
@@ -660,6 +667,7 @@ jasmine.Env = function() {
|
|
660
667
|
this.reporter = new jasmine.MultiReporter();
|
661
668
|
|
662
669
|
this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL;
|
670
|
+
this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL;
|
663
671
|
this.lastUpdate = 0;
|
664
672
|
this.specFilter = function() {
|
665
673
|
return true;
|
@@ -1135,7 +1143,7 @@ jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {
|
|
1135
1143
|
message: message
|
1136
1144
|
});
|
1137
1145
|
this.spec.addMatcherResult(expectationResult);
|
1138
|
-
return
|
1146
|
+
return jasmine.undefined;
|
1139
1147
|
};
|
1140
1148
|
};
|
1141
1149
|
|
@@ -1153,6 +1161,7 @@ jasmine.Matchers.prototype.toBe = function(expected) {
|
|
1153
1161
|
/**
|
1154
1162
|
* toNotBe: compares the actual to the expected using !==
|
1155
1163
|
* @param expected
|
1164
|
+
* @deprecated as of 1.0. Use not.toBe() instead.
|
1156
1165
|
*/
|
1157
1166
|
jasmine.Matchers.prototype.toNotBe = function(expected) {
|
1158
1167
|
return this.actual !== expected;
|
@@ -1170,6 +1179,7 @@ jasmine.Matchers.prototype.toEqual = function(expected) {
|
|
1170
1179
|
/**
|
1171
1180
|
* toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual
|
1172
1181
|
* @param expected
|
1182
|
+
* @deprecated as of 1.0. Use not.toNotEqual() instead.
|
1173
1183
|
*/
|
1174
1184
|
jasmine.Matchers.prototype.toNotEqual = function(expected) {
|
1175
1185
|
return !this.env.equals_(this.actual, expected);
|
@@ -1188,6 +1198,7 @@ jasmine.Matchers.prototype.toMatch = function(expected) {
|
|
1188
1198
|
/**
|
1189
1199
|
* Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch
|
1190
1200
|
* @param expected
|
1201
|
+
* @deprecated as of 1.0. Use not.toMatch() instead.
|
1191
1202
|
*/
|
1192
1203
|
jasmine.Matchers.prototype.toNotMatch = function(expected) {
|
1193
1204
|
return !(new RegExp(expected).test(this.actual));
|
@@ -1230,11 +1241,6 @@ jasmine.Matchers.prototype.toBeFalsy = function() {
|
|
1230
1241
|
};
|
1231
1242
|
|
1232
1243
|
|
1233
|
-
/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */
|
1234
|
-
jasmine.Matchers.prototype.wasCalled = function() {
|
1235
|
-
return this.toHaveBeenCalled();
|
1236
|
-
};
|
1237
|
-
|
1238
1244
|
/**
|
1239
1245
|
* Matcher that checks to see if the actual, a Jasmine spy, was called.
|
1240
1246
|
*/
|
@@ -1248,12 +1254,18 @@ jasmine.Matchers.prototype.toHaveBeenCalled = function() {
|
|
1248
1254
|
}
|
1249
1255
|
|
1250
1256
|
this.message = function() {
|
1251
|
-
return
|
1257
|
+
return [
|
1258
|
+
"Expected spy " + this.actual.identity + " to have been called.",
|
1259
|
+
"Expected spy " + this.actual.identity + " not to have been called."
|
1260
|
+
];
|
1252
1261
|
};
|
1253
1262
|
|
1254
1263
|
return this.actual.wasCalled;
|
1255
1264
|
};
|
1256
1265
|
|
1266
|
+
/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */
|
1267
|
+
jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled;
|
1268
|
+
|
1257
1269
|
/**
|
1258
1270
|
* Matcher that checks to see if the actual, a Jasmine spy, was not called.
|
1259
1271
|
*
|
@@ -1269,17 +1281,15 @@ jasmine.Matchers.prototype.wasNotCalled = function() {
|
|
1269
1281
|
}
|
1270
1282
|
|
1271
1283
|
this.message = function() {
|
1272
|
-
return
|
1284
|
+
return [
|
1285
|
+
"Expected spy " + this.actual.identity + " to not have been called.",
|
1286
|
+
"Expected spy " + this.actual.identity + " to have been called."
|
1287
|
+
];
|
1273
1288
|
};
|
1274
1289
|
|
1275
1290
|
return !this.actual.wasCalled;
|
1276
1291
|
};
|
1277
1292
|
|
1278
|
-
/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */
|
1279
|
-
jasmine.Matchers.prototype.wasCalledWith = function() {
|
1280
|
-
return this.toHaveBeenCalledWith.apply(this, arguments);
|
1281
|
-
};
|
1282
|
-
|
1283
1293
|
/**
|
1284
1294
|
* Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters.
|
1285
1295
|
*
|
@@ -1293,15 +1303,25 @@ jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
|
|
1293
1303
|
}
|
1294
1304
|
this.message = function() {
|
1295
1305
|
if (this.actual.callCount == 0) {
|
1296
|
-
|
1306
|
+
// todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
|
1307
|
+
return [
|
1308
|
+
"Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.",
|
1309
|
+
"Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was."
|
1310
|
+
];
|
1297
1311
|
} else {
|
1298
|
-
return
|
1312
|
+
return [
|
1313
|
+
"Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall),
|
1314
|
+
"Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall)
|
1315
|
+
];
|
1299
1316
|
}
|
1300
1317
|
};
|
1301
1318
|
|
1302
1319
|
return this.env.contains_(this.actual.argsForCall, expectedArgs);
|
1303
1320
|
};
|
1304
1321
|
|
1322
|
+
/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */
|
1323
|
+
jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith;
|
1324
|
+
|
1305
1325
|
/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */
|
1306
1326
|
jasmine.Matchers.prototype.wasNotCalledWith = function() {
|
1307
1327
|
var expectedArgs = jasmine.util.argsToArray(arguments);
|
@@ -1310,7 +1330,10 @@ jasmine.Matchers.prototype.wasNotCalledWith = function() {
|
|
1310
1330
|
}
|
1311
1331
|
|
1312
1332
|
this.message = function() {
|
1313
|
-
return
|
1333
|
+
return [
|
1334
|
+
"Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was",
|
1335
|
+
"Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was"
|
1336
|
+
]
|
1314
1337
|
};
|
1315
1338
|
|
1316
1339
|
return !this.env.contains_(this.actual.argsForCall, expectedArgs);
|
@@ -1329,6 +1352,7 @@ jasmine.Matchers.prototype.toContain = function(expected) {
|
|
1329
1352
|
* Matcher that checks that the expected item is NOT an element in the actual Array.
|
1330
1353
|
*
|
1331
1354
|
* @param {Object} expected
|
1355
|
+
* @deprecated as of 1.0. Use not.toNotContain() instead.
|
1332
1356
|
*/
|
1333
1357
|
jasmine.Matchers.prototype.toNotContain = function(expected) {
|
1334
1358
|
return !this.env.contains_(this.actual, expected);
|
@@ -1362,9 +1386,11 @@ jasmine.Matchers.prototype.toThrow = function(expected) {
|
|
1362
1386
|
result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));
|
1363
1387
|
}
|
1364
1388
|
|
1389
|
+
var not = this.isNot ? "not " : "";
|
1390
|
+
|
1365
1391
|
this.message = function() {
|
1366
1392
|
if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
|
1367
|
-
return ["Expected function to throw", expected.message || expected, ", but it threw", exception.message || exception].join(' ');
|
1393
|
+
return ["Expected function " + not + "to throw", expected ? expected.message || expected : " an exception", ", but it threw", exception.message || exception].join(' ');
|
1368
1394
|
} else {
|
1369
1395
|
return "Expected function to throw an exception.";
|
1370
1396
|
}
|
@@ -1644,6 +1670,7 @@ jasmine.Queue = function(env) {
|
|
1644
1670
|
this.running = false;
|
1645
1671
|
this.index = 0;
|
1646
1672
|
this.offset = 0;
|
1673
|
+
this.abort = false;
|
1647
1674
|
};
|
1648
1675
|
|
1649
1676
|
jasmine.Queue.prototype.addBefore = function(block) {
|
@@ -1678,7 +1705,7 @@ jasmine.Queue.prototype.next_ = function() {
|
|
1678
1705
|
while (goAgain) {
|
1679
1706
|
goAgain = false;
|
1680
1707
|
|
1681
|
-
if (self.index < self.blocks.length) {
|
1708
|
+
if (self.index < self.blocks.length && !this.abort) {
|
1682
1709
|
var calledSynchronously = true;
|
1683
1710
|
var completedSynchronously = false;
|
1684
1711
|
|
@@ -1688,6 +1715,10 @@ jasmine.Queue.prototype.next_ = function() {
|
|
1688
1715
|
return;
|
1689
1716
|
}
|
1690
1717
|
|
1718
|
+
if (self.blocks[self.index].abort) {
|
1719
|
+
self.abort = true;
|
1720
|
+
}
|
1721
|
+
|
1691
1722
|
self.offset = 0;
|
1692
1723
|
self.index++;
|
1693
1724
|
|
@@ -1884,14 +1915,46 @@ jasmine.Spec.prototype.expect = function(actual) {
|
|
1884
1915
|
return positive;
|
1885
1916
|
};
|
1886
1917
|
|
1918
|
+
/**
|
1919
|
+
* Waits a fixed time period before moving to the next block.
|
1920
|
+
*
|
1921
|
+
* @deprecated Use waitsFor() instead
|
1922
|
+
* @param {Number} timeout milliseconds to wait
|
1923
|
+
*/
|
1887
1924
|
jasmine.Spec.prototype.waits = function(timeout) {
|
1888
1925
|
var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this);
|
1889
1926
|
this.addToQueue(waitsFunc);
|
1890
1927
|
return this;
|
1891
1928
|
};
|
1892
1929
|
|
1893
|
-
|
1894
|
-
|
1930
|
+
/**
|
1931
|
+
* Waits for the latchFunction to return true before proceeding to the next block.
|
1932
|
+
*
|
1933
|
+
* @param {Function} latchFunction
|
1934
|
+
* @param {String} optional_timeoutMessage
|
1935
|
+
* @param {Number} optional_timeout
|
1936
|
+
*/
|
1937
|
+
jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
|
1938
|
+
var latchFunction_ = null;
|
1939
|
+
var optional_timeoutMessage_ = null;
|
1940
|
+
var optional_timeout_ = null;
|
1941
|
+
|
1942
|
+
for (var i = 0; i < arguments.length; i++) {
|
1943
|
+
var arg = arguments[i];
|
1944
|
+
switch (typeof arg) {
|
1945
|
+
case 'function':
|
1946
|
+
latchFunction_ = arg;
|
1947
|
+
break;
|
1948
|
+
case 'string':
|
1949
|
+
optional_timeoutMessage_ = arg;
|
1950
|
+
break;
|
1951
|
+
case 'number':
|
1952
|
+
optional_timeout_ = arg;
|
1953
|
+
break;
|
1954
|
+
}
|
1955
|
+
}
|
1956
|
+
|
1957
|
+
var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this);
|
1895
1958
|
this.addToQueue(waitsForFunc);
|
1896
1959
|
return this;
|
1897
1960
|
};
|
@@ -2114,41 +2177,56 @@ jasmine.WaitsBlock.prototype.execute = function (onComplete) {
|
|
2114
2177
|
onComplete();
|
2115
2178
|
}, this.timeout);
|
2116
2179
|
};
|
2180
|
+
/**
|
2181
|
+
* A block which waits for some condition to become true, with timeout.
|
2182
|
+
*
|
2183
|
+
* @constructor
|
2184
|
+
* @extends jasmine.Block
|
2185
|
+
* @param {jasmine.Env} env The Jasmine environment.
|
2186
|
+
* @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true.
|
2187
|
+
* @param {Function} latchFunction A function which returns true when the desired condition has been met.
|
2188
|
+
* @param {String} message The message to display if the desired condition hasn't been met within the given time period.
|
2189
|
+
* @param {jasmine.Spec} spec The Jasmine spec.
|
2190
|
+
*/
|
2117
2191
|
jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) {
|
2118
|
-
this.timeout = timeout;
|
2192
|
+
this.timeout = timeout || env.defaultTimeoutInterval;
|
2119
2193
|
this.latchFunction = latchFunction;
|
2120
2194
|
this.message = message;
|
2121
2195
|
this.totalTimeSpentWaitingForLatch = 0;
|
2122
2196
|
jasmine.Block.call(this, env, null, spec);
|
2123
2197
|
};
|
2124
|
-
|
2125
2198
|
jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block);
|
2126
2199
|
|
2127
|
-
jasmine.WaitsForBlock.TIMEOUT_INCREMENT =
|
2200
|
+
jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10;
|
2128
2201
|
|
2129
|
-
jasmine.WaitsForBlock.prototype.execute = function
|
2130
|
-
|
2131
|
-
self.env.reporter.log('>> Jasmine waiting for ' + (self.message || 'something to happen'));
|
2202
|
+
jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
|
2203
|
+
this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen'));
|
2132
2204
|
var latchFunctionResult;
|
2133
2205
|
try {
|
2134
|
-
latchFunctionResult =
|
2206
|
+
latchFunctionResult = this.latchFunction.apply(this.spec);
|
2135
2207
|
} catch (e) {
|
2136
|
-
|
2208
|
+
this.spec.fail(e);
|
2137
2209
|
onComplete();
|
2138
2210
|
return;
|
2139
2211
|
}
|
2140
2212
|
|
2141
2213
|
if (latchFunctionResult) {
|
2142
2214
|
onComplete();
|
2143
|
-
} else if (
|
2144
|
-
var message = 'timed out after ' +
|
2145
|
-
|
2215
|
+
} else if (this.totalTimeSpentWaitingForLatch >= this.timeout) {
|
2216
|
+
var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen');
|
2217
|
+
this.spec.fail({
|
2146
2218
|
name: 'timeout',
|
2147
2219
|
message: message
|
2148
2220
|
});
|
2221
|
+
|
2222
|
+
this.abort = true;
|
2223
|
+
onComplete();
|
2149
2224
|
} else {
|
2150
|
-
|
2151
|
-
|
2225
|
+
this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
|
2226
|
+
var self = this;
|
2227
|
+
this.env.setTimeout(function() {
|
2228
|
+
self.execute(onComplete);
|
2229
|
+
}, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
|
2152
2230
|
}
|
2153
2231
|
};
|
2154
2232
|
// Mock setTimeout, clearTimeout
|
@@ -2336,8 +2414,8 @@ jasmine.getGlobal().clearInterval = function(timeoutKey) {
|
|
2336
2414
|
|
2337
2415
|
|
2338
2416
|
jasmine.version_= {
|
2339
|
-
"major":
|
2340
|
-
"minor":
|
2341
|
-
"build":
|
2342
|
-
"revision":
|
2417
|
+
"major": 1,
|
2418
|
+
"minor": 0,
|
2419
|
+
"build": 0,
|
2420
|
+
"revision": 1284494074
|
2343
2421
|
};
|
data/lib/jasmine/base.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'socket'
|
2
2
|
require 'erb'
|
3
|
-
require 'json'
|
3
|
+
require 'json/pure'
|
4
4
|
|
5
5
|
module Jasmine
|
6
6
|
def self.root
|
@@ -44,10 +44,6 @@ module Jasmine
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def self.kill_process_group(process_group_id, signal="TERM")
|
48
|
-
Process.kill signal, -process_group_id # negative pid means kill process group. (see man 2 kill)
|
49
|
-
end
|
50
|
-
|
51
47
|
def self.cachebust(files, root_dir="", replace=nil, replace_with=nil)
|
52
48
|
require 'digest/md5'
|
53
49
|
files.collect do |file_name|
|
@@ -18,17 +18,18 @@ module Jasmine
|
|
18
18
|
|
19
19
|
def copy_unless_exists(relative_path, dest_path = nil)
|
20
20
|
unless File.exist?(dest_path(relative_path))
|
21
|
-
|
21
|
+
FileUtils.copy(template_path(relative_path), dest_path(dest_path || relative_path))
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
def process(argv)
|
26
26
|
if argv[0] == 'init'
|
27
|
-
require '
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
require 'fileutils'
|
28
|
+
|
29
|
+
FileUtils.makedirs('public/javascripts')
|
30
|
+
FileUtils.makedirs('spec/javascripts')
|
31
|
+
FileUtils.makedirs('spec/javascripts/support')
|
32
|
+
FileUtils.makedirs('spec/javascripts/helpers')
|
32
33
|
|
33
34
|
copy_unless_exists('jasmine-example/src/Player.js', 'public/javascripts/Player.js')
|
34
35
|
copy_unless_exists('jasmine-example/src/Song.js', 'public/javascripts/Song.js')
|
@@ -51,7 +52,7 @@ module Jasmine
|
|
51
52
|
require 'rake'
|
52
53
|
unless Rake::Task.task_defined?('jasmine')
|
53
54
|
File.open(dest_path('Rakefile'), write_mode) do |f|
|
54
|
-
f.write(File.read(template_path('lib/tasks/jasmine.rake')))
|
55
|
+
f.write("\n" + File.read(template_path('lib/tasks/jasmine.rake')))
|
55
56
|
end
|
56
57
|
end
|
57
58
|
end
|
data/lib/jasmine/config.rb
CHANGED
@@ -3,13 +3,16 @@ module Jasmine
|
|
3
3
|
require 'yaml'
|
4
4
|
require 'erb'
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
6
|
+
def browser
|
7
|
+
ENV["JASMINE_BROWSER"] || 'firefox'
|
8
|
+
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
def jasmine_host
|
11
|
+
ENV["JASMINE_HOST"] || 'http://localhost'
|
12
|
+
end
|
13
|
+
|
14
|
+
def external_selenium_server_port
|
15
|
+
ENV['SELENIUM_SERVER_PORT'] && ENV['SELENIUM_SERVER_PORT'].to_i > 0 ? ENV['SELENIUM_SERVER_PORT'].to_i : nil
|
13
16
|
end
|
14
17
|
|
15
18
|
def start_server(port = 8888)
|
@@ -19,45 +22,33 @@ module Jasmine
|
|
19
22
|
|
20
23
|
def start
|
21
24
|
start_servers
|
22
|
-
@client = Jasmine::SeleniumDriver.new("localhost", @selenium_server_port, "*#{
|
25
|
+
@client = Jasmine::SeleniumDriver.new("localhost", @selenium_server_port, "*#{browser}", "#{jasmine_host}:#{@jasmine_server_port}/")
|
23
26
|
@client.connect
|
24
27
|
end
|
25
28
|
|
26
29
|
def stop
|
27
30
|
@client.disconnect
|
28
|
-
stop_servers
|
29
|
-
end
|
30
|
-
|
31
|
-
def jasmine_host
|
32
|
-
ENV["JASMINE_HOST"] || 'http://localhost'
|
33
31
|
end
|
34
32
|
|
35
33
|
def start_jasmine_server
|
36
34
|
@jasmine_server_port = Jasmine::find_unused_port
|
37
|
-
|
38
|
-
Process.setpgrp
|
35
|
+
Thread.new do
|
39
36
|
start_server(@jasmine_server_port)
|
40
|
-
exit! 0
|
41
37
|
end
|
42
|
-
puts "jasmine server started. pid is #{@jasmine_server_pid}"
|
43
38
|
Jasmine::wait_for_listener(@jasmine_server_port, "jasmine server")
|
44
|
-
|
45
|
-
|
46
|
-
def external_selenium_server_port
|
47
|
-
ENV['SELENIUM_SERVER_PORT'] && ENV['SELENIUM_SERVER_PORT'].to_i > 0 ? ENV['SELENIUM_SERVER_PORT'].to_i : nil
|
39
|
+
puts "jasmine server started."
|
48
40
|
end
|
49
41
|
|
50
42
|
def start_selenium_server
|
51
43
|
@selenium_server_port = external_selenium_server_port
|
52
44
|
if @selenium_server_port.nil?
|
53
45
|
@selenium_server_port = Jasmine::find_unused_port
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
46
|
+
require 'selenium_rc'
|
47
|
+
SeleniumRC::Server.send(:include, SeleniumServerForkHackForRSpec)
|
48
|
+
SeleniumRC::Server.boot("localhost", @selenium_server_port, :args => ["> /dev/null"])
|
49
|
+
else
|
50
|
+
Jasmine::wait_for_listener(@selenium_server_port, "selenium server")
|
59
51
|
end
|
60
|
-
Jasmine::wait_for_listener(@selenium_server_port, "selenium server")
|
61
52
|
end
|
62
53
|
|
63
54
|
def start_servers
|
@@ -65,18 +56,6 @@ module Jasmine
|
|
65
56
|
start_selenium_server
|
66
57
|
end
|
67
58
|
|
68
|
-
def stop_servers
|
69
|
-
puts "shutting down the servers..."
|
70
|
-
Jasmine::kill_process_group(@selenium_pid) if @selenium_pid
|
71
|
-
if @jasmine_server_pid
|
72
|
-
if Rack::Handler.default == Rack::Handler::WEBrick
|
73
|
-
Jasmine::kill_process_group(@jasmine_server_pid, "INT")
|
74
|
-
else
|
75
|
-
Jasmine::kill_process_group(@jasmine_server_pid)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
59
|
def run
|
81
60
|
begin
|
82
61
|
start
|
@@ -183,5 +162,20 @@ module Jasmine
|
|
183
162
|
end
|
184
163
|
end
|
185
164
|
|
165
|
+
module SeleniumServerForkHackForRSpec
|
166
|
+
# without this, Selenium's forked process will attempt to run specs a second time at exit;
|
167
|
+
# see http://www.ruby-forum.com/topic/212722
|
168
|
+
def self.included(base)
|
169
|
+
alias_method :fork_without_fix_for_rspec, :fork
|
170
|
+
alias_method :fork, :fork_with_fix_for_rspec
|
171
|
+
end
|
172
|
+
|
173
|
+
def fork_with_fix_for_rspec
|
174
|
+
fork_without_fix_for_rspec do
|
175
|
+
yield
|
176
|
+
at_exit { exit! }
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
186
180
|
end
|
187
|
-
end
|
181
|
+
end
|
data/lib/jasmine/server.rb
CHANGED
data/spec/config_spec.rb
CHANGED
@@ -8,12 +8,12 @@ describe Jasmine::Config do
|
|
8
8
|
temp_dir_before
|
9
9
|
|
10
10
|
Dir::chdir @tmp
|
11
|
-
|
11
|
+
`rails rails-project`
|
12
12
|
Dir::chdir 'rails-project'
|
13
13
|
|
14
14
|
FileUtils.cp_r(File.join(@root, 'generators'), 'vendor')
|
15
15
|
|
16
|
-
|
16
|
+
`./script/generate jasmine`
|
17
17
|
|
18
18
|
Dir::chdir @old_dir
|
19
19
|
|
@@ -256,24 +256,4 @@ describe Jasmine::Config do
|
|
256
256
|
config.start_selenium_server
|
257
257
|
end
|
258
258
|
end
|
259
|
-
|
260
|
-
describe "#stop_servers" do
|
261
|
-
it "should kill Selenium and Rack servers" do
|
262
|
-
Rack::Handler.stub!(:default).and_return("Not WEBrick")
|
263
|
-
config = Jasmine::Config.new
|
264
|
-
config.instance_variable_set(:@selenium_pid, 100)
|
265
|
-
config.instance_variable_set(:@jasmine_server_pid, 200)
|
266
|
-
Jasmine.should_receive(:kill_process_group).with(100)
|
267
|
-
Jasmine.should_receive(:kill_process_group).with(200)
|
268
|
-
config.stop_servers
|
269
|
-
end
|
270
|
-
|
271
|
-
it "should send kill with SIGINT to WEBrick" do
|
272
|
-
Rack::Handler.stub!(:default).and_return(Rack::Handler::WEBrick)
|
273
|
-
config = Jasmine::Config.new
|
274
|
-
config.instance_variable_set(:@jasmine_server_pid, 100)
|
275
|
-
Jasmine.should_receive(:kill_process_group).with(100, "INT")
|
276
|
-
config.stop_servers
|
277
|
-
end
|
278
|
-
end
|
279
259
|
end
|
@@ -11,13 +11,16 @@ describe "Jasmine command line tool" do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should create files on init" do
|
14
|
-
|
14
|
+
output = capture_stdout do
|
15
|
+
Jasmine::CommandLineTool.new.process ["init"]
|
16
|
+
end
|
17
|
+
output.should =~ /Jasmine has been installed with example specs./
|
15
18
|
|
16
19
|
my_jasmine_lib = File.expand_path(File.join(@root, "lib"))
|
17
20
|
bootstrap = "$:.unshift('#{my_jasmine_lib}')"
|
18
21
|
|
19
22
|
ENV['JASMINE_GEM_PATH'] = "#{@root}/lib"
|
20
|
-
ci_output = `rake -E
|
23
|
+
ci_output = `rake -E "#{bootstrap}" --trace jasmine:ci`
|
21
24
|
ci_output.should =~ (/[1-9][0-9]* examples, 0 failures/)
|
22
25
|
end
|
23
26
|
end
|
@@ -11,12 +11,13 @@ describe "Jasmine rails generator" do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should create files on init" do
|
14
|
-
|
14
|
+
`rails rails-project`
|
15
15
|
Dir::chdir 'rails-project'
|
16
16
|
|
17
17
|
FileUtils.cp_r(File.join(@root, 'generators'), 'vendor')
|
18
18
|
|
19
|
-
|
19
|
+
output = `./script/generate jasmine`
|
20
|
+
output.should =~ /Jasmine has been installed with example specs./
|
20
21
|
|
21
22
|
bootstrap = "$:.unshift('#{@root}/lib')"
|
22
23
|
ENV['JASMINE_GEM_PATH'] = "#{@root}/lib"
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
require "bundler"
|
3
|
+
require 'stringio'
|
3
4
|
|
4
5
|
Bundler.setup(:default, :test)
|
5
6
|
|
@@ -26,3 +27,14 @@ def temp_dir_after
|
|
26
27
|
Dir::chdir @old_dir
|
27
28
|
FileUtils.rm_r @tmp
|
28
29
|
end
|
30
|
+
|
31
|
+
module Kernel
|
32
|
+
def capture_stdout
|
33
|
+
out = StringIO.new
|
34
|
+
$stdout = out
|
35
|
+
yield
|
36
|
+
return out.string
|
37
|
+
ensure
|
38
|
+
$stdout = STDOUT
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jasmine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 19
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
|
-
- 0
|
8
|
-
- 11
|
9
6
|
- 1
|
10
7
|
- 0
|
11
|
-
|
8
|
+
- 0
|
9
|
+
version: 1.0.0
|
12
10
|
platform: ruby
|
13
11
|
authors:
|
14
12
|
- Rajan Agaskar
|
@@ -17,75 +15,95 @@ autorequire:
|
|
17
15
|
bindir: bin
|
18
16
|
cert_chain: []
|
19
17
|
|
20
|
-
date: 2010-
|
18
|
+
date: 2010-09-14 00:00:00 -07:00
|
21
19
|
default_executable: jasmine
|
22
20
|
dependencies:
|
23
21
|
- !ruby/object:Gem::Dependency
|
24
|
-
|
25
|
-
|
22
|
+
type: :runtime
|
23
|
+
name: rake
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 8
|
31
|
+
- 7
|
32
|
+
version: 0.8.7
|
33
|
+
requirement: *id001
|
34
|
+
prerelease: false
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
type: :runtime
|
37
|
+
name: rspec
|
38
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
26
39
|
requirements:
|
27
40
|
- - ">="
|
28
41
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 25
|
30
42
|
segments:
|
31
43
|
- 1
|
32
44
|
- 1
|
33
45
|
- 5
|
34
46
|
version: 1.1.5
|
35
|
-
|
36
|
-
name: rspec
|
37
|
-
version_requirements: *id001
|
47
|
+
requirement: *id002
|
38
48
|
prerelease: false
|
39
49
|
- !ruby/object:Gem::Dependency
|
40
|
-
|
41
|
-
|
50
|
+
type: :runtime
|
51
|
+
name: rack
|
52
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
42
53
|
requirements:
|
43
54
|
- - ">="
|
44
55
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 23
|
46
56
|
segments:
|
47
57
|
- 1
|
48
58
|
- 0
|
49
59
|
- 0
|
50
60
|
version: 1.0.0
|
51
|
-
|
52
|
-
name: rack
|
53
|
-
version_requirements: *id002
|
61
|
+
requirement: *id003
|
54
62
|
prerelease: false
|
55
63
|
- !ruby/object:Gem::Dependency
|
56
|
-
|
57
|
-
|
64
|
+
type: :runtime
|
65
|
+
name: selenium-rc
|
66
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
58
67
|
requirements:
|
59
68
|
- - ">="
|
60
69
|
- !ruby/object:Gem::Version
|
61
|
-
hash: 11
|
62
70
|
segments:
|
63
71
|
- 2
|
64
72
|
- 1
|
65
73
|
- 0
|
66
74
|
version: 2.1.0
|
67
|
-
|
68
|
-
name: selenium-rc
|
69
|
-
version_requirements: *id003
|
75
|
+
requirement: *id004
|
70
76
|
prerelease: false
|
71
77
|
- !ruby/object:Gem::Dependency
|
72
|
-
|
73
|
-
|
78
|
+
type: :runtime
|
79
|
+
name: selenium-client
|
80
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
74
81
|
requirements:
|
75
82
|
- - ">="
|
76
83
|
- !ruby/object:Gem::Version
|
77
|
-
hash: 61
|
78
84
|
segments:
|
79
85
|
- 1
|
80
86
|
- 2
|
81
87
|
- 17
|
82
88
|
version: 1.2.17
|
89
|
+
requirement: *id005
|
90
|
+
prerelease: false
|
91
|
+
- !ruby/object:Gem::Dependency
|
83
92
|
type: :runtime
|
84
|
-
name:
|
85
|
-
version_requirements:
|
93
|
+
name: json_pure
|
94
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
segments:
|
99
|
+
- 1
|
100
|
+
- 4
|
101
|
+
- 3
|
102
|
+
version: 1.4.3
|
103
|
+
requirement: *id006
|
86
104
|
prerelease: false
|
87
105
|
description: Javascript BDD test framework
|
88
|
-
email:
|
106
|
+
email: jasmine-js@googlegroups.com
|
89
107
|
executables:
|
90
108
|
- jasmine
|
91
109
|
extensions: []
|
@@ -105,7 +123,6 @@ files:
|
|
105
123
|
- generators/jasmine/templates/spec/javascripts/support/jasmine.yml
|
106
124
|
- generators/jasmine/templates/spec/javascripts/support/jasmine_runner.rb
|
107
125
|
- jasmine/example/SpecRunner.html
|
108
|
-
- jasmine/lib/consolex.js
|
109
126
|
- jasmine/lib/jasmine-html.js
|
110
127
|
- jasmine/lib/jasmine.css
|
111
128
|
- jasmine/lib/jasmine.js
|
@@ -120,16 +137,8 @@ files:
|
|
120
137
|
- lib/jasmine/spec_builder.rb
|
121
138
|
- lib/jasmine/tasks/jasmine.rake
|
122
139
|
- README.markdown
|
123
|
-
- spec/config_spec.rb
|
124
|
-
- spec/jasmine_command_line_tool_spec.rb
|
125
|
-
- spec/jasmine_self_test_config.rb
|
126
|
-
- spec/jasmine_self_test_spec.rb
|
127
|
-
- spec/rails_generator_spec.rb
|
128
|
-
- spec/server_spec.rb
|
129
|
-
- spec/spec_helper.rb
|
130
|
-
- bin/jasmine
|
131
140
|
has_rdoc: true
|
132
|
-
homepage: http://github.com/
|
141
|
+
homepage: http://pivotal.github.com/jasmine
|
133
142
|
licenses: []
|
134
143
|
|
135
144
|
post_install_message:
|
@@ -138,30 +147,26 @@ rdoc_options:
|
|
138
147
|
require_paths:
|
139
148
|
- lib
|
140
149
|
required_ruby_version: !ruby/object:Gem::Requirement
|
141
|
-
none: false
|
142
150
|
requirements:
|
143
151
|
- - ">="
|
144
152
|
- !ruby/object:Gem::Version
|
145
|
-
hash: 3
|
146
153
|
segments:
|
147
154
|
- 0
|
148
155
|
version: "0"
|
149
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
|
-
none: false
|
151
157
|
requirements:
|
152
158
|
- - ">="
|
153
159
|
- !ruby/object:Gem::Version
|
154
|
-
hash: 3
|
155
160
|
segments:
|
156
161
|
- 0
|
157
162
|
version: "0"
|
158
163
|
requirements: []
|
159
164
|
|
160
165
|
rubyforge_project:
|
161
|
-
rubygems_version: 1.3.
|
166
|
+
rubygems_version: 1.3.6
|
162
167
|
signing_key:
|
163
168
|
specification_version: 3
|
164
|
-
summary: Jasmine Ruby
|
169
|
+
summary: Jasmine Runner for Ruby
|
165
170
|
test_files:
|
166
171
|
- spec/config_spec.rb
|
167
172
|
- spec/jasmine_command_line_tool_spec.rb
|
data/jasmine/lib/consolex.js
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
/** Console X
|
2
|
-
* http://github.com/deadlyicon/consolex.js
|
3
|
-
*
|
4
|
-
* By Jared Grippe <jared@jaredgrippe.com>
|
5
|
-
*
|
6
|
-
* Copyright (c) 2009 Jared Grippe
|
7
|
-
* Licensed under the MIT license.
|
8
|
-
*
|
9
|
-
* consolex avoids ever having to see javascript bugs in browsers that do not implement the entire
|
10
|
-
* firebug console suit
|
11
|
-
*
|
12
|
-
*/
|
13
|
-
(function(window) {
|
14
|
-
window.console || (window.console = {});
|
15
|
-
|
16
|
-
var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
|
17
|
-
"group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
|
18
|
-
|
19
|
-
function emptyFunction(){}
|
20
|
-
|
21
|
-
for (var i = 0; i < names.length; ++i){
|
22
|
-
window.console[names[i]] || (window.console[names[i]] = emptyFunction);
|
23
|
-
if (typeof window.console[names[i]] !== 'function')
|
24
|
-
window.console[names[i]] = (function(method) {
|
25
|
-
return function(){ return Function.prototype.apply.apply(method, [console,arguments]); };
|
26
|
-
})(window.console[names[i]]);
|
27
|
-
}
|
28
|
-
})(this);
|