Skip to content
This repository was archived by the owner on Jul 29, 2024. It is now read-only.

Commit 1e60a95

Browse files
committed
feat(frameworks): add jasmine2 framework
1 parent 0a1f770 commit 1e60a95

35 files changed

+186
-14
lines changed

docs/referenceConf.js

+13-1
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ exports.config = {
236236
// ----- The test framework --------------------------------------------------
237237
// ---------------------------------------------------------------------------
238238

239-
// Test framework to use. This may be jasmine, cucumber, or mocha.
239+
// Test framework to use. This may be jasmine, jasmine2, cucumber, or mocha.
240240
//
241241
// Jasmine is fully supported as a test and assertion framework.
242242
// Mocha and Cucumber have limited beta support. You will need to include your
@@ -257,6 +257,18 @@ exports.config = {
257257
defaultTimeoutInterval: 30000
258258
},
259259

260+
// Options to be passed to jasmine2.
261+
//
262+
// See the full list at https://github.com/jasmine/jasmine-npm
263+
jasmineNodeOpts: {
264+
// If true, print colors to the terminal.
265+
showColors: true,
266+
// Default time to wait in ms before a test fails.
267+
defaultTimeoutInterval: 30000,
268+
// Function called to print jasmine results
269+
print: function() {},
270+
},
271+
260272
// Options to be passed to Mocha.
261273
//
262274
// See the full list at http://visionmedia.github.io/mocha/

lib/frameworks/jasmine2.js

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
var q = require('q');
2+
3+
var RunnerReporter = function(emitter) {
4+
this.emitter = emitter;
5+
this.testResult = [],
6+
this.failedCount = 0;
7+
};
8+
9+
RunnerReporter.prototype.jasmineStarted = function() {
10+
// Need to initiate startTime here, in case reportSpecStarting is not
11+
// called (e.g. when fit is used)
12+
this.startTime = new Date();
13+
};
14+
15+
RunnerReporter.prototype.specStarted = function() {
16+
this.startTime = new Date();
17+
};
18+
19+
RunnerReporter.prototype.specDone = function(result) {
20+
if (result.status == 'passed') {
21+
this.emitter.emit('testPass');
22+
} else if (result.status == 'failed') {
23+
this.emitter.emit('testFail');
24+
this.failedCount++;
25+
}
26+
27+
var entry = {
28+
description: result.description,
29+
assertions: [],
30+
duration: new Date().getTime() - this.startTime.getTime()
31+
};
32+
33+
result.failedExpectations.forEach(function(item) {
34+
entry.assertions.push({
35+
passed: item.passed,
36+
errorMsg: item.passed ? undefined : item.message,
37+
stackTrace: item.passed ? undefined : item.stack
38+
});
39+
});
40+
this.testResult.push(entry);
41+
};
42+
43+
/**
44+
* Execute the Runner's test cases through Jasmine.
45+
*
46+
* @param {Runner} runner The current Protractor Runner.
47+
* @param {Array} specs Array of Directory Path Strings.
48+
* @return {q.Promise} Promise resolved with the test results
49+
*/
50+
exports.run = function(runner, specs) {
51+
var JasmineRunner = require('jasmine');
52+
var jrunner = new JasmineRunner();
53+
/* global jasmine */
54+
55+
require('jasminewd2');
56+
57+
// On timeout, the flow should be reset. This will prevent webdriver tasks
58+
// from overflowing into the next test and causing it to fail or timeout
59+
// as well. This is done in the reporter instead of an afterEach block
60+
// to ensure that it runs after any afterEach() blocks with webdriver tasks
61+
// get to complete first.
62+
var reporter = new RunnerReporter(runner);
63+
jasmine.getEnv().addReporter(reporter);
64+
65+
return runner.runTestPreparer().then(function() {
66+
return q.promise(function (resolve, reject) {
67+
var jasmineNodeOpts = runner.getConfig().jasmineNodeOpts;
68+
69+
if (jasmineNodeOpts && jasmineNodeOpts.defaultTimeoutInterval) {
70+
jasmine.DEFAULT_TIMEOUT_INTERVAL = jasmineNodeOpts.defaultTimeoutInterval;
71+
}
72+
73+
var originalOnComplete = runner.getConfig().onComplete;
74+
jasmineNodeOpts.onComplete = function(passed) {
75+
try {
76+
if (originalOnComplete) {
77+
originalOnComplete(passed);
78+
}
79+
resolve({
80+
failedCount: reporter.failedCount,
81+
specResults: reporter.testResult
82+
});
83+
} catch(err) {
84+
reject(err);
85+
}
86+
};
87+
88+
jrunner.configureDefaultReporter(jasmineNodeOpts);
89+
jrunner.projectBaseDir = '';
90+
jrunner.specDir = '';
91+
jrunner.addSpecFiles(specs);
92+
jrunner.execute();
93+
});
94+
});
95+
};

lib/runner.js

+2
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ Runner.prototype.run = function() {
263263
var frameworkPath = '';
264264
if (self.config_.framework === 'jasmine') {
265265
frameworkPath = './frameworks/jasmine.js';
266+
} else if (self.config_.framework === 'jasmine2') {
267+
frameworkPath = './frameworks/jasmine2.js';
266268
} else if (self.config_.framework === 'mocha') {
267269
frameworkPath = './frameworks/mocha.js';
268270
} else if (self.config_.framework === 'cucumber') {

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
"selenium-webdriver": "2.44.0",
1717
"minijasminenode": "1.1.1",
1818
"jasminewd": "1.1.0",
19+
"jasminewd2": "0.0.2",
20+
"jasmine": "2.1.1",
1921
"saucelabs": "~0.1.0",
2022
"glob": "~3.2",
2123
"adm-zip": "0.4.4",

scripts/test.js

+4-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#!/usr/bin/env node
22

33
var Executor = require('./test/test_util').Executor;
4-
var glob = require('glob').sync;
54

65
var passingTests = [
76
'node lib/cli.js spec/basicConf.js',
@@ -26,14 +25,10 @@ var passingTests = [
2625
'node lib/cli.js spec/interactionConf.js',
2726
'node lib/cli.js spec/directConnectConf.js',
2827
'node lib/cli.js spec/restartBrowserBetweenTestsConf.js',
29-
'node lib/cli.js spec/getCapabilitiesConf.js'
28+
'node lib/cli.js spec/getCapabilitiesConf.js',
29+
'node node_modules/.bin/jasmine JASMINE_CONFIG_PATH=scripts/unit_test.json'
3030
];
3131

32-
passingTests.push(
33-
'node node_modules/minijasminenode/bin/minijn ' +
34-
glob('spec/unit/*.js').join(' ') + ' ' +
35-
glob('website/docgen/spec/*.js').join(' '));
36-
3732
var executor = new Executor();
3833

3934
passingTests.forEach(function(passing_test) {
@@ -56,7 +51,8 @@ executor.addCommandlineTest('node lib/cli.js spec/errorTest/singleFailureConf.js
5651
executor.addCommandlineTest('node lib/cli.js spec/errorTest/timeoutConf.js')
5752
.expectExitCode(1)
5853
.expectErrors({
59-
message: 'timeout: timed out after 1 msec waiting for spec to complete'
54+
message: 'Timeout - Async callback was not invoked within timeout ' +
55+
'specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.'
6056
})
6157
.expectTestDuration(0, 100);
6258

scripts/unit_test.json

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"spec_dir": "",
3+
"spec_files": [
4+
"spec/unit/*.js",
5+
"website/docgen/spec/*.js"
6+
]
7+
}

spec/altRootConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var env = require('./environment.js');
44
exports.config = {
55
seleniumAddress: env.seleniumAddress,
66

7+
framework: 'jasmine2',
8+
79
// Spec patterns are relative to this config.
810
specs: [
911
'altRoot/*_spec.js',

spec/basic/locators_spec.js

+10-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,16 @@ describe('locators', function() {
1212

1313
it('should allow custom expectations to expect an element', function() {
1414
this.addMatchers({
15-
toHaveText: function(actualText) {
16-
return this.actual.getText().then(function(expectedText) {
17-
return expectedText === actualText;
18-
});
15+
toHaveText: function() {
16+
return {
17+
compare: function(actual, expected) {
18+
return {
19+
pass: actual.getText().then(function(actual) {
20+
return actual === expected;
21+
})
22+
};
23+
}
24+
};
1925
}
2026
});
2127

spec/basicConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var env = require('./environment.js');
44
exports.config = {
55
seleniumAddress: env.seleniumAddress,
66

7+
framework: 'jasmine2',
8+
79
// Spec patterns are relative to this directory.
810
specs: [
911
'basic/*_spec.js'

spec/ciConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ exports.config = {
55
sauceUser: process.env.SAUCE_USERNAME,
66
sauceKey: process.env.SAUCE_ACCESS_KEY,
77

8+
framework: 'jasmine2',
9+
810
// Spec patterns are relative to this directory.
911
specs: [
1012
'basic/*_spec.js'

spec/directConnectConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var env = require('./environment.js');
44
exports.config = {
55
directConnect: true,
66

7+
framework: 'jasmine2',
8+
79
capabilities: {
810
'browserName': 'chrome'
911
},

spec/errorTest/afterLaunchChangesExitCodeConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ var env = require('../environment.js');
33
exports.config = {
44
seleniumAddress: env.seleniumAddress,
55

6+
framework: 'jasmine2',
7+
68
specs: [
79
'baseCase/single_failure_spec1.js'
810
],

spec/errorTest/multiFailureConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ var env = require('../environment.js');
33
exports.config = {
44
seleniumAddress: env.seleniumAddress,
55

6+
framework: 'jasmine2',
7+
68
specs: [
79
'baseCase/single_failure_spec1.js',
810
'baseCase/single_failure_spec2.js'

spec/errorTest/shardedFailureConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ var env = require('../environment.js');
33
exports.config = {
44
seleniumAddress: env.seleniumAddress,
55

6+
framework: 'jasmine2',
7+
68
specs: [
79
'baseCase/single_failure_spec1.js',
810
'baseCase/single_failure_spec2.js'

spec/errorTest/singleFailureConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ var env = require('../environment.js');
33
exports.config = {
44
seleniumAddress: env.seleniumAddress,
55

6+
framework: 'jasmine2',
7+
68
specs: [
79
'baseCase/single_failure_spec1.js'
810
],

spec/errorTest/timeoutConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ var env = require('../environment.js');
33
exports.config = {
44
seleniumAddress: env.seleniumAddress,
55

6+
framework: 'jasmine2',
7+
68
specs: [
79
'baseCase/timeout_spec.js'
810
],

spec/interactionConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var env = require('./environment.js');
44
exports.config = {
55
seleniumAddress: env.seleniumAddress,
66

7+
framework: 'jasmine2',
8+
79
// Spec patterns are relative to this directory.
810
specs: [
911
'interaction/*_spec.js'

spec/junitOutputConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ var env = require('./environment.js');
88
exports.config = {
99
seleniumAddress: env.seleniumAddress,
1010

11+
framework: 'jasmine2',
12+
1113
specs: [
1214
'basic/*_spec.js'
1315
],

spec/multiConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var env = require('./environment.js');
44
exports.config = {
55
seleniumAddress: env.seleniumAddress,
66

7+
framework: 'jasmine2',
8+
79
// Spec patterns are relative to this directory.
810
specs: [
911
'basic/lib_spec.js'

spec/ngHintFailConfig.js

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var env = require('./environment.js');
22

33
exports.config = {
44
seleniumAddress: env.seleniumAddress,
5+
framework: 'jasmine2',
56
specs: ['ngHint/fail_spec.js'],
67
baseUrl: env.baseUrl,
78
plugins: [{

spec/ngHintSuccessConfig.js

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var env = require('./environment.js');
22

33
exports.config = {
44
seleniumAddress: env.seleniumAddress,
5+
framework: 'jasmine2',
56
specs: ['ngHint/success_spec.js'],
67
baseUrl: env.baseUrl,
78
plugins: [{

spec/onCleanUpAsyncReturnValueConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ var q = require('q');
55
exports.config = {
66
seleniumAddress: env.seleniumAddress,
77

8+
framework: 'jasmine2',
9+
810
specs: [
911
'onCleanUp/*_spec.js'
1012
],

spec/onCleanUpNoReturnValueConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var env = require('./environment.js');
44
exports.config = {
55
seleniumAddress: env.seleniumAddress,
66

7+
framework: 'jasmine2',
8+
79
specs: [
810
'onCleanUp/*_spec.js'
911
],

spec/onCleanUpSyncReturnValueConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var env = require('./environment.js');
44
exports.config = {
55
seleniumAddress: env.seleniumAddress,
66

7+
framework: 'jasmine2',
8+
79
specs: [
810
'onCleanUp/*_spec.js'
911
],

spec/onPrepareConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ var env = require('./environment.js');
66
exports.config = {
77
seleniumAddress: env.seleniumAddress,
88

9+
framework: 'jasmine2',
10+
911
specs: [
1012
'onPrepare/*_spec.js'
1113
],

spec/onPrepareFileConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ var env = require('./environment.js');
55
exports.config = {
66
seleniumAddress: env.seleniumAddress,
77

8+
framework: 'jasmine2',
9+
810
// Spec patterns are relative to this directory.
911
specs: [
1012
'onPrepare/*_spec.js'

spec/onPreparePromiseConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ var q = require('q');
77
exports.config = {
88
seleniumAddress: env.seleniumAddress,
99

10+
framework: 'jasmine2',
11+
1012
specs: [
1113
'onPrepare/*_spec.js'
1214
],

spec/onPreparePromiseFileConf.js

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ var env = require('./environment.js');
55
exports.config = {
66
seleniumAddress: env.seleniumAddress,
77

8+
framework: 'jasmine2',
9+
810
// Spec patterns are relative to this directory.
911
specs: [
1012
'onPrepare/*_spec.js'

0 commit comments

Comments
 (0)