tntim96 / JSCover

JSCover is a JavaScript Code Coverage Tool that measures line, branch and function coverage
GNU General Public License v2.0
399 stars 84 forks source link

React JS file instrumentation is breaking #273

Closed sushant98905 closed 5 years ago

sushant98905 commented 5 years ago

Thanks for the wonderful API, for evaluating the JavaScript code coverage. I'm trying to evaluate a JS code coverage of my application which has react js and angular js. And I'm having trouble in instrumenting the the React js files, using local-storage option : java -jar JSCover-all.jar -fs --local-storage sourceCodeDir instrumentedSrcCodeDir

To help you in reproducing the case ,here is the sample usecase: A react js application (Calculator) can be downloaded from - https://github.com/ahfarmer/calculator

Now lets try instrumenting this application, using following commands: java -jar JSCover-all.jar -fs --local-storage userDir/calculator-master/calculator-master/src userDir/calculator-master/calculator-master/src_inst

Following stack is displayed on the console while performing the instrumentation of (App.js) : Nov 09, 2018 1:07:10 PM jscover.Main runMain INFO: Args: -fs,--local-storage,<UserDir>/calculator-master/calculator-master/src,<UserDir>/calculator-master/calculator-master/src_inst 20181109 13:07:10.668,11,SEVERE,"'(' expected, sourceName: /component/App.js, line: 17 lineOffset: 14",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,14,SEVERE,"'(' expected, sourceName: /component/ButtonPanel.js, line: 8 lineOffset: 14",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,12,SEVERE,"')' expected, sourceName: /component/App.test.js, line: 7 lineOffset: 18",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,13,SEVERE,"'(' expected, sourceName: /component/Button.js, line: 6 lineOffset: 14",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,14,SEVERE,"',' expected, sourceName: /component/ButtonPanel.js, line: 8 lineOffset: 27",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,11,SEVERE,"',' expected, sourceName: /component/App.js, line: 17 lineOffset: 27",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,13,SEVERE,"')' expected, sourceName: /component/Button.js, line: 6 lineOffset: 16",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,12,SEVERE,"Semi-colon expected, sourceName: /component/App.test.js, line: 7 lineOffset: 19",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,11,SEVERE,"cannot use keyword 'this' here., sourceName: /component/App.js, line: 18 lineOffset: 8",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,14,SEVERE,"cannot use keyword 'this' here., sourceName: /component/ButtonPanel.js, line: 9 lineOffset: 8",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,12,SEVERE,"primary expression expected, sourceName: /component/App.test.js, line: 7 lineOffset: 25",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,13,SEVERE,"'{' expected, sourceName: /component/Button.js, line: 6 lineOffset: 17",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,12,SEVERE,"Semi-colon expected, sourceName: /component/App.test.js, line: 7 lineOffset: 30",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,13,SEVERE,"'}' expected, sourceName: /component/Button.js, line: 6 lineOffset: 19",jscover.instrument.SourceProcessor, 20181109 13:07:10.668,11,SEVERE,"'}' expected, sourceName: /component/App.js, line: 18 lineOffset: 8",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,14,SEVERE,"'}' expected, sourceName: /component/ButtonPanel.js, line: 9 lineOffset: 8",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,12,SEVERE,"'}' expected, sourceName: /component/App.test.js, line: 7 lineOffset: 30",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,13,SEVERE,"'}' expected, sourceName: /component/Button.js, line: 6 lineOffset: 22",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,14,SEVERE,"',' expected, sourceName: /component/ButtonPanel.js, line: 9 lineOffset: 9",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,11,SEVERE,"',' expected, sourceName: /component/App.js, line: 18 lineOffset: 9",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,12,SEVERE,"',' expected, sourceName: /component/App.test.js, line: 7 lineOffset: 31",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,11,SEVERE,"')' expected, sourceName: /component/App.js, line: 18 lineOffset: 17",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,14,SEVERE,"')' expected, sourceName: /component/ButtonPanel.js, line: 9 lineOffset: 14",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,13,SEVERE,"primary expression expected, sourceName: /component/Button.js, line: 8 lineOffset: 3",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,12,SEVERE,"')' expected, sourceName: /component/App.test.js, line: 8 lineOffset: 0",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,13,SEVERE,"Semi-colon expected, sourceName: /component/Button.js, line: 10 lineOffset: 11",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,12,SEVERE,"Semi-colon expected, sourceName: /component/App.test.js, line: 8 lineOffset: 1",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,11,SEVERE,"'{' expected, sourceName: /component/App.js, line: 18 lineOffset: 18",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,14,SEVERE,"'{' expected, sourceName: /component/ButtonPanel.js, line: 9 lineOffset: 15",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,11,SEVERE,"Semi-colon expected, sourceName: /component/App.js, line: 18 lineOffset: 51",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,14,SEVERE,"primary expression expected, sourceName: /component/ButtonPanel.js, line: 14 lineOffset: 7",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,11,SEVERE,"'}' expected, sourceName: /component/App.js, line: 18 lineOffset: 51",jscover.instrument.SourceProcessor, 20181109 13:07:10.684,12,SEVERE,"primary expression expected, sourceName: /component/App.test.js, line: 8 lineOffset: 2",jscover.instrument.SourceProcessor, 20181109 13:07:10.699,13,SEVERE,"primary expression expected, sourceName: /component/Button.js, line: 18 lineOffset: 7",jscover.instrument.SourceProcessor, 20181109 13:07:10.699,14,SEVERE,"')' expected, sourceName: /component/ButtonPanel.js, line: 14 lineOffset: 7",jscover.instrument.SourceProcessor, 20181109 13:07:10.699,11,SEVERE,"Semi-colon expected, sourceName: /component/App.js, line: 21 lineOffset: 11",jscover.instrument.SourceProcessor, 20181109 13:07:10.699,13,SEVERE,"')' expected, sourceName: /component/Button.js, line: 18 lineOffset: 7",jscover.instrument.SourceProcessor, 20181109 13:07:10.699,11,SEVERE,"primary expression expected, sourceName: /component/App.js, line: 23 lineOffset: 7",jscover.instrument.SourceProcessor, 20181109 13:07:10.699,14,SEVERE,"Semi-colon expected, sourceName: /component/ButtonPanel.js, line: 14 lineOffset: 11",jscover.instrument.SourceProcessor, 20181109 13:07:10.699,13,SEVERE,"Semi-colon expected, sourceName: /component/Button.js, line: 18 lineOffset: 11",jscover.instrument.SourceProcessor, 20181109 13:07:10.715,11,SEVERE,"')' expected, sourceName: /component/App.js, line: 23 lineOffset: 7",jscover.instrument.SourceProcessor, 20181109 13:07:10.715,14,SEVERE,"primary expression expected, sourceName: /component/ButtonPanel.js, line: 15 lineOffset: 9",jscover.instrument.SourceProcessor, 20181109 13:07:10.715,13,SEVERE,"'}' expected, sourceName: /component/Button.js, line: 18 lineOffset: 31",jscover.instrument.SourceProcessor, 20181109 13:07:10.715,11,SEVERE,"Semi-colon expected, sourceName: /component/App.js, line: 23 lineOffset: 11",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,11,SEVERE,"primary expression expected, sourceName: /component/App.js, line: 24 lineOffset: 9",jscover.instrument.SourceProcessor, 20181109 13:07:10.715,14,SEVERE,"Semi-colon expected, sourceName: /component/ButtonPanel.js, line: 15 lineOffset: 9",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,13,SEVERE,"Semi-colon expected, sourceName: /component/Button.js, line: 18 lineOffset: 32",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,11,SEVERE,"Semi-colon expected, sourceName: /component/App.js, line: 24 lineOffset: 9",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,14,SEVERE,"primary expression expected, sourceName: /component/ButtonPanel.js, line: 16 lineOffset: 11",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,11,SEVERE,"Semi-colon expected, sourceName: /component/App.js, line: 24 lineOffset: 17",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,14,SEVERE,"Semi-colon expected, sourceName: /component/ButtonPanel.js, line: 16 lineOffset: 11",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,13,SEVERE,"primary expression expected, sourceName: /component/Button.js, line: 18 lineOffset: 50",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,14,SEVERE,"Semi-colon expected, sourceName: /component/ButtonPanel.js, line: 16 lineOffset: 18",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,11,SEVERE,"Cannot use keyword in short object literal, sourceName: /component/App.js, line: 24 lineOffset: 24",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,14,SEVERE,"Semi-colon expected, sourceName: /component/ButtonPanel.js, line: 16 lineOffset: 28",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,11,SEVERE,"'}' expected, sourceName: /component/App.js, line: 24 lineOffset: 28",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,13,SEVERE,"Semi-colon expected, sourceName: /component/Button.js, line: 19 lineOffset: 16",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,11,SEVERE,"Semi-colon expected, sourceName: /component/App.js, line: 24 lineOffset: 29",jscover.instrument.SourceProcessor, 20181109 13:07:10.731,13,SEVERE,"Cannot use keyword in short object literal, sourceName: /component/Button.js, line: 19 lineOffset: 25",jscover.instrument.SourceProcessor, 20181109 13:07:10.746,14,SEVERE,"Cannot use keyword in short object literal, sourceName: /component/ButtonPanel.js, line: 16 lineOffset: 42",jscover.instrument.SourceProcessor, 20181109 13:07:10.746,13,SEVERE,"'}' expected, sourceName: /component/Button.js, line: 19 lineOffset: 29",jscover.instrument.SourceProcessor, 20181109 13:07:10.746,11,SEVERE,"Expected '/' in regular expression literal, sourceName: /component/App.js, line: 24 lineOffset: 70",jscover.instrument.SourceProcessor, 20181109 13:07:10.746,13,SEVERE,"Semi-colon expected, sourceName: /component/Button.js, line: 19 lineOffset: 30",jscover.instrument.SourceProcessor, 20181109 13:07:10.746,11,SEVERE,"Semi-colon expected, sourceName: /component/App.js, line: 25 lineOffset: 21",jscover.instrument.SourceProcessor, 20181109 13:07:10.746,13,SEVERE,"primary expression expected, sourceName: /component/Button.js, line: 19 lineOffset: 42",jscover.instrument.SourceProcessor, 20181109 13:07:10.766,11,SEVERE,"Cannot use keyword in short object literal, sourceName: /component/App.js, line: 25 lineOffset: 35",jscover.instrument.SourceProcessor, 20181109 13:07:10.769,14,SEVERE,"'}' expected, sourceName: /component/ButtonPanel.js, line: 16 lineOffset: 46",jscover.instrument.SourceProcessor, 20181109 13:07:10.772,13,SEVERE,"Cannot use keyword in short object literal, sourceName: /component/Button.js, line: 19 lineOffset: 44",jscover.instrument.SourceProcessor, 20181109 13:07:10.773,11,SEVERE,"'}' expected, sourceName: /component/App.js, line: 25 lineOffset: 39",jscover.instrument.SourceProcessor, 20181109 13:07:10.775,14,SEVERE,"Semi-colon expected, sourceName: /component/ButtonPanel.js, line: 16 lineOffset: 47",jscover.instrument.SourceProcessor, 20181109 13:07:10.776,11,SEVERE,"Semi-colon expected, sourceName: /component/App.js, line: 25 lineOffset: 40",jscover.instrument.SourceProcessor, 20181109 13:07:10.782,14,SEVERE,"'}' expected, sourceName: /component/ButtonPanel.js, line: 16 lineOffset: 60",jscover.instrument.SourceProcessor, 20181109 13:07:10.782,13,SEVERE,"'}' expected, sourceName: /component/Button.js, line: 19 lineOffset: 48",jscover.instrument.SourceProcessor, 20181109 13:07:10.783,11,SEVERE,"primary expression expected, sourceName: /component/App.js, line: 25 lineOffset: 52",jscover.instrument.SourceProcessor, 20181109 13:07:10.788,14,SEVERE,"primary expression expected, sourceName: /component/ButtonPanel.js, line: 16 lineOffset: 62",jscover.instrument.SourceProcessor, 20181109 13:07:10.795,14,SEVERE,"Semi-colon expected, sourceName: /component/ButtonPanel.js, line: 17 lineOffset: 18",jscover.instrument.SourceProcessor, 20181109 13:07:10.788,13,SEVERE,"Semi-colon expected, sourceName: /component/Button.js, line: 19 lineOffset: 49",jscover.instrument.SourceProcessor, 20181109 13:07:10.797,11,SEVERE,"primary expression expected, sourceName: /component/App.js, line: 25 lineOffset: 55",jscover.instrument.SourceProcessor, 20181109 13:07:10.813,11,SEVERE,"Expected '/' in regular expression literal, sourceName: /component/App.js, line: 26 lineOffset: 12",jscover.instrument.SourceProcessor, 20181109 13:07:10.811,14,SEVERE,"Semi-colon expected, sourceName: /component/ButtonPanel.js, line: 17 lineOffset: 29",jscover.instrument.SourceProcessor, 20181109 13:07:10.819,13,SEVERE,"primary expression expected, sourceName: /component/Button.js, line: 19 lineOffset: 60",jscover.instrument.SourceProcessor, 20181109 13:07:10.821,11,SEVERE,"primary expression expected, sourceName: /component/App.js, line: 27 lineOffset: 5",jscover.instrument.SourceProcessor, 20181109 13:07:10.821,14,SEVERE,"Cannot use keyword in short object literal, sourceName: /component/ButtonPanel.js, line: 17 lineOffset: 43",jscover.instrument.SourceProcessor, 20181109 13:07:10.828,13,SEVERE,"Expected '/' in regular expression literal, sourceName: /component/Button.js, line: 19 lineOffset: 69",jscover.instrument.SourceProcessor, 20181109 13:07:10.829,11,SEVERE,"primary expression expected, sourceName: /component/App.js, line: 28 lineOffset: 3",jscover.instrument.SourceProcessor, 20181109 13:07:10.828,14,SEVERE,"'}' expected, sourceName: /component/ButtonPanel.js, line: 17 lineOffset: 47",jscover.instrument.SourceProcessor, 20181109 13:07:10.837,14,SEVERE,"Semi-colon expected, sourceName: /component/ButtonPanel.js, line: 17 lineOffset: 48",jscover.instrument.SourceProcessor, 20181109 13:07:10.838,13,SEVERE,"Expected '/' in regular expression literal, sourceName: /component/Button.js, line: 20 lineOffset: 12",jscover.instrument.SourceProcessor, 20181109 13:07:10.838,11,SEVERE,"primary expression expected, sourceName: /component/App.js, line: 29 lineOffset: 1",jscover.instrument.SourceProcessor, 20181109 13:07:10.838,12,SEVERE,"primary expression expected, sourceName: /component/Display.js, line: 9 lineOffset: 7",jscover.instrument.SourceProcessor, Exception in thread "pool-2-thread-1" java.lang.RuntimeException: Exception parsing "/component/App.js" at com.google.javascript.jscomp.parsing.ParserRunner.parse(ParserRunner.java:147) at jscover.instrument.SourceProcessor.parse(SourceProcessor.java:506) at jscover.instrument.SourceProcessor.instrumentSource(SourceProcessor.java:465) at jscover.instrument.SourceProcessor.processSourceWithoutHeader(SourceProcessor.java:435) at jscover.instrument.SourceProcessor.processSource(SourceProcessor.java:423) at jscover.instrument.SourceProcessor.processSourceForFileSystem(SourceProcessor.java:415) at jscover.instrument.InstrumenterService.instrumentJSForFileSystem(InstrumenterService.java:381) at jscover.filesystem.FileSystemInstrumenter.lambda$copyFolder$2(FileSystemInstrumenter.java:417) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(String.java:1967) at com.google.javascript.jscomp.parsing.IRFactory.normalizeRegex(IRFactory.java:2932) at com.google.javascript.jscomp.parsing.IRFactory$TransformDispatcher.processRegExpLiteral(IRFactory.java:1802) at com.google.javascript.jscomp.parsing.IRFactory$TransformDispatcher.processLiteralExpression(IRFactory.java:2710) at com.google.javascript.jscomp.parsing.IRFactory$TransformDispatcher.process(IRFactory.java:2797) at com.google.javascript.jscomp.parsing.IRFactory.transform(IRFactory.java:752) at com.google.javascript.jscomp.parsing.IRFactory$TransformDispatcher.processBinaryExpressionHelper(IRFactory.java:1464) at com.google.javascript.jscomp.parsing.IRFactory$TransformDispatcher.processBinaryExpression(IRFactory.java:1428) at com.google.javascript.jscomp.parsing.IRFactory$TransformDispatcher.process(IRFactory.java:2721) at com.google.javascript.jscomp.parsing.IRFactory.transform(IRFactory.java:752) at com.google.javascript.jscomp.parsing.IRFactory$TransformDispatcher.processExpressionStatement(IRFactory.java:1208) at com.google.javascript.jscomp.parsing.IRFactory$TransformDispatcher.process(IRFactory.java:2751) at com.google.javascript.jscomp.parsing.IRFactory.transform(IRFactory.java:752) at com.google.javascript.jscomp.parsing.IRFactory$TransformDispatcher.processAstRoot(IRFactory.java:1073) at com.google.javascript.jscomp.parsing.IRFactory$TransformDispatcher.process(IRFactory.java:2795) at com.google.javascript.jscomp.parsing.IRFactory.transformTree(IRFactory.java:333) at com.google.javascript.jscomp.parsing.ParserRunner.parse(ParserRunner.java:136) ... 10 more

Thanks in advance.

tntim96 commented 5 years ago

Take a look at https://facebook.github.io/create-react-app/docs/running-tests#coverage-reporting

You just have to run

npm test -- --coverage

...to get react's built-in coverage.

sushant98905 commented 5 years ago

Take a look at https://facebook.github.io/create-react-app/docs/running-tests#coverage-reporting

You just have to run

npm test -- --coverage

...to get react's built-in coverage.

Thanks for your reply. The solution provided in the mentioned framework (Jest) is to create JUnit Cases and we intend to evaluate the code-coverage of our application by accessing it the way any layman might do i.e. by running our functional tests written in Selenium for traversing the application, thats why I'm inclined towards using JSCover.