/*******************************************************************************
 * Copyright (c) 2009 University of Illinois at Urbana-Champaign 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
 *
 * Contributors:
 *    UIUC - Initial API and implementation
 *******************************************************************************/
package org.eclipse.photran.internal.tests;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import junit.framework.TestCase;

import org.eclipse.photran.internal.core.SyntaxException;
import org.eclipse.photran.internal.core.analysis.dependence.LoopDependences;
import org.eclipse.photran.internal.core.analysis.dependence.GCDTest;
import org.eclipse.photran.internal.core.analysis.loops.ASTProperLoopConstructNode;
import org.eclipse.photran.internal.core.analysis.loops.LoopReplacer;
import org.eclipse.photran.internal.core.lexer.LexerException;
import org.eclipse.photran.internal.core.lexer.LexerFactory;
import org.eclipse.photran.internal.core.lexer.SourceForm;
import org.eclipse.photran.internal.core.parser.ASTAssignmentStmtNode;
import org.eclipse.photran.internal.core.parser.ASTExecutableProgramNode;
import org.eclipse.photran.internal.core.parser.ASTMainProgramNode;
import org.eclipse.photran.internal.core.parser.IBodyConstruct;
import org.eclipse.photran.internal.core.parser.Parser;

/**
 * Base class for unit tests for dependence testing classes.
 *
 * @author Jeff Overbey
 */
public abstract class BaseTestCase extends TestCase
{
    protected LoopDependences dependences(String loop) throws IOException, LexerException, SyntaxException
    {
        return LoopDependences.computeFor(loop(loop), new GCDTest());
    }

    protected ASTProperLoopConstructNode loop(String stmt) throws IOException, LexerException, SyntaxException
    {
        ASTProperLoopConstructNode result = parseStmt(stmt);
        assertNotNull(result);
        return result;
    }

    protected ASTAssignmentStmtNode assignment(String stmt) throws IOException, LexerException, SyntaxException
    {
        ASTAssignmentStmtNode result = parseStmt(stmt);
        assertNotNull(result);
        return result;
    }

    @SuppressWarnings("unchecked")
    protected <T extends IBodyConstruct> T parseStmt(String stmt) throws IOException, LexerException, SyntaxException
    {
        String program = stmt + "\nend program\n";
        InputStream in = new ByteArrayInputStream(program.getBytes());
        ASTExecutableProgramNode ast = new Parser().parse(LexerFactory.createLexer(in, null, null, SourceForm.UNPREPROCESSED_FREE_FORM, true));
        assertTrue(ast != null);
        LoopReplacer.replaceAllLoopsIn(ast);
        return (T)((ASTMainProgramNode)ast.getProgramUnitList().get(0)).getBody().get(0);
    }
}
