package org.eclipse.team.tests.ccvs.core.compatible;
/*
 * (c) Copyright IBM Corp. 2000, 2002.
 * All Rights Reserved.
 */
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.team.tests.ccvs.core.JUnitTestCase;

public class ConflictTest extends JUnitTestCase {
	SameResultEnv env1;
	SameResultEnv env2;
	
	public ConflictTest() {
		this(null);
	}
	
	public ConflictTest(String arg) {
		super(arg);
		env1 = new SameResultEnv(arg + "checkout1");
		env2 = new SameResultEnv(arg + "checkout2");
	}

	public void setUp() throws Exception {
		env1.setUp();
		env2.setUp();

		// Set the project to the content we need ...
		env1.magicSetUpRepo("proj2",new String[]{"a.txt","f1/b.txt","f1/c.txt"});
		env2.deleteFile("proj2");
	}
	
	public void tearDown() throws Exception {
		env1.tearDown();
		env2.tearDown();
	}
	
	public static Test suite() {
		TestSuite suite = new TestSuite(ConflictTest.class);
		//return new CompatibleTestSetup(new ConflictTest("testSimpleConflict"));
		return new CompatibleTestSetup(suite);
	}
	
	public void testSimpleConflict() throws Exception {
		// Download content in two locations
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"},"");
		env2.execute("co",EMPTY_ARGS,new String[]{"proj2"},"");
		
		// change the file in both directories in a different way
		env1.appendToFile("proj2/f1/c.txt", new String[] { "AppendIt This" });
		env2.appendToFile("proj2/f1/c.txt", new String[] { "AppendIt That" });
		
		// commit changes of the first
		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
		
		// load the changes into the changed file
		// and submit the merge
		env2.execute("update",EMPTY_ARGS,new String[]{"proj2"},"");
		
		// commit must fail because we have a merged conflict which has not been
		// edited.
		env2.setIgnoreExceptions(true);
		env2.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
		env2.setIgnoreExceptions(false);
		
		// Make a change to the file in order to let the cvs-client know
		// that we solved the confilict
		env2.appendToFile("proj2/f1/c.txt", new String[] { "That's allright" });
		env2.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
	}
	
	public void testMergedUpdate() throws Exception {
		// Download content in two locations
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"},"");
		env2.execute("co",EMPTY_ARGS,new String[]{"proj2"},"");
		
		// change the file in both directories in a different way so that 
		// can be merged without conflicts
		env1.prefixToFile("proj2/f1/c.txt", new String[] { "AppendIt at top" });
		env2.appendToFile("proj2/f1/c.txt", new String[] { "AppendIt at bottom" });
		
		// commit changes of the first
		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
		
		// changes should be merged
		env2.execute("update",EMPTY_ARGS,new String[]{"proj2"},"");
		env2.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");	
	}
}