Files
2012-09-24 20:55:07 +02:00

353 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using NUnit.Framework;
using DelphiProjectHandler.Dialogs;
namespace DelphiProjectHandler.Tests.Utils
{
[TestFixture]
public class PathUtilsClassTests
{
#region (Helper methods)
protected void CompareLists(IList<string> iActual, IList<string> iExpected, string iErrorMsg)
{
Assert.AreEqual(iExpected.Count, iActual.Count, "Different no. of items returned.");
for (int vItemIdx = 0; vItemIdx < iActual.Count; vItemIdx++)
Assert.AreEqual(iExpected[vItemIdx], iActual[vItemIdx], "Different items found. Item: " + vItemIdx.ToString() + ". " + iErrorMsg);
}
protected void DoFail(string iMessage, string iCorrectPath, string iPathToFix)
{
Assert.Fail(iMessage + "; " + GetPathsMessage(iCorrectPath, iPathToFix));
}
protected string GetPathsMessage(string iBasePath, string iPath)
{
return string.Format("Base path: {0}; Path: {1}", iBasePath, iPath);
}
#endregion
#region (Test methods)
protected void TestConcatFolders(int iStartIndex, string[] iFolders, string iExpected)
{
string vActual = PathUtils.ConcatFolders(iStartIndex, iFolders);
Assert.AreEqual(iExpected, vActual);
}
protected void TestBuildGoUpPath(int iCount, string iExpected)
{
string vActual = PathUtils.BuildGoUpPath(iCount);
Assert.AreEqual(iExpected, vActual, "Number of levels: " + iCount.ToString());
}
protected void TestSplitPaths(string iPath, string[] iExpected)
{
string[] vActual = PathUtils.SplitPath(iPath);
Assert.AreEqual(iExpected.Length, vActual.Length, "Different number of folders returned. Path: " + iPath);
for (int vFolderIdx = 0; vFolderIdx < vActual.Length; vFolderIdx++)
Assert.AreEqual(iExpected[vFolderIdx], vActual[vFolderIdx], string.Format("Wrong folder. Path: {0}, Index: {1}", iPath, vFolderIdx.ToString()));
}
protected void TestFixRootPath(string iCorrectPath, string iPathToFix, string iExpected)
{
try
{
string vActual = PathUtils.FixRootPath(iCorrectPath, iPathToFix);
Assert.AreEqual(iExpected, vActual, GetPathsMessage(iCorrectPath, iPathToFix));
}
catch (Exception e)
{
DoFail(e.Message, iCorrectPath, iPathToFix);
}
}
protected void TestFixRootPath(string iBasePath)
{
try
{
string vRootPath = "";
if (iBasePath != "")
vRootPath = Path.GetPathRoot(iBasePath).TrimEnd(Path.DirectorySeparatorChar);
TestFixRootPath(iBasePath, @"\temp2", vRootPath + @"\temp2");
TestFixRootPath(iBasePath, @"d:\temp2", @"d:\temp2");
TestFixRootPath(iBasePath, @"temp2", @"temp2");
TestFixRootPath(iBasePath, @"", @"");
}
catch (Exception e)
{
DoFail(e.Message, iBasePath, "<unknown>");
}
}
protected void TestCombine(string iBasePath, string iAddedPath, string iExpected, bool iShouldFail)
{
string vActual = "";
try
{
vActual = PathUtils.Combine(iBasePath, iAddedPath);
if (iShouldFail)
DoFail("Exception should be raised, while it wasn't", iBasePath, iAddedPath);
}
catch (ArgumentException e)
{
if (!iShouldFail)
DoFail("Exception was raised while it shouldn't. " + e.Message, iBasePath, iAddedPath);
else
return;
}
Assert.AreEqual(iExpected, vActual, GetPathsMessage(iBasePath, iAddedPath));
}
protected void TestCombine(string iBasePath)
{
try
{
string vBasePath = PathUtils.AddEndingDirectorySeparator(iBasePath);
TestCombine(iBasePath, @"c:\", @"c:\", iBasePath != "");
TestCombine(iBasePath, @"c:\temp", @"c:\temp", iBasePath != "");
TestCombine(iBasePath, @"c:", @"c:", iBasePath != "");
TestCombine(iBasePath, @"\temp", vBasePath + @"temp", false);
TestCombine(iBasePath, @"temp", vBasePath + @"temp", false);
TestCombine(iBasePath, @"\", vBasePath, false);
TestCombine(iBasePath, @"", vBasePath, false);
}
catch (Exception e)
{
DoFail(e.Message, iBasePath, "");
}
}
protected void TestRemoveEndingDirectorySeparator(string iPath, string iExpected)
{
string vActual = PathUtils.RemoveEndingDirectorySeparator(iPath);
Assert.AreEqual(iExpected, vActual, "Test value: " + iPath);
}
protected void TestAddEndingDirectorySeparator(string iPath, string iExpected)
{
string vActual = PathUtils.AddEndingDirectorySeparator(iPath);
Assert.AreEqual(iExpected, vActual, "Test value: " + iPath);
}
protected void TestAddEndingDirectorySeparator_List(IList<string> iPaths, IList<string> iExpected)
{
IList<string> vActual = PathUtils.AddEndingDirectorySeparator(iPaths);
CompareLists(vActual, iExpected, "");
}
protected void TestHaveSameRoots(string iLeftPath, string iRightPath, bool iExpected)
{
bool vActual = PathUtils.HaveSameRoots(iLeftPath, iRightPath);
Assert.AreEqual(iExpected, vActual, "Left path: " + iLeftPath + "; Right path: " + iRightPath);
}
protected void TestGetFirstDifferentFolderIdx(string[] iLeftFolders, string[] iRightFolders, int iExpected)
{
int vActual = PathUtils.GetFirstDifferentFolderIdx(iLeftFolders, iRightFolders);
Assert.AreEqual(iExpected, vActual);
}
protected void TestIsValidPath(string iPath, bool iExpected, string iErrorMsg)
{
bool vActual = PathUtils.IsValidPath(iPath);
Assert.AreEqual(iExpected, vActual, "Path was recognized incorrectly. " + iErrorMsg);
}
protected void TestRemoveInvalidPaths(IList<string> iPaths, IList<string> iExpected)
{
IList<string> vActual = PathUtils.RemoveInvalidPaths(iPaths);
Assert.AreEqual(iExpected.Count, vActual.Count, "Wrong no. of items was returned");
for (int vItemIdx = 0; vItemIdx < vActual.Count; vItemIdx++)
Assert.AreEqual(iExpected[vItemIdx], vActual[vItemIdx], "Paths are different. Index: " + vItemIdx.ToString());
}
protected void TestNormalize(IList<string> iPaths, IList<string> iExpected)
{
IList<string> vActual = PathUtils.Normalize(iPaths);
CompareLists(vActual, iExpected, "");
}
#endregion
[Test]
public void ConcatFolders_StartOn1st()
{
TestConcatFolders(0, new string[] { "folder1" }, @"folder1\");
TestConcatFolders(0, new string[] { "folder1", "folder2" }, @"folder1\folder2\");
TestConcatFolders(0, new string[] { "folder1", "folder2", @"folder3\" }, @"folder1\folder2\folder3\");
}
[Test]
public void ConcatFolders_StartOn2nd()
{
TestConcatFolders(1, new string[] { "folder1" }, @"");
TestConcatFolders(1, new string[] { "folder1", "folder2" }, @"folder2\");
TestConcatFolders(1, new string[] { "folder1", "folder2", @"folder3\" }, @"folder2\folder3\");
}
[Test]
public void ConcatFolders_StartOn3rd()
{
TestConcatFolders(2, new string[] { "folder1" }, @"");
TestConcatFolders(2, new string[] { "folder1", "folder2" }, @"");
TestConcatFolders(2, new string[] { "folder1", "folder2", @"folder3\" }, @"folder3\");
}
[Test]
public void ConcatFolders_InvalidIndex()
{
TestConcatFolders(-1, new string[] { "folder1", "folder2" }, @"");
}
[Test]
public void BuildGoUpPath()
{
TestBuildGoUpPath(-1, @"");
TestBuildGoUpPath(0, @"");
TestBuildGoUpPath(1, @"..\");
TestBuildGoUpPath(2, @"..\..\");
TestBuildGoUpPath(3, @"..\..\..\");
}
[Test]
public void SplitPaths()
{
TestSplitPaths(@"temp1", new string[] { "temp1" });
TestSplitPaths(@"temp1\temp2", new string[] { "temp1", "temp2" });
TestSplitPaths(@"c:\temp1\temp2", new string[] { "c:", "temp1", "temp2" });
TestSplitPaths(@"c:\temp1\temp2\", new string[] { "c:", "temp1", "temp2", "" });
TestSplitPaths(@"\temp1\temp2\", new string[] { "", "temp1", "temp2", "" });
TestSplitPaths(@"\temp1\temp2", new string[] { "", "temp1", "temp2" });
TestSplitPaths(@"", new string[] { });
}
[Test]
public void FixRootPath()
{
TestFixRootPath(@"c:\");
TestFixRootPath(@"temp1");
TestFixRootPath(@"\temp1");
TestFixRootPath(@"");
}
[Test]
public void Combine()
{
TestCombine(@"c:\");
TestCombine(@"c:\temp1");
TestCombine(@"c:");
TestCombine(@"\temp1");
TestCombine(@"temp1");
TestCombine(@"\");
TestCombine(@"");
}
[Test]
public void RemoveEndingDirectorySeparator()
{
TestRemoveEndingDirectorySeparator(@"c:\", @"c:\");
TestRemoveEndingDirectorySeparator(@"c:\temp", @"c:\temp");
TestRemoveEndingDirectorySeparator(@"c:\temp\", @"c:\temp");
TestRemoveEndingDirectorySeparator(@"\", @"\");
TestRemoveEndingDirectorySeparator(@"", @"");
TestRemoveEndingDirectorySeparator(@"\temp\", @"\temp");
}
[Test]
public void AddEndingDirectorySeparator()
{
TestAddEndingDirectorySeparator(@"c:\temp", @"c:\temp\");
TestAddEndingDirectorySeparator(@"c:\", @"c:\");
TestAddEndingDirectorySeparator(@"c:\temp\", @"c:\temp\");
TestAddEndingDirectorySeparator(@"\", @"\");
TestAddEndingDirectorySeparator(@"", @"");
TestAddEndingDirectorySeparator(@"c:", @"c:\");
}
[Test]
public void AddEndingDirectorySeparator_List()
{
TestAddEndingDirectorySeparator_List(
new string[] {@"c:\temp", @"c:\", @"c:\temp\", @"\", "", "c:"},
new string[] {@"c:\temp\", @"c:\", @"c:\temp\", @"\", "", @"c:\"});
}
[Test]
public void HaveSameRoots()
{
TestHaveSameRoots(@"c:\", @"c:\temp", true);
TestHaveSameRoots(@"c:\", @"c:\", true);
TestHaveSameRoots(@"c:\Temp\", @"c:\temp", true);
TestHaveSameRoots(@"\temp", @"\temp2", true);
TestHaveSameRoots(@"\", @"\", true);
TestHaveSameRoots(@"c:\", @"d:\", false);
TestHaveSameRoots(@"c:\temp", @"d:\temp", false);
TestHaveSameRoots(@"\temp", @"c:\temp", false);
}
[Test]
public void GetFirstDifferentFolderIdx()
{
TestGetFirstDifferentFolderIdx(
new string[] {"folder1", "folder2", "folder3"},
new string[] {"folder1", "folder2", "folder5"},
2);
TestGetFirstDifferentFolderIdx(
new string[] { "folder1" },
new string[] { "folder2" },
0);
TestGetFirstDifferentFolderIdx(
new string[] { "folder1", "folder2" },
new string[] { "folder1", "folder2", "folder3", "folder4" },
2);
TestGetFirstDifferentFolderIdx(
new string[] { "folder1", "folder2", "folder3", "folder4" },
new string[] { "folder1", "folder2" },
2);
TestGetFirstDifferentFolderIdx(
new string[] { "folder1", "folder2" },
new string[] { "folder1", "folder2" },
2);
TestGetFirstDifferentFolderIdx(
new string[] { "folder1" },
new string[] { "folder1" },
1);
TestGetFirstDifferentFolderIdx(
new string[] { },
new string[] { },
0);
}
[Test]
public void IsValidPath()
{
TestIsValidPath(@"C:\", true, "Test 1");
TestIsValidPath(@"C:\Windows", true, "Test 2");
TestIsValidPath(@"C:\Windows\", true, "Test 3");
TestIsValidPath(@"C:\1234", false, "Test 4");
TestIsValidPath(@"C:\Windows\abc123", false, "Test 5");
}
[Test]
public void RemoveInvalidPaths()
{
TestRemoveInvalidPaths(
new string[] {@"C:\", @"c:\12345", @"C:\windows", @"c:\windows\abc123", @"C:\windows\", @"c:\1234\abc"},
new string[] {@"C:\", @"C:\windows", @"C:\windows\"});
}
[Test]
public void Normalize()
{
TestNormalize(
new string[] {@"C:\WINDOWS", null, @"C:\", @"", @"C:\123abc", @"C:\windows", @"c:\windows\", @"", @"c:\windows\123abc\", null},
new string[] {@"c:\", @"c:\windows\"}
);
}
}
}