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

import java.util.ArrayList;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.photran.core.vpg.util.LineCol;
import org.eclipse.photran.internal.core.refactoring.EncapsulateVariableRefactoring;

/**
 * 
 * @author Tim
 */
public class EncapsulateVariableFailTestCase extends EncapsulateVariableTestCase
{
    private ArrayList<String> myFailFilenames;
    private String failSelectionFile;
    private ITextSelection failSelection;
    private boolean isFatal;
    
    public EncapsulateVariableFailTestCase(){;}
    
    public EncapsulateVariableFailTestCase(ArrayList<String> fNames, String selectionfName, boolean isFatal, Object ignore)
    {
        super(fNames, selectionfName, ignore);
        myFailFilenames = fNames;
        failSelectionFile = selectionfName;
        this.isFatal = isFatal;
    }
    
    @Override
    protected void setSelection(String fContent, String filename)
    {        
        int startOffset = fContent.indexOf("!") + 1;
        int endOffset = fContent.indexOf(System.getProperty("line.separator"), startOffset);
        if(endOffset <= 0)
            endOffset = fContent.indexOf("\n", startOffset);
        
        String infoString = fContent.substring(startOffset, endOffset);
        String [] res = infoString.split(",");
        
        if(res.length < 3 || res.length > 3)
            throw new Error("Malformed test case");
        
        int line = Integer.parseInt(res[0]);
        int col = Integer.parseInt(res[1]);
        int length = Integer.parseInt(res[2]);
        
        LineCol lineCol = new LineCol(line, col);
        
        int actualOffset = getLineColOffset(filename, lineCol);
        
        failSelection = new TextSelection(actualOffset, length);
    }
    
    @Override
    protected void doRefactoring() throws Exception
    {
        IFile selFile = getFileAndSetSelection(DIR, failSelectionFile);
        
        for(String fName : myFailFilenames)
        {
            getFile(DIR, fName);
        }

        project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
        String before = compileAndRunFortranProgram();

        EncapsulateVariableRefactoring refactoring = new EncapsulateVariableRefactoring(selFile, failSelection);
        
        String description = "Attempt to encapsulate variables in " + failSelectionFile;
       
        RefactoringStatus status = refactoring.checkAllConditions(new NullProgressMonitor());
        if(isFatal)
            assertTrue(status.hasFatalError());
        else
            assertTrue(status.hasError());
    }
    
    public void test() throws Exception
    {
        if(myFailFilenames == null) 
            return;
        
        doRefactoring();
    }
}
