/*******************************************************************************
 * 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.core.tests.makeprivatepublic;

import org.eclipse.photran.core.vpg.util.LineCol;

import junit.framework.Test;
import junit.framework.TestSuite;

/**
 *
 * @author Kurt Hendle
 */
public class MakePrivateEntityPublicTestSuite extends TestSuite
{
    public static Test suite() throws Exception
    {
        TestSuite suite = new TestSuite();

        //1. functionality test - multiple variables in list
        suite.addTest(successTest("priv1.f90",new LineCol(4,13), 1));

        //2. functionality test - single variable list (simply change private to public)
        suite.addTest(successTest("priv2.f90",new LineCol(5,13), 1));

        //3. functionality test - single variable, private statement in declaration attributes
        suite.addTest(successTest("test3.f90", new LineCol(3,25), 1));

        //4. functionality test - multiple variables, private statement in declaration attributes
        suite.addTest(successTest("test4.f90", new LineCol(3,22), 4));

        //5. functionality test - single var, private stmt and other attributes in declaration
        suite.addTest(successTest("test5.f90", new LineCol(3,35), 5));

        //6. functionality test - mult. vars., private stmt and other attributes in declaration
        suite.addTest(successTest("test6.f90", new LineCol(3,42), 4));

        //7. functionality test - private statement alone, all program entities private
        suite.addTest(successTest("test7.f90", new LineCol(6,23), 4));
        suite.addTest(successTest("test7_1.f90", new LineCol(6,23), 4));

        //8. precondition test - empty selection ""
        suite.addTest(preconditionTest("priv1.f90", new LineCol(3,13), 0));

        //9. precondition test - select variable which is not tagged private
        suite.addTest(preconditionTest("priv1.f90", new LineCol(3,16), 1));
        suite.addTest(preconditionTest("testFile1.f90", new LineCol(4,13), 1));

        //10. precondition test - select a public variable
        suite.addTest(preconditionTest("priv2.f90", new LineCol(6,12), 1));
        suite.addTest(preconditionTest("testFile1.f90", new LineCol(11,15), 1));

        //11. precondition test - test if possible to make definition public
        // NOTE: will fail til ScopingNode#canAddDefinition is added
        // FIXME JO suite.addTest(preconditionTest("main.f90", new LineCol(19,24), 8));

        //12. functionality test - subroutine/function made private by a lone private stmt
        suite.addTest(successTest("test12.f90", new LineCol(6,16), 6));

        //13 precondition test - subroutine/function not made private
        suite.addTest(preconditionTest("test13.f90", new LineCol(16,14), 3));

        return suite;
    }

    private static TestSuite successTest(String filename, LineCol position, int length)
    {
        TestSuite subSuite = new TestSuite("Making private variable public - " + filename);
        subSuite.addTest(new MakePrivateEntityPublicTestCase(filename, position, length, false));
        return subSuite;
    }

    private static TestSuite preconditionTest(String filename, LineCol position, int length)
    {
        TestSuite subSuite = new TestSuite("Testing preconditions for making private entity public - " +
            filename);
        subSuite.addTest(new MakePrivateEntityPublicTestCase(filename, position, length, true));
        return subSuite;
    }
}
