'use strict';

var Mocha = require('../../lib/mocha');

describe('Mocha', function() {
  describe('"grep" option', function() {
    it('should add a RegExp to the mocha.options object', function() {
      var mocha = new Mocha({grep: /foo.*/});
      expect(mocha.options.grep, 'to equal', /foo.*/);
    });

    it('should convert string to a RegExp', function() {
      var mocha = new Mocha({grep: 'foo.*'});
      expect(mocha.options.grep, 'to equal', /foo.*/);
    });
  });

  describe('"fgrep" option', function() {
    it('should escape and convert string to a RegExp', function() {
      var mocha = new Mocha({fgrep: 'foo.*'});
      expect(mocha.options.grep, 'to equal', /foo\.\*/);
    });
  });

  describe('.grep()', function() {
    // Test helper
    function testGrep(mocha) {
      return function testGrep(grep, expected) {
        mocha.grep(grep);
        expect(String(mocha.options.grep), 'to be', expected);
      };
    }

    it('should add a RegExp to the mocha.options object', function() {
      var test = testGrep(new Mocha());
      test(/foo/, '/foo/');
    });

    it('should convert grep string to a RegExp', function() {
      var test = testGrep(new Mocha());
      test('foo', '/foo/');
      test('^foo.*bar$', '/^foo.*bar$/');
      test('^@.*(?=\\(\\)$)', '/^@.*(?=\\(\\)$)/');
    });

    it('should covert grep regex-like string to a RegExp', function() {
      var test = testGrep(new Mocha());
      test('/foo/', '/foo/');
      // Keep the flags
      test('/baz/i', '/baz/i');
      test('/bar/g', '/bar/g');
      test('/^foo(.*)bar/g', '/^foo(.*)bar/g');
    });

    it('should return its parent Mocha object for chainability', function() {
      var mocha = new Mocha();
      expect(mocha.grep(), 'to be', mocha);
    });
  });

  describe('"invert" option', function() {
    it('should add a Boolean to the mocha.options object', function() {
      var mocha = new Mocha({invert: true});
      expect(mocha.options.invert, 'to be', true);
    });
  });
});
