progress.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /**
  2. * Module dependencies.
  3. */
  4. var Base = require('./base');
  5. var inherits = require('../utils').inherits;
  6. var color = Base.color;
  7. var cursor = Base.cursor;
  8. /**
  9. * Expose `Progress`.
  10. */
  11. exports = module.exports = Progress;
  12. /**
  13. * General progress bar color.
  14. */
  15. Base.colors.progress = 90;
  16. /**
  17. * Initialize a new `Progress` bar test reporter.
  18. *
  19. * @api public
  20. * @param {Runner} runner
  21. * @param {Object} options
  22. */
  23. function Progress(runner, options) {
  24. Base.call(this, runner);
  25. var self = this;
  26. var width = Base.window.width * .50 | 0;
  27. var total = runner.total;
  28. var complete = 0;
  29. var lastN = -1;
  30. // default chars
  31. options = options || {};
  32. options.open = options.open || '[';
  33. options.complete = options.complete || '▬';
  34. options.incomplete = options.incomplete || Base.symbols.dot;
  35. options.close = options.close || ']';
  36. options.verbose = false;
  37. // tests started
  38. runner.on('start', function() {
  39. console.log();
  40. cursor.hide();
  41. });
  42. // tests complete
  43. runner.on('test end', function() {
  44. complete++;
  45. var percent = complete / total;
  46. var n = width * percent | 0;
  47. var i = width - n;
  48. if (n === lastN && !options.verbose) {
  49. // Don't re-render the line if it hasn't changed
  50. return;
  51. }
  52. lastN = n;
  53. cursor.CR();
  54. process.stdout.write('\u001b[J');
  55. process.stdout.write(color('progress', ' ' + options.open));
  56. process.stdout.write(Array(n).join(options.complete));
  57. process.stdout.write(Array(i).join(options.incomplete));
  58. process.stdout.write(color('progress', options.close));
  59. if (options.verbose) {
  60. process.stdout.write(color('progress', ' ' + complete + ' of ' + total));
  61. }
  62. });
  63. // tests are complete, output some stats
  64. // and the failures if any
  65. runner.on('end', function() {
  66. cursor.show();
  67. console.log();
  68. self.epilogue();
  69. });
  70. }
  71. /**
  72. * Inherit from `Base.prototype`.
  73. */
  74. inherits(Progress, Base);