aboutsummaryrefslogtreecommitdiffstats
path: root/test/ngScenario/RunnerSpec.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/ngScenario/RunnerSpec.js')
-rw-r--r--test/ngScenario/RunnerSpec.js116
1 files changed, 116 insertions, 0 deletions
diff --git a/test/ngScenario/RunnerSpec.js b/test/ngScenario/RunnerSpec.js
new file mode 100644
index 00000000..c4ad6f95
--- /dev/null
+++ b/test/ngScenario/RunnerSpec.js
@@ -0,0 +1,116 @@
+'use strict';
+
+/**
+ * Mock spec runner.
+ */
+function MockSpecRunner() {}
+MockSpecRunner.prototype.run = function(spec, specDone) {
+ spec.before.call(this);
+ spec.body.call(this);
+ spec.after.call(this);
+ specDone();
+};
+
+MockSpecRunner.prototype.addFuture = function(name, fn, line) {
+ return {name: name, fn: fn, line: line};
+};
+
+describe('angular.scenario.Runner', function() {
+ var $window;
+ var runner;
+
+ beforeEach(function() {
+ // Trick to get the scope out of a DSL statement
+ angular.scenario.dsl('dslAddFuture', function() {
+ return function() {
+ return this.addFuture('future name', angular.noop);
+ };
+ });
+ // Trick to get the scope out of a DSL statement
+ angular.scenario.dsl('dslScope', function() {
+ var scope = this;
+ return function() { return scope; };
+ });
+ // Trick to get the scope out of a DSL statement
+ angular.scenario.dsl('dslChain', function() {
+ return function() {
+ this.chained = 0;
+ this.chain = function() { this.chained++; return this; };
+ return this;
+ };
+ });
+ $window = {
+ location: {}
+ };
+ runner = new angular.scenario.Runner($window);
+ runner.on('SpecError', angular.mock.rethrow);
+ runner.on('StepError', angular.mock.rethrow);
+ });
+
+ afterEach(function() {
+ delete angular.scenario.dsl.dslScope;
+ delete angular.scenario.dsl.dslChain;
+ });
+
+ it('should publish the functions in the public API', function() {
+ angular.forEach(runner.api, function(fn, name) {
+ var func;
+ if (name in $window) {
+ func = $window[name];
+ }
+ expect(angular.isFunction(func)).toBeTruthy();
+ });
+ });
+
+ it('should construct valid describe trees with public API', function() {
+ var before = [];
+ var after = [];
+ $window.describe('A', function() {
+ $window.beforeEach(function() { before.push('A'); });
+ $window.afterEach(function() { after.push('A'); });
+ $window.it('1', angular.noop);
+ $window.describe('B', function() {
+ $window.beforeEach(function() { before.push('B'); });
+ $window.afterEach(function() { after.push('B'); });
+ $window.it('2', angular.noop);
+ $window.describe('C', function() {
+ $window.beforeEach(function() { before.push('C'); });
+ $window.afterEach(function() { after.push('C'); });
+ $window.it('3', angular.noop);
+ });
+ });
+ });
+ var specs = runner.rootDescribe.getSpecs();
+ specs[0].before();
+ specs[0].body();
+ specs[0].after();
+ expect(before).toEqual(['A', 'B', 'C']);
+ expect(after).toEqual(['C', 'B', 'A']);
+ expect(specs[2].definition.parent).toEqual(runner.rootDescribe);
+ expect(specs[0].definition.parent).toEqual(specs[2].definition.children[0]);
+ });
+
+ it('should publish the DSL statements to the $window', function() {
+ $window.describe('describe', function() {
+ $window.it('1', function() {
+ expect($window.dslScope).toBeDefined();
+ });
+ });
+ runner.run(null/*application*/);
+ });
+
+ it('should create a new scope for each DSL chain', function() {
+ $window.describe('describe', function() {
+ $window.it('1', function() {
+ var scope = $window.dslScope();
+ scope.test = "foo";
+ expect($window.dslScope().test).toBeUndefined();
+ });
+ $window.it('2', function() {
+ var scope = $window.dslChain().chain().chain();
+ expect(scope.chained).toEqual(2);
+ });
+ });
+ runner.run(null/*application*/);
+ });
+});