/**
 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
 */

package net.sourceforge.pmd.lang.java.symboltable;

import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;

import org.apache.commons.io.IOUtils;

import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.LanguageVersion;
import net.sourceforge.pmd.lang.LanguageVersionHandler;
import net.sourceforge.pmd.lang.java.JavaLanguageModule;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;

public abstract class STBBaseTst {

    protected ASTCompilationUnit acu;
    protected SymbolFacade stb;

    protected void parseCode(final String code) {
        parseCode(code, LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getDefaultVersion());
    }

    protected void parseCode15(String code) {
        parseCode(code, LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.5"));
    }

    protected void parseCode(final String code, final LanguageVersion languageVersion) {
        final LanguageVersionHandler languageVersionHandler = languageVersion.getLanguageVersionHandler();
        acu = (ASTCompilationUnit) languageVersionHandler.getParser(languageVersionHandler.getDefaultParserOptions())
                .parse(null, new StringReader(code));
        stb = new SymbolFacade();
        stb.initializeWith(acu);
    }

    // Note: If you're using Eclipse or some other IDE to run this test, you
    // _must_ have the src/test/java folder in the classpath. Normally the IDE
    // doesn't put source directories themselves directly in the classpath, only
    // the output directories are in the classpath.
    protected void parseForClass(final Class<?> clazz) {
        final String sourceFile = clazz.getName().replace('.', '/') + ".java";
        final InputStream is = STBBaseTst.class.getClassLoader().getResourceAsStream(sourceFile);
        if (is == null) {
            throw new IllegalArgumentException("Unable to find source file " + sourceFile + " for " + clazz);
        }
        final String source;
        try {
            source = IOUtils.toString(is);
        } catch (final IOException e) {
            throw new RuntimeException(e);
        }
        parseCode(source, LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getDefaultVersion());
    }
}
