blob: b5dd87994ebbcf07f10cfebd62adf4a8ef314cd4 [file] [log] [blame]
/*
* Copyright 2008 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.jjs.impl.gflow.constants;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.dev.jjs.ast.JBlock;
import com.google.gwt.dev.jjs.ast.JDeclarationStatement;
import com.google.gwt.dev.jjs.ast.JMethod;
import com.google.gwt.dev.jjs.ast.JMethodBody;
import com.google.gwt.dev.jjs.ast.JProgram;
import com.google.gwt.dev.jjs.ast.JReturnStatement;
import com.google.gwt.dev.jjs.ast.JStatement;
import com.google.gwt.dev.jjs.ast.JValueLiteral;
import com.google.gwt.dev.jjs.impl.JJSTestBase;
import com.google.gwt.dev.jjs.impl.gflow.constants.ConstantsAssumption;
import com.google.gwt.dev.jjs.impl.gflow.constants.ExpressionEvaluator;
import java.util.List;
/**
* Tests for ExpressionEvaluator - testing evaluation expressions based on
* assumptions.
*/
public class ExpressionEvaluatorTest extends JJSTestBase {
@Override
protected void setUp() throws Exception {
super.setUp();
addSnippetClassDecl("static String foo() { return null; };");
}
public void testVariableRef() throws Exception {
assertThat("i", "int",
"int i = 1;").evaluatesInto("1");
}
public void testEq() throws Exception {
assertThat("i == 1", "boolean",
"int i = 1;").evaluatesInto("true");
assertThat("i != 1", "boolean",
"int i = 1;").evaluatesInto("false");
}
public void testNullNotNull() throws Exception {
assertThat("s == null", "boolean",
"String s = null;").evaluatesInto("true");
assertThat("s != null", "boolean",
"String s = null;").evaluatesInto("false");
assertThat("null == s", "boolean",
"String s = null;").evaluatesInto("true");
assertThat("null != s", "boolean",
"String s = null;").evaluatesInto("false");
}
public void testBinaryExpr() throws Exception {
assertThat("i + 1", "int", "int i; i = 1;").evaluatesInto("<null>");
assertThat("1 + i", "int", "int i; i = 1;").evaluatesInto("<null>");
assertThat("2 + i", "int", "int i = 1;").evaluatesInto("3");
assertThat("i + 3", "int", "int i = 1;").evaluatesInto("4");
assertThat("i / 2", "int", "int i = 6;").evaluatesInto("3");
assertThat("i / 0", "int", "int i = 1;").evaluatesInto("<null>");
assertThat("4 / 0", "int", "int i = 0;").evaluatesInto("<null>");
}
private static class Result {
private final JValueLiteral literal;
public Result(JValueLiteral literal) {
this.literal = literal;
}
public void evaluatesInto(String string) {
String actual = literal == null ? "<null>" : literal.toSource();
assertEquals(string, actual);
}
}
private Result assertThat(String expr, String type,
String decls) throws UnableToCompleteException {
ConstantsAssumption.Updater updater =
new ConstantsAssumption.Updater(new ConstantsAssumption());
String codeSnippet = decls;
codeSnippet += "return " + expr + ";";
JProgram program = compileSnippet(type, codeSnippet);
JMethod mainMethod = findMainMethod(program);
JBlock block = ((JMethodBody) mainMethod.getBody()).getBlock();
List<JStatement> statements = block.getStatements();
// TODO: not a pretty assumption detection.
for (JStatement stmt : statements) {
if (!(stmt instanceof JDeclarationStatement)) {
continue;
}
JDeclarationStatement decl = (JDeclarationStatement) stmt;
if (decl.getInitializer() != null) {
updater.set(decl.getVariableRef().getTarget(),
(JValueLiteral) decl.getInitializer());
}
}
JReturnStatement returnStatement =
(JReturnStatement) statements.get(statements.size() - 1);
return new Result(ExpressionEvaluator.evaluate(returnStatement.getExpr(),
updater.unwrap()));
}
}