/*******************************************************************************
 * Copyright (c) 2008 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.refactoring.tests.rename;

import java.util.HashMap;
import java.util.Set;

import junit.framework.TestSuite;

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

public abstract class RenameTestSuite extends TestSuite
{
    ///////////////////////////////////////////////////////////////////////////
    //
    // RECORD POSITIONS OF ALL IDENTIFIERS IN RENAME1.F90, AND
    // GROUP THEM ACCORDING TO WHICH ONES SHOULD BE RENAMED TOGETHER
    //
    ///////////////////////////////////////////////////////////////////////////
    
    protected static class Ident
    {
        private String name;
        private HashMap<String, LineCol[]> references;
        
        public Ident(String name)
        {
            this.name = name;
            this.references = new HashMap<String, LineCol[]>();
        }
        
        public Ident(String filename, String name, LineCol[] referencesInFile)
        {
            this(name);
            addReferences(filename, referencesInFile);
        }
        
        public void addReferences(String filename, LineCol[] referencesInFile)
        {
            this.references.put(filename, referencesInFile);
        }

        public String getName()
        {
            return this.name;
        }

        public Set<String> getFiles()
        {
            return this.references.keySet();
        }
        
        public LineCol[] getReferences(String filename)
        {
            return this.references.get(filename);
        }
    }

    protected Ident var(String name) { return new Ident(name); }
    protected Ident var(String filename, String name, LineCol[] refs) { return new Ident(filename, name, refs); }
    protected LineCol lc(int line, int col) { return new LineCol(line, col); }
    
    ///////////////////////////////////////////////////////////////////////////
    //
    // SUITE BUILDING
    //
    ///////////////////////////////////////////////////////////////////////////

    private TestSuite currentSubSuite = null;
    
    protected void startTests(String description)
    {
        currentSubSuite = new TestSuite();
        currentSubSuite.setName(description);
    }
    
    protected void addSuccessTests(Ident ident, String newName)
    {
        TestSuite subSubSuite = new TestSuite();
        subSubSuite.setName("Renaming " + describe(ident, newName));
        
        for (String filename : ident.getFiles())
            for (LineCol position : ident.getReferences(filename))
                subSubSuite.addTest(new RenameTestCase.ExpectSuccess(filename, ident, position, newName));
        
        currentSubSuite.addTest(subSubSuite);
    }

    protected void addPreconditionTests(Ident ident, String newName)
    {
        TestSuite subSubSuite = new TestSuite();
        subSubSuite.setName("Attempting to rename " + describe(ident, newName));
        
        for (String filename : ident.getFiles())
            for (LineCol position : ident.getReferences(filename))
                subSubSuite.addTest(new RenameTestCase.ExpectFailure(filename, ident, position, newName));
        
        currentSubSuite.addTest(subSubSuite);
    }
    
    private String describe(Ident ident, String newName)
    {
        return ident.name + " to " + newName;
    }
    
    protected void endTests()
    {
        addTest(currentSubSuite);
        currentSubSuite = null;
    }
}
