diff options
Diffstat (limited to 'test/ngScenario/RunnerSpec.js')
| -rw-r--r-- | test/ngScenario/RunnerSpec.js | 116 | 
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*/); +  }); +});  | 
