package org.eclipse.photran.refactoring.tests.rename;

import junit.framework.Test;

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

public class Rename9 extends RenameTestSuite
{
    private String filename = "rename9.f90";
    
    private Ident i1 = var(filename, "i1", new LineCol[] { lc(3,14), lc(36,12) });
    private Ident j1 = var(filename, "j1", new LineCol[] { lc(4,23) });
    private Ident k1 = var(filename, "k1", new LineCol[] { lc(5,14), lc(7,31) });
    private Ident f1 = var(filename, "f1", new LineCol[] { lc(12,20), lc(12,26), lc(36,24) });
    private Ident i2 = var(filename, "i2", new LineCol[] { lc(17,14) });
    private Ident j2 = var(filename, "j2", new LineCol[] { lc(18,22), lc(39,16) });
    private Ident k2 = var(filename, "k2", new LineCol[] { lc(20,13), lc(22,31), lc(39,20) });
    private Ident f2 = var(filename, "f2", new LineCol[] { lc(27,20), lc(27,26) });
    private Ident j1implicit = var(filename, "j1", new LineCol[] { lc(36,16) });
    private Ident k1implicit = var(filename, "k1", new LineCol[] { lc(36,20) });
    private Ident zimplicit = var(filename, "z", new LineCol[] { lc(36,30) });
    private Ident i2implicit = var(filename, "i2", new LineCol[] { lc(39,12) });
    private Ident f2implicit = var(filename, "f2", new LineCol[] { lc(39,29) });
    
    // Note that the order here determines the order in the expectSuccess matrix below
    private Ident[] allVars = new Ident[]
    {
        i1, j1, k1, f1, i2, j2, k2, f2, j1implicit, k1implicit, zimplicit, i2implicit, f2implicit
    };

    private boolean[][] expectSuccess = new boolean[][]
      {
          // IMPORTANT:
          // * Subprogram arguments cannot be renamed
          // * x cannot be renamed to x
          // * j1 and j1implicit have the SAME NAME, so their columns should be identical (same for k1, etc.)
          
          /* vvv can be renamed to >>>     i1     j1     k1     f1     i2     j2     k2     f2     j1implicit k1implicit zimplicit i2implicit f2implicit   
          /* i1         */ new boolean[] { false, false, false, false, false, false, false, false, false,     false,     false,    false,     false },
          /* j1         */ new boolean[] { false, false, false, false, true,  true,  true,  true,  false,     false,     true,     true,      true  },
          /* k1         */ new boolean[] { false, false, false, false, true,  true,  true,  true,  false,     false,     false,    true,      true  },
          /* f1         */ new boolean[] { false, false, false, false, false, false, false, false, false,     false,     false,    false,     false },
          /* i2         */ new boolean[] { true,  true,  true,  true,  false, false, false, false, true,      true,      true,     false,     false },
          /* j2         */ new boolean[] { false, false, false, false, false, false, false, false, false,     false,     false,    false,     false },
          /* k2         */ new boolean[] { false, false, false, false, false, false, false, false, false,     false,     false,    false,     false },
          /* f2         */ new boolean[] { true,  true,  true,  true,  false, false, false, false, true,      true,      true,     false,     false },
          /* j1implicit */ new boolean[] { false, false, false, false, false, false, false, false, false,     false,     false,    false,     false },
          /* k1implicit */ new boolean[] { false, false, false, false, false, false, false, false, false,     false,     false,    false,     false },
          /* zimplicit  */ new boolean[] { false, false, false, false, false, false, false, false, false,     false,     false,    false,     false },
          /* i2implicit */ new boolean[] { false, false, false, false, false, false, false, false, false,     false,     false,    false,     false },
          /* f2implicit */ new boolean[] { false, false, false, false, false, false, false, false, false,     false,     false,    false,     false },
      };

    public static Test suite() throws Exception
    {
        return new Rename9();
    }
    
    public Rename9() throws Exception
    {
        startTests("Renaming in module with interfaces and visibilities");
        for (int i = 0; i < allVars.length; i++)
        {
            addSuccessTests(allVars[i], "something_different");
            for (int j = 0; j < allVars.length; j++)
            {
                if (expectSuccess[i][j])
                    addSuccessTests(allVars[i], allVars[j].getName());
                else
                    addPreconditionTests(allVars[i], allVars[j].getName());
            }
        }
        endTests();
    }
}
