Index: dart/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java |
diff --git a/dart/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java b/dart/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java |
deleted file mode 100644 |
index 92247b15651447633a69246c4e9538f7831e6ebd..0000000000000000000000000000000000000000 |
--- a/dart/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java |
+++ /dev/null |
@@ -1,510 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-package com.google.dart.compiler; |
- |
-import com.google.common.collect.Lists; |
-import com.google.common.collect.Maps; |
-import com.google.common.collect.Sets; |
-import com.google.dart.compiler.CommandLineOptions.CompilerOptions; |
-import com.google.dart.compiler.ast.ASTVisitor; |
-import com.google.dart.compiler.ast.DartExpression; |
-import com.google.dart.compiler.ast.DartFunctionTypeAlias; |
-import com.google.dart.compiler.ast.DartIdentifier; |
-import com.google.dart.compiler.ast.DartNode; |
-import com.google.dart.compiler.ast.DartUnit; |
-import com.google.dart.compiler.ast.LibraryUnit; |
-import com.google.dart.compiler.common.ErrorExpectation; |
-import com.google.dart.compiler.common.SourceInfo; |
-import com.google.dart.compiler.end2end.inc.MemoryLibrarySource; |
-import com.google.dart.compiler.parser.DartParser; |
-import com.google.dart.compiler.parser.DartParserRunner; |
-import com.google.dart.compiler.resolver.Element; |
-import com.google.dart.compiler.type.Type; |
-import com.google.dart.compiler.type.TypeQuality; |
- |
-import static com.google.dart.compiler.common.ErrorExpectation.assertErrors; |
- |
-import junit.framework.TestCase; |
- |
-import java.io.IOException; |
-import java.io.InputStreamReader; |
-import java.io.Reader; |
-import java.net.URI; |
-import java.net.URL; |
-import java.util.List; |
-import java.util.Map; |
-import java.util.concurrent.atomic.AtomicReference; |
- |
-/** |
- * Base class for compiler tests, with helpful utility methods. |
- */ |
-public abstract class CompilerTestCase extends TestCase { |
- |
- private static final String UTF8 = "UTF-8"; |
- protected CompilerConfiguration compilerConfiguration; |
- protected String testSource; |
- protected DartUnit testUnit; |
- |
- /** |
- * Instance of {@link CompilerConfiguration} for incremental check-only compilation. |
- */ |
- protected static final CompilerConfiguration CHECK_ONLY_CONFIGURATION = |
- new DefaultCompilerConfiguration(new CompilerOptions()) { |
- @Override |
- public boolean incremental() { |
- return true; |
- } |
- |
- @Override |
- public boolean resolveDespiteParseErrors() { |
- return true; |
- } |
- }; |
- |
- /** |
- * Read a resource from the given URL. |
- */ |
- protected static String readUrl(URL url) { |
- try { |
- StringBuffer out = new StringBuffer(); |
- Reader in = new InputStreamReader(url.openStream(), UTF8); |
- char[] buf = new char[10240]; |
- int n; |
- while ((n = in.read(buf)) > 0) { |
- out.append(buf, 0, n); |
- } |
- in.close(); |
- return out.toString(); |
- } catch (IOException e) { |
- // Just punt a RuntimeException out the top if something goes wrong. |
- // It will simply cause the test to fail, which is exactly what we want. |
- throw new RuntimeException(e); |
- } |
- } |
- |
- /** |
- * Return a URL that can be used to read an input file for the given test name |
- * and path. |
- */ |
- protected static URL inputUrlFor(Class<?> testClass, String testName) { |
- String fullPath = testClass.getPackage().getName().replace('.', '/') + "/" |
- + testName; |
- URL url = chooseClassLoader().getResource(fullPath); |
- if (url == null) { |
- fail("Could not find input file: " + fullPath); |
- } |
- return url; |
- } |
- |
- private static ClassLoader chooseClassLoader() { |
- if (Thread.currentThread().getContextClassLoader() != null) { |
- return Thread.currentThread().getContextClassLoader(); |
- } |
- return CompilerTestCase.class.getClassLoader(); |
- } |
- |
- /** |
- * Collects the results of running analyzeLibrary. |
- */ |
- protected static class AnalyzeLibraryResult extends DartCompilerListener.Empty { |
- public String source; |
- private final List<DartCompilationError> errors = Lists.newArrayList(); |
- private final List<DartCompilationError> compilationErrors = Lists.newArrayList(); |
- private final List<DartCompilationError> compilationWarnings = Lists.newArrayList(); |
- private final List<DartCompilationError> typeErrors = Lists.newArrayList(); |
- private LibraryUnit result; |
- |
- @Override |
- public void onError(DartCompilationError event) { |
- errors.add(event); |
- if (event.getErrorCode().getSubSystem() == SubSystem.STATIC_TYPE) { |
- typeErrors.add(event); |
- } else if (event.getErrorCode().getErrorSeverity() == ErrorSeverity.ERROR) { |
- compilationErrors.add(event); |
- } else if (event.getErrorCode().getErrorSeverity() == ErrorSeverity.WARNING) { |
- compilationWarnings.add(event); |
- } |
- } |
- |
- public List<DartCompilationError> getErrors() { |
- return errors; |
- } |
- |
- public List<DartCompilationError> getTypeErrors() { |
- return typeErrors; |
- } |
- |
- public List<DartCompilationError> getCompilationErrors() { |
- return compilationErrors; |
- } |
- |
- public List<DartCompilationError> getCompilationWarnings() { |
- return compilationWarnings; |
- } |
- |
- /** |
- * @param lib |
- */ |
- public void setLibraryUnitResult(LibraryUnit lib) { |
- result = lib; |
- } |
- |
- /** |
- * @return the analyzed library |
- */ |
- public LibraryUnit getLibraryUnitResult() { |
- return result; |
- } |
- } |
- |
- /** |
- * Build a multi-line string from a list of strings. |
- * |
- * @param lines |
- * @return a single string containing {@code lines}, each terminated by \n |
- */ |
- protected static String makeCode(String... lines) { |
- StringBuilder buf = new StringBuilder(); |
- for (String line : lines) { |
- buf.append(line).append('\n'); |
- } |
- return buf.toString(); |
- } |
- |
- @Override |
- protected void setUp() throws Exception { |
- super.setUp(); |
- compilerConfiguration = CHECK_ONLY_CONFIGURATION; |
- } |
- |
- @Override |
- protected void tearDown() throws Exception { |
- compilerConfiguration = null; |
- testSource = null; |
- testUnit = null; |
- super.tearDown(); |
- } |
- |
- protected AnalyzeLibraryResult analyzeLibrary(String... lines) throws Exception { |
- testSource = makeCode(lines); |
- AnalyzeLibraryResult libraryResult = analyzeLibrary(testSource); |
- testUnit = libraryResult.getLibraryUnitResult().getUnits().iterator().next(); |
- return libraryResult; |
- } |
- |
- /** |
- * Simulate running {@code analyzeLibrary} the way the IDE will. |
- * <p> |
- * <b>Note:</b> if the IDE changes how it calls analyzeLibrary, this should |
- * be changed to match. |
- * @param code the Dart code to parse/analyze |
- * |
- * @return an {@link AnalyzeLibraryResult} containing the {@link LibraryUnit} |
- * and all the errors/warnings generated from the supplied code |
- * @throws Exception |
- */ |
- protected AnalyzeLibraryResult analyzeLibrary(String code) |
- throws Exception { |
- AnalyzeLibraryResult result = new AnalyzeLibraryResult(); |
- result.source = code; |
- // Prepare library. |
- MemoryLibrarySource lib = new MemoryLibrarySource("Test.dart"); |
- lib.setContent("Test.dart", code); |
- // Prepare unit. |
- Map<URI, DartUnit> testUnits = Maps.newHashMap(); |
- { |
- DartSource src = lib.getSourceFor("Test.dart"); |
- DartUnit unit = makeParser(src, code, result).parseUnit(); |
- testUnits.put(src.getUri(), unit); |
- } |
- DartArtifactProvider provider = new MockArtifactProvider(); |
- result.setLibraryUnitResult(DartCompiler.analyzeLibrary( |
- lib, |
- testUnits, |
- compilerConfiguration, |
- provider, |
- result)); |
- // TODO(zundel): One day, we want all AST nodes that are identifiers to point to |
- // elements if they are resolved. Uncommenting this line helps track missing elements |
- // down. |
- // ResolverAuditVisitor.exec(unit); |
- return result; |
- } |
- |
- /** |
- * Compiles a single unit with a synthesized application. |
- */ |
- protected DartSource compileSingleUnit(String name, String code, |
- DartArtifactProvider provider) throws IOException { |
- MockLibrarySource lib = new MockLibrarySource(); |
- DartSourceTest src = new DartSourceTest(name, code, lib); |
- lib.addSource(src); |
- CompilerConfiguration config = getCompilerConfiguration(); |
- DartCompilerListener listener = new DartCompilerListenerTest(src.getName()); |
- DartCompiler.compileLib(lib, config, provider, listener); |
- return src; |
- } |
- |
- /** |
- * Allow tests to override the configuration used. |
- */ |
- protected CompilerConfiguration getCompilerConfiguration() { |
- return new DefaultCompilerConfiguration(); |
- } |
- |
- /** |
- * Parse a single compilation unit for the given input file. |
- */ |
- protected final DartUnit parseUnit(String path) { |
- // final because we delegate to the method below, and only that one should |
- // be overriden to do extra checks. |
- URL url = inputUrlFor(getClass(), path); |
- String source = readUrl(url); |
- return parseUnit(path, source); |
- } |
- |
- /** |
- * Parse a single compilation unit for the name and source. |
- */ |
- protected DartUnit parseUnit(String srcName, String sourceCode, Object... errors) { |
- testSource = sourceCode; |
- // TODO(jgw): We'll need to fill in the library parameter when testing multiple units. |
- DartSourceTest src = new DartSourceTest(srcName, sourceCode, null); |
- DartCompilerListenerTest listener = new DartCompilerListenerTest(srcName, errors); |
- testUnit = makeParser(src, sourceCode, listener).parseUnit(); |
- listener.checkAllErrorsReported(); |
- return testUnit; |
- } |
- |
- /** |
- * Parse a single compilation unit for the name and source. The parse expects some kind of error, |
- * but isn't picky about the actual contents. This is useful for testing parser recovery where we |
- * don't want to make the test too brittle. |
- */ |
- protected DartUnit parseUnitUnspecifiedErrors(String srcName, String sourceCode) { |
- DartSourceTest src = new DartSourceTest(srcName, sourceCode, null); |
- final List<DartCompilationError> errorsEncountered = Lists.newArrayList(); |
- DartCompilerListener listener = new DartCompilerListener.Empty() { |
- @Override |
- public void onError(DartCompilationError event) { |
- errorsEncountered.add(event); |
- } |
- }; |
- DartUnit unit = makeParser(src, sourceCode, listener).parseUnit(); |
- assertTrue("Expected some compilation errors, got none.", errorsEncountered.size() > 0); |
- return unit; |
- } |
- |
- protected DartUnit parseUnitAsSystemLibrary(final String srcName, String sourceCode, |
- Object... errors) { |
- DartSourceTest src = new DartSourceTest(srcName, sourceCode, null) { |
- @Override |
- public URI getUri() { |
- return URI.create("dart:core/" + srcName); |
- } |
- }; |
- DartCompilerListenerTest listener = new DartCompilerListenerTest(srcName, errors); |
- DartUnit unit = makeParser(src, sourceCode, listener).parseUnit(); |
- listener.checkAllErrorsReported(); |
- return unit; |
- } |
- |
- |
- /** |
- * Parse a single compilation unit with given name and source, and check for a set of expected errors. |
- * |
- * @param errors a sequence of errors represented as triples of the form |
- * (String msg, int line, int column) or |
- * (ErrorCode code, int line, int column) |
- */ |
- protected DartUnit parseSourceUnitErrors(String sourceCode, Object... errors) { |
- String srcName = "Test.dart"; |
- DartSourceTest src = new DartSourceTest(srcName, sourceCode, null); |
- DartCompilerListenerTest listener = new DartCompilerListenerTest(srcName, errors); |
- DartUnit unit = makeParser(src, sourceCode, listener).parseUnit(); |
- listener.checkAllErrorsReported(); |
- return unit; |
- } |
- |
- /** |
- * Parse a single compilation unit for the given input file, and check for a |
- * set of expected errors. |
- * |
- * @param errors a sequence of errors represented as triples of the form |
- * (String msg, int line, int column) or |
- * (ErrorCode code, int line, int column) |
- */ |
- protected DartUnit parseUnitErrors(final String path, final Object... errors) { |
- URL url = inputUrlFor(getClass(), path); |
- String sourceCode = readUrl(url); |
- // TODO(jgw): We'll need to fill in the library parameter when testing multiple units. |
- DartSourceTest src = new DartSourceTest(path, sourceCode, null); |
- DartCompilerListenerTest listener = new DartCompilerListenerTest(path, errors); |
- DartUnit unit = makeParser(src, sourceCode, listener).parseUnit(); |
- listener.checkAllErrorsReported(); |
- return unit; |
- } |
- |
- /** |
- * Override this method to provide an alternate {@link DartParser}. |
- */ |
- protected DartParser makeParser(Source src, String sourceCode, |
- DartCompilerListener listener) { |
- return new DartParser(src, sourceCode, false, Sets.<String>newHashSet(), listener, null); |
- } |
- |
- /** |
- * @return the {@link DartParserRunner} with parsed source. It can be used to request |
- * {@link DartUnit} or compilation problems. |
- */ |
- protected final DartParserRunner parseSource(String code) { |
- return DartParserRunner.parse(getName(), code, Integer.MAX_VALUE, false); |
- } |
- |
- /** |
- * Parses given source and checks parsing problems. |
- */ |
- protected final DartParserRunner parseExpectErrors(String code, |
- ErrorExpectation... expectedErrors) { |
- DartParserRunner parserRunner = parseSource(code); |
- List<DartCompilationError> errors = parserRunner.getErrors(); |
- assertErrors(errors, expectedErrors); |
- return parserRunner; |
- } |
- |
- /** |
- * Parses given source and checks parsing problems. |
- */ |
- protected final void parseExpectWarnings(String code, ErrorExpectation... expectedWarnings) { |
- DartParserRunner runner = DartParserRunner.parse(getName(), code, Integer.MAX_VALUE, true); |
- List<DartCompilationError> errors = runner.getErrors(); |
- assertErrors(errors, expectedWarnings); |
- } |
- |
- /** |
- * Find node in {@link #testUnit} parsed form {@link #testSource}. |
- */ |
- public <T extends DartNode> T findNode(final Class<T> clazz, String pattern) { |
- final int index = testSource.indexOf(pattern); |
- assertTrue(index != -1); |
- final AtomicReference<T> result = new AtomicReference<T>(); |
- testUnit.accept(new ASTVisitor<Void>() { |
- @Override |
- @SuppressWarnings("unchecked") |
- public Void visitNode(DartNode node) { |
- SourceInfo sourceInfo = node.getSourceInfo(); |
- if (sourceInfo.getOffset() <= index |
- && index < sourceInfo.getEnd() |
- && clazz.isInstance(node)) { |
- result.set((T) node); |
- } |
- return super.visitNode(node); |
- } |
- }); |
- return result.get(); |
- } |
- |
- /** |
- * @return the {@link DartExpression} with given {@link DartNode#toSource()}. This is inaccurate approach, but good |
- * enough for specific tests. |
- */ |
- @SuppressWarnings("unchecked") |
- protected static <T extends DartNode> T findNodeBySource(DartNode rootNode, final String sampleSource) { |
- final DartNode result[] = new DartNode[1]; |
- rootNode.accept(new ASTVisitor<Void>() { |
- @Override |
- public Void visitNode(DartNode node) { |
- if (node.toSource().equals(sampleSource)) { |
- result[0] = node; |
- } |
- return super.visitNode(node); |
- } |
- }); |
- return (T) result[0]; |
- } |
- |
- protected static DartFunctionTypeAlias findTypedef(DartNode rootNode, final String name) { |
- final DartFunctionTypeAlias result[] = new DartFunctionTypeAlias[1]; |
- rootNode.accept(new ASTVisitor<Void>() { |
- @Override |
- public Void visitFunctionTypeAlias(DartFunctionTypeAlias node) { |
- if (node.getName().getName().equals(name)) { |
- result[0] = node; |
- } |
- return null; |
- } |
- }); |
- return result[0]; |
- } |
- |
- public static String getNodeSource(String code, DartNode node) { |
- SourceInfo sourceInfo = node.getSourceInfo(); |
- return code.substring(sourceInfo.getOffset(), sourceInfo.getEnd()); |
- } |
- |
- /** |
- * Asserts that parsed {@link DartUnit} has {@link DartExpression} with given source and its |
- * {@link SourceInfo} points to the given source. |
- */ |
- protected void assertNodeSourceInfo(String nodeSource) { |
- DartNode node = findNode(DartNode.class, nodeSource); |
- assertNotNull(node); |
- SourceInfo sourceInfo = node.getSourceInfo(); |
- String actualSource = testSource.substring(sourceInfo.getOffset(), sourceInfo.getEnd()); |
- assertEquals(nodeSource, actualSource); |
- } |
- |
- /** |
- * Asserts that {@link Element} with given name has expected type. |
- */ |
- protected static void assertInferredElementTypeString( |
- DartUnit unit, |
- String variableName, |
- String expectedType, |
- TypeQuality quality) { |
- // find element |
- Element element = getNamedElement(unit, variableName); |
- assertNotNull(element); |
- // check type |
- Type actualType = element.getType(); |
- assertInferredElementTypeString(actualType, element.getName(), expectedType, quality); |
- } |
- |
- protected static void assertInferredElementTypeString( |
- Type actualType, |
- String testName, |
- String expectedType, |
- TypeQuality quality) { |
- assertEquals(testName, expectedType, getTypeSource(actualType)); |
- if (quality != null) { |
- assertSame(quality, actualType.getQuality()); |
- } |
- } |
- |
- /** |
- * @return the source-like {@link String} for the given {@link Type}. |
- */ |
- protected static String getTypeSource(Type actualType) { |
- return actualType.toString(); |
- } |
- |
- /** |
- * @return the {@link Element} with given name, may be <code>null</code>. |
- */ |
- private static Element getNamedElement(DartUnit unit, final String name) { |
- final Element[] result = {null}; |
- unit.accept(new ASTVisitor<Void>() { |
- @Override |
- public Void visitIdentifier(DartIdentifier node) { |
- Element element = node.getElement(); |
- if (element != null && element.getName().equals(name)) { |
- result[0] = element; |
- } |
- return super.visitIdentifier(node); |
- } |
- }); |
- return result[0]; |
- } |
-} |