/*******************************************************************************
 * Copyright (c) 2010 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.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import junit.framework.TestCase;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.photran.internal.core.FortranCorePlugin;
import org.eclipse.photran.internal.core.SyntaxException;
import org.eclipse.photran.internal.core.analysis.loops.LoopReplacer;
import org.eclipse.photran.internal.core.lexer.ASTLexerFactory;
import org.eclipse.photran.internal.core.lexer.LexerException;
import org.eclipse.photran.internal.core.lexer.sourceform.UnpreprocessedFreeSourceForm;
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.IExpr;
import org.eclipse.photran.internal.core.parser.Parser;
import org.eclipse.photran.internal.core.sourceform.ISourceForm;

/**
 * Base class for all Photran test cases.
 * <p>
 * This class provides methods to parse Fortran code, as well as some general utility methods.
 *
 * @author Jeff Overbey
 */
public abstract class PhotranTestCase extends TestCase
{
    public PhotranTestCase()
    {
        this(null);
    }

    public PhotranTestCase(String name)
    {
        super(name);
        if (!FortranCorePlugin.inTestingMode())
            fail("PHOTRAN'S UNIT TESTS MUST BE RUN AS A JUNIT PLUG-IN TEST");
    }

    protected ASTExecutableProgramNode parse(String string) throws IOException, LexerException, SyntaxException
    {
        return parse(string, new UnpreprocessedFreeSourceForm());
    }

    protected ASTExecutableProgramNode parse(String string, ISourceForm sourceForm) throws IOException, LexerException, SyntaxException
    {
        ASTExecutableProgramNode ast = new Parser().parse(new ASTLexerFactory().createLexer(new StringReader(string), null, "<stdin>", sourceForm));
        assertTrue(ast != null);
        return ast;
    }

    protected ASTExecutableProgramNode parse(File file) throws IOException, LexerException, SyntaxException, CoreException
    {
        return parse(file, new UnpreprocessedFreeSourceForm());
    }

    protected ASTExecutableProgramNode parse(File file, ISourceForm sourceForm) throws IOException, LexerException, SyntaxException, CoreException
    {
        ASTExecutableProgramNode ast = new Parser().parse(new ASTLexerFactory().createLexer(file, sourceForm));
        assertTrue(ast != null);
        return ast;
    }

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

    protected IExpr parseExpression(String expression) throws IOException, LexerException,
        SyntaxException
    {
        String program = "a = " + expression + "\nend";
        ASTExecutableProgramNode ast = parse(program);
        assertNotNull(ast);
        ASTMainProgramNode mainProg = (ASTMainProgramNode)ast.getProgramUnitList().get(0);
        ASTAssignmentStmtNode assignmentStmt = (ASTAssignmentStmtNode)mainProg.getBody().get(0);
        IExpr exprNode = assignmentStmt.getRhs();
        return exprNode;
    }

    protected <T> void assertCollectionsEqual(T[] expectedArray, Iterable<T> actualIterable)
    {
        assertCollectionsEqual(Arrays.asList(expectedArray), actualIterable);
    }

    protected <T> void assertCollectionsEqual(List<T> expected, Iterable<T> actualIterable)
    {
        List<T> actual = new ArrayList<T>();
        for (T entry : actualIterable)
            actual.add(entry);

        assertEquals(expected, actual);
    }
}
