'use strict';

var Test = require('../test'); var EVENT_FILE_PRE_REQUIRE = require('../suite').constants

.EVENT_FILE_PRE_REQUIRE;

/**

* TDD-style interface:
*
*      suite('Array', function() {
*        suite('#indexOf()', function() {
*          suiteSetup(function() {
*
*          });
*
*          test('should return -1 when not present', function() {
*
*          });
*
*          test('should return the index when present', function() {
*
*          });
*
*          suiteTeardown(function() {
*
*          });
*        });
*      });
*
* @param {Suite} suite Root suite.
*/

module.exports = function(suite) {

var suites = [suite];

suite.on(EVENT_FILE_PRE_REQUIRE, function(context, file, mocha) {
  var common = require('./common')(suites, context, mocha);

  context.setup = common.beforeEach;
  context.teardown = common.afterEach;
  context.suiteSetup = common.before;
  context.suiteTeardown = common.after;
  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.suite = function(title, fn) {
    return common.suite.create({
      title: title,
      file: file,
      fn: fn
    });
  };

  /**
   * Pending suite.
   */
  context.suite.skip = function(title, fn) {
    return common.suite.skip({
      title: title,
      file: file,
      fn: fn
    });
  };

  /**
   * Exclusive test-case.
   */
  context.suite.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.test = 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.test.only = function(title, fn) {
    return common.test.only(mocha, context.test(title, fn));
  };

  context.test.skip = common.test.skip;
  context.test.retries = common.test.retries;
});

};

module.exports.description =

'traditional "suite"/"test" instead of BDD\'s "describe"/"it"';