/*******************************************************************************
 * 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.refactoring.addonlytousestmt;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.photran.internal.core.util.LineCol;

/**
 * 
 * @author Kurt Hendle
 */
public class AddOnlyToUseTestSuite extends TestSuite
{
    public static Test suite() throws Exception
    {
        TestSuite suite = new TestSuite();
        
        //1. basic test, add no list, leave the file the same
        String[] test1Files = new String[] { "test1.f90", "module2.f90", "module3.f90", "module4.f90" };
        suite.addTest(successTest(test1Files, new LineCol(3,5), 7));
        
        //2. basic test, add list of given names
        String[] test2Files = new String[] { "test2.f90", "module2.f90", "module3.f90", "module4.f90" };
        suite.addTest(successTest(test2Files, new LineCol(3,5), 7, "help_common3", "onlyTest"));
        
        //3. precondition test - give an empty selection for module name
        String[] test3Files = new String[] { "test3.f90", "module2.f90", "module3.f90", "module4.f90", "module5.f90" };
        suite.addTest(finalPreconditionTest(test3Files, new LineCol(3,5), 0));
        
        //4. precondition test - give a non-existent module name
        String[] test4Files = new String[] { "test3.f90", "module2.f90", "module3.f90", "module4.f90", "module5.f90" };
        suite.addTest(finalPreconditionTest(test4Files, new LineCol(8,9), 5));
        
        //5. precondition test - give a module containing no declarations
        String[] test5Files = new String[] { "test3.f90", "module2.f90", "module3.f90", "module4.f90", "module5.f90" };
        suite.addTest(preconditionTest(test5Files, new LineCol(5,5), 7));
        
        //6. precondition test - have entity conflict with local variable
        String[] test6Files = new String[] { "test6.f90", "module4.f90" };  //v name conflict
        suite.addTest(finalPreconditionTest(test6Files, new LineCol(2,9), 7, "f"));
        
        //7. precondition test - have 2 modules in project with same name
        String[] test7Files = new String[] { "test7.f90", "module4.f90" };
        suite.addTest(preconditionTest(test7Files, new LineCol(2,9), 7));
        
        //8. precondition test - have 2 declarations of subroutine in same project
        String[] test8Files = new String[] { "test8.f90", "module4.f90" };
        suite.addTest(successTest(test8Files, new LineCol(2,9), 7));
        
        //9. success test - requires refactoring to add entities already being used i
        //                  in the module to the ONLY list
        String[] test9Files = new String[] { "test9.f90", "module.f90" };
        suite.addTest(successTest(test9Files, new LineCol(2,9), 7));
        
        return suite;
    }
    
    private static TestSuite successTest(String[] filenames, LineCol position, int length)
    {
        return successTest(filenames, position, length, (String[])null);
    }
    
    private static TestSuite successTest(String[] filenames, LineCol position, int length, String... entityNames)
    {
        TestSuite subSuite = new TestSuite("Adding ONLY clause to USE statement - " + filenames[0]);
        subSuite.addTest(new AddOnlyToUseTestCase(filenames, position, length, false, false, entityNames));
        return subSuite;
    }
    
    private static TestSuite preconditionTest(String[] filenames, LineCol position, int length, String... entityNames)
    {
        TestSuite subSuite = new TestSuite("Testing preconditions for adding ONLY to USE statement - " +
            filenames[0]);
        subSuite.addTest(new AddOnlyToUseTestCase(filenames, position, length, true, false, entityNames));
        return subSuite;
    }
    
    private static TestSuite finalPreconditionTest(String[] filenames, LineCol position, int length, String... entityNames)
    {
        TestSuite subSuite = new TestSuite("Testing final preconditions for adding ONLY to USE statement - " +
            filenames[0]);
        subSuite.addTest(new AddOnlyToUseTestCase(filenames, position, length, false, true, entityNames));
        return subSuite;   
    }
}
