package org.eclipse.tigerstripe.workbench.base.test.refactor;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.tigerstripe.workbench.base.test.utils.ModelProjectHelper;
import org.eclipse.tigerstripe.workbench.internal.core.model.IAbstractArtifactInternal;
import org.eclipse.tigerstripe.workbench.model.deprecated_.IArtifactManagerSession;
import org.eclipse.tigerstripe.workbench.model.deprecated_.IField;
import org.eclipse.tigerstripe.workbench.model.deprecated_.IType;
import org.eclipse.tigerstripe.workbench.project.ITigerstripeModelProjectInternal;

import junit.framework.TestCase;

public abstract class AbstractRefactorTest extends TestCase{

    protected ITigerstripeModelProjectInternal project = null;
    protected final static String NAME = "model-refactoring";
    protected final static String MODIFIED = "Modified";
    protected final static String CHILD = ".child";

    protected final static String FIRST_SUB_PACKAGE = ModelProjectHelper.DEFAULT_PKG+CHILD;
    
    protected final static String M3 = ".M3";
    
    protected final static String ATT_0 = "first";
    protected final static String ATT_1 = "second";
    protected final static String ATT_2 = "third";
    protected final static String ATT_3 = "fourth";

    protected IArtifactManagerSession session;
    
    @Override
    protected void setUp() throws Exception {
        super.setUp();
        createProjectAndEntities();
    }

    public void tearDown() throws Exception {
        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        IResource proj = workspace.getRoot().findMember(NAME);
        if (proj != null)
            proj.delete(true, new NullProgressMonitor());
    }
    
    public void createProjectAndEntities() throws Exception {
        project = (ITigerstripeModelProjectInternal) ModelProjectHelper.createModelProject(NAME, true);

        // Need additional entities:

        session = project.getArtifactManagerSession();
        
            // Some attributes on M1 {
            IAbstractArtifactInternal m1Art = (IAbstractArtifactInternal) session.getArtifactByFullyQualifiedName(ModelProjectHelper.M1);
            IField attribute0 = m1Art.makeField();
            attribute0.setName(ATT_0);
            m1Art.addField(attribute0);
            m1Art.doSave(null);
        
        
            // Some attributes on M2
            IAbstractArtifactInternal m2Art = (IAbstractArtifactInternal) session.getArtifactByFullyQualifiedName(ModelProjectHelper.M2);
            IField attribute1 = m2Art.makeField();
            attribute1.setName(ATT_1);
            IType type = attribute1.makeType();
            attribute1.setType(type);
            type.setFullyQualifiedName(ModelProjectHelper.M1);
            m2Art.addField(attribute1);
            m2Art.doSave(null);
        

        // Extend from the base ones..
        
        IAbstractArtifactInternal m3 = (IAbstractArtifactInternal) session
                .makeArtifact(org.eclipse.tigerstripe.workbench.model.deprecated_.IManagedEntityArtifact.class
                        .getName());
        m3.setFullyQualifiedName(FIRST_SUB_PACKAGE+M3);
        m3.setExtendedArtifact(m1Art);
        m3.doSave(null);

    }
    
}
