package org.eclipse.team.tests.ccvs.core.compatible;
/*
 * (c) Copyright IBM Corp. 2000, 2002.
 * All Rights Reserved.
 */
import java.util.Date;
import java.util.GregorianCalendar;

import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.team.tests.ccvs.core.JUnitTestCase;

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

	public static void main(String[] args) {	
		run(BasicTest.class);
	}

	public static Test suite() {
		TestSuite suite = new TestSuite(BasicTest.class);
		return new CompatibleTestSetup(suite);
		//return new CompatibleTestSetup(new BasicTest("testReadOnly"));
	}
	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 void testAdd() throws Exception {
		
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env1.writeToFile("proj2/d.txt",new String[]{"The file to be added","next"});
		env1.mkdirs("proj2/f2/f3");
		env1.mkdirs("proj2/f4/f5");
		env1.writeToFile("proj2/f4/f5/e.txt", new String[]{"Another file to be added","next"});
		
		env1.execute("add",EMPTY_ARGS,new String[]{"d.txt"},"proj2");
		env1.execute("add",EMPTY_ARGS,new String[]{"f2","f2/f3"},"proj2");
		env1.execute("add",EMPTY_ARGS,new String[]{"f4"},"proj2");
		env1.execute("add",EMPTY_ARGS,new String[]{"f4/f5"},"proj2");
		env1.execute("add",EMPTY_ARGS,new String[]{"f4/f5/e.txt"},"proj2");
		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"});

		// Check the stuff out somewhere else to acctually check, that
		// the file has been accepted
		env2.execute("co",EMPTY_ARGS,new String[]{"proj2"});		
	}

	public void testAddUpdate() throws Exception {
		
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env2.execute("co",EMPTY_ARGS,new String[]{"proj2"});		

		env1.writeToFile("proj2/d.txt",new String[]{"The file to be added","next"});
		env1.mkdirs("proj2/f2/f3");
		env1.mkdirs("proj2/f4/f5");
		env1.writeToFile("proj2/f4/f5/e.txt", new String[]{"Another file to be added","next"});
		
		env1.execute("add",EMPTY_ARGS,new String[]{"d.txt"},"proj2");
		env1.execute("add",EMPTY_ARGS,new String[]{"f2","f2/f3"},"proj2");
		env1.execute("add",EMPTY_ARGS,new String[]{"f4"},"proj2");
		env1.execute("add",EMPTY_ARGS,new String[]{"f4/f5"},"proj2");
		env1.execute("add",EMPTY_ARGS,new String[]{"f4/f5/e.txt"},"proj2");
		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"});

		env2.execute("update",EMPTY_ARGS,new String[]{"proj2"});		

	}

	public void testRemove() throws Exception {
		
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env1.deleteFile("proj2/a.txt");
		env1.deleteFile("proj2/f1/c.txt");
		
		env1.execute("remove",EMPTY_ARGS,new String[]{"a.txt"},"proj2");
		env1.execute("remove",EMPTY_ARGS,new String[]{"f1/c.txt"},"proj2");
		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"});

		// Check the stuff out somewhere else to acctually check, that
		// the file has been accepted
		env2.execute("co",EMPTY_ARGS,new String[]{"proj2"});		
	}
	
	public void testRemoveRecusive() throws Exception {
		
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env2.execute("co",EMPTY_ARGS,new String[]{"proj2"});		

		env1.deleteFile("proj2/a.txt");
		env1.deleteFile("proj2/f1/c.txt");
		
		env1.execute("remove",EMPTY_ARGS,new String[0],"proj2");
		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"});

		// Check the stuff out somewhere else to acctually check, that
		// the file has been accepted
		env2.execute("update",EMPTY_ARGS,new String[]{"proj2"});		
	}
	
	public void testRoundRewrite() 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 "proj1/folder1/c.txt" in env1 check it in
		// on the server
		env1.appendToFile("proj2/f1/c.txt", new String[] { "AppendIt" });
		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
		
		// assure that the file is different in env1 and env2
		// try {
		//	assertEqualsArrays(env1.readFromFile("proj2/f1/c.txt"),
		//				   	   env2.readFromFile("proj2/f1/c.txt"));
		//	throw new IllegalArgumentException("This is a failed Assertion");
		// } catch (AssertionFailedError e) {}
		
		// update env2 and make sure the changes are there
		env2.execute("update",EMPTY_ARGS,new String[]{"proj2"},"");
		// assertEqualsArrays(env1.readFromFile("proj2/f1/c.txt"),
		//				   env2.readFromFile("proj2/f1/c.txt"));
	}
	
	public void testUpdateMinusN() throws Exception {	
		String[] fileContent1;
		
		fileContent1 = new String[]{"RandomNumber", Math.random() + ""};
		
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env2.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		
		env1.writeToFile("proj1/folder1/c.txt",fileContent1);
		
		env1.execute("ci",new String[]{"-n"},new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
		env2.execute("update",EMPTY_ARGS,new String[]{"proj2"});		
	}
	
	public void testStatus() throws Exception {
		
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env1.execute("status",EMPTY_ARGS,new String[]{"proj2"});
		
		env1.deleteFile("proj2/a.txt");
		env1.deleteFile("proj2/f1/c.txt");
		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });

		env1.execute("status",EMPTY_ARGS,new String[]{"proj2"});
		env1.execute("status",EMPTY_ARGS,new String[0],"proj2");

		env1.createRandomFile("proj2/d.txt");

		env1.execute("status",EMPTY_ARGS,new String[0],"proj2");
		env1.execute("status",EMPTY_ARGS,new String[]{"f1/b.txt"},"proj2");
		// env1.execute("status",localOptions,new String[]{"d.txt"},"proj2");
	}

	public void testLog() throws Exception {
		
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env1.execute("log",EMPTY_ARGS,new String[]{"proj2"});
		
		env1.deleteFile("proj2/a.txt");
		env1.deleteFile("proj2/f1/c.txt");
		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });

		env1.execute("log",EMPTY_ARGS,new String[]{"proj2"});
		env1.execute("log",EMPTY_ARGS,new String[0],"proj2");

		env1.createRandomFile("proj2/d.txt");

		env1.execute("log",EMPTY_ARGS,new String[0],"proj2");
		env1.execute("log",EMPTY_ARGS,new String[]{"f1/b.txt"},"proj2");
	
	}	
	
	public void testBranchTag() throws Exception {
		
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env1.execute("tag",new String[]{"-b"},new String[]{"tag1","proj2"});
		
		env1.deleteFile("proj2/a.txt");
		env1.deleteFile("proj2/f1/c.txt");
		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });

		env1.execute("tag",new String[]{"-b"},new String[]{"tag2","proj2"});

		env1.createRandomFile("proj2/d.txt");
		
		env1.deleteFile("proj2");
		
		// Try an commit and an add in the two different streams
		env1.execute("co",new String[]{"-r","tag1"},new String[]{"proj2"});
		env1.appendToFile("proj2/f1/b.txt", new String[] { "AppendItTwo" });
		env1.createRandomFile("proj2/d.txt");
		env1.execute("add",new String[0],new String[]{"d.txt"},"proj2");
		env1.execute("ci",new String[]{"-m","branch"},new String[]{"proj2"});
		env1.deleteFile("proj2");
		env1.execute("co",new String[]{"-r","tag1"},new String[]{"proj2"});

		env2.execute("co",new String[]{"-r","tag2"},new String[]{"proj2"});
		env2.appendToFile("proj2/f1/b.txt", new String[] { "AppendItThree" });
		env2.createRandomFile("proj2/d.txt");
		env2.execute("add",new String[0],new String[]{"d.txt"},"proj2");
		env2.execute("ci",new String[]{"-m","branch"},new String[]{"proj2"});	
		env2.deleteFile("proj2");
		env2.execute("co",new String[]{"-r","tag2"},new String[]{"proj2"});
	}
		
	public void testBranchingWithLocalChanges() throws Exception {
		// Try to branch of a workspace with local changes
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		JUnitTestCase.waitMsec(1500);
		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });
		env1.execute("tag",new String[]{"-b"},new String[]{"branch-with-changes","proj2"});
		env1.execute("update",new String[]{"-r", "branch-with-changes"},new String[]{"proj2"});
	}

	public void testTag() throws Exception {
		
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env1.execute("tag",EMPTY_ARGS,new String[]{"tag1","proj2"});
		
		env1.deleteFile("proj2/a.txt");
		env1.deleteFile("proj2/f1/c.txt");
		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });

		env1.execute("tag",EMPTY_ARGS,new String[]{"tag2","proj2"});
		env1.execute("tag",EMPTY_ARGS,new String[]{"tag2"},"proj2");

		env1.createRandomFile("proj2/d.txt");

		env1.execute("tag",EMPTY_ARGS,new String[]{"tag3"},"proj2");
		env1.execute("tag",EMPTY_ARGS,new String[]{"tag3","f1/b.txt"},"proj2");
		
		env1.deleteFile("proj2");
		env1.execute("co",new String[]{"-r","tag1"},new String[]{"proj2"});
		env1.deleteFile("proj2");
		env1.execute("co",new String[]{"-r","tag2"},new String[]{"proj2"});
		env1.deleteFile("proj2");
		env1.execute("co",new String[]{"-r","tag3"},new String[]{"proj2"});
		
		// env1.execute("tag",localOptions,new String[]{"d.txt"},"proj2");
		
		env1.execute("update", new String[]{"-r","tag1"}, new String[]{"proj2"});
		env1.execute("update", new String[]{"-r","tag2"}, new String[]{"proj2"});
		env1.execute("update", new String[]{"-r","tag3"}, new String[]{"proj2"});
		env1.execute("update", new String[]{"-A"}, new String[]{"proj2"});
	}
	
	public void testRTag() throws Exception {
		
		// Checkout and tag the project
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env1.execute("tag",EMPTY_ARGS,new String[]{"tag1","proj2"});
		env1.deleteFile("proj2");
		
		// Use rtag to tag the above tag as both a version and a branch
		env1.execute("rtag",new String[]{"-r", "tag1"},new String[]{"rtag1","proj2"});
		env1.execute("rtag",new String[]{"-b", "-r", "tag1"},new String[]{"btag1","proj2"});
		
		// Checkout the version and branch
		env1.deleteFile("proj2");
		env1.execute("co",new String[]{"-r","rtag1"},new String[]{"proj2"});
		env1.deleteFile("proj2");
		env1.execute("co",new String[]{"-r","btag1"},new String[]{"proj2"});
	}
	
	public void testPrune() 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 "proj1/folder1/c.txt" in env1 check it in
		// on the server
		env1.deleteFile("proj2/f1/b.txt");
		env1.deleteFile("proj2/f1/c.txt");
		env1.execute("remove",EMPTY_ARGS,new String[0],"proj2");
		
		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
		env1.execute("update",new String[]{"-P"},new String[]{"proj2"},"");
		
		// update env2 and make sure the changes are there
		env2.execute("update",new String[]{"-P"},new String[]{"proj2"},"");

	}
	
	public void testPrune2() 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 "proj1/folder1/c.txt" in env1 check it in
		// on the server
		env1.deleteFile("proj2/f1/b.txt");
		env1.deleteFile("proj2/f1/c.txt");
		env1.execute("remove",EMPTY_ARGS,new String[0],"proj2");
		
		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
		env1.execute("update",new String[]{"-P"},new String[]{},"proj2");
		
		// update env2 and make sure the changes are there
		env2.execute("update",new String[]{"-P"},new String[]{},"proj2");

	}
	
	public void testAdmin() throws Exception {
				
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"},"");
		
		env1.execute("admin",new String[]{"-kb"},new String[]{"proj2/f1/b.txt"},"");
		env1.execute("update",EMPTY_ARGS,new String[]{"proj2"},"");
		
		env2.execute("co",EMPTY_ARGS,new String[]{"proj2"},"");
	}

	public void testDiff() throws Exception {
		
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
		env1.execute("diff",EMPTY_ARGS,new String[]{"proj2"});
		
		env1.setIgnoreExceptions(true);
		
		env1.appendToFile("proj2/f1/c.txt",new String[] {"AppendIt2" });
		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });
		
		env1.execute("diff",EMPTY_ARGS,new String[]{"proj2"});
		env1.execute("diff",EMPTY_ARGS,new String[0],"proj2");
		
		env1.createRandomFile("proj2/d.txt");

		env1.execute("diff",EMPTY_ARGS,new String[0],"proj2");
		env1.execute("diff",EMPTY_ARGS,new String[]{"f1/b.txt"},"proj2");
		// env1.execute("diff",localOptions,new String[]{"d.txt"},"proj2");

		env1.setIgnoreExceptions(false);
	}

	public void testReadOnly() throws Exception {
		
		// Checkout a read-only copy
		env1.execute("co",new String[]{"-r"},EMPTY_ARGS,new String[]{"proj2"},"");
		// Checkout and modify a writable copy
		env2.execute("co",new String[]{},EMPTY_ARGS,new String[]{"proj2"},"");
		env2.appendToFile("proj2/f1/c.txt",new String[] {"AppendIt2" });
		// Update the read only copy
		env1.execute("update",new String[] {"-r"},EMPTY_ARGS,new String[]{"proj2"},"");
		
		// Update the read-only copy to writable
		env1.execute("update",new String[] {},EMPTY_ARGS,new String[]{"proj2"},"");
	}
	
	public void testQuestionables() throws Exception {			
		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"},"");
		env1.writeToFile("proj2/f2/d.txt", new String[]{"content"});
		env1.writeToFile("proj2/f3/f4/d.txt", new String[]{"content"});	
		env1.writeToFile("proj2/f5/f6/f7/d.txt", new String[]{"content"});	
		env1.execute("add",new String[0],new String[]{"f3"},"proj2");
		env1.execute("add",new String[0],new String[]{"f3/f4"},"proj2");
		env1.execute("update",new String[0],new String[]{"."},"proj2");
	}
	
	public void testImportWrappers() throws Exception {
		// Make the project empty
		env1.magicSetUpRepo("proj3",new String[]{"NoImportant.txt"});
		env2.deleteFile("proj3");
		
		// Create resouces and import them with the 
		// special wrapper
		env1.createRandomFile(new String[]{"a.txt","a.class","a.xxx"},"proj3");
		env1.execute("import",
					new String[]{"-W","*.txt -k 'kv'","-W","*.class -k 'b'","-I","*.xxx","-m","msg"},
					new String[]{"proj3","aTag","bTag"},
					"proj3");
		
		// download the server-version	
		env2.execute("co",EMPTY_ARGS,new String[]{"proj3"},"");
	}
	
	public void testImportIgnores() throws Exception {
		// Make the project empty
		env1.magicSetUpRepo("proj3",new String[]{"NoImportant.txt"});
		env2.deleteFile("proj3");
		
		// Create resouces and import them with the 
		// special wrapper
		env1.createRandomFile(new String[]{"a.txt","a.class","a.xxx"},"proj3");
		env1.execute("import",
					new String[]{"-I","*.xxx","-m","msg"},
					new String[]{"proj3","aTag","bTag"},
					"proj3");
		
		// download the server-version	
		env2.execute("co",EMPTY_ARGS,new String[]{"proj3"},"");
	}
	
	private String toGMTString(Date d) {
		return d.toGMTString();
	}
	
	public void testDate() throws Exception {
		
		// IMPOTANT:
		// Do not make tests with relative dates, because the times coming back form the server will 
		// sometimes differ from the reference-client to the eclipse-client due to the time-delay in calling

		Date beforeChange;
		Date firstChange;
		Date secondChange;
		
		env1.execute("co",new String[0],new String[]{"proj2"});
		
		// Change the file "a.txt" and record the times you are doing that at
		waitMsec(1100); // here we wait for the import to finish
		beforeChange = GregorianCalendar.getInstance().getTime();

		waitMsec(1100);
	
		env1.appendToFile("proj2/a.txt",new String[] { "AppendIt" });
		env1.execute("ci",new String[]{"-m","msg"},new String[]{"proj2"});
		firstChange = GregorianCalendar.getInstance().getTime();

		waitMsec(1100);
			
		env1.appendToFile("proj2/a.txt",new String[] { "AppendIt2" });
		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt2" });
		env1.execute("ci",new String[]{"-m","msg"},new String[]{"proj2"});
		secondChange = GregorianCalendar.getInstance().getTime();

		waitMsec(1100);		

		env1.deleteFile("proj2");
		
		// Now check the project at different times out
		env1.execute("co",new String[]{"-D",toGMTString(beforeChange)},new String[]{"proj2"});
		env1.deleteFile("proj2");
		
		env1.execute("co",new String[]{"-D",toGMTString(firstChange)},new String[]{"proj2"});
		env1.deleteFile("proj2");
		
		env1.execute("co",new String[]{"-D",toGMTString(secondChange)},new String[]{"proj2"});
		env1.deleteFile("proj2");
		
		// Now do some updates to look if update -D works
		env1.execute("co",new String[0],new String[]{"proj2"});
		env1.execute("update",new String[]{"-D",toGMTString(beforeChange)},new String[]{"proj2"});
		env1.execute("update",new String[]{"-D",toGMTString(firstChange)},new String[]{"proj2"});
		env1.execute("update",new String[]{"-D",toGMTString(secondChange)},new String[]{"proj2"});

		// We look if the parameter -a is working
		env1.execute("update",new String[]{"-D",toGMTString(beforeChange),"-A"},new String[]{"proj2"});
		env1.execute("update",new String[]{"-D",toGMTString(secondChange)},new String[]{"proj2"});
		env1.deleteFile("proj2");
		
		// We get try to merge changes from different dates
		env1.execute("co",new String[0],new String[]{"proj2"});
		env1.appendToFile("proj2/a.txt", new String[] { "This is the world ..." });
		env1.execute("update",new String[]{"-D",toGMTString(beforeChange)},new String[]{"proj2"});
		env1.appendToFile("proj2/a.txt", new String[] {"... which constantly changes" });
		env1.execute("update",new String[]{"-A"},new String[]{"proj2"});
		// Change something to be able to commit
		env1.appendToFile("proj2/a.txt", new String[] { "... and the changes are approved" });
		env1.execute("ci",new String[]{"-m","msg"},new String[]{"proj2"});
		
	}
}

