teabag 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +6 -4
- data/app/assets/javascripts/teabag-jasmine.js +2 -2
- data/app/assets/javascripts/teabag-mocha.js +348 -21
- data/app/assets/javascripts/teabag-qunit.js +2 -2
- data/app/assets/javascripts/teabag/mocha.coffee +1 -1
- data/app/controllers/teabag/spec_controller.rb +1 -1
- data/lib/teabag/console.rb +15 -15
- data/lib/teabag/formatters/base_formatter.rb +1 -0
- data/lib/teabag/formatters/clean_formatter.rb +13 -0
- data/lib/teabag/server.rb +1 -0
- data/lib/teabag/suite.rb +22 -1
- data/lib/teabag/version.rb +1 -1
- data/spec/dummy/log/development.log +4342 -0
- data/spec/dummy/log/test.log +1760 -0
- data/spec/dummy/tmp/cache/assets/C35/A30/sprockets%2F29906bf540f7d2e081088494b2554989 +0 -0
- data/spec/dummy/tmp/cache/assets/C4E/9B0/sprockets%2Fa807397434c9262c3d62da3e91152184 +0 -0
- data/spec/dummy/tmp/cache/assets/C59/250/sprockets%2Fa80d3fe493d2476e58c4323996064512 +0 -0
- data/spec/dummy/tmp/cache/assets/C75/D50/sprockets%2F5302968a40e08d2c011aa38666d273f6 +0 -0
- data/spec/dummy/tmp/cache/assets/C78/F80/sprockets%2F9161622ddd251097a4ab816b8220984c +0 -0
- data/spec/dummy/tmp/cache/assets/C7A/EC0/sprockets%2F5c16e4214f5662e1b27932a57c43491b +0 -0
- data/spec/dummy/tmp/cache/assets/C89/700/sprockets%2F259935a7704fef0069303ea63fa89408 +0 -0
- data/spec/dummy/tmp/cache/assets/C8A/460/sprockets%2F77bffd9959420103906722b404ae8d59 +0 -0
- data/spec/dummy/tmp/cache/assets/C91/FA0/sprockets%2F2eb81283f5789ae91a69344552db3856 +0 -0
- data/spec/dummy/tmp/cache/assets/C9D/E90/sprockets%2F3045c9533f179d3e1c805d163ed002a0 +0 -0
- data/spec/dummy/tmp/cache/assets/CA6/DF0/sprockets%2F7da83747ce56e49393b6b8726587f846 +0 -0
- data/spec/dummy/tmp/cache/assets/CA9/C40/sprockets%2F932b7e2cd1e067289ab51190800814df +0 -0
- data/spec/dummy/tmp/cache/assets/CAA/0C0/sprockets%2F057b0ce384f16d9202ae84473436cc35 +0 -0
- data/spec/dummy/tmp/cache/assets/CAD/410/sprockets%2F651414e5c7e86f05c5108dc71626b25c +0 -0
- data/spec/dummy/tmp/cache/assets/CAF/0F0/sprockets%2F6000e67cf3f2377f860c24da7c819701 +0 -0
- data/spec/dummy/tmp/cache/assets/CB0/700/sprockets%2F006af6bf0f6b55777b03c4615c853881 +0 -0
- data/spec/dummy/tmp/cache/assets/CBB/FA0/sprockets%2F74922109263bdc965b2e9567eec6d154 +0 -0
- data/spec/dummy/tmp/cache/assets/CBD/AF0/sprockets%2Fd687ec33822256e9444e8cd04f1b4873 +0 -0
- data/spec/dummy/tmp/cache/assets/CBF/630/sprockets%2F707d2db81468088470d476abff35388d +0 -0
- data/spec/dummy/tmp/cache/assets/CC2/EC0/sprockets%2F76bf80cb571ca530357f78db78167866 +0 -0
- data/spec/dummy/tmp/cache/assets/CCE/C50/sprockets%2Fe12774c2fea852112414bb379a71f31a +0 -0
- data/spec/dummy/tmp/cache/assets/CD3/460/sprockets%2F7f3f6802b0b309ed142d0b671c9640c4 +0 -0
- data/spec/dummy/tmp/cache/assets/CD9/DD0/sprockets%2Fe5774759168a731da1c1149ecf0e1b03 +0 -0
- data/spec/dummy/tmp/cache/assets/CE0/090/sprockets%2F48d5d35ae87d0723318b8bc257fa2237 +0 -0
- data/spec/dummy/tmp/cache/assets/CE3/1F0/sprockets%2Fe69a515d3a9d14c669be8871012a7d07 +0 -0
- data/spec/dummy/tmp/cache/assets/CE6/270/sprockets%2F2c98152560d18470fec8cf4c6829b4d0 +0 -0
- data/spec/dummy/tmp/cache/assets/CE6/7C0/sprockets%2Fa03a2c86ce6724be8542295e1cf24798 +0 -0
- data/spec/dummy/tmp/cache/assets/CE7/A60/sprockets%2Ff58eee249aa167d23f8220087bb46684 +0 -0
- data/spec/dummy/tmp/cache/assets/CE9/9E0/sprockets%2F135480d497ed7e4884462dc0ef0b80d7 +0 -0
- data/spec/dummy/tmp/cache/assets/CEB/680/sprockets%2F67f0794ef8c0576d5c7da34f4437305a +0 -0
- data/spec/dummy/tmp/cache/assets/CEB/B40/sprockets%2F1150bf8d912aa100a132251eefaf6045 +0 -0
- data/spec/dummy/tmp/cache/assets/CEE/930/sprockets%2Fe196521e15fd8d33e3261d5538fe8f92 +0 -0
- data/spec/dummy/tmp/cache/assets/CF4/6F0/sprockets%2Fed96f92571224b862b84d7078b86ded3 +0 -0
- data/spec/dummy/tmp/cache/assets/CF8/780/sprockets%2F8845b81ff27cdb57c835836c9f91a265 +0 -0
- data/spec/dummy/tmp/cache/assets/CFA/D20/sprockets%2Fb26796b39b3c5d6ed70be7989637a493 +0 -0
- data/spec/dummy/tmp/cache/assets/CFB/210/sprockets%2F9104695bfbf9a9d4b94382e6e90487a9 +0 -0
- data/spec/dummy/tmp/cache/assets/CFC/380/sprockets%2Fa7443cbd671446a589867dd5f4a4f989 +0 -0
- data/spec/dummy/tmp/cache/assets/D00/110/sprockets%2F6a6353b7723a8b21708e0fbfe04bd422 +0 -0
- data/spec/dummy/tmp/cache/assets/D03/630/sprockets%2F5d8da32dba6a7be70426a1d554773701 +0 -0
- data/spec/dummy/tmp/cache/assets/D04/170/sprockets%2F76ab1dc02e6c7618852708a1e05a2df3 +0 -0
- data/spec/dummy/tmp/cache/assets/D04/480/sprockets%2F8bd8f10500b21d2f9d94e4cd1401c936 +0 -0
- data/spec/dummy/tmp/cache/assets/D05/8D0/sprockets%2F319f8f235f452343f1ebf03cb262d23d +0 -0
- data/spec/dummy/tmp/cache/assets/D09/BF0/sprockets%2F9e6bca5d26f50d9484385d51ba04312c +0 -0
- data/spec/dummy/tmp/cache/assets/D0E/570/sprockets%2F90fe371bf8091e88a712124d9cdae260 +0 -0
- data/spec/dummy/tmp/cache/assets/D15/4D0/sprockets%2Fdf269dd57c774b930679e00131ca9ae4 +0 -0
- data/spec/dummy/tmp/cache/assets/D15/750/sprockets%2F8effdd3e668a4036260a3e370f3b6657 +0 -0
- data/spec/dummy/tmp/cache/assets/D17/710/sprockets%2Ffa49fb6823d466e79a195e0cd71340c5 +0 -0
- data/spec/dummy/tmp/cache/assets/D1A/D30/sprockets%2F815a5177e9edba0c5c996182ef1b3675 +0 -0
- data/spec/dummy/tmp/cache/assets/D1D/560/sprockets%2F1ca784ee7ba1922465147e7f8963eae5 +0 -0
- data/spec/dummy/tmp/cache/assets/D1E/AA0/sprockets%2F5c8741a556bc955cd36e61c88582b6dc +0 -0
- data/spec/dummy/tmp/cache/assets/D31/9C0/sprockets%2Fbd102a4f5a4985c3519dd6ab0295a1c6 +0 -0
- data/spec/dummy/tmp/cache/assets/D35/7C0/sprockets%2Ff536a2606eaf7d542c0985104cb62baf +0 -0
- data/spec/dummy/tmp/cache/assets/D37/FF0/sprockets%2F96841ca4cfae32c515077f3f5fc303b2 +0 -0
- data/spec/dummy/tmp/cache/assets/D3C/840/sprockets%2Fc6202ec91d567a85bd3d46dc43ea9108 +0 -0
- data/spec/dummy/tmp/cache/assets/D44/E90/sprockets%2F05cfc0bf7c9938963d1d1c63248db80d +0 -0
- data/spec/dummy/tmp/cache/assets/D45/C30/sprockets%2Fcc744877558178a3adb77c441cadce70 +0 -0
- data/spec/dummy/tmp/cache/assets/D47/A90/sprockets%2Fe7ca382b607c595ea6505853f7fb63da +0 -0
- data/spec/dummy/tmp/cache/assets/D49/1F0/sprockets%2F773b56f87127c6605e7d1d3faf2b6af6 +0 -0
- data/spec/dummy/tmp/cache/assets/D49/A10/sprockets%2Fc4656bd995a6f297c26d19b13aadb963 +0 -0
- data/spec/dummy/tmp/cache/assets/D50/D70/sprockets%2Fe2a3e6c95b11e0801a4eebae3a026026 +0 -0
- data/spec/dummy/tmp/cache/assets/D51/400/sprockets%2Ff5e433d8a31e80985b75ce598de236be +0 -0
- data/spec/dummy/tmp/cache/assets/D54/D80/sprockets%2F631327e25ec20edc723046cdec3bb1c0 +0 -0
- data/spec/dummy/tmp/cache/assets/D5A/140/sprockets%2F01f728f33e9bd12104d3b0b1dc7df0a9 +0 -0
- data/spec/dummy/tmp/cache/assets/D5C/710/sprockets%2F9427d05cee2caa721241a25a9af1d08f +0 -0
- data/spec/dummy/tmp/cache/assets/D5C/CC0/sprockets%2Faa8bf6de211f2765b0a26f112b971f0c +0 -0
- data/spec/dummy/tmp/cache/assets/D5E/FA0/sprockets%2Fc81c371ae2d61a6aa1708262fba79e0d +0 -0
- data/spec/dummy/tmp/cache/assets/D61/1F0/sprockets%2F0c7a6176d2fc4db00bb9a74d36380fe1 +0 -0
- data/spec/dummy/tmp/cache/assets/D67/BC0/sprockets%2F35d2c2b45981ade5a2db2a9c7f37a615 +0 -0
- data/spec/dummy/tmp/cache/assets/D69/F90/sprockets%2F6a0795b7b38bd7e6142cd1b88211dade +0 -0
- data/spec/dummy/tmp/cache/assets/D6A/950/sprockets%2F429b1806cb7580ebf29f9a12c33cbea6 +0 -0
- data/spec/dummy/tmp/cache/assets/D6D/DA0/sprockets%2Fac936bf40b42227a2bf9d474ae9ec149 +0 -0
- data/spec/dummy/tmp/cache/assets/D77/B30/sprockets%2F946cf2f17c7eb41037f9ee08ad67ec40 +0 -0
- data/spec/dummy/tmp/cache/assets/D78/2F0/sprockets%2F3c61f8915b8f717b1de788e6ecad122c +0 -0
- data/spec/dummy/tmp/cache/assets/D7E/C10/sprockets%2F747c98c3cc7494a62dd882752adffb2b +0 -0
- data/spec/dummy/tmp/cache/assets/D8C/520/sprockets%2F221cd58a042baac534d27e4cfedc1188 +0 -0
- data/spec/dummy/tmp/cache/assets/D8D/370/sprockets%2Fc8ecf0a54ad40917d2607b0d5a6bbb27 +0 -0
- data/spec/dummy/tmp/cache/assets/D93/BD0/sprockets%2Ff5e1b60201e08e3ddf8d3de5211f3d5e +0 -0
- data/spec/dummy/tmp/cache/assets/DA0/330/sprockets%2Fcbbb4de706387d50f48a72ee6c9c1b80 +0 -0
- data/spec/dummy/tmp/cache/assets/DA5/0A0/sprockets%2F7a4b5928cec69ab65afff309a04d6b47 +0 -0
- data/spec/dummy/tmp/cache/assets/DAE/6C0/sprockets%2F77c7a8676aeefa73156c55dfcf51cc46 +0 -0
- data/spec/dummy/tmp/cache/assets/DB5/040/sprockets%2F9a9da5df88713663b9fbc945facca891 +0 -0
- data/spec/dummy/tmp/cache/assets/DC3/230/sprockets%2Fdf52e72eb73be91eccc60182191aed0b +0 -0
- data/spec/dummy/tmp/cache/assets/DC7/A10/sprockets%2F84a8af0fcbf401864e1ae5bf092cba94 +0 -0
- data/spec/dummy/tmp/cache/assets/DCD/EB0/sprockets%2F4f77f509126ecbced7ea2a5ab290c8d4 +0 -0
- data/spec/dummy/tmp/cache/assets/DDB/EF0/sprockets%2Fe790bb18b64df8aa0a9fe94642a9edd8 +0 -0
- data/spec/dummy/tmp/cache/assets/DDF/2A0/sprockets%2Fbdb1c7e9d59fd44828d498bee2e1da91 +0 -0
- data/spec/dummy/tmp/cache/assets/DE4/140/sprockets%2F139e4ab85d1aacb22c115fa136afdc8a +0 -0
- data/spec/dummy/tmp/cache/assets/DEB/110/sprockets%2F2dbdab0ce5babca645cdb5780004f875 +0 -0
- data/spec/dummy/tmp/cache/assets/DF6/0E0/sprockets%2F85b10db6e1afe643aba6d396abdd77f0 +0 -0
- data/spec/dummy/tmp/cache/assets/DF7/E10/sprockets%2F25e4253aba9a9adcefb72552fb1ff0c8 +0 -0
- data/spec/dummy/tmp/cache/assets/DFC/C20/sprockets%2Fd9178ad7e3b401c9fceafd64ea2b50d6 +0 -0
- data/spec/dummy/tmp/cache/assets/DFC/C30/sprockets%2Fb50a07cb30b0bd0eec8e98e5de79d65d +0 -0
- data/spec/dummy/tmp/cache/assets/E02/6E0/sprockets%2F63d6a5cdb8cefa64ef76b5c6e0fd3720 +0 -0
- data/spec/dummy/tmp/cache/assets/E08/BB0/sprockets%2Fefac99af1af28543aef6fb607faa4973 +0 -0
- data/spec/dummy/tmp/cache/assets/E08/F20/sprockets%2F4fc5cdcd6974efe7adfe809b30bd6513 +0 -0
- data/spec/dummy/tmp/cache/assets/E16/D30/sprockets%2Fd69469e6e7439baacd8df989c0fdacc2 +0 -0
- data/spec/dummy/tmp/cache/assets/E17/EF0/sprockets%2Fa291ad64a26afd055dfadabbdf03f154 +0 -0
- data/spec/dummy/tmp/cache/assets/E2F/790/sprockets%2F7fac280deaa7ef20a77d5c9b5b9cfc34 +0 -0
- data/spec/dummy/tmp/cache/assets/E36/A40/sprockets%2Ff3477eebd69a4f1b8fbdd3f9ef2ba242 +0 -0
- data/spec/dummy/tmp/cache/assets/E41/250/sprockets%2F97cf8fe3d7ffaff076f655aefb36da03 +0 -0
- data/spec/dummy/tmp/cache/assets/E64/1E0/sprockets%2F81ab4c863fbbdec8dd66afc97ebf034d +0 -0
- data/spec/dummy/tmp/cache/assets/E6E/260/sprockets%2Fd9f8ab8b91ef582cc6c99a3ba0dedfe6 +0 -0
- data/spec/dummy/tmp/cache/assets/F79/360/sprockets%2F0ce035fefee5ebdabc8efabfbdbd6ee4 +0 -0
- data/spec/teabag/console_spec.rb +36 -28
- data/spec/teabag/server_spec.rb +4 -2
- data/spec/teabag/suite_spec.rb +40 -1
- data/vendor/assets/javascripts/{mocha-1.7.4.MIT.LICENSE → mocha-1.8.1.MIT.LICENSE} +0 -0
- data/vendor/assets/javascripts/{mocha-1.7.4.js → mocha-1.8.1.js} +346 -19
- data/vendor/assets/javascripts/support/chai.MIT.LICENSE +22 -0
- data/vendor/assets/javascripts/support/chai.js +3809 -0
- data/vendor/assets/javascripts/support/jasmine-jquery.js +13 -10
- metadata +17 -6
data/README.md
CHANGED
@@ -389,16 +389,18 @@ Specify if you want color output by default.
|
|
389
389
|
|
390
390
|
We know that testing usually requires more than just the test framework, so we've included some of the libraries that we use on a regular basis.
|
391
391
|
|
392
|
-
- [
|
393
|
-
- [
|
394
|
-
- [
|
392
|
+
- [Sinon.JS](http://sinonjs.org) Standalone test spies, stubs and mocks for JavaScript. No dependencies, works with any unit testing framework.
|
393
|
+
- [ChaiJS](http://chaijs.com/) BDD / TDD assertion library for node and the browser that can be delightfully paired with any javascript testing framework.
|
394
|
+
- [expect.js](https://github.com/LearnBoost/expect.js) Minimalistic BDD assertion toolkit based on should.js.
|
395
|
+
- [jasmine-jquery.js](https://github.com/velesin/jasmine-jquery) A set of custom matchers for jQuery, and an API for handling HTML fixtures in your specs.
|
395
396
|
|
396
397
|
You can require these files in your spec helper by using:
|
397
398
|
|
398
399
|
```javascript
|
399
|
-
//=require support/jasmine-jquery
|
400
400
|
//=require support/sinon
|
401
|
+
//=require support/chai
|
401
402
|
//=require support/expect
|
403
|
+
//=require support/jasmine-jquery
|
402
404
|
```
|
403
405
|
|
404
406
|
|
@@ -3022,7 +3022,7 @@ jasmine.version_= {
|
|
3022
3022
|
_ref = Teabag.suites.all;
|
3023
3023
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
3024
3024
|
suite = _ref[_i];
|
3025
|
-
options.push("<option" + (Teabag.suites.active === suite ? " selected='selected'" : "") + " value=\"" + suite + "\">" + suite + "
|
3025
|
+
options.push("<option" + (Teabag.suites.active === suite ? " selected='selected'" : "") + " value=\"" + suite + "\">" + suite + "</option>");
|
3026
3026
|
}
|
3027
3027
|
return "<select id=\"teabag-suite-select\">" + (options.join("")) + "</select>";
|
3028
3028
|
};
|
@@ -3036,7 +3036,7 @@ jasmine.version_= {
|
|
3036
3036
|
if (this.filters.length) {
|
3037
3037
|
this.setClass("filter", "teabag-filtered");
|
3038
3038
|
}
|
3039
|
-
return this.setHtml("filter-list", "<li>" + (this.filters.join("</li><li>"))
|
3039
|
+
return this.setHtml("filter-list", "<li>" + (this.filters.join("</li><li>")), true);
|
3040
3040
|
};
|
3041
3041
|
|
3042
3042
|
HTML.prototype.reportRunnerStarting = function(runner) {
|
@@ -58,6 +58,293 @@
|
|
58
58
|
}); // module: browser/debug.js
|
59
59
|
|
60
60
|
require.register("browser/diff.js", function(module, exports, require){
|
61
|
+
/* See license.txt for terms of usage */
|
62
|
+
|
63
|
+
/*
|
64
|
+
* Text diff implementation.
|
65
|
+
*
|
66
|
+
* This library supports the following APIS:
|
67
|
+
* JsDiff.diffChars: Character by character diff
|
68
|
+
* JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace
|
69
|
+
* JsDiff.diffLines: Line based diff
|
70
|
+
*
|
71
|
+
* JsDiff.diffCss: Diff targeted at CSS content
|
72
|
+
*
|
73
|
+
* These methods are based on the implementation proposed in
|
74
|
+
* "An O(ND) Difference Algorithm and its Variations" (Myers, 1986).
|
75
|
+
* http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927
|
76
|
+
*/
|
77
|
+
var JsDiff = (function() {
|
78
|
+
function clonePath(path) {
|
79
|
+
return { newPos: path.newPos, components: path.components.slice(0) };
|
80
|
+
}
|
81
|
+
function removeEmpty(array) {
|
82
|
+
var ret = [];
|
83
|
+
for (var i = 0; i < array.length; i++) {
|
84
|
+
if (array[i]) {
|
85
|
+
ret.push(array[i]);
|
86
|
+
}
|
87
|
+
}
|
88
|
+
return ret;
|
89
|
+
}
|
90
|
+
function escapeHTML(s) {
|
91
|
+
var n = s;
|
92
|
+
n = n.replace(/&/g, "&");
|
93
|
+
n = n.replace(/</g, "<");
|
94
|
+
n = n.replace(/>/g, ">");
|
95
|
+
n = n.replace(/"/g, """);
|
96
|
+
|
97
|
+
return n;
|
98
|
+
}
|
99
|
+
|
100
|
+
|
101
|
+
var fbDiff = function(ignoreWhitespace) {
|
102
|
+
this.ignoreWhitespace = ignoreWhitespace;
|
103
|
+
};
|
104
|
+
fbDiff.prototype = {
|
105
|
+
diff: function(oldString, newString) {
|
106
|
+
// Handle the identity case (this is due to unrolling editLength == 0
|
107
|
+
if (newString == oldString) {
|
108
|
+
return [{ value: newString }];
|
109
|
+
}
|
110
|
+
if (!newString) {
|
111
|
+
return [{ value: oldString, removed: true }];
|
112
|
+
}
|
113
|
+
if (!oldString) {
|
114
|
+
return [{ value: newString, added: true }];
|
115
|
+
}
|
116
|
+
|
117
|
+
newString = this.tokenize(newString);
|
118
|
+
oldString = this.tokenize(oldString);
|
119
|
+
|
120
|
+
var newLen = newString.length, oldLen = oldString.length;
|
121
|
+
var maxEditLength = newLen + oldLen;
|
122
|
+
var bestPath = [{ newPos: -1, components: [] }];
|
123
|
+
|
124
|
+
// Seed editLength = 0
|
125
|
+
var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);
|
126
|
+
if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) {
|
127
|
+
return bestPath[0].components;
|
128
|
+
}
|
129
|
+
|
130
|
+
for (var editLength = 1; editLength <= maxEditLength; editLength++) {
|
131
|
+
for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) {
|
132
|
+
var basePath;
|
133
|
+
var addPath = bestPath[diagonalPath-1],
|
134
|
+
removePath = bestPath[diagonalPath+1];
|
135
|
+
oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;
|
136
|
+
if (addPath) {
|
137
|
+
// No one else is going to attempt to use this value, clear it
|
138
|
+
bestPath[diagonalPath-1] = undefined;
|
139
|
+
}
|
140
|
+
|
141
|
+
var canAdd = addPath && addPath.newPos+1 < newLen;
|
142
|
+
var canRemove = removePath && 0 <= oldPos && oldPos < oldLen;
|
143
|
+
if (!canAdd && !canRemove) {
|
144
|
+
bestPath[diagonalPath] = undefined;
|
145
|
+
continue;
|
146
|
+
}
|
147
|
+
|
148
|
+
// Select the diagonal that we want to branch from. We select the prior
|
149
|
+
// path whose position in the new string is the farthest from the origin
|
150
|
+
// and does not pass the bounds of the diff graph
|
151
|
+
if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) {
|
152
|
+
basePath = clonePath(removePath);
|
153
|
+
this.pushComponent(basePath.components, oldString[oldPos], undefined, true);
|
154
|
+
} else {
|
155
|
+
basePath = clonePath(addPath);
|
156
|
+
basePath.newPos++;
|
157
|
+
this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined);
|
158
|
+
}
|
159
|
+
|
160
|
+
var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath);
|
161
|
+
|
162
|
+
if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) {
|
163
|
+
return basePath.components;
|
164
|
+
} else {
|
165
|
+
bestPath[diagonalPath] = basePath;
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
},
|
170
|
+
|
171
|
+
pushComponent: function(components, value, added, removed) {
|
172
|
+
var last = components[components.length-1];
|
173
|
+
if (last && last.added === added && last.removed === removed) {
|
174
|
+
// We need to clone here as the component clone operation is just
|
175
|
+
// as shallow array clone
|
176
|
+
components[components.length-1] =
|
177
|
+
{value: this.join(last.value, value), added: added, removed: removed };
|
178
|
+
} else {
|
179
|
+
components.push({value: value, added: added, removed: removed });
|
180
|
+
}
|
181
|
+
},
|
182
|
+
extractCommon: function(basePath, newString, oldString, diagonalPath) {
|
183
|
+
var newLen = newString.length,
|
184
|
+
oldLen = oldString.length,
|
185
|
+
newPos = basePath.newPos,
|
186
|
+
oldPos = newPos - diagonalPath;
|
187
|
+
while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) {
|
188
|
+
newPos++;
|
189
|
+
oldPos++;
|
190
|
+
|
191
|
+
this.pushComponent(basePath.components, newString[newPos], undefined, undefined);
|
192
|
+
}
|
193
|
+
basePath.newPos = newPos;
|
194
|
+
return oldPos;
|
195
|
+
},
|
196
|
+
|
197
|
+
equals: function(left, right) {
|
198
|
+
var reWhitespace = /\S/;
|
199
|
+
if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) {
|
200
|
+
return true;
|
201
|
+
} else {
|
202
|
+
return left == right;
|
203
|
+
}
|
204
|
+
},
|
205
|
+
join: function(left, right) {
|
206
|
+
return left + right;
|
207
|
+
},
|
208
|
+
tokenize: function(value) {
|
209
|
+
return value;
|
210
|
+
}
|
211
|
+
};
|
212
|
+
|
213
|
+
var CharDiff = new fbDiff();
|
214
|
+
|
215
|
+
var WordDiff = new fbDiff(true);
|
216
|
+
WordDiff.tokenize = function(value) {
|
217
|
+
return removeEmpty(value.split(/(\s+|\b)/));
|
218
|
+
};
|
219
|
+
|
220
|
+
var CssDiff = new fbDiff(true);
|
221
|
+
CssDiff.tokenize = function(value) {
|
222
|
+
return removeEmpty(value.split(/([{}:;,]|\s+)/));
|
223
|
+
};
|
224
|
+
|
225
|
+
var LineDiff = new fbDiff();
|
226
|
+
LineDiff.tokenize = function(value) {
|
227
|
+
return value.split(/^/m);
|
228
|
+
};
|
229
|
+
|
230
|
+
return {
|
231
|
+
diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); },
|
232
|
+
diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); },
|
233
|
+
diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); },
|
234
|
+
|
235
|
+
diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); },
|
236
|
+
|
237
|
+
createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) {
|
238
|
+
var ret = [];
|
239
|
+
|
240
|
+
ret.push("Index: " + fileName);
|
241
|
+
ret.push("===================================================================");
|
242
|
+
ret.push("--- " + fileName + (typeof oldHeader === "undefined" ? "" : "\t" + oldHeader));
|
243
|
+
ret.push("+++ " + fileName + (typeof newHeader === "undefined" ? "" : "\t" + newHeader));
|
244
|
+
|
245
|
+
var diff = LineDiff.diff(oldStr, newStr);
|
246
|
+
if (!diff[diff.length-1].value) {
|
247
|
+
diff.pop(); // Remove trailing newline add
|
248
|
+
}
|
249
|
+
diff.push({value: "", lines: []}); // Append an empty value to make cleanup easier
|
250
|
+
|
251
|
+
function contextLines(lines) {
|
252
|
+
return lines.map(function(entry) { return ' ' + entry; });
|
253
|
+
}
|
254
|
+
function eofNL(curRange, i, current) {
|
255
|
+
var last = diff[diff.length-2],
|
256
|
+
isLast = i === diff.length-2,
|
257
|
+
isLastOfType = i === diff.length-3 && (current.added === !last.added || current.removed === !last.removed);
|
258
|
+
|
259
|
+
// Figure out if this is the last line for the given file and missing NL
|
260
|
+
if (!/\n$/.test(current.value) && (isLast || isLastOfType)) {
|
261
|
+
curRange.push('\');
|
262
|
+
}
|
263
|
+
}
|
264
|
+
|
265
|
+
var oldRangeStart = 0, newRangeStart = 0, curRange = [],
|
266
|
+
oldLine = 1, newLine = 1;
|
267
|
+
for (var i = 0; i < diff.length; i++) {
|
268
|
+
var current = diff[i],
|
269
|
+
lines = current.lines || current.value.replace(/\n$/, "").split("\n");
|
270
|
+
current.lines = lines;
|
271
|
+
|
272
|
+
if (current.added || current.removed) {
|
273
|
+
if (!oldRangeStart) {
|
274
|
+
var prev = diff[i-1];
|
275
|
+
oldRangeStart = oldLine;
|
276
|
+
newRangeStart = newLine;
|
277
|
+
|
278
|
+
if (prev) {
|
279
|
+
curRange = contextLines(prev.lines.slice(-4));
|
280
|
+
oldRangeStart -= curRange.length;
|
281
|
+
newRangeStart -= curRange.length;
|
282
|
+
}
|
283
|
+
}
|
284
|
+
curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?"+":"-") + entry; }));
|
285
|
+
eofNL(curRange, i, current);
|
286
|
+
|
287
|
+
if (current.added) {
|
288
|
+
newLine += lines.length;
|
289
|
+
} else {
|
290
|
+
oldLine += lines.length;
|
291
|
+
}
|
292
|
+
} else {
|
293
|
+
if (oldRangeStart) {
|
294
|
+
// Close out any changes that have been output (or join overlapping)
|
295
|
+
if (lines.length <= 8 && i < diff.length-2) {
|
296
|
+
// Overlapping
|
297
|
+
curRange.push.apply(curRange, contextLines(lines));
|
298
|
+
} else {
|
299
|
+
// end the range and output
|
300
|
+
var contextSize = Math.min(lines.length, 4);
|
301
|
+
ret.push(
|
302
|
+
"@@ -" + oldRangeStart + "," + (oldLine-oldRangeStart+contextSize)
|
303
|
+
+ " +" + newRangeStart + "," + (newLine-newRangeStart+contextSize)
|
304
|
+
+ " @@");
|
305
|
+
ret.push.apply(ret, curRange);
|
306
|
+
ret.push.apply(ret, contextLines(lines.slice(0, contextSize)));
|
307
|
+
if (lines.length <= 4) {
|
308
|
+
eofNL(ret, i, current);
|
309
|
+
}
|
310
|
+
|
311
|
+
oldRangeStart = 0; newRangeStart = 0; curRange = [];
|
312
|
+
}
|
313
|
+
}
|
314
|
+
oldLine += lines.length;
|
315
|
+
newLine += lines.length;
|
316
|
+
}
|
317
|
+
}
|
318
|
+
|
319
|
+
return ret.join('\n') + '\n';
|
320
|
+
},
|
321
|
+
|
322
|
+
convertChangesToXML: function(changes){
|
323
|
+
var ret = [];
|
324
|
+
for ( var i = 0; i < changes.length; i++) {
|
325
|
+
var change = changes[i];
|
326
|
+
if (change.added) {
|
327
|
+
ret.push("<ins>");
|
328
|
+
} else if (change.removed) {
|
329
|
+
ret.push("<del>");
|
330
|
+
}
|
331
|
+
|
332
|
+
ret.push(escapeHTML(change.value));
|
333
|
+
|
334
|
+
if (change.added) {
|
335
|
+
ret.push("</ins>");
|
336
|
+
} else if (change.removed) {
|
337
|
+
ret.push("</del>");
|
338
|
+
}
|
339
|
+
}
|
340
|
+
return ret.join("");
|
341
|
+
}
|
342
|
+
};
|
343
|
+
})();
|
344
|
+
|
345
|
+
if (typeof module !== "undefined") {
|
346
|
+
module.exports = JsDiff;
|
347
|
+
}
|
61
348
|
|
62
349
|
}); // module: browser/diff.js
|
63
350
|
|
@@ -494,7 +781,9 @@
|
|
494
781
|
* Inherit from `Runnable.prototype`.
|
495
782
|
*/
|
496
783
|
|
497
|
-
|
784
|
+
function F(){};
|
785
|
+
F.prototype = Runnable.prototype;
|
786
|
+
Hook.prototype = new F;
|
498
787
|
Hook.prototype.constructor = Hook;
|
499
788
|
|
500
789
|
|
@@ -1005,6 +1294,7 @@
|
|
1005
1294
|
* - `reporter` reporter instance, defaults to `mocha.reporters.Dot`
|
1006
1295
|
* - `globals` array of accepted globals
|
1007
1296
|
* - `timeout` timeout in milliseconds
|
1297
|
+
* - `bail` bail on the first test failure
|
1008
1298
|
* - `slow` milliseconds to wait before considering a test slow
|
1009
1299
|
* - `ignoreLeaks` ignore global leaks
|
1010
1300
|
* - `grep` string or regexp to filter tests with
|
@@ -1020,11 +1310,25 @@
|
|
1020
1310
|
this.grep(options.grep);
|
1021
1311
|
this.suite = new exports.Suite('', new exports.Context);
|
1022
1312
|
this.ui(options.ui);
|
1313
|
+
this.bail(options.bail);
|
1023
1314
|
this.reporter(options.reporter);
|
1024
1315
|
if (options.timeout) this.timeout(options.timeout);
|
1025
1316
|
if (options.slow) this.slow(options.slow);
|
1026
1317
|
}
|
1027
1318
|
|
1319
|
+
/**
|
1320
|
+
* Enable or disable bailing on the first failure.
|
1321
|
+
*
|
1322
|
+
* @param {Boolean} [bail]
|
1323
|
+
* @api public
|
1324
|
+
*/
|
1325
|
+
|
1326
|
+
Mocha.prototype.bail = function(bail){
|
1327
|
+
if (0 == arguments.length) bail = true;
|
1328
|
+
this.suite.bail(bail);
|
1329
|
+
return this;
|
1330
|
+
};
|
1331
|
+
|
1028
1332
|
/**
|
1029
1333
|
* Add test `file`.
|
1030
1334
|
*
|
@@ -1040,7 +1344,7 @@
|
|
1040
1344
|
/**
|
1041
1345
|
* Set reporter to `reporter`, defaults to "dot".
|
1042
1346
|
*
|
1043
|
-
* @param {String|Function} reporter name
|
1347
|
+
* @param {String|Function} reporter name or constructor
|
1044
1348
|
* @api public
|
1045
1349
|
*/
|
1046
1350
|
|
@@ -1846,7 +2150,9 @@
|
|
1846
2150
|
* Inherit from `Base.prototype`.
|
1847
2151
|
*/
|
1848
2152
|
|
1849
|
-
|
2153
|
+
function F(){};
|
2154
|
+
F.prototype = Base.prototype;
|
2155
|
+
Dot.prototype = new F;
|
1850
2156
|
Dot.prototype.constructor = Dot;
|
1851
2157
|
|
1852
2158
|
}); // module: reporters/dot.js
|
@@ -2073,7 +2379,7 @@
|
|
2073
2379
|
|
2074
2380
|
on(h2, 'click', function(){
|
2075
2381
|
pre.style.display = 'none' == pre.style.display
|
2076
|
-
? '
|
2382
|
+
? 'block'
|
2077
2383
|
: 'none';
|
2078
2384
|
});
|
2079
2385
|
|
@@ -2578,7 +2884,9 @@
|
|
2578
2884
|
* Inherit from `Base.prototype`.
|
2579
2885
|
*/
|
2580
2886
|
|
2581
|
-
|
2887
|
+
function F(){};
|
2888
|
+
F.prototype = Base.prototype;
|
2889
|
+
Landing.prototype = new F;
|
2582
2890
|
Landing.prototype.constructor = Landing;
|
2583
2891
|
|
2584
2892
|
}); // module: reporters/landing.js
|
@@ -2647,7 +2955,9 @@
|
|
2647
2955
|
* Inherit from `Base.prototype`.
|
2648
2956
|
*/
|
2649
2957
|
|
2650
|
-
|
2958
|
+
function F(){};
|
2959
|
+
F.prototype = Base.prototype;
|
2960
|
+
List.prototype = new F;
|
2651
2961
|
List.prototype.constructor = List;
|
2652
2962
|
|
2653
2963
|
|
@@ -2679,7 +2989,6 @@
|
|
2679
2989
|
|
2680
2990
|
var self = this
|
2681
2991
|
, stats = this.stats
|
2682
|
-
, total = runner.total
|
2683
2992
|
, level = 0
|
2684
2993
|
, buf = '';
|
2685
2994
|
|
@@ -2786,7 +3095,9 @@
|
|
2786
3095
|
* Inherit from `Base.prototype`.
|
2787
3096
|
*/
|
2788
3097
|
|
2789
|
-
|
3098
|
+
function F(){};
|
3099
|
+
F.prototype = Base.prototype;
|
3100
|
+
Min.prototype = new F;
|
2790
3101
|
Min.prototype.constructor = Min;
|
2791
3102
|
|
2792
3103
|
}); // module: reporters/min.js
|
@@ -3050,7 +3361,9 @@
|
|
3050
3361
|
* Inherit from `Base.prototype`.
|
3051
3362
|
*/
|
3052
3363
|
|
3053
|
-
|
3364
|
+
function F(){};
|
3365
|
+
F.prototype = Base.prototype;
|
3366
|
+
NyanCat.prototype = new F;
|
3054
3367
|
NyanCat.prototype.constructor = NyanCat;
|
3055
3368
|
|
3056
3369
|
|
@@ -3142,7 +3455,9 @@
|
|
3142
3455
|
* Inherit from `Base.prototype`.
|
3143
3456
|
*/
|
3144
3457
|
|
3145
|
-
|
3458
|
+
function F(){};
|
3459
|
+
F.prototype = Base.prototype;
|
3460
|
+
Progress.prototype = new F;
|
3146
3461
|
Progress.prototype.constructor = Progress;
|
3147
3462
|
|
3148
3463
|
|
@@ -3235,7 +3550,9 @@
|
|
3235
3550
|
* Inherit from `Base.prototype`.
|
3236
3551
|
*/
|
3237
3552
|
|
3238
|
-
|
3553
|
+
function F(){};
|
3554
|
+
F.prototype = Base.prototype;
|
3555
|
+
Spec.prototype = new F;
|
3239
3556
|
Spec.prototype.constructor = Spec;
|
3240
3557
|
|
3241
3558
|
|
@@ -3271,7 +3588,7 @@
|
|
3271
3588
|
, stats = this.stats
|
3272
3589
|
, n = 1
|
3273
3590
|
, passes = 0
|
3274
|
-
, failures =
|
3591
|
+
, failures = 0;
|
3275
3592
|
|
3276
3593
|
runner.on('start', function(){
|
3277
3594
|
var total = runner.grepTotal(runner.suite);
|
@@ -3294,7 +3611,7 @@
|
|
3294
3611
|
runner.on('fail', function(test, err){
|
3295
3612
|
failures++;
|
3296
3613
|
console.log('not ok %d %s', n, title(test));
|
3297
|
-
console.log(err.stack.replace(/^/gm, ' '));
|
3614
|
+
if (err.stack) console.log(err.stack.replace(/^/gm, ' '));
|
3298
3615
|
});
|
3299
3616
|
|
3300
3617
|
runner.on('end', function(){
|
@@ -3454,7 +3771,9 @@
|
|
3454
3771
|
* Inherit from `Base.prototype`.
|
3455
3772
|
*/
|
3456
3773
|
|
3457
|
-
|
3774
|
+
function F(){};
|
3775
|
+
F.prototype = Base.prototype;
|
3776
|
+
XUnit.prototype = new F;
|
3458
3777
|
XUnit.prototype.constructor = XUnit;
|
3459
3778
|
|
3460
3779
|
|
@@ -3562,7 +3881,9 @@
|
|
3562
3881
|
* Inherit from `EventEmitter.prototype`.
|
3563
3882
|
*/
|
3564
3883
|
|
3565
|
-
|
3884
|
+
function F(){};
|
3885
|
+
F.prototype = EventEmitter.prototype;
|
3886
|
+
Runnable.prototype = new F;
|
3566
3887
|
Runnable.prototype.constructor = Runnable;
|
3567
3888
|
|
3568
3889
|
|
@@ -3707,7 +4028,7 @@
|
|
3707
4028
|
if (this.async) {
|
3708
4029
|
try {
|
3709
4030
|
this.fn.call(ctx, function(err){
|
3710
|
-
if (toString.call(err) === "[object Error]") return done(err);
|
4031
|
+
if (err instanceof Error || toString.call(err) === "[object Error]") return done(err);
|
3711
4032
|
if (null != err) return done(new Error('done() invoked with non-Error: ' + err));
|
3712
4033
|
done();
|
3713
4034
|
});
|
@@ -3801,7 +4122,9 @@
|
|
3801
4122
|
* Inherit from `EventEmitter.prototype`.
|
3802
4123
|
*/
|
3803
4124
|
|
3804
|
-
|
4125
|
+
function F(){};
|
4126
|
+
F.prototype = EventEmitter.prototype;
|
4127
|
+
Runner.prototype = new F;
|
3805
4128
|
Runner.prototype.constructor = Runner;
|
3806
4129
|
|
3807
4130
|
|
@@ -4341,7 +4664,9 @@
|
|
4341
4664
|
* Inherit from `EventEmitter.prototype`.
|
4342
4665
|
*/
|
4343
4666
|
|
4344
|
-
|
4667
|
+
function F(){};
|
4668
|
+
F.prototype = EventEmitter.prototype;
|
4669
|
+
Suite.prototype = new F;
|
4345
4670
|
Suite.prototype.constructor = Suite;
|
4346
4671
|
|
4347
4672
|
|
@@ -4606,7 +4931,9 @@
|
|
4606
4931
|
* Inherit from `Runnable.prototype`.
|
4607
4932
|
*/
|
4608
4933
|
|
4609
|
-
|
4934
|
+
function F(){};
|
4935
|
+
F.prototype = Runnable.prototype;
|
4936
|
+
Test.prototype = new F;
|
4610
4937
|
Test.prototype.constructor = Test;
|
4611
4938
|
|
4612
4939
|
|
@@ -5433,7 +5760,7 @@
|
|
5433
5760
|
_ref = Teabag.suites.all;
|
5434
5761
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
5435
5762
|
suite = _ref[_i];
|
5436
|
-
options.push("<option" + (Teabag.suites.active === suite ? " selected='selected'" : "") + " value=\"" + suite + "\">" + suite + "
|
5763
|
+
options.push("<option" + (Teabag.suites.active === suite ? " selected='selected'" : "") + " value=\"" + suite + "\">" + suite + "</option>");
|
5437
5764
|
}
|
5438
5765
|
return "<select id=\"teabag-suite-select\">" + (options.join("")) + "</select>";
|
5439
5766
|
};
|
@@ -5447,7 +5774,7 @@
|
|
5447
5774
|
if (this.filters.length) {
|
5448
5775
|
this.setClass("filter", "teabag-filtered");
|
5449
5776
|
}
|
5450
|
-
return this.setHtml("filter-list", "<li>" + (this.filters.join("</li><li>"))
|
5777
|
+
return this.setHtml("filter-list", "<li>" + (this.filters.join("</li><li>")), true);
|
5451
5778
|
};
|
5452
5779
|
|
5453
5780
|
HTML.prototype.reportRunnerStarting = function(runner) {
|