blob: f609c2f3b2dec791215ad6fd05817df670777ac8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.dltk.ruby.core.tests.parser;
import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.ASTVisitor;
import org.eclipse.dltk.ast.declarations.ModuleDeclaration;
import org.eclipse.dltk.compiler.env.ModuleSource;
import org.eclipse.dltk.compiler.problem.AbstractProblemReporter;
import org.eclipse.dltk.compiler.problem.IProblem;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.tests.model.AbstractModelTests;
import org.eclipse.dltk.ruby.core.RubyNature;
import org.eclipse.dltk.ruby.core.tests.Activator;
public abstract class AbstractASTTest extends AbstractModelTests {
protected static class CountingProblemReporter extends
AbstractProblemReporter {
public int count = 0;
public String lastInfo = "<no errors>";
public void reset() {
count = 0;
}
public int getCount() {
return count;
}
public String info() {
return lastInfo;
}
@Override
public void reportProblem(IProblem problem) {
count++;
lastInfo = problem.getMessage();
}
}
protected final static CountingProblemReporter problems = new CountingProblemReporter();
public AbstractASTTest(String testProjectName, String name) {
super(testProjectName, name);
}
public AbstractASTTest(String name) {
super(Activator.PLUGIN_ID, name);
}
protected ModuleDeclaration getAST(String content) {
problems.reset();
return (ModuleDeclaration) DLTKLanguageManager.getSourceParser(
RubyNature.NATURE_ID).parse(new ModuleSource(content), problems);
}
protected ASTNode getNodeAt(ASTNode root, final int start, final int end)
throws Exception {
assertTrue((start != -1) || (end != -1));
final ASTNode[] result = new ASTNode[] { null };
ASTVisitor visitor = new ASTVisitor() {
@Override
public boolean visitGeneral(ASTNode node) throws Exception {
if ((node.sourceStart() == start || start == -1)
&& (node.sourceEnd() == end || end == -1)) {
if (result[0] != null
&& !(result[0] instanceof ModuleDeclaration))
throw new RuntimeException("Two different nodes on "
+ start + ":" + end);
result[0] = node;
}
return true;
}
};
root.traverse(visitor);
return result[0];
}
protected abstract Class<?> getExpectedClass();
protected ASTNode checkNode(String content, int start, int end)
throws Exception {
ModuleDeclaration ast = getAST(content);
assertNotNull(ast);
if (problems.getCount() != 0) {
throw new RuntimeException(problems.info());
}
ASTNode nodeAt = getNodeAt(ast, start, end);
assertNotNull(nodeAt);
assertEquals(getExpectedClass(), nodeAt.getClass());
return nodeAt;
}
}