var fs = require('fs'); var util = require('util'); var path = require('path');

// boot code for jasmine var jasmineRequire = require('../lib/jasmine-core/jasmine.js'); var jasmine = jasmineRequire.core(jasmineRequire);

var consoleFns = require('../lib/console/console.js'); extend(jasmineRequire, consoleFns); jasmineRequire.console(jasmineRequire, jasmine);

var env = jasmine.getEnv();

var jasmineInterface = {

describe: function(description, specDefinitions) {
  return env.describe(description, specDefinitions);
},

xdescribe: function(description, specDefinitions) {
  return env.xdescribe(description, specDefinitions);
},

it: function(desc, func) {
  return env.it(desc, func);
},

xit: function(desc, func) {
  return env.xit(desc, func);
},

beforeEach: function(beforeEachFunction) {
  return env.beforeEach(beforeEachFunction);
},

afterEach: function(afterEachFunction) {
  return env.afterEach(afterEachFunction);
},

expect: function(actual) {
  return env.expect(actual);
},

spyOn: function(obj, methodName) {
  return env.spyOn(obj, methodName);
},

jsApiReporter: new jasmine.JsApiReporter({
  timer: new jasmine.Timer()
}),

beforeAll: function(beforeAllFunction) {
  return env.beforeAll(beforeAllFunction);
},

afterAll: function(afterAllFunction) {
  return env.afterAll(afterAllFunction);
}

};

extend(global, jasmineInterface);

function extend(destination, source) {

for (var property in source) destination[property] = source[property];
return destination;

}

jasmine.addCustomEqualityTester = function(tester) {

env.addCustomEqualityTester(tester);

};

jasmine.addMatchers = function(matchers) {

return env.addMatchers(matchers);

};

jasmine.clock = function() {

return env.clock;

};

// Jasmine “runner” function executeSpecs(specs, done, isVerbose, showColors) {

global.jasmine = jasmine;

for (var i = 0; i < specs.length; i++) {
  var filename = specs[i];
  require(filename.replace(/\.\w+$/, ""));
}

var env = jasmine.getEnv();
var consoleReporter = new jasmine.ConsoleReporter({
  print: util.print,
  onComplete: done,
  showColors: showColors,
  timer: new jasmine.Timer()
});

env.addReporter(consoleReporter);
env.execute();

}

function getFiles(dir, matcher) {

var allFiles = [];

if (fs.statSync(dir).isFile() && dir.match(matcher)) {
  allFiles.push(dir);
} else {
  var files = fs.readdirSync(dir);
  for (var i = 0, len = files.length; i < len; ++i) {
    var filename = dir + '/' + files[i];
    if (fs.statSync(filename).isFile() && filename.match(matcher)) {
      allFiles.push(filename);
    } else if (fs.statSync(filename).isDirectory()) {
      var subfiles = getFiles(filename);
      subfiles.forEach(function(result) {
        allFiles.push(result);
      });
    }
  }
}
return allFiles;

}

function getSpecFiles(dir) {

return getFiles(dir, new RegExp("Spec.js$"));

}

var j$require = (function() {

var exported = {},
    j$req;

global.getJasmineRequireObj = getJasmineRequireObj;

j$req = require(__dirname + "/../src/core/requireCore.js");
extend(j$req, require(__dirname + "/../src/console/requireConsole.js"));

var srcFiles = getFiles(__dirname + "/../src/core");
srcFiles.push(__dirname + "/../src/version.js");
srcFiles.push(__dirname + "/../src/console/ConsoleReporter.js");

for (var i = 0; i < srcFiles.length; i++) {
  require(srcFiles[i]);
}
extend(j$req, exported);

delete global.getJasmineRequireObj;

return j$req;

function getJasmineRequireObj() {
  return exported;
}

}());

j$ = j$require.core(j$require); j$require.console(j$require, j$);

// options from command line var isVerbose = false; var showColors = true; var perfSuite = false;

process.argv.forEach(function(arg) {

switch (arg) {
  case '--color':
    showColors = true;
    break;
  case '--noColor':
    showColors = false;
    break;
  case '--verbose':
    isVerbose = true;
    break;
  case '--perf':
    perfSuite = true;
    break;
}

});

specs = [];

if (perfSuite) {

specs = getFiles(__dirname + '/performance', new RegExp("test.js$"));

} else {

var consoleSpecs = getSpecFiles(__dirname + "/console"),
    coreSpecs = getSpecFiles(__dirname + "/core"),
    specs = consoleSpecs.concat(coreSpecs);

}

executeSpecs(specs, function(passed) {

if (passed) {
  process.exit(0);
} else {
  process.exit(1);
}

}, isVerbose, showColors);