blob: b4525fdca946eb0b81ffc6a297351f02ce31a82d [file] [log] [blame]
/*
* 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'"));
}
}