Coverage

66%
106
71
35

/Users/alexsouthern/Dropbox/blanket/src/blanket.js

65%
100
65
35
LineHitsSource
11var inBrowser = typeof exports === 'undefined';
21var parseAndModify = (inBrowser ? window.falafel : require("/Users/alexsouthern/Dropbox/blanket/src/./lib/falafel").falafel);
3
41(inBrowser ? window : exports).blanket = (function(){
51 var linesToAddTracking = [
6 "ExpressionStatement",
7 "BreakStatement" ,
8 "ContinueStatement" ,
9 "VariableDeclaration",
10 "ReturnStatement" ,
11 "ThrowStatement" ,
12 "TryStatement" ,
13 "FunctionDeclaration" ,
14 "IfStatement" ,
15 "WhileStatement" ,
16 "DoWhileStatement" ,
17 "ForStatement" ,
18 "ForInStatement" ,
19 "SwitchStatement" ,
20 "WithStatement"
21 ],
22 linesToAddBrackets = [
23 "IfStatement" ,
24 "WhileStatement" ,
25 "DoWhileStatement" ,
26 "ForStatement" ,
27 "ForInStatement" ,
28 "WithStatement"
29 ],
30 covVar = (inBrowser ? "window._$blanket" : "_$jscoverage" ),
31 __blanket,
32 copynumber = Math.floor(Math.random()*1000),
33 coverageInfo = {},options = {
34 reporter: null,
35 adapter:null,
36 filter: null,
37 orderedLoading: true,
38 loader: null,
39 ignoreScriptError: false,
40 existingRequireJS:false,
41 autoStart: false,
42 timeout: 180,
43 branchTracking: false,
44 ignoreCors: false
45 };
46
471 if (inBrowser && typeof window.blanket !== 'undefined'){
480 __blanket = window.blanket.noConflict();
49 }
50
511 _blanket = {
52 noConflict: function(){
530 if (__blanket){
540 return __blanket;
55 }
560 return _blanket;
57 },
58 _getCopyNumber: function(){
59 //internal method
60 //for differentiating between instances
610 return copynumber;
62 },
63 extend: function(obj) {
64 //borrowed from underscore
650 _blanket._extend(_blanket,obj);
66 },
67 _extend: function(dest,source){
680 if (source) {
690 for (var prop in source) {
700 if ( dest[prop] instanceof Object && typeof dest[prop] !== "function"){
710 _blanket._extend(dest[prop],source[prop]);
72 }else{
730 dest[prop] = source[prop];
74 }
75 }
76 }
77 },
78 options: function(key,value){
79101 if (typeof key !== "string"){
800 _blanket._extend(options,key);
81101 }else if (typeof value === 'undefined'){
82100 return options[key];
83 }else{
841 options[key]=value;
85 }
86 },
87 instrument: function(config, next){
883 var inFile = config.inputFile,
89 inFileName = config.inputFileName;
903 var sourceArray = _blanket._prepareSource(inFile);
913 _blanket._trackingArraySetup=[];
923 var instrumented = parseAndModify(inFile,{loc:true,comment:true}, _blanket._addTracking,inFileName);
933 instrumented = _blanket._trackingSetup(inFileName,sourceArray)+instrumented;
943 next(instrumented);
95 },
96 _trackingArraySetup: [],
97 _branchingArraySetup: [],
98 _prepareSource: function(source){
994 return source.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/(\r\n|\n|\r)/gm,"\n").split('\n');
100 },
101 _trackingSetup: function(filename,sourceArray){
1024 var branches = _blanket.options("branchTracking");
1034 var sourceString = sourceArray.join("',\n'");
1044 var intro = "";
105
1064 intro += "if (typeof "+covVar+" === 'undefined') "+covVar+" = {};\n";
1074 if (branches){
1080 intro += "var _$branchFcn=function(f,l,c,r){ ";
1090 intro += covVar+"[f].branchData[l][c].push(r);";
1100 intro += "return r;};\n";
111 }
1124 intro += "if (typeof "+covVar+"['"+filename+"'] === 'undefined'){";
113
1144 intro += covVar+"['"+filename+"']=[];\n";
1154 if (branches){
1160 intro += covVar+"['"+filename+"'].branchData=[];\n";
117 }
1184 intro += covVar+"['"+filename+"'].source=['"+sourceString+"'];\n";
119 //initialize array values
1204 _blanket._trackingArraySetup.sort(function(a,b){
12119 return parseInt(a,10) > parseInt(b,10);
122 }).forEach(function(item){
12316 intro += covVar+"['"+filename+"']["+item+"]=0;\n";
124 });
1254 if (branches){
1260 _blanket._branchingArraySetup.sort(function(a,b){
1270 return a.line > b.line;
128 }).sort(function(a,b){
1290 return a.column > b.column;
130 }).forEach(function(item){
1310 if (item.file === filename){
1320 intro += "if (typeof "+ covVar+"['"+filename+"'].branchData["+item.line+"] === 'undefined'){\n";
1330 intro += covVar+"['"+filename+"'].branchData["+item.line+"]=[];\n";
1340 intro += "}";
1350 intro += covVar+"['"+filename+"'].branchData["+item.line+"]["+item.column+"] = [];\n";
136 }
137 });
138 }
1394 intro += "}";
140
1414 return intro;
142 },
143 _blockifyIf: function(node){
144
145121 if (linesToAddBrackets.indexOf(node.type) > -1){
1469 var bracketsExistObject = node.consequent || node.body;
1479 var bracketsExistAlt = node.alternate;
1489 if( bracketsExistAlt && bracketsExistAlt.type !== "BlockStatement") {
1492 bracketsExistAlt.update("{\n"+bracketsExistAlt.source()+"}\n");
150 }
1519 if( bracketsExistObject && bracketsExistObject.type !== "BlockStatement") {
1526 bracketsExistObject.update("{\n"+bracketsExistObject.source()+"}\n");
153 }
154 }
155 },
156 _trackBranch: function(node,filename){
157 //recursive on consequent and alternative
1580 var line = node.loc.start.line;
1590 var col = node.loc.start.column;
160
1610 _blanket._branchingArraySetup.push({
162 line: line,
163 column: col,
164 file:filename
165 });
166
1670 var source = node.source();
1680 var updated = "_$branchFcn"+
169 "('"+filename+"',"+line+","+col+","+source.slice(0,source.indexOf("?"))+
170 ")"+source.slice(source.indexOf("?"));
1710 node.update(updated);
172 },
173 _addTracking: function (node,filename) {
174121 _blanket._blockifyIf(node);
175121 if (linesToAddTracking.indexOf(node.type) > -1 && node.parent.type !== "LabeledStatement"){
17626 if (node.type === "VariableDeclaration" &&
177 (node.parent.type === "ForStatement" || node.parent.type === "ForInStatement")){
1781 return;
179 }
18025 if (node.loc && node.loc.start){
18125 node.update(covVar+"['"+filename+"']["+node.loc.start.line+"]++;\n"+node.source());
18225 _blanket._trackingArraySetup.push(node.loc.start.line);
183 }else{
184 //I don't think we can handle a node with no location
1850 throw new Error("The instrumenter encountered a node with no location: "+Object.keys(node));
186 }
18795 }else if (_blanket.options("branchTracking") && node.type === "ConditionalExpression"){
1880 _blanket._trackBranch(node,filename);
189 }
190 },
191 setupCoverage: function(){
1921 coverageInfo.instrumentation = "blanket";
1931 coverageInfo.stats = {
194 "suites": 0,
195 "tests": 0,
196 "passes": 0,
197 "pending": 0,
198 "failures": 0,
199 "start": new Date()
200 };
201 },
202 _checkIfSetup: function(){
2034 if (!coverageInfo.stats){
2040 throw new Error("You must call blanket.setupCoverage() first.");
205 }
206 },
207 onTestStart: function(){
2081 this._checkIfSetup();
2091 coverageInfo.stats.tests++;
2101 coverageInfo.stats.pending++;
211 },
212 onTestDone: function(total,passed){
2131 this._checkIfSetup();
2141 if(passed === total){
2151 coverageInfo.stats.passes++;
216 }else{
2170 coverageInfo.stats.failures++;
218 }
2191 coverageInfo.stats.pending--;
220 },
221 onModuleStart: function(){
2221 this._checkIfSetup();
2231 coverageInfo.stats.suites++;
224 },
225 onTestsDone: function(){
2261 this._checkIfSetup();
2271 coverageInfo.stats.end = new Date();
228
2291 if (typeof exports === 'undefined'){
2300 this.report(coverageInfo);
231 }else{
2321 delete _$jscoverage.branchFcn;
2331 this.options("reporter").call(this,coverageInfo);
234 }
235 }
236 };
2371 return _blanket;
238})();
239

label_test

100%
5
5
0
LineHitsSource
11function aFunc(max) {
21var ret=0; rows: for (var i = 0; i < max--; i++) {
320 ret=i; if (i == 9) {
41 break rows;
5}
6}
71 return ret;}
8

testfile2

100%
1
1
0
LineHitsSource
15var a=3;if(a==1)a=2;else if(a==3){a=4;}result=a;