/* * Copyright 2013 Google Inc. All rights reserved. * * 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.errorprone.refaster; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Matchers.argThat; import com.google.errorprone.refaster.Bindings; import com.google.errorprone.refaster.CouldNotResolveImportException; import com.google.errorprone.refaster.Inliner; import com.google.errorprone.refaster.UTree; import com.google.errorprone.refaster.Unifier; import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.parser.Parser; import com.sun.tools.javac.parser.ParserFactory; import com.sun.tools.javac.tree.JCTree.JCExpression; import com.sun.tools.javac.tree.JCTree.JCIdent; import com.sun.tools.javac.util.Context; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher; import org.junit.Before; /** * Basics for testing {@code UTree} implementations. * * @author lowasser@google.com (Louis Wasserman) */ public abstract class AbstractUTreeTest { protected Context context; protected Unifier unifier; protected Inliner inliner; @Before public void createContext() { context = new Context(); JavacFileManager.preRegister(context); unifier = new Unifier(context); inliner = unifier.createInliner(); } public void assertUnifiesAndInlines(String expression, UTree<?> template) { assertUnifies(expression, template); assertInlines(expression, template); } public void assertUnifies(String expression, UTree<?> template) { assertNotNull( String.format("Expected template %s to unify with expression %s", template, expression), template.unify(parseExpression(expression), unifier)); } public void assertInlines(String expression, UTree<?> template) { try { assertEquals( String.format("Expected template %s to inline to expression %s", template, expression), expression, template.inline(inliner).toString()); } catch (CouldNotResolveImportException e) { throw new RuntimeException(e); } } protected JCExpression parseExpression(String contents) { Parser parser = ParserFactory.instance(context).newParser(contents, false, false, true); return parser.parseExpression(); } protected <V> void bind(Bindings.Key<V> key, V value) { Bindings bindings = Bindings.create(inliner.bindings); bindings.putBinding(key, value); inliner = new Inliner(context, bindings); } protected JCExpression ident(final String name) { return argThat(new TypeSafeMatcher<JCExpression>() { @Override public void describeTo(Description description) { description.appendText("Identifier matching \"" + name + "\""); } @Override public boolean matchesSafely(JCExpression item) { return item instanceof JCIdent && ((JCIdent) item).getName().contentEquals(name); } }); } }