|  | 'use strict'; | 
|  |  | 
|  | var Test = require('../test'); | 
|  | var EVENT_FILE_PRE_REQUIRE = require('../suite').constants | 
|  | .EVENT_FILE_PRE_REQUIRE; | 
|  |  | 
|  | /** | 
|  | * BDD-style interface: | 
|  | * | 
|  | *      describe('Array', function() { | 
|  | *        describe('#indexOf()', function() { | 
|  | *          it('should return -1 when not present', function() { | 
|  | *            // ... | 
|  | *          }); | 
|  | * | 
|  | *          it('should return the index when present', function() { | 
|  | *            // ... | 
|  | *          }); | 
|  | *        }); | 
|  | *      }); | 
|  | * | 
|  | * @param {Suite} suite Root suite. | 
|  | */ | 
|  | module.exports = function bddInterface(suite) { | 
|  | var suites = [suite]; | 
|  |  | 
|  | suite.on(EVENT_FILE_PRE_REQUIRE, function(context, file, mocha) { | 
|  | var common = require('./common')(suites, context, mocha); | 
|  |  | 
|  | context.before = common.before; | 
|  | context.after = common.after; | 
|  | context.beforeEach = common.beforeEach; | 
|  | context.afterEach = common.afterEach; | 
|  | context.run = mocha.options.delay && common.runWithSuite(suite); | 
|  | /** | 
|  | * Describe a "suite" with the given `title` | 
|  | * and callback `fn` containing nested suites | 
|  | * and/or tests. | 
|  | */ | 
|  |  | 
|  | context.describe = context.context = function(title, fn) { | 
|  | return common.suite.create({ | 
|  | title: title, | 
|  | file: file, | 
|  | fn: fn | 
|  | }); | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Pending describe. | 
|  | */ | 
|  |  | 
|  | context.xdescribe = context.xcontext = context.describe.skip = function( | 
|  | title, | 
|  | fn | 
|  | ) { | 
|  | return common.suite.skip({ | 
|  | title: title, | 
|  | file: file, | 
|  | fn: fn | 
|  | }); | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Exclusive suite. | 
|  | */ | 
|  |  | 
|  | context.describe.only = function(title, fn) { | 
|  | return common.suite.only({ | 
|  | title: title, | 
|  | file: file, | 
|  | fn: fn | 
|  | }); | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Describe a specification or test-case | 
|  | * with the given `title` and callback `fn` | 
|  | * acting as a thunk. | 
|  | */ | 
|  |  | 
|  | context.it = context.specify = function(title, fn) { | 
|  | var suite = suites[0]; | 
|  | if (suite.isPending()) { | 
|  | fn = null; | 
|  | } | 
|  | var test = new Test(title, fn); | 
|  | test.file = file; | 
|  | suite.addTest(test); | 
|  | return test; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Exclusive test-case. | 
|  | */ | 
|  |  | 
|  | context.it.only = function(title, fn) { | 
|  | return common.test.only(mocha, context.it(title, fn)); | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Pending test case. | 
|  | */ | 
|  |  | 
|  | context.xit = context.xspecify = context.it.skip = function(title) { | 
|  | return context.it(title); | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Number of attempts to retry. | 
|  | */ | 
|  | context.it.retries = function(n) { | 
|  | context.retries(n); | 
|  | }; | 
|  | }); | 
|  | }; | 
|  |  | 
|  | module.exports.description = 'BDD or RSpec style [default]'; |