| /* |
| * Copyright 2012 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| |
| package com.google.gwt.dev.js; |
| |
| import com.google.gwt.dev.jjs.SourceInfo; |
| import com.google.gwt.dev.jjs.ast.RuntimeConstants; |
| import com.google.gwt.dev.js.ast.JsBlock; |
| import com.google.gwt.dev.js.ast.JsContext; |
| import com.google.gwt.dev.js.ast.JsExprStmt; |
| import com.google.gwt.dev.js.ast.JsExpression; |
| import com.google.gwt.dev.js.ast.JsFunction; |
| import com.google.gwt.dev.js.ast.JsObjectLiteral; |
| import com.google.gwt.dev.js.ast.JsProgram; |
| import com.google.gwt.dev.js.ast.JsStatement; |
| import com.google.gwt.thirdparty.guava.common.base.Splitter; |
| import com.google.gwt.thirdparty.guava.common.collect.HashMultimap; |
| import com.google.gwt.thirdparty.guava.common.collect.LinkedHashMultimap; |
| import com.google.gwt.thirdparty.guava.common.collect.Multimap; |
| |
| import junit.framework.TestCase; |
| |
| import java.io.StringReader; |
| |
| /** |
| * Tests for CoverageInstrumentor. |
| */ |
| public class CoverageInstrumentorTest extends TestCase { |
| private JsProgram program; |
| private JsBlock functionBody; |
| |
| @Override |
| public void setUp() { |
| program = new JsProgram(); |
| SourceInfo info = program.createSourceInfo(1, "Test.java"); |
| JsBlock globalBlock = program.getGlobalBlock(); |
| JsFunction function = new JsFunction(info, program.getScope()); |
| functionBody = new JsBlock(info); |
| function.setBody(functionBody); |
| globalBlock.getStatements().add(new JsExprStmt(info, function)); |
| } |
| |
| private String instrument(String code) throws Exception { |
| functionBody.getStatements().clear(); |
| CoverageInstrumentor.exec(program, parse(code), |
| program.getScope().declareName(RuntimeConstants.COVERAGE_UTIL_ON_BEFORE_UNLOAD), |
| program.getScope().declareName(RuntimeConstants.COVERAGE_UTIL_COVER), |
| program.getScope().declareName(RuntimeConstants.COVERAGE_UTIL_COVERAGE)); |
| return functionBody.toSource().trim().replaceAll("\\s+", " "); |
| } |
| |
| private Multimap<String, Integer> parse(String code) throws Exception { |
| Iterable<String> lines = Splitter.on('\n').split(code); |
| Multimap<String, Integer> instrumentableLines = HashMultimap.create(); |
| int i = 0; |
| for (String line : lines) { |
| instrumentableLines.put("Test.java", ++i); |
| } |
| JsParser.parseInto(functionBody.getSourceInfo(), program.getScope(), |
| functionBody, new StringReader(code)); |
| i = 0; |
| for (JsStatement statement : functionBody.getStatements()) { |
| final SourceInfo info = program.createSourceInfo(++i, "Test.java"); |
| statement.setSourceInfo(info); |
| new CoverageVisitor(instrumentableLines.keySet()) { |
| @Override public void endVisit(JsExpression x, JsContext ctx) { |
| x.setSourceInfo(info); |
| } |
| }.accept(statement); |
| } |
| return instrumentableLines; |
| } |
| |
| public void testBaselineCoverage() throws Exception { |
| Multimap<String, Integer> instrumentableLines = LinkedHashMultimap.create(); |
| for (int i = 1; i < 6; i++) { |
| instrumentableLines.put("A.java", i); |
| instrumentableLines.put("B.java", i); |
| } |
| |
| JsObjectLiteral baseline = CoverageInstrumentor.baselineCoverage(program.getSourceInfo(), |
| instrumentableLines); |
| assertEquals("{'A.java':{1:0, 2:0, 3:0, 4:0, 5:0}, 'B.java':{1:0, 2:0, 3:0, 4:0, 5:0}}", |
| baseline.toSource().trim().replaceAll("\\s+", " ")); |
| } |
| |
| public void testSimpleInstrumentation() throws Exception { |
| assertEquals("{ CoverageUtil.cover('Test.java', 1) , f(); }", instrument("f()")); |
| assertEquals( |
| "{ CoverageUtil.cover('Test.java', 1) , f(); CoverageUtil.cover('Test.java', 2) , g(); }", |
| instrument("f() \n g()")); |
| } |
| |
| public void testPreserveLiterals() throws Exception { |
| assertEquals("{ 'x'; }", instrument("'x'")); |
| } |
| } |