| /* |
| * 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())); |
| } |
| } |