Index: src/libchengine/Tests/TestsTDestinationPathProvider.cpp
===================================================================
diff -u -N -r2e4eacb299f21d06196fe13140b4b0d095abdca9 -rc0c9f340aa8fe7582d54b7cbb7935c6a33653b71
--- src/libchengine/Tests/TestsTDestinationPathProvider.cpp	(.../TestsTDestinationPathProvider.cpp)	(revision 2e4eacb299f21d06196fe13140b4b0d095abdca9)
+++ src/libchengine/Tests/TestsTDestinationPathProvider.cpp	(.../TestsTDestinationPathProvider.cpp)	(revision c0c9f340aa8fe7582d54b7cbb7935c6a33653b71)
@@ -32,18 +32,18 @@
 	MOCK_METHOD3(GetDynamicFreeSpace, void(const TSmartPath& path, unsigned long long& rullFree, unsigned long long& rullTotal));
 };
 
-using TestTuple = std::tuple<TString, TString, bool, TString, bool, bool, TString>;
+// base src path, full src path, is file, destination path, ignore folders, force directories, expected resulting path
+using TestTuple = std::tuple<const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*, bool, const wchar_t*, bool, bool, const wchar_t*>;
 
 class TransformTest : public ::testing::TestWithParam<TestTuple>
 {
-	// You can implement all the usual fixture class members here.
-	// To access the test parameter, call GetParam() from class
-	// TestWithParam<T>.
 public:
 	TSmartPath TransformPath(
 		IFilesystemPtr spFilesystem,
 		TSmartPath pathSrcBase,
 		TSmartPath pathSrcRelativeToBase,
+		TSmartPath pathBaseDstOverride,
+		TSmartPath pathDstOverride,
 		bool bSrcIsFile,
 		TSmartPath pathDst,
 		bool bIgnoreFolders,
@@ -54,82 +54,250 @@
 		TString strNextAltName = L"Copy (%count) of %name";
 
 		TBasePathDataPtr spBasePath(new TBasePathData(0, pathSrcBase));
+		spBasePath->SetDestinationPath(pathBaseDstOverride);
 		TFileInfoPtr spFileInfo(new TFileInfo(spBasePath, pathSrcRelativeToBase, bSrcIsFile ? FILE_ATTRIBUTE_NORMAL : FILE_ATTRIBUTE_DIRECTORY,
 			0, TFileTime(), TFileTime(), TFileTime(), 0));
+		spFileInfo->SetDstRelativePath(pathDstOverride);
 
 		TDestinationPathProvider tDstPathProvider(spFilesystem, pathDst, bIgnoreFolders, bForceDirectories, strFirstAltName, strNextAltName);
 		return tDstPathProvider.CalculateDestinationPath(spFileInfo);
 	}
 };
 
 // base src path, full src path, is file, destination path, ignore folders, force directories, expected resulting path
-INSTANTIATE_TEST_CASE_P(BasicTransformTests, TransformTest, ::testing::Values(
+INSTANTIATE_TEST_CASE_P(TransformTests_NoDstOverride, TransformTest, ::testing::Values(
 	/////////////////////////////////////////
 	// full drive copy, std options, root
-	std::make_tuple(TString(L"c:"), TString(L"c:"), false, TString(L"x:\\"), false, false, TString(L"x:\\c")),			// 0
-	std::make_tuple(TString(L"c:\\"), TString(L"c:\\"), false, TString(L"x:\\"), false, false, TString(L"x:\\c")),		// 1
+	std::make_tuple(L"c:",		L"c:",		L"", L"", false, L"x:\\", false, false, L"x:\\c"),			// 0
+	std::make_tuple(L"c:\\",	L"c:\\",	L"", L"", false, L"x:\\", false, false, L"x:\\c"),		// 1
 	// full drive copy, ignore folders, root
-	std::make_tuple(TString(L"c:"), TString(L"c:"), false, TString(L"x:\\"), true, false, TString(L"x:\\c")),			// 2
-	std::make_tuple(TString(L"c:\\"), TString(L"c:\\"), false, TString(L"x:\\"), true, false, TString(L"x:\\c")),		// 3
+	std::make_tuple(L"c:",		L"c:",		L"", L"", false, L"x:\\", true, false, L"x:\\c"),			// 2
+	std::make_tuple(L"c:\\",	L"c:\\",	L"", L"", false, L"x:\\", true, false, L"x:\\c"),		// 3
 	// full drive copy, force directories, root
-	std::make_tuple(TString(L"c:"), TString(L"c:"), false, TString(L"x:\\"), false, true, TString(L"x:\\c")),			// 4
-	std::make_tuple(TString(L"c:\\"), TString(L"c:\\"), false, TString(L"x:\\"), false, true, TString(L"x:\\c")),		// 5
+	std::make_tuple(L"c:",		L"c:",		L"", L"", false, L"x:\\", false, true, L"x:\\c"),			// 4
+	std::make_tuple(L"c:\\",	L"c:\\",	L"", L"", false, L"x:\\", false, true, L"x:\\c"),		// 5
 
 	/////////////////////////////////////////
 	// full drive copy, std options, non-root
-	std::make_tuple(TString(L"c:"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), false, false, TString(L"x:\\c\\folder\\file.txt")),		// 6
-	std::make_tuple(TString(L"c:\\"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), false, false, TString(L"x:\\c\\folder\\file.txt")),		// 7
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", false, false, L"x:\\c\\folder\\file.txt"),		// 6
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", false, false, L"x:\\c\\folder\\file.txt"),		// 7
 	// full drive copy, ignore folders, non-root
-	std::make_tuple(TString(L"c:"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), true, false, TString(L"x:\\file.txt")),					// 8
-	std::make_tuple(TString(L"c:\\"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), true, false, TString(L"x:\\file.txt")),					// 9
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", true, false, L"x:\\file.txt"),					// 8
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", true, false, L"x:\\file.txt"),					// 9
 	// full drive copy, force directories, non-root
-	std::make_tuple(TString(L"c:"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder\\file.txt")),		// 10
-	std::make_tuple(TString(L"c:\\"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder\\file.txt")),		// 11
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", false, true, L"x:\\c\\folder\\file.txt"),		// 10
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", false, true, L"x:\\c\\folder\\file.txt"),		// 11
 
 	/////////////////////////////////////////
 	// folder copy, std options, folder root
-	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, false, TString(L"x:\\folder")),					// 12
-	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\"), false, TString(L"x:\\"), false, false, TString(L"x:\\folder")),				// 13
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"", L"", false, L"x:\\", false, false, L"x:\\folder"),					// 12
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"", L"", false, L"x:\\", false, false, L"x:\\folder"),				// 13
 	// folder copy, ignore folders, folder root
-	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), true, false, TString(L"x:\\folder")),					// 14
-	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\"), false, TString(L"x:\\"), true, false, TString(L"x:\\folder")),				// 15
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"", L"", false, L"x:\\", true, false, L"x:\\folder"),					// 14
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"", L"", false, L"x:\\", true, false, L"x:\\folder"),				// 15
 	// folder copy, force directories, folder root
-	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder")),					// 16
-	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\"), false, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder")),				// 17
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"", L"", false, L"x:\\", false, true, L"x:\\c\\folder"),					// 16
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"", L"", false, L"x:\\", false, true, L"x:\\c\\folder"),				// 17
 
 	/////////////////////////////////////////
 	// folder copy, std options, non folder root
-	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), false, false, TString(L"x:\\folder\\folder2\\file.txt")),		// 18
-	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), false, false, TString(L"x:\\folder\\folder2\\file.txt")),		// 19
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"", L"", true, L"x:\\", false, false, L"x:\\folder\\folder2\\file.txt"),		// 18
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"", L"", true, L"x:\\", false, false, L"x:\\folder\\folder2\\file.txt"),		// 19
 	// folder copy, ignore folders, non folder root
-	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), true, false, TString(L"x:\\file.txt")),			// 20
-	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), true, false, TString(L"x:\\file.txt")),		// 21
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"", L"", true, L"x:\\", true, false, L"x:\\file.txt"),			// 20
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"", L"", true, L"x:\\", true, false, L"x:\\file.txt"),		// 21
 	// folder copy, force directories, non folder root
-	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder\\folder2\\file.txt")),			// 22
-	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder\\folder2\\file.txt")),		// 23
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"", L"", true, L"x:\\", false, true, L"x:\\c\\folder\\folder2\\file.txt"),			// 22
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"", L"", true, L"x:\\", false, true, L"x:\\c\\folder\\folder2\\file.txt"),		// 23
 
 	/////////////////////////////////////////
 	// special cases
 	// base path slightly differs from normal path (by a separator which should be ignored)
-	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, false, TString(L"x:\\folder")),			// 24
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder", L"", L"", false, L"x:\\", false, false, L"x:\\folder"),			// 24
 
 	// case insensitivity
-	std::make_tuple(TString(L"c:\\Folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, false, TString(L"x:\\Folder"))			// 25
+	std::make_tuple(L"c:\\Folder",		L"c:\\folder", L"", L"", false, L"x:\\", false, false, L"x:\\Folder")			// 25
 ));
 
+
+// base src path, full src path, is file, destination path, ignore folders, force directories, expected resulting path
+INSTANTIATE_TEST_CASE_P(TransformTests_TopLevelOverride, TransformTest, ::testing::Values(
+	/////////////////////////////////////////
+	// full drive copy, std options, root
+	std::make_tuple(L"c:",		L"c:",		L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL"),			// 0
+	std::make_tuple(L"c:\\",	L"c:\\",	L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL"),		// 1
+	// full drive copy, ignore folders, root
+	std::make_tuple(L"c:",		L"c:",		L"AltTL", L"", false, L"x:\\", true, false, L"x:\\c"),			// 2
+	std::make_tuple(L"c:\\",	L"c:\\",	L"AltTL", L"", false, L"x:\\", true, false, L"x:\\c"),		// 3
+	// full drive copy, force directories, root
+	std::make_tuple(L"c:",		L"c:",		L"AltTL", L"", false, L"x:\\", false, true, L"x:\\c"),			// 4
+	std::make_tuple(L"c:\\",	L"c:\\",	L"AltTL", L"", false, L"x:\\", false, true, L"x:\\c"),		// 5
+
+	/////////////////////////////////////////
+	// full drive copy, std options, non-root
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"AltTL", L"", true, L"x:\\", false, false, L"x:\\AltTL\\folder\\file.txt"),		// 6
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"AltTL", L"", true, L"x:\\", false, false, L"x:\\AltTL\\folder\\file.txt"),		// 7
+	// full drive copy, ignore folders, non-root
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"AltTL", L"", true, L"x:\\", true, false, L"x:\\file.txt"),					// 8
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"AltTL", L"", true, L"x:\\", true, false, L"x:\\file.txt"),					// 9
+	// full drive copy, force directories, non-root
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"AltTL", L"", true, L"x:\\", false, true, L"x:\\c\\folder\\file.txt"),		// 10
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"AltTL", L"", true, L"x:\\", false, true, L"x:\\c\\folder\\file.txt"),		// 11
+
+	/////////////////////////////////////////
+	// folder copy, std options, folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL"),					// 12
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL"),				// 13
+	// folder copy, ignore folders, folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"AltTL", L"", false, L"x:\\", true, false, L"x:\\folder"),					// 14
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"AltTL", L"", false, L"x:\\", true, false, L"x:\\folder"),				// 15
+	// folder copy, force directories, folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"AltTL", L"", false, L"x:\\", false, true, L"x:\\c\\folder"),					// 16
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"AltTL", L"", false, L"x:\\", false, true, L"x:\\c\\folder"),				// 17
+
+	/////////////////////////////////////////
+	// folder copy, std options, non folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"AltTL", L"", true, L"x:\\", false, false, L"x:\\AltTL\\folder2\\file.txt"),		// 18
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"AltTL", L"", true, L"x:\\", false, false, L"x:\\AltTL\\folder2\\file.txt"),		// 19
+	// folder copy, ignore folders, non folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"AltTL", L"", true, L"x:\\", true, false, L"x:\\file.txt"),			// 20
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"AltTL", L"", true, L"x:\\", true, false, L"x:\\file.txt"),		// 21
+	// folder copy, force directories, non folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"AltTL", L"", true, L"x:\\", false, true, L"x:\\c\\folder\\folder2\\file.txt"),			// 22
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"AltTL", L"", true, L"x:\\", false, true, L"x:\\c\\folder\\folder2\\file.txt"),		// 23
+
+	/////////////////////////////////////////
+	// special cases
+	// base path slightly differs from normal path (by a separator which should be ignored)
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder", L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL"),			// 24
+
+	// case insensitivity
+	std::make_tuple(L"c:\\Folder",		L"c:\\folder", L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL")			// 25
+));
+
+INSTANTIATE_TEST_CASE_P(TransformTests_DstOverride, TransformTest, ::testing::Values(
+	/////////////////////////////////////////
+	// full drive copy, std options, root
+	std::make_tuple(L"c:",		L"c:",		L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),			// 0
+	std::make_tuple(L"c:\\",	L"c:\\",	L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),		// 1
+	// full drive copy, ignore folders, root
+	std::make_tuple(L"c:",		L"c:",		L"", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),			// 2
+	std::make_tuple(L"c:\\",	L"c:\\",	L"", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),		// 3
+	// full drive copy, force directories, root
+	std::make_tuple(L"c:",		L"c:",		L"", L"AltName", false, L"x:\\", false, true, L"x:\\AltName"),			// 4
+	std::make_tuple(L"c:\\",	L"c:\\",	L"", L"AltName", false, L"x:\\", false, true, L"x:\\AltName"),		// 5
+
+	/////////////////////////////////////////
+	// full drive copy, std options, non-root
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", false, false, L"x:\\c\\folder\\AltName"),		// 6
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", false, false, L"x:\\c\\folder\\AltName"),		// 7
+	// full drive copy, ignore folders, non-root
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),					// 8
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),					// 9
+	// full drive copy, force directories, non-root
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", false, true, L"x:\\c\\folder\\AltName"),		// 10
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", false, true, L"x:\\c\\folder\\AltName"),		// 11
+
+	/////////////////////////////////////////
+	// folder copy, std options, folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),					// 12
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),				// 13
+	// folder copy, ignore folders, folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),					// 14
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),				// 15
+	// folder copy, force directories, folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"", L"AltName", false, L"x:\\", false, true, L"x:\\c\\AltName"),					// 16
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"", L"AltName", false, L"x:\\", false, true, L"x:\\c\\AltName"),				// 17
+
+	/////////////////////////////////////////
+	// folder copy, std options, non folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"", L"AltName", true, L"x:\\", false, false, L"x:\\folder\\folder2\\AltName"),		// 18
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"", L"AltName", true, L"x:\\", false, false, L"x:\\folder\\folder2\\AltName"),		// 19
+	// folder copy, ignore folders, non folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),			// 20
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),		// 21
+	// folder copy, force directories, non folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"", L"AltName", true, L"x:\\", false, true, L"x:\\c\\folder\\folder2\\AltName"),			// 22
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"", L"AltName", true, L"x:\\", false, true, L"x:\\c\\folder\\folder2\\AltName"),		// 23
+
+	/////////////////////////////////////////
+	// special cases
+	// base path slightly differs from normal path (by a separator which should be ignored)
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder", L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),			// 24
+
+	// case insensitivity
+	std::make_tuple(L"c:\\Folder",		L"c:\\folder", L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName")			// 25
+));
+
+INSTANTIATE_TEST_CASE_P(TransformTests_TopLevelOverrideAndDstOverride, TransformTest, ::testing::Values(
+	/////////////////////////////////////////
+	// full drive copy, std options, root
+	std::make_tuple(L"c:",		L"c:",		L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),			// 0
+	std::make_tuple(L"c:\\",	L"c:\\",	L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),		// 1
+	// full drive copy, ignore folders, root
+	std::make_tuple(L"c:",		L"c:",		L"AltTL", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),			// 2
+	std::make_tuple(L"c:\\",	L"c:\\",	L"AltTL", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),		// 3
+	// full drive copy, force directories, root
+	std::make_tuple(L"c:",		L"c:",		L"AltTL", L"AltName", false, L"x:\\", false, true, L"x:\\AltName"),			// 4
+	std::make_tuple(L"c:\\",	L"c:\\",	L"AltTL", L"AltName", false, L"x:\\", false, true, L"x:\\AltName"),		// 5
+
+	/////////////////////////////////////////
+	// full drive copy, std options, non-root
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"AltTL", L"AltName", true, L"x:\\", false, false, L"x:\\AltTL\\folder\\AltName"),		// 6
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"AltTL", L"AltName", true, L"x:\\", false, false, L"x:\\AltTL\\folder\\AltName"),		// 7
+	// full drive copy, ignore folders, non-root
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"AltTL", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),					// 8
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"AltTL", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),					// 9
+	// full drive copy, force directories, non-root
+	std::make_tuple(L"c:",		L"c:\\folder\\file.txt", L"AltTL", L"AltName", true, L"x:\\", false, true, L"x:\\c\\folder\\AltName"),		// 10
+	std::make_tuple(L"c:\\",	L"c:\\folder\\file.txt", L"AltTL", L"AltName", true, L"x:\\", false, true, L"x:\\c\\folder\\AltName"),		// 11
+
+	/////////////////////////////////////////
+	// folder copy, std options, folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),					// 12
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),				// 13
+	// folder copy, ignore folders, folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"AltTL", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),					// 14
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"AltTL", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),				// 15
+	// folder copy, force directories, folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder", L"AltTL", L"AltName", false, L"x:\\", false, true, L"x:\\c\\AltName"),					// 16
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\", L"AltTL", L"AltName", false, L"x:\\", false, true, L"x:\\c\\AltName"),				// 17
+
+	/////////////////////////////////////////
+	// folder copy, std options, non folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"AltTL", L"AltName", true, L"x:\\", false, false, L"x:\\AltTL\\folder2\\AltName"),		// 18
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"AltTL", L"AltName", true, L"x:\\", false, false, L"x:\\AltTL\\folder2\\AltName"),		// 19
+	// folder copy, ignore folders, non folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"AltTL", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),			// 20
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"AltTL", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),		// 21
+	// folder copy, force directories, non folder root
+	std::make_tuple(L"c:\\folder",		L"c:\\folder\\folder2\\file.txt", L"AltTL", L"AltName", true, L"x:\\", false, true, L"x:\\c\\folder\\folder2\\AltName"),			// 22
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder\\folder2\\file.txt", L"AltTL", L"AltName", true, L"x:\\", false, true, L"x:\\c\\folder\\folder2\\AltName"),		// 23
+
+	/////////////////////////////////////////
+	// special cases
+	// base path slightly differs from normal path (by a separator which should be ignored)
+	std::make_tuple(L"c:\\folder\\",	L"c:\\folder", L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),			// 24
+
+	// case insensitivity
+	std::make_tuple(L"c:\\Folder",		L"c:\\folder", L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName")			// 25
+));
+
 TEST_P(TransformTest, PathTest)
 {
 	const TestTuple& rTestData = GetParam();
 
 	// parameters
-	TSmartPath pathSrcBase = PathFromWString(std::get<0>(rTestData));
-	TSmartPath pathSrcRelativeToBase = PathFromWString(std::get<1>(rTestData));
-	bool bSrcIsFile = std::get<2>(rTestData);
-	TSmartPath pathDst = PathFromWString(std::get<3>(rTestData));
-	TString strExpectedResultPath = std::get<6>(rTestData);
+	TSmartPath pathSrcBase = PathFromString(std::get<0>(rTestData));
+	TSmartPath pathSrcRelativeToBase = PathFromString(std::get<1>(rTestData));
+	TSmartPath pathBaseDstOverride = PathFromString(std::get<2>(rTestData));
+	TSmartPath pathDstOverride = PathFromString(std::get<3>(rTestData));
+	bool bSrcIsFile = std::get<4>(rTestData);
+	TSmartPath pathDst = PathFromString(std::get<5>(rTestData));
+	TString strExpectedResultPath = std::get<8>(rTestData);
 
-	bool bIgnoreFolders = std::get<4>(rTestData);
-	bool bForceDirectories = std::get<5>(rTestData);
+	bool bIgnoreFolders = std::get<6>(rTestData);
+	bool bForceDirectories = std::get<7>(rTestData);
 
 	// setup
 	std::shared_ptr<NiceMock<IFilesystemMock> > spFilesystemMock(new NiceMock<IFilesystemMock>);
@@ -140,6 +308,8 @@
 	TSmartPath pathResult = TransformPath(spFilesystemMock,
 		pathSrcBase,
 		pathSrcRelativeToBase,
+		pathBaseDstOverride,
+		pathDstOverride,
 		bSrcIsFile,
 		pathDst,
 		bIgnoreFolders,