konacha 0.10.0 → 1.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -5
- data/History.md +10 -0
- data/README.md +6 -17
- data/app/views/konacha/specs/specs.html.erb +17 -14
- data/konacha.gemspec +2 -2
- data/{vendor → lib}/assets/javascripts/konacha/runner.js +0 -0
- data/{vendor → lib}/assets/javascripts/konacha/server.js +0 -0
- data/lib/assets/stylesheets/konacha.css +5 -0
- data/lib/konacha.rb +2 -2
- data/lib/konacha/engine.rb +0 -1
- data/lib/konacha/runner.rb +59 -105
- data/spec/dummy/spec/javascripts/templating_spec.js +3 -2
- data/spec/dummy/spec/javascripts/test_element_spec.js.coffee +13 -5
- data/spec/konacha_spec.rb +0 -6
- data/spec/runner_spec.rb +3 -18
- data/spec/server_spec.rb +0 -4
- data/spec/spec_helper.rb +13 -0
- data/spec/views/specs/specs.html.erb_spec.rb +0 -6
- data/vendor/assets/javascripts/chai.js +103 -22
- data/vendor/assets/javascripts/mocha.js +352 -8
- data/vendor/{assets/images → images}/konacha.jpg +0 -0
- metadata +33 -33
- data/vendor/assets/stylesheets/konacha.css +0 -6
data/spec/server_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -19,3 +19,16 @@ Capybara.configure do |config|
|
|
19
19
|
config.default_driver = :selenium_with_firebug
|
20
20
|
config.app = Konacha.application
|
21
21
|
end
|
22
|
+
|
23
|
+
module Konacha
|
24
|
+
module RequestSpec
|
25
|
+
def app
|
26
|
+
# Override the RSpec default of `Rails.application`.
|
27
|
+
Konacha.application
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
RSpec.configure do |config|
|
33
|
+
config.include Konacha::RequestSpec, :type => :request
|
34
|
+
end
|
@@ -1,12 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "konacha/specs/specs" do
|
4
|
-
it "sets up the specified interface" do
|
5
|
-
Konacha.should_receive(:interface).any_number_of_times { :tdd }
|
6
|
-
render
|
7
|
-
rendered.should include('mocha.setup("tdd")')
|
8
|
-
end
|
9
|
-
|
10
4
|
it "includes konacha JS for given mode" do
|
11
5
|
Konacha.should_receive(:mode).any_number_of_times { :runner }
|
12
6
|
render
|
@@ -140,7 +140,7 @@ function Assertion (obj, msg, stack) {
|
|
140
140
|
Assertion.includeStack = false;
|
141
141
|
|
142
142
|
/*!
|
143
|
-
* # .assert(expression, message, negateMessage)
|
143
|
+
* # .assert(expression, message, negateMessage, expected, actual)
|
144
144
|
*
|
145
145
|
* Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
|
146
146
|
*
|
@@ -148,21 +148,21 @@ Assertion.includeStack = false;
|
|
148
148
|
* @param {Philosophical} expression to be tested
|
149
149
|
* @param {String} message to display if fails
|
150
150
|
* @param {String} negatedMessage to display if negated expression fails
|
151
|
+
* @param {*} expected value (remember to check for negation)
|
152
|
+
* @param {*} actual (optional) will default to `this.obj`
|
151
153
|
* @api private
|
152
154
|
*/
|
153
155
|
|
154
156
|
Assertion.prototype.assert = function (expr, msg, negateMsg, expected, actual) {
|
155
157
|
actual = actual || this.obj;
|
156
158
|
var msg = (this.negate ? negateMsg : msg)
|
157
|
-
, ok = this.negate ? !expr : expr
|
158
|
-
, act = this.negate ? expected : actual
|
159
|
-
, exp = this.negate ? actual : expected;
|
159
|
+
, ok = this.negate ? !expr : expr;
|
160
160
|
|
161
161
|
if (!ok) {
|
162
162
|
throw new AssertionError({
|
163
163
|
message: this.msg ? this.msg + ': ' + msg : msg // include custom message if available
|
164
|
-
, actual:
|
165
|
-
, expected:
|
164
|
+
, actual: actual
|
165
|
+
, expected: expected
|
166
166
|
, stackStartFunction: (Assertion.includeStack) ? this.assert : this.ssfi
|
167
167
|
});
|
168
168
|
}
|
@@ -442,10 +442,16 @@ Object.defineProperty(Assertion.prototype, 'exist',
|
|
442
442
|
|
443
443
|
Object.defineProperty(Assertion.prototype, 'empty',
|
444
444
|
{ get: function () {
|
445
|
-
|
445
|
+
var expected = this.obj;
|
446
|
+
|
447
|
+
if (Array.isArray(this.obj)) {
|
448
|
+
expected = this.obj.length;
|
449
|
+
} else if (typeof this.obj === 'object') {
|
450
|
+
expected = Object.keys(this.obj).length;
|
451
|
+
}
|
446
452
|
|
447
453
|
this.assert(
|
448
|
-
|
454
|
+
!expected
|
449
455
|
, 'expected ' + this.inspect + ' to be empty'
|
450
456
|
, 'expected ' + this.inspect + ' not to be empty');
|
451
457
|
|
@@ -891,10 +897,21 @@ Assertion.prototype.keys = function(keys) {
|
|
891
897
|
/**
|
892
898
|
* # .throw(constructor)
|
893
899
|
*
|
894
|
-
* Assert that a function will throw a specific type of error
|
900
|
+
* Assert that a function will throw a specific type of error or that error
|
901
|
+
* thrown will match a RegExp or include a string.
|
895
902
|
*
|
896
|
-
* var fn = function () { throw new ReferenceError(''); }
|
903
|
+
* var fn = function () { throw new ReferenceError('This is a bad function.'); }
|
897
904
|
* expect(fn).to.throw(ReferenceError);
|
905
|
+
* expect(fn).to.throw(/bad function/);
|
906
|
+
* expect(fn).to.not.throw('good function');
|
907
|
+
* expect(fn).to.throw(ReferenceError, /bad function/);
|
908
|
+
*
|
909
|
+
* Please note that when a throw expectation is negated, it will check each
|
910
|
+
* parameter independently, starting with Error constructor type. The appropriate way
|
911
|
+
* to check for the existence of a type of error but for a message that does not match
|
912
|
+
* is to use `and`.
|
913
|
+
*
|
914
|
+
* expect(fn).to.throw(ReferenceError).and.not.throw(/good function/);
|
898
915
|
*
|
899
916
|
* @name throw
|
900
917
|
* @alias throws
|
@@ -904,25 +921,44 @@ Assertion.prototype.keys = function(keys) {
|
|
904
921
|
* @api public
|
905
922
|
*/
|
906
923
|
|
907
|
-
Assertion.prototype.throw = function (constructor) {
|
924
|
+
Assertion.prototype.throw = function (constructor, msg) {
|
908
925
|
new Assertion(this.obj).is.a('function');
|
909
926
|
|
910
927
|
var thrown = false;
|
911
928
|
|
929
|
+
if (arguments.length === 0) {
|
930
|
+
msg = null;
|
931
|
+
constructor = null;
|
932
|
+
} else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) {
|
933
|
+
msg = constructor;
|
934
|
+
constructor = null;
|
935
|
+
}
|
936
|
+
|
912
937
|
try {
|
913
938
|
this.obj();
|
914
939
|
} catch (err) {
|
915
|
-
|
940
|
+
// first, check constructor
|
941
|
+
if (constructor && 'function' === typeof constructor) {
|
916
942
|
this.assert(
|
917
943
|
err instanceof constructor && err.name == constructor.name
|
918
944
|
, 'expected ' + this.inspect + ' to throw ' + constructor.name + ' but a ' + err.name + ' was thrown'
|
919
945
|
, 'expected ' + this.inspect + ' to not throw ' + constructor.name );
|
946
|
+
if (!msg) return this;
|
947
|
+
}
|
948
|
+
// next, check message
|
949
|
+
if (err.message && msg && msg instanceof RegExp) {
|
950
|
+
this.assert(
|
951
|
+
msg.exec(err.message)
|
952
|
+
, 'expected ' + this.inspect + ' to throw error matching ' + msg + ' but got ' + inspect(err.message)
|
953
|
+
, 'expected ' + this.inspect + ' to throw error not matching ' + msg
|
954
|
+
);
|
920
955
|
return this;
|
921
|
-
} else if (
|
956
|
+
} else if (err.message && msg && 'string' === typeof msg) {
|
922
957
|
this.assert(
|
923
|
-
|
924
|
-
, 'expected ' + this.inspect + ' to throw error
|
925
|
-
, 'expected ' + this.inspect + ' to throw error not
|
958
|
+
~err.message.indexOf(msg)
|
959
|
+
, 'expected ' + this.inspect + ' to throw error including ' + inspect(msg) + ' but got ' + inspect(err.message)
|
960
|
+
, 'expected ' + this.inspect + ' to throw error not including ' + inspect(msg)
|
961
|
+
);
|
926
962
|
return this;
|
927
963
|
} else {
|
928
964
|
thrown = true;
|
@@ -1043,7 +1079,7 @@ require.register("chai.js", function(module, exports, require){
|
|
1043
1079
|
var used = [];
|
1044
1080
|
var exports = module.exports = {};
|
1045
1081
|
|
1046
|
-
exports.version = '0.
|
1082
|
+
exports.version = '0.5.2';
|
1047
1083
|
|
1048
1084
|
exports.Assertion = require('./assertion');
|
1049
1085
|
exports.AssertionError = require('./error');
|
@@ -1151,6 +1187,29 @@ module.exports = function (chai) {
|
|
1151
1187
|
|
1152
1188
|
var assert = chai.assert = {};
|
1153
1189
|
|
1190
|
+
/**
|
1191
|
+
* # .fail(actual, expect, msg, operator)
|
1192
|
+
*
|
1193
|
+
* Throw a failure. Node.js compatible.
|
1194
|
+
*
|
1195
|
+
* @name fail
|
1196
|
+
* @param {*} actual value
|
1197
|
+
* @param {*} expected value
|
1198
|
+
* @param {String} message
|
1199
|
+
* @param {String} operator
|
1200
|
+
* @api public
|
1201
|
+
*/
|
1202
|
+
|
1203
|
+
assert.fail = function (actual, expected, message, operator) {
|
1204
|
+
throw new chai.AssertionError({
|
1205
|
+
actual: actual
|
1206
|
+
, expected: expected
|
1207
|
+
, message: message
|
1208
|
+
, operator: operator
|
1209
|
+
, stackStartFunction: assert.fail
|
1210
|
+
});
|
1211
|
+
}
|
1212
|
+
|
1154
1213
|
/**
|
1155
1214
|
* # .ok(object, [message])
|
1156
1215
|
*
|
@@ -1375,6 +1434,24 @@ module.exports = function (chai) {
|
|
1375
1434
|
new Assertion(val, msg).to.equal(undefined);
|
1376
1435
|
};
|
1377
1436
|
|
1437
|
+
/**
|
1438
|
+
* # .isDefined(value, [message])
|
1439
|
+
*
|
1440
|
+
* Assert `value` is not undefined.
|
1441
|
+
*
|
1442
|
+
* var tea = 'cup of chai';
|
1443
|
+
* assert.isDefined(tea, 'no tea defined');
|
1444
|
+
*
|
1445
|
+
* @name isUndefined
|
1446
|
+
* @param {*} value
|
1447
|
+
* @param {String} message
|
1448
|
+
* @api public
|
1449
|
+
*/
|
1450
|
+
|
1451
|
+
assert.isDefined = function (val, msg) {
|
1452
|
+
new Assertion(val, msg).to.not.equal(undefined);
|
1453
|
+
};
|
1454
|
+
|
1378
1455
|
/**
|
1379
1456
|
* # .isFunction(value, [message])
|
1380
1457
|
*
|
@@ -1660,7 +1737,11 @@ module.exports = function (chai) {
|
|
1660
1737
|
if (!~['==', '===', '>', '>=', '<', '<=', '!=', '!=='].indexOf(operator)) {
|
1661
1738
|
throw new Error('Invalid operator "' + operator + '"');
|
1662
1739
|
}
|
1663
|
-
new Assertion(eval(val + operator + val2), msg)
|
1740
|
+
var test = new Assertion(eval(val + operator + val2), msg);
|
1741
|
+
test.assert(
|
1742
|
+
true === test.obj
|
1743
|
+
, 'expected ' + inspect(val) + ' to be ' + operator + ' ' + inspect(val2)
|
1744
|
+
, 'expected ' + inspect(val) + ' to not be ' + operator + ' ' + inspect(val2) );
|
1664
1745
|
};
|
1665
1746
|
|
1666
1747
|
/*!
|
@@ -1732,8 +1813,8 @@ module.exports = function (chai) {
|
|
1732
1813
|
new Assertion(val1).to.equal(val2);
|
1733
1814
|
};
|
1734
1815
|
|
1735
|
-
should.throw = function (fn,
|
1736
|
-
new Assertion(fn).to.throw(
|
1816
|
+
should.throw = function (fn, errt, errs) {
|
1817
|
+
new Assertion(fn).to.throw(errt, errs);
|
1737
1818
|
};
|
1738
1819
|
|
1739
1820
|
should.exist = function (val) {
|
@@ -1747,8 +1828,8 @@ module.exports = function (chai) {
|
|
1747
1828
|
new Assertion(val1).to.not.equal(val2);
|
1748
1829
|
};
|
1749
1830
|
|
1750
|
-
should.not.throw = function (fn,
|
1751
|
-
new Assertion(fn).to.not.throw(
|
1831
|
+
should.not.throw = function (fn, errt, errs) {
|
1832
|
+
new Assertion(fn).to.not.throw(errt, errs);
|
1752
1833
|
};
|
1753
1834
|
|
1754
1835
|
should.not.exist = function (val) {
|
@@ -854,11 +854,27 @@ require.register("mocha.js", function(module, exports, require){
|
|
854
854
|
* MIT Licensed
|
855
855
|
*/
|
856
856
|
|
857
|
+
/**
|
858
|
+
* Module dependencies.
|
859
|
+
*/
|
860
|
+
|
861
|
+
var path = require('browser/path');
|
862
|
+
|
863
|
+
/**
|
864
|
+
* Expose `Mocha`.
|
865
|
+
*/
|
866
|
+
|
867
|
+
exports = module.exports = Mocha;
|
868
|
+
|
857
869
|
/**
|
858
870
|
* Library version.
|
859
871
|
*/
|
860
872
|
|
861
|
-
exports.version = '0.
|
873
|
+
exports.version = '1.0.0';
|
874
|
+
|
875
|
+
/**
|
876
|
+
* Expose internals.
|
877
|
+
*/
|
862
878
|
|
863
879
|
exports.utils = require('./utils');
|
864
880
|
exports.interfaces = require('./interfaces');
|
@@ -870,6 +886,144 @@ exports.Suite = require('./suite');
|
|
870
886
|
exports.Hook = require('./hook');
|
871
887
|
exports.Test = require('./test');
|
872
888
|
|
889
|
+
/**
|
890
|
+
* Return image `name` path.
|
891
|
+
*
|
892
|
+
* @param {String} name
|
893
|
+
* @return {String}
|
894
|
+
* @api private
|
895
|
+
*/
|
896
|
+
|
897
|
+
function image(name) {
|
898
|
+
return __dirname + '/../images/' + name + '.png';
|
899
|
+
}
|
900
|
+
|
901
|
+
/**
|
902
|
+
* Setup mocha with `options`.
|
903
|
+
*
|
904
|
+
* Options:
|
905
|
+
*
|
906
|
+
* - `ui` name "bdd", "tdd", "exports" etc
|
907
|
+
* - `reporter` reporter instance, defaults to `mocha.reporters.Dot`
|
908
|
+
* - `globals` array of accepted globals
|
909
|
+
* - `timeout` timeout in milliseconds
|
910
|
+
* - `ignoreLeaks` ignore global leaks
|
911
|
+
*
|
912
|
+
* @param {Object} options
|
913
|
+
* @api public
|
914
|
+
*/
|
915
|
+
|
916
|
+
function Mocha(options) {
|
917
|
+
options = options || {};
|
918
|
+
this.files = [];
|
919
|
+
this.options = options;
|
920
|
+
this.suite = new exports.Suite('', new exports.Context);
|
921
|
+
this.ui(options.ui);
|
922
|
+
this.reporter(options.reporter);
|
923
|
+
if (options.timeout) this.suite.timeout(options.timeout);
|
924
|
+
}
|
925
|
+
|
926
|
+
/**
|
927
|
+
* Add test `file`.
|
928
|
+
*
|
929
|
+
* @param {String} file
|
930
|
+
* @api public
|
931
|
+
*/
|
932
|
+
|
933
|
+
Mocha.prototype.addFile = function(file){
|
934
|
+
this.files.push(file);
|
935
|
+
return this;
|
936
|
+
};
|
937
|
+
|
938
|
+
/**
|
939
|
+
* Set reporter to `name`, defaults to "dot".
|
940
|
+
*
|
941
|
+
* @param {String} name
|
942
|
+
* @api public
|
943
|
+
*/
|
944
|
+
|
945
|
+
Mocha.prototype.reporter = function(name){
|
946
|
+
name = name || 'dot';
|
947
|
+
this._reporter = require('./reporters/' + name);
|
948
|
+
if (!this._reporter) throw new Error('invalid reporter "' + name + '"');
|
949
|
+
return this;
|
950
|
+
};
|
951
|
+
|
952
|
+
/**
|
953
|
+
* Set test UI `name`, defaults to "bdd".
|
954
|
+
*
|
955
|
+
* @param {String} bdd
|
956
|
+
* @api public
|
957
|
+
*/
|
958
|
+
|
959
|
+
Mocha.prototype.ui = function(name){
|
960
|
+
name = name || 'bdd';
|
961
|
+
this._ui = exports.interfaces[name];
|
962
|
+
if (!this._ui) throw new Error('invalid interface "' + name + '"');
|
963
|
+
this._ui = this._ui(this.suite);
|
964
|
+
return this;
|
965
|
+
};
|
966
|
+
|
967
|
+
/**
|
968
|
+
* Load registered files.
|
969
|
+
*
|
970
|
+
* @api private
|
971
|
+
*/
|
972
|
+
|
973
|
+
Mocha.prototype.loadFiles = function(){
|
974
|
+
var suite = this.suite;
|
975
|
+
this.files.forEach(function(file){
|
976
|
+
file = path.resolve(file);
|
977
|
+
suite.emit('pre-require', global, file);
|
978
|
+
suite.emit('require', require(file), file);
|
979
|
+
suite.emit('post-require', global, file);
|
980
|
+
});
|
981
|
+
};
|
982
|
+
|
983
|
+
/**
|
984
|
+
* Enable growl support.
|
985
|
+
*
|
986
|
+
* @api private
|
987
|
+
*/
|
988
|
+
|
989
|
+
Mocha.prototype.growl = function(runner, reporter) {
|
990
|
+
var notify = require('growl');
|
991
|
+
|
992
|
+
runner.on('end', function(){
|
993
|
+
var stats = reporter.stats;
|
994
|
+
if (stats.failures) {
|
995
|
+
var msg = stats.failures + ' of ' + runner.total + ' tests failed';
|
996
|
+
notify(msg, { title: 'Failed', image: image('fail') });
|
997
|
+
} else {
|
998
|
+
notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', {
|
999
|
+
title: 'Passed'
|
1000
|
+
, image: image('pass')
|
1001
|
+
});
|
1002
|
+
}
|
1003
|
+
});
|
1004
|
+
};
|
1005
|
+
|
1006
|
+
/**
|
1007
|
+
* Run tests and invoke `fn()` when complete.
|
1008
|
+
*
|
1009
|
+
* @param {Function} fn
|
1010
|
+
* @return {Runner}
|
1011
|
+
* @api public
|
1012
|
+
*/
|
1013
|
+
|
1014
|
+
Mocha.prototype.run = function(fn){
|
1015
|
+
this.loadFiles();
|
1016
|
+
var suite = this.suite;
|
1017
|
+
var options = this.options;
|
1018
|
+
var runner = new exports.Runner(suite);
|
1019
|
+
var reporter = new this._reporter(runner);
|
1020
|
+
runner.ignoreLeaks = options.ignoreLeaks;
|
1021
|
+
if (options.grep) runner.grep(options.grep);
|
1022
|
+
if (options.globals) runner.globals(options.globals);
|
1023
|
+
if (options.growl) this.growl(runner, reporter);
|
1024
|
+
return runner.run(fn);
|
1025
|
+
};
|
1026
|
+
|
873
1027
|
}); // module: mocha.js
|
874
1028
|
|
875
1029
|
require.register("reporters/base.js", function(module, exports, require){
|
@@ -1047,7 +1201,7 @@ exports.list = function(failures){
|
|
1047
1201
|
}
|
1048
1202
|
|
1049
1203
|
// indent stack trace without msg
|
1050
|
-
stack = stack.slice(index + 1)
|
1204
|
+
stack = stack.slice(index ? index + 1 : index)
|
1051
1205
|
.replace(/^/gm, ' ');
|
1052
1206
|
|
1053
1207
|
console.error(fmt, (i + 1), test.fullTitle(), msg, stack);
|
@@ -1488,12 +1642,22 @@ function HTML(runner) {
|
|
1488
1642
|
var el = fragment('<div class="test pass pending"><h2>%e</h2></div>', test.title);
|
1489
1643
|
} else {
|
1490
1644
|
var el = fragment('<div class="test fail"><h2>%e</h2></div>', test.title);
|
1491
|
-
var str = test.err.stack || test.err;
|
1645
|
+
var str = test.err.stack || test.err.toString();
|
1646
|
+
|
1647
|
+
// FF / Opera do not add the message
|
1648
|
+
if (!~str.indexOf(test.err.message)) {
|
1649
|
+
str = test.err.message + '\n' + str;
|
1650
|
+
}
|
1492
1651
|
|
1493
1652
|
// <=IE7 stringifies to [Object Error]. Since it can be overloaded, we
|
1494
1653
|
// check for the result of the stringifying.
|
1495
1654
|
if ('[object Error]' == str) str = test.err.message;
|
1496
1655
|
|
1656
|
+
// Safari doesn't give you a stack. Let's at least provide a source line.
|
1657
|
+
if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) {
|
1658
|
+
str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")";
|
1659
|
+
}
|
1660
|
+
|
1497
1661
|
el.appendChild(fragment('<pre class="error">%e</pre>', str));
|
1498
1662
|
}
|
1499
1663
|
|
@@ -1600,6 +1764,7 @@ exports.TAP = require('./tap');
|
|
1600
1764
|
exports.JSON = require('./json');
|
1601
1765
|
exports.HTML = require('./html');
|
1602
1766
|
exports.List = require('./list');
|
1767
|
+
exports.Min = require('./min');
|
1603
1768
|
exports.Spec = require('./spec');
|
1604
1769
|
exports.Progress = require('./progress');
|
1605
1770
|
exports.Landing = require('./landing');
|
@@ -1607,6 +1772,7 @@ exports.JSONCov = require('./json-cov');
|
|
1607
1772
|
exports.HTMLCov = require('./html-cov');
|
1608
1773
|
exports.JSONStream = require('./json-stream');
|
1609
1774
|
exports.XUnit = require('./xunit')
|
1775
|
+
exports.Teamcity = require('./teamcity')
|
1610
1776
|
|
1611
1777
|
}); // module: reporters/index.js
|
1612
1778
|
|
@@ -2072,6 +2238,162 @@ List.prototype.constructor = List;
|
|
2072
2238
|
|
2073
2239
|
}); // module: reporters/list.js
|
2074
2240
|
|
2241
|
+
require.register("reporters/markdown.js", function(module, exports, require){
|
2242
|
+
|
2243
|
+
/**
|
2244
|
+
* Module dependencies.
|
2245
|
+
*/
|
2246
|
+
|
2247
|
+
var Base = require('./base')
|
2248
|
+
, utils = require('../utils');
|
2249
|
+
|
2250
|
+
/**
|
2251
|
+
* Expose `Markdown`.
|
2252
|
+
*/
|
2253
|
+
|
2254
|
+
exports = module.exports = Markdown;
|
2255
|
+
|
2256
|
+
/**
|
2257
|
+
* Initialize a new `Markdown` reporter.
|
2258
|
+
*
|
2259
|
+
* @param {Runner} runner
|
2260
|
+
* @api public
|
2261
|
+
*/
|
2262
|
+
|
2263
|
+
function Markdown(runner) {
|
2264
|
+
Base.call(this, runner);
|
2265
|
+
|
2266
|
+
var self = this
|
2267
|
+
, stats = this.stats
|
2268
|
+
, total = runner.total
|
2269
|
+
, level = 0
|
2270
|
+
, buf = '';
|
2271
|
+
|
2272
|
+
function title(str) {
|
2273
|
+
return Array(level).join('#') + ' ' + str;
|
2274
|
+
}
|
2275
|
+
|
2276
|
+
function indent() {
|
2277
|
+
return Array(level).join(' ');
|
2278
|
+
}
|
2279
|
+
|
2280
|
+
function mapTOC(suite, obj) {
|
2281
|
+
var ret = obj;
|
2282
|
+
obj = obj[suite.title] = obj[suite.title] || { suite: suite };
|
2283
|
+
suite.suites.forEach(function(suite){
|
2284
|
+
mapTOC(suite, obj);
|
2285
|
+
});
|
2286
|
+
return ret;
|
2287
|
+
}
|
2288
|
+
|
2289
|
+
function stringifyTOC(obj, level) {
|
2290
|
+
++level;
|
2291
|
+
var buf = '';
|
2292
|
+
var link;
|
2293
|
+
for (var key in obj) {
|
2294
|
+
if ('suite' == key) continue;
|
2295
|
+
if (key) link = ' - [' + key + '](#' + utils.slug(obj[key].suite.fullTitle()) + ')\n';
|
2296
|
+
if (key) buf += Array(level).join(' ') + link;
|
2297
|
+
buf += stringifyTOC(obj[key], level);
|
2298
|
+
}
|
2299
|
+
--level;
|
2300
|
+
return buf;
|
2301
|
+
}
|
2302
|
+
|
2303
|
+
function generateTOC(suite) {
|
2304
|
+
var obj = mapTOC(suite, {});
|
2305
|
+
return stringifyTOC(obj, 0);
|
2306
|
+
}
|
2307
|
+
|
2308
|
+
generateTOC(runner.suite);
|
2309
|
+
|
2310
|
+
runner.on('suite', function(suite){
|
2311
|
+
++level;
|
2312
|
+
var slug = utils.slug(suite.fullTitle());
|
2313
|
+
buf += '<a name="' + slug + '" />' + '\n';
|
2314
|
+
buf += title(suite.title) + '\n';
|
2315
|
+
});
|
2316
|
+
|
2317
|
+
runner.on('suite end', function(suite){
|
2318
|
+
--level;
|
2319
|
+
});
|
2320
|
+
|
2321
|
+
runner.on('pass', function(test){
|
2322
|
+
var code = clean(test.fn.toString());
|
2323
|
+
buf += test.title + '.\n';
|
2324
|
+
buf += '\n```js';
|
2325
|
+
buf += code + '\n';
|
2326
|
+
buf += '```\n\n';
|
2327
|
+
});
|
2328
|
+
|
2329
|
+
runner.on('end', function(){
|
2330
|
+
process.stdout.write('# TOC\n');
|
2331
|
+
process.stdout.write(generateTOC(runner.suite));
|
2332
|
+
process.stdout.write(buf);
|
2333
|
+
});
|
2334
|
+
}
|
2335
|
+
|
2336
|
+
/**
|
2337
|
+
* Strip the function definition from `str`,
|
2338
|
+
* and re-indent for pre whitespace.
|
2339
|
+
*/
|
2340
|
+
|
2341
|
+
function clean(str) {
|
2342
|
+
str = str
|
2343
|
+
.replace(/^function *\(.*\) *{/, '')
|
2344
|
+
.replace(/\s+\}$/, '');
|
2345
|
+
|
2346
|
+
var spaces = str.match(/^\n?( *)/)[1].length
|
2347
|
+
, re = new RegExp('^ {' + spaces + '}', 'gm');
|
2348
|
+
|
2349
|
+
str = str.replace(re, '');
|
2350
|
+
|
2351
|
+
return str;
|
2352
|
+
}
|
2353
|
+
}); // module: reporters/markdown.js
|
2354
|
+
|
2355
|
+
require.register("reporters/min.js", function(module, exports, require){
|
2356
|
+
/**
|
2357
|
+
* Module dependencies.
|
2358
|
+
*/
|
2359
|
+
|
2360
|
+
var Base = require('./base');
|
2361
|
+
|
2362
|
+
/**
|
2363
|
+
* Expose `Min`.
|
2364
|
+
*/
|
2365
|
+
|
2366
|
+
exports = module.exports = Min;
|
2367
|
+
|
2368
|
+
/**
|
2369
|
+
* Initialize a new `Min` minimal test reporter (best used with --watch).
|
2370
|
+
*
|
2371
|
+
* @param {Runner} runner
|
2372
|
+
* @api public
|
2373
|
+
*/
|
2374
|
+
|
2375
|
+
function Min(runner) {
|
2376
|
+
Base.call(this, runner);
|
2377
|
+
|
2378
|
+
runner.on('start', function(){
|
2379
|
+
// clear screen
|
2380
|
+
process.stdout.write('\033[2J');
|
2381
|
+
// set cursor position
|
2382
|
+
process.stdout.write('\033[1;3H');
|
2383
|
+
});
|
2384
|
+
|
2385
|
+
runner.on('end', this.epilogue.bind(this));
|
2386
|
+
}
|
2387
|
+
|
2388
|
+
/**
|
2389
|
+
* Inherit from `Base.prototype`.
|
2390
|
+
*/
|
2391
|
+
|
2392
|
+
Min.prototype = new Base;
|
2393
|
+
Min.prototype.constructor = Min;
|
2394
|
+
|
2395
|
+
}); // module: reporters/min.js
|
2396
|
+
|
2075
2397
|
require.register("reporters/progress.js", function(module, exports, require){
|
2076
2398
|
|
2077
2399
|
/**
|
@@ -3579,6 +3901,20 @@ exports.files = function(dir, ret){
|
|
3579
3901
|
|
3580
3902
|
return ret;
|
3581
3903
|
};
|
3904
|
+
|
3905
|
+
/**
|
3906
|
+
* Compute a slug from the given `str`.
|
3907
|
+
*
|
3908
|
+
* @param {String} str
|
3909
|
+
* @return {String}
|
3910
|
+
*/
|
3911
|
+
|
3912
|
+
exports.slug = function(str){
|
3913
|
+
return str
|
3914
|
+
.toLowerCase()
|
3915
|
+
.replace(/ +/g, '-')
|
3916
|
+
.replace(/[^-\w]/g, '');
|
3917
|
+
};
|
3582
3918
|
}); // module: utils.js
|
3583
3919
|
|
3584
3920
|
/**
|
@@ -3652,6 +3988,7 @@ window.mocha = require('mocha');
|
|
3652
3988
|
;(function(){
|
3653
3989
|
var suite = new mocha.Suite('', new mocha.Context)
|
3654
3990
|
, utils = mocha.utils
|
3991
|
+
, options = {}
|
3655
3992
|
|
3656
3993
|
/**
|
3657
3994
|
* Highlight the given string of `js`.
|
@@ -3696,12 +4033,16 @@ window.mocha = require('mocha');
|
|
3696
4033
|
}
|
3697
4034
|
|
3698
4035
|
/**
|
3699
|
-
* Setup mocha with the
|
4036
|
+
* Setup mocha with the given setting options.
|
3700
4037
|
*/
|
3701
4038
|
|
3702
|
-
mocha.setup = function(
|
3703
|
-
ui =
|
4039
|
+
mocha.setup = function(opts){
|
4040
|
+
if ('string' === typeof opts) options.ui = opts;
|
4041
|
+
else options = opts;
|
4042
|
+
|
4043
|
+
ui = mocha.interfaces[options.ui];
|
3704
4044
|
if (!ui) throw new Error('invalid mocha interface "' + ui + '"');
|
4045
|
+
if (options.timeout) suite.timeout(options.timeout);
|
3705
4046
|
ui(suite);
|
3706
4047
|
suite.emit('pre-require', window);
|
3707
4048
|
};
|
@@ -3710,13 +4051,16 @@ window.mocha = require('mocha');
|
|
3710
4051
|
* Run mocha, returning the Runner.
|
3711
4052
|
*/
|
3712
4053
|
|
3713
|
-
mocha.run = function(
|
4054
|
+
mocha.run = function(){
|
3714
4055
|
suite.emit('run');
|
3715
4056
|
var runner = new mocha.Runner(suite);
|
3716
|
-
Reporter =
|
4057
|
+
var Reporter = options.reporter || mocha.reporters.HTML;
|
3717
4058
|
var reporter = new Reporter(runner);
|
3718
4059
|
var query = parse(window.location.search || "");
|
3719
4060
|
if (query.grep) runner.grep(new RegExp(query.grep));
|
4061
|
+
if (options.ignoreLeaks) runner.ignoreLeaks = true;
|
4062
|
+
if (options.globals) runner.globals(options.globals);
|
4063
|
+
runner.globals(['location']);
|
3720
4064
|
runner.on('end', highlightCode);
|
3721
4065
|
return runner.run();
|
3722
4066
|
};
|