using Perforce.P4;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace p4api.net.unit.test
{
	/// 
	///This is a test class for RepositoryTest and is intended
	///to contain RepositoryTest Unit Tests
	///
	public partial class RepositoryTest
	{
		/// 
		///A test for CreateDepot
		///
		[TestMethod()]
		public void CreateDepotTest()
		{
			bool unicode = false;
			string uri = "localhost:6666";
			string user = "admin";
			string pass = string.Empty;
			string ws_client = "admin_space";
			for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
			{
				Process p4d = Utilities.DeployP4TestServer(TestDir, 8, unicode);
				Server server = new Server(new ServerAddress(uri));
				try
				{
					Repository rep = new Repository(server);
					using (Connection con = rep.Connection)
					{
						con.UserName = user;
						con.Client = new Client();
						con.Client.Name = ws_client;
						bool connected = con.Connect(null);
						Assert.IsTrue(connected);
						Assert.AreEqual(con.Status, ConnectionStatus.Connected);
						Depot d = new Depot();
						d.Id = "NewDepot";
						d.Description = "created by perforce";
						d.Owner = "admin";
						d.Type = DepotType.Stream;
						d.Map = "NewDepot/...";
						Depot newDepot = rep.CreateDepot(d, null);
						Assert.IsNotNull(newDepot);
					}
				}
				finally
				{
					Utilities.RemoveTestServer(p4d, TestDir);
				}
				unicode = !unicode;
			}
		}
        /// 
        ///A test for CreateDepot with an invalid path
        ///
        [TestMethod()]
        public void CreateInvalidPathDepotTest()
        {
            bool unicode = false;
            string uri = "localhost:6666";
            string user = "admin";
            string pass = string.Empty;
            string ws_client = "admin_space";
            for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
            {
                Process p4d = Utilities.DeployP4TestServer(TestDir, 8, unicode);
                Server server = new Server(new ServerAddress(uri));
                try
                {
                    Repository rep = new Repository(server);
                    using (Connection con = rep.Connection)
                    {
                        con.UserName = user;
                        con.Client = new Client();
                        con.Client.Name = ws_client;
                        bool connected = con.Connect(null);
                        Assert.IsTrue(connected);
                        Assert.AreEqual(con.Status, ConnectionStatus.Connected);
                        Depot d = new Depot();
                        d.Id = "NewDepot";
                        d.Description = "created by perforce";
                        d.Owner = "admin";
                        d.Type = DepotType.Stream;
                        d.Map = "123";
                        try
                        {
                            Depot newDepot = rep.CreateDepot(d, null);
                        }
                        catch (P4Exception e)
                        {
                            Assert.AreEqual(822155706, e.ErrorCode, "Error in depot specification. "                            
                            + "Map entry '123' must have only 1 wildcard which must be a trailing '/...' or '\\...'.");
                        }                       
                    }
                }
                finally
                {
                    Utilities.RemoveTestServer(p4d, TestDir);
                }
                unicode = !unicode;
            }
        }
        /// 
        ///A test for CreateDepot attempting to add another spec depot
        ///
        [TestMethod()]
        public void CreateExtraSpecDepotTest()
        {
            bool unicode = false;
            string uri = "localhost:6666";
            string user = "admin";
            string pass = string.Empty;
            string ws_client = "admin_space";
            for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
            {
                Process p4d = Utilities.DeployP4TestServer(TestDir, 8, unicode);
                Server server = new Server(new ServerAddress(uri));
                try
                {
                    Repository rep = new Repository(server);
                    using (Connection con = rep.Connection)
                    {
                        con.UserName = user;
                        con.Client = new Client();
                        con.Client.Name = ws_client;
                        bool connected = con.Connect(null);
                        Assert.IsTrue(connected);
                        Assert.AreEqual(con.Status, ConnectionStatus.Connected);
                        Depot d = new Depot();
                        d.Id = "NewDepot";
                        d.Description = "created by perforce";
                        d.Owner = "admin";
                        d.Type = DepotType.Spec;//.Local;
                        d.Map = "123";
                        try
                        {
                            Depot newDepot = rep.CreateDepot(d, null);
                        }
                        catch (P4Exception e)
                        {                           
                            Assert.AreEqual(822286756, e.ErrorCode, "Error in depot specification.\n"
                            + "There is already a spec depot called 'speque'.\n");
                        }
                    }
                }
                finally
                {
                    Utilities.RemoveTestServer(p4d, TestDir);
                }
                unicode = !unicode;
            }
        }
   
		/// 
		///A test for DeleteDepot
		///
		[TestMethod()]
		public void DeleteDepotTest()
		{
			bool unicode = false;
			string uri = "localhost:6666";
			string user = "admin";
			string pass = string.Empty;
			string ws_client = "admin_space";
			for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
			{
				Process p4d = Utilities.DeployP4TestServer(TestDir, 8, unicode);
				Server server = new Server(new ServerAddress(uri));
				try
				{
					Repository rep = new Repository(server);
					using (Connection con = rep.Connection)
					{
						con.UserName = user;
						con.Client = new Client();
						con.Client.Name = ws_client;
						bool connected = con.Connect(null);
						Assert.IsTrue(connected);
						Assert.AreEqual(con.Status, ConnectionStatus.Connected);
						Depot d = new Depot();
						d.Id = "NewDepot";
						d.Description = "created by perforce";
						d.Owner = "admin";
						d.Type = DepotType.Local;
						d.Map = "NewDepot/...";
						Depot newDepot = rep.CreateDepot(d, null);
						Assert.IsNotNull(newDepot);
						rep.DeleteDepot(newDepot, null);
						IList dlist = rep.GetDepots();
						Assert.IsFalse(dlist.Contains(newDepot));
					}
				}
				finally
				{
					Utilities.RemoveTestServer(p4d, TestDir);
				}
				unicode = !unicode;
			}
		}
        /// 
        ///A test for DeleteDepot for a depot with files in it
        ///
        [TestMethod()]
        public void DeleteDepotWithFilesTest()
        {
            bool unicode = false;
            string uri = "localhost:6666";
            string user = "admin";
            string pass = string.Empty;
            string ws_client = "admin_space";
            for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
            {
                Process p4d = Utilities.DeployP4TestServer(TestDir, 8, unicode);
                Server server = new Server(new ServerAddress(uri));
                try
                {
                    Repository rep = new Repository(server);
                    using (Connection con = rep.Connection)
                    {
                        con.UserName = user;
                        con.Client = new Client();
                        con.Client.Name = ws_client;
                        bool connected = con.Connect(null);
                        Assert.IsTrue(connected);
                        Assert.AreEqual(con.Status, ConnectionStatus.Connected);
                       
                        String depotName = "flow";
                        Depot depot = rep.GetDepot(depotName, null);
                        Assert.IsNotNull(depot);
                        try
                        {
                            rep.DeleteDepot(depot, null);
                        }
                        catch (P4Exception e)
                        {
                            Assert.AreEqual(822417475, e.ErrorCode, 
                                "Depot flow isn't empty. To delete a depot, all file revisions must be removed " 
                                + "and all lazy copy references from other depots must be severed. Use 'p4 obliterate'"
                                + "or 'p4 snap' to break file linkages from other depots, then clear this depot with "
                                + "'p4 obliteror 'p4 snap' to break file linkages from other depots, then clear this depot "
                                + "with 'p4 obliterate', then retry the deletion.");
                        }
                    }
                }
                finally
                {
                    Utilities.RemoveTestServer(p4d, TestDir);
                }
                unicode = !unicode;
            }
        }
      
		/// 
		///A test for GetDepot
		///
		[TestMethod()]
		public void GetDepotTest()
		{
			bool unicode = false;
			string uri = "localhost:6666";
			string user = "admin";
			string pass = string.Empty;
			string ws_client = "admin_space";
			string targetDepot = "flow";
			for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
			{
				Process p4d = Utilities.DeployP4TestServer(TestDir, 8, unicode);
				Server server = new Server(new ServerAddress(uri));
				try
				{
					Repository rep = new Repository(server);
					using (Connection con = rep.Connection)
					{
						con.UserName = user;
						con.Client = new Client();
						con.Client.Name = ws_client;
						bool connected = con.Connect(null);
						Assert.IsTrue(connected);
						Assert.AreEqual(con.Status, ConnectionStatus.Connected);
						Depot d = rep.GetDepot(targetDepot, null);
						Assert.IsNotNull(d);
						Assert.AreEqual(targetDepot, d.Id);
					}
				}
				finally
				{
					Utilities.RemoveTestServer(p4d, TestDir);
				}
				unicode = !unicode;
			}
		}
		/// 
		///A test for GetDepots
		///
		[TestMethod()]
		public void GetDepotsTest()
		{
			bool unicode = false;
			string uri = "localhost:6666";
			string user = "admin";
			string pass = string.Empty;
			string ws_client = "admin_space";
			for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
			{
				Process p4d = Utilities.DeployP4TestServer(TestDir, 8, unicode);
				Server server = new Server(new ServerAddress(uri));
				try
				{
					Repository rep = new Repository(server);
					using (Connection con = rep.Connection)
					{
						con.UserName = user;
						con.Client = new Client();
						con.Client.Name = ws_client;
						bool connected = con.Connect(null);
						Assert.IsTrue(connected);
						Assert.AreEqual(con.Status, ConnectionStatus.Connected);
						IList dlist = rep.GetDepots();
						Assert.IsTrue(dlist[0].Id.Equals("depot"));
						Assert.IsTrue(dlist[1].Map.Equals("flow/..."));
						Assert.IsTrue(dlist[2].Type.Equals(DepotType.Stream));
						Assert.IsTrue(dlist[3].Description.Equals("Depot For 'Rocket' project\n\nEVENTS/new_stream_events/events0100_create_depots.pl-Event_001-perforce-CREATE_DEPOTS-Creating depots...\n"));
						//DateTime modified = new DateTime(2010, 10, 19, 10, 40, 3);
						//Assert.AreEqual(modified, dlist[0].Modified);
					}
				}
				finally
				{
					Utilities.RemoveTestServer(p4d, TestDir);
				}
				unicode = !unicode;
			}
		}
	}
}