silverbucket/teste

View on GitHub
bin/jaribu

Summary

Maintainability
Test Coverage
#!/usr/bin/env node
// -*- mode:js; js-indent-level:2 -*-

(function (undefined) {
  "use strict";

  var walk           = require('walk'),
      requirejs      = require('requirejs'),
      files          = [],
      cwd            = process.cwd(),
      argv           = process.argv.slice(2),
      jaribuDir      = __dirname + '/../',
      appDir         = __dirname + '/../',
      requestedFiles;

  if (__dirname.match(/node_modules\/jaribu\/bin$/)) {
    // we're a node module, set the require root
    // to the root of the app, not this module.
    appDir = __dirname + '/../../../';
  }

  console.log('jaribu is in: ' + jaribuDir);
  console.log('app is in: ' + appDir);

  requirejs.config({
    //Pass the top-level main.js/index.js require
    //function to requirejs so that node modules
    //are loaded relative to the top-level JS file.
    baseUrl: appDir,
    paths: {
      jaribu: jaribuDir,
      'jaribu/colors': jaribuDir + '/lib/colors',
      'jaribu/display': jaribuDir + '/lib/display',
      'jaribu/tools/Env': jaribuDir + '/lib/tools/Env',
      'jaribu/Scaffolding': jaribuDir + '/lib/Scaffolding',
      'jaribu/Test': jaribuDir + '/lib/Test',
      'jaribu/Suite': jaribuDir + '/lib/Suite',
      'jaribu/helpers': jaribuDir + '/lib/helpers',
      'jaribu/tools/Write': jaribuDir + '/lib/tools/Write',
      'jaribu/tools/result': jaribuDir + '/lib/tools/result',
      'jaribu/tools/assert': jaribuDir + '/lib/tools/assert',
      'jaribu/tools/assertType': jaribuDir + '/lib/tools/assertType',
      'jaribu/fakes/Stub': jaribuDir + '/lib/fakes/Stub',
      'jaribu/fakes/remoteStorageMock': jaribuDir + '/lib/fakes/remoteStorageMock',
      'jaribu/tools/HttpServer': jaribuDir + '/lib/tools/HttpServer',
      'jaribu/tools/Throws': jaribuDir + '/lib/tools/Throws',
      'jaribu/tools/WebSocketClient': jaribuDir + '/lib/tools/WebSocketClient',
      'jaribu/tools/WebSocketServer': jaribuDir + '/lib/tools/WebSocketServer',
      'jaribu/testlib2': jaribuDir + '/lib/testlib2',
      'jaribu/testlib': jaribuDir + '/lib/testlib'
    },
    nodeRequire: require
  });

  if (argv.length > 0) {
    requestedFiles = {};
    argv.forEach(function (arg) {
      var path = arg[0] == '/' ? arg : (cwd + '/' + arg);
      requestedFiles[path] = true;
    });
  }

  // Walker options
  var walker  = walk.walk(cwd + '/test', { followLinks: false });

  walker.on('file', function (root, stat, next) {
    var path = root + '/' + stat.name;
    if (stat.name.match(/\-suite\.js$/g)) {
      // Add this file to the list of files
      if ((! requestedFiles) || requestedFiles[path]) {
        files.push(path);
      }
    } else if ((requestedFiles) && (requestedFiles[path])) {
        files.push(path);
    }
    next();
  });

  walker.on('end', function () {
    files = files.sort();
    console.log(files);

    var jaribu = requirejs('jaribu/lib/jaribu');
    var failedToLoad = [];

    var len_files = files.length;
    if (files.length === 0) {
      console.log('no tests found to run');
      return;
    }

    for (var i = 0; i < len_files; i += 1) {
      var s = requirejs(files[i]);
      var suites = [];

      if (typeof s === 'undefined') {
        console.error('expected an array of tests, but got \'undefined\' from file: ' + files[i]);
        failedToLoad.push({
          desc: files[i],
          error: 'unable to read suite data from file'
        });
        continue;
      } else if ((s.hasOwnProperty('name')) && (typeof s.name !== 'undefined')) {
        suites.push(s);
      } else {
        suites = s;
      }

      for (var n = 0, nlen = suites.length; n < nlen; n += 1) {
        if (! jaribu.loadSuite(suites[n]) ) {
          console.error("\n" + 'unable to load suite: ' + suites[n].desc);
          console.error(jaribu.getErrorMessage());
          failedToLoad.push({ 'desc': suites[n].desc, 'error': jaribu.getErrorMessage() });
        }
      }
    }

    jaribu.begin(function () {
      // on complete
      for (var i = 0, len = failedToLoad.length; i < len; i += 1) {
        console.log("\nsuite failed to load: " + failedToLoad[i].desc);
        console.log(failedToLoad[i].error);
      }
      console.log("\n");
    });
  });
}());