Clone
ixen
committed
on 12 Nov 20
Added unit tests covering destination path generation in various name-overriding cases.
/Tests/TestsTDestinationPathProvider.cpp (+208 -38)
15 15 public:
16 16         MOCK_METHOD1(PathExist, bool(const TSmartPath&));
17 17         MOCK_METHOD5(SetFileDirBasicInfo, void(const TSmartPath& pathFileDir, DWORD dwAttributes, const TFileTime& ftCreationTime, const TFileTime& ftLastAccessTime, const TFileTime& ftLastWriteTime));
18 18         MOCK_METHOD2(SetAttributes, void(const TSmartPath& pathFileDir, DWORD dwAttributes));
19 19
20 20         MOCK_METHOD2(CreateDirectory, void(const TSmartPath&, bool));
21 21         MOCK_METHOD1(RemoveDirectory, void(const TSmartPath& pathFile));
22 22         MOCK_METHOD1(DeleteFile, void(const TSmartPath& pathFile));
23 23
24 24         MOCK_METHOD3(GetFileInfo, void(const TSmartPath& pathFile, TFileInfoPtr& rFileInfo, const TBasePathDataPtr& spBasePathData));
25 25         MOCK_METHOD2(FastMove, void(const TSmartPath&, const TSmartPath&));
26 26
27 27         MOCK_METHOD2(CreateFinderObject, IFilesystemFindPtr(const TSmartPath& pathDir, const TSmartPath& pathMask));
28 28         MOCK_METHOD4(CreateFileObject, IFilesystemFilePtr(IFilesystemFile::EOpenMode eMode, const TSmartPath& pathFile, bool bNoBuffering, bool bProtectReadOnlyFiles));
29 29
30 30         MOCK_METHOD2(GetPathsRelation, EPathsRelation(const TSmartPath& pathFirst, const TSmartPath& pathSecond));
31 31
32 32         MOCK_METHOD3(GetDynamicFreeSpace, void(const TSmartPath& path, unsigned long long& rullFree, unsigned long long& rullTotal));
33 33 };
34 34
35   using TestTuple = std::tuple<TString, TString, bool, TString, bool, bool, TString>;
  35 // base src path, full src path, is file, destination path, ignore folders, force directories, expected resulting path
  36 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*>;
36 37
37 38 class TransformTest : public ::testing::TestWithParam<TestTuple>
38 39 {
39           // You can implement all the usual fixture class members here.
40           // To access the test parameter, call GetParam() from class
41           // TestWithParam<T>.
42 40 public:
43 41         TSmartPath TransformPath(
44 42                 IFilesystemPtr spFilesystem,
45 43                 TSmartPath pathSrcBase,
46 44                 TSmartPath pathSrcRelativeToBase,
  45                 TSmartPath pathBaseDstOverride,
  46                 TSmartPath pathDstOverride,
47 47                 bool bSrcIsFile,
48 48                 TSmartPath pathDst,
49 49                 bool bIgnoreFolders,
50 50                 bool bForceDirectories
51 51         )
52 52         {
53 53                 TString strFirstAltName = L"Copy of %name";
54 54                 TString strNextAltName = L"Copy (%count) of %name";
55 55
56 56                 TBasePathDataPtr spBasePath(new TBasePathData(0, pathSrcBase));
  57                 spBasePath->SetDestinationPath(pathBaseDstOverride);
57 58                 TFileInfoPtr spFileInfo(new TFileInfo(spBasePath, pathSrcRelativeToBase, bSrcIsFile ? FILE_ATTRIBUTE_NORMAL : FILE_ATTRIBUTE_DIRECTORY,
58 59                         0, TFileTime(), TFileTime(), TFileTime(), 0));
  60                 spFileInfo->SetDstRelativePath(pathDstOverride);
59 61
60 62                 TDestinationPathProvider tDstPathProvider(spFilesystem, pathDst, bIgnoreFolders, bForceDirectories, strFirstAltName, strNextAltName);
61 63                 return tDstPathProvider.CalculateDestinationPath(spFileInfo);
62 64         }
63 65 };
64 66
65 67 // base src path, full src path, is file, destination path, ignore folders, force directories, expected resulting path
66   INSTANTIATE_TEST_CASE_P(BasicTransformTests, TransformTest, ::testing::Values(
  68 INSTANTIATE_TEST_CASE_P(TransformTests_NoDstOverride, TransformTest, ::testing::Values(
67 69         /////////////////////////////////////////
68 70         // full drive copy, std options, root
69           std::make_tuple(TString(L"c:"), TString(L"c:"), false, TString(L"x:\\"), false, false, TString(L"x:\\c")),                      // 0
70           std::make_tuple(TString(L"c:\\"), TString(L"c:\\"), false, TString(L"x:\\"), false, false, TString(L"x:\\c")),          // 1
  71         std::make_tuple(L"c:",          L"c:",          L"", L"", false, L"x:\\", false, false, L"x:\\c"),                      // 0
  72         std::make_tuple(L"c:\\",        L"c:\\",        L"", L"", false, L"x:\\", false, false, L"x:\\c"),              // 1
71 73         // full drive copy, ignore folders, root
72           std::make_tuple(TString(L"c:"), TString(L"c:"), false, TString(L"x:\\"), true, false, TString(L"x:\\c")),                       // 2
73           std::make_tuple(TString(L"c:\\"), TString(L"c:\\"), false, TString(L"x:\\"), true, false, TString(L"x:\\c")),           // 3
  74         std::make_tuple(L"c:",          L"c:",          L"", L"", false, L"x:\\", true, false, L"x:\\c"),                       // 2
  75         std::make_tuple(L"c:\\",        L"c:\\",        L"", L"", false, L"x:\\", true, false, L"x:\\c"),               // 3
74 76         // full drive copy, force directories, root
75           std::make_tuple(TString(L"c:"), TString(L"c:"), false, TString(L"x:\\"), false, true, TString(L"x:\\c")),                       // 4
76           std::make_tuple(TString(L"c:\\"), TString(L"c:\\"), false, TString(L"x:\\"), false, true, TString(L"x:\\c")),           // 5
  77         std::make_tuple(L"c:",          L"c:",          L"", L"", false, L"x:\\", false, true, L"x:\\c"),                       // 4
  78         std::make_tuple(L"c:\\",        L"c:\\",        L"", L"", false, L"x:\\", false, true, L"x:\\c"),               // 5
77 79
78 80         /////////////////////////////////////////
79 81         // full drive copy, std options, non-root
80           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
81           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
  82         std::make_tuple(L"c:",          L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", false, false, L"x:\\c\\folder\\file.txt"),            // 6
  83         std::make_tuple(L"c:\\",        L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", false, false, L"x:\\c\\folder\\file.txt"),            // 7
82 84         // full drive copy, ignore folders, non-root
83           std::make_tuple(TString(L"c:"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), true, false, TString(L"x:\\file.txt")),                                       // 8
84           std::make_tuple(TString(L"c:\\"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), true, false, TString(L"x:\\file.txt")),                                     // 9
  85         std::make_tuple(L"c:",          L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", true, false, L"x:\\file.txt"),                                        // 8
  86         std::make_tuple(L"c:\\",        L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", true, false, L"x:\\file.txt"),                                        // 9
85 87         // full drive copy, force directories, non-root
86           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
87           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
  88         std::make_tuple(L"c:",          L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", false, true, L"x:\\c\\folder\\file.txt"),             // 10
  89         std::make_tuple(L"c:\\",        L"c:\\folder\\file.txt", L"", L"", true, L"x:\\", false, true, L"x:\\c\\folder\\file.txt"),             // 11
88 90
89 91         /////////////////////////////////////////
90 92         // folder copy, std options, folder root
91           std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, false, TString(L"x:\\folder")),                                 // 12
92           std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\"), false, TString(L"x:\\"), false, false, TString(L"x:\\folder")),                             // 13
  93         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"", L"", false, L"x:\\", false, false, L"x:\\folder"),                                  // 12
  94         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"", L"", false, L"x:\\", false, false, L"x:\\folder"),                                // 13
93 95         // folder copy, ignore folders, folder root
94           std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), true, false, TString(L"x:\\folder")),                                  // 14
95           std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\"), false, TString(L"x:\\"), true, false, TString(L"x:\\folder")),                              // 15
  96         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"", L"", false, L"x:\\", true, false, L"x:\\folder"),                                   // 14
  97         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"", L"", false, L"x:\\", true, false, L"x:\\folder"),                         // 15
96 98         // folder copy, force directories, folder root
97           std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder")),                                       // 16
98           std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\"), false, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder")),                           // 17
  99         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"", L"", false, L"x:\\", false, true, L"x:\\c\\folder"),                                        // 16
  100         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"", L"", false, L"x:\\", false, true, L"x:\\c\\folder"),                              // 17
99 101
100 102         /////////////////////////////////////////
101 103         // folder copy, std options, non folder root
102           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
103           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
  104         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
  105         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
104 106         // folder copy, ignore folders, non folder root
105           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
106           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
  107         std::make_tuple(L"c:\\folder",          L"c:\\folder\\folder2\\file.txt", L"", L"", true, L"x:\\", true, false, L"x:\\file.txt"),                       // 20
  108         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\folder2\\file.txt", L"", L"", true, L"x:\\", true, false, L"x:\\file.txt"),               // 21
107 109         // folder copy, force directories, non folder root
108           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
109           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
  110         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
  111         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
110 112
111 113         /////////////////////////////////////////
112 114         // special cases
113 115         // base path slightly differs from normal path (by a separator which should be ignored)
114           std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, false, TString(L"x:\\folder")),                       // 24
  116         std::make_tuple(L"c:\\folder\\",        L"c:\\folder", L"", L"", false, L"x:\\", false, false, L"x:\\folder"),                  // 24
115 117
116 118         // case insensitivity
117           std::make_tuple(TString(L"c:\\Folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, false, TString(L"x:\\Folder"))                  // 25
  119         std::make_tuple(L"c:\\Folder",          L"c:\\folder", L"", L"", false, L"x:\\", false, false, L"x:\\Folder")                   // 25
118 120 ));
119 121
  122
  123 // base src path, full src path, is file, destination path, ignore folders, force directories, expected resulting path
  124 INSTANTIATE_TEST_CASE_P(TransformTests_TopLevelOverride, TransformTest, ::testing::Values(
  125         /////////////////////////////////////////
  126         // full drive copy, std options, root
  127         std::make_tuple(L"c:",          L"c:",          L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL"),                     // 0
  128         std::make_tuple(L"c:\\",        L"c:\\",        L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL"),             // 1
  129         // full drive copy, ignore folders, root
  130         std::make_tuple(L"c:",          L"c:",          L"AltTL", L"", false, L"x:\\", true, false, L"x:\\c"),                  // 2
  131         std::make_tuple(L"c:\\",        L"c:\\",        L"AltTL", L"", false, L"x:\\", true, false, L"x:\\c"),          // 3
  132         // full drive copy, force directories, root
  133         std::make_tuple(L"c:",          L"c:",          L"AltTL", L"", false, L"x:\\", false, true, L"x:\\c"),                  // 4
  134         std::make_tuple(L"c:\\",        L"c:\\",        L"AltTL", L"", false, L"x:\\", false, true, L"x:\\c"),          // 5
  135
  136         /////////////////////////////////////////
  137         // full drive copy, std options, non-root
  138         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
  139         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
  140         // full drive copy, ignore folders, non-root
  141         std::make_tuple(L"c:",          L"c:\\folder\\file.txt", L"AltTL", L"", true, L"x:\\", true, false, L"x:\\file.txt"),                                   // 8
  142         std::make_tuple(L"c:\\",        L"c:\\folder\\file.txt", L"AltTL", L"", true, L"x:\\", true, false, L"x:\\file.txt"),                                   // 9
  143         // full drive copy, force directories, non-root
  144         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
  145         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
  146
  147         /////////////////////////////////////////
  148         // folder copy, std options, folder root
  149         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL"),                                      // 12
  150         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL"),                            // 13
  151         // folder copy, ignore folders, folder root
  152         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"AltTL", L"", false, L"x:\\", true, false, L"x:\\folder"),                                      // 14
  153         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"AltTL", L"", false, L"x:\\", true, false, L"x:\\folder"),                            // 15
  154         // folder copy, force directories, folder root
  155         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"AltTL", L"", false, L"x:\\", false, true, L"x:\\c\\folder"),                                   // 16
  156         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"AltTL", L"", false, L"x:\\", false, true, L"x:\\c\\folder"),                         // 17
  157
  158         /////////////////////////////////////////
  159         // folder copy, std options, non folder root
  160         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
  161         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
  162         // folder copy, ignore folders, non folder root
  163         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
  164         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
  165         // folder copy, force directories, non folder root
  166         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
  167         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
  168
  169         /////////////////////////////////////////
  170         // special cases
  171         // base path slightly differs from normal path (by a separator which should be ignored)
  172         std::make_tuple(L"c:\\folder\\",        L"c:\\folder", L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL"),                      // 24
  173
  174         // case insensitivity
  175         std::make_tuple(L"c:\\Folder",          L"c:\\folder", L"AltTL", L"", false, L"x:\\", false, false, L"x:\\AltTL")                       // 25
  176 ));
  177
  178 INSTANTIATE_TEST_CASE_P(TransformTests_DstOverride, TransformTest, ::testing::Values(
  179         /////////////////////////////////////////
  180         // full drive copy, std options, root
  181         std::make_tuple(L"c:",          L"c:",          L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),                 // 0
  182         std::make_tuple(L"c:\\",        L"c:\\",        L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),         // 1
  183         // full drive copy, ignore folders, root
  184         std::make_tuple(L"c:",          L"c:",          L"", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),                  // 2
  185         std::make_tuple(L"c:\\",        L"c:\\",        L"", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),          // 3
  186         // full drive copy, force directories, root
  187         std::make_tuple(L"c:",          L"c:",          L"", L"AltName", false, L"x:\\", false, true, L"x:\\AltName"),                  // 4
  188         std::make_tuple(L"c:\\",        L"c:\\",        L"", L"AltName", false, L"x:\\", false, true, L"x:\\AltName"),          // 5
  189
  190         /////////////////////////////////////////
  191         // full drive copy, std options, non-root
  192         std::make_tuple(L"c:",          L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", false, false, L"x:\\c\\folder\\AltName"),              // 6
  193         std::make_tuple(L"c:\\",        L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", false, false, L"x:\\c\\folder\\AltName"),              // 7
  194         // full drive copy, ignore folders, non-root
  195         std::make_tuple(L"c:",          L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),                                  // 8
  196         std::make_tuple(L"c:\\",        L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),                                  // 9
  197         // full drive copy, force directories, non-root
  198         std::make_tuple(L"c:",          L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", false, true, L"x:\\c\\folder\\AltName"),               // 10
  199         std::make_tuple(L"c:\\",        L"c:\\folder\\file.txt", L"", L"AltName", true, L"x:\\", false, true, L"x:\\c\\folder\\AltName"),               // 11
  200
  201         /////////////////////////////////////////
  202         // folder copy, std options, folder root
  203         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),                                  // 12
  204         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),                                // 13
  205         // folder copy, ignore folders, folder root
  206         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),                                   // 14
  207         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),                         // 15
  208         // folder copy, force directories, folder root
  209         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"", L"AltName", false, L"x:\\", false, true, L"x:\\c\\AltName"),                                        // 16
  210         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"", L"AltName", false, L"x:\\", false, true, L"x:\\c\\AltName"),                              // 17
  211
  212         /////////////////////////////////////////
  213         // folder copy, std options, non folder root
  214         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
  215         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
  216         // folder copy, ignore folders, non folder root
  217         std::make_tuple(L"c:\\folder",          L"c:\\folder\\folder2\\file.txt", L"", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),                 // 20
  218         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\folder2\\file.txt", L"", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),         // 21
  219         // folder copy, force directories, non folder root
  220         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
  221         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
  222
  223         /////////////////////////////////////////
  224         // special cases
  225         // base path slightly differs from normal path (by a separator which should be ignored)
  226         std::make_tuple(L"c:\\folder\\",        L"c:\\folder", L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),                  // 24
  227
  228         // case insensitivity
  229         std::make_tuple(L"c:\\Folder",          L"c:\\folder", L"", L"AltName", false, L"x:\\", false, false, L"x:\\AltName")                   // 25
  230 ));
  231
  232 INSTANTIATE_TEST_CASE_P(TransformTests_TopLevelOverrideAndDstOverride, TransformTest, ::testing::Values(
  233         /////////////////////////////////////////
  234         // full drive copy, std options, root
  235         std::make_tuple(L"c:",          L"c:",          L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),                    // 0
  236         std::make_tuple(L"c:\\",        L"c:\\",        L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),            // 1
  237         // full drive copy, ignore folders, root
  238         std::make_tuple(L"c:",          L"c:",          L"AltTL", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),                     // 2
  239         std::make_tuple(L"c:\\",        L"c:\\",        L"AltTL", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),             // 3
  240         // full drive copy, force directories, root
  241         std::make_tuple(L"c:",          L"c:",          L"AltTL", L"AltName", false, L"x:\\", false, true, L"x:\\AltName"),                     // 4
  242         std::make_tuple(L"c:\\",        L"c:\\",        L"AltTL", L"AltName", false, L"x:\\", false, true, L"x:\\AltName"),             // 5
  243
  244         /////////////////////////////////////////
  245         // full drive copy, std options, non-root
  246         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
  247         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
  248         // full drive copy, ignore folders, non-root
  249         std::make_tuple(L"c:",          L"c:\\folder\\file.txt", L"AltTL", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),                                     // 8
  250         std::make_tuple(L"c:\\",        L"c:\\folder\\file.txt", L"AltTL", L"AltName", true, L"x:\\", true, false, L"x:\\AltName"),                                     // 9
  251         // full drive copy, force directories, non-root
  252         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
  253         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
  254
  255         /////////////////////////////////////////
  256         // folder copy, std options, folder root
  257         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),                                     // 12
  258         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),                           // 13
  259         // folder copy, ignore folders, folder root
  260         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"AltTL", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),                                      // 14
  261         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"AltTL", L"AltName", false, L"x:\\", true, false, L"x:\\AltName"),                            // 15
  262         // folder copy, force directories, folder root
  263         std::make_tuple(L"c:\\folder",          L"c:\\folder", L"AltTL", L"AltName", false, L"x:\\", false, true, L"x:\\c\\AltName"),                                   // 16
  264         std::make_tuple(L"c:\\folder\\",        L"c:\\folder\\", L"AltTL", L"AltName", false, L"x:\\", false, true, L"x:\\c\\AltName"),                         // 17
  265
  266         /////////////////////////////////////////
  267         // folder copy, std options, non folder root
  268         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
  269         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
  270         // folder copy, ignore folders, non folder root
  271         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
  272         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
  273         // folder copy, force directories, non folder root
  274         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
  275         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
  276
  277         /////////////////////////////////////////
  278         // special cases
  279         // base path slightly differs from normal path (by a separator which should be ignored)
  280         std::make_tuple(L"c:\\folder\\",        L"c:\\folder", L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName"),                     // 24
  281
  282         // case insensitivity
  283         std::make_tuple(L"c:\\Folder",          L"c:\\folder", L"AltTL", L"AltName", false, L"x:\\", false, false, L"x:\\AltName")                      // 25
  284 ));
  285
120 286 TEST_P(TransformTest, PathTest)
121 287 {
122 288         const TestTuple& rTestData = GetParam();
123 289
124 290         // parameters
125           TSmartPath pathSrcBase = PathFromWString(std::get<0>(rTestData));
126           TSmartPath pathSrcRelativeToBase = PathFromWString(std::get<1>(rTestData));
127           bool bSrcIsFile = std::get<2>(rTestData);
128           TSmartPath pathDst = PathFromWString(std::get<3>(rTestData));
129           TString strExpectedResultPath = std::get<6>(rTestData);
  291         TSmartPath pathSrcBase = PathFromString(std::get<0>(rTestData));
  292         TSmartPath pathSrcRelativeToBase = PathFromString(std::get<1>(rTestData));
  293         TSmartPath pathBaseDstOverride = PathFromString(std::get<2>(rTestData));
  294         TSmartPath pathDstOverride = PathFromString(std::get<3>(rTestData));
  295         bool bSrcIsFile = std::get<4>(rTestData);
  296         TSmartPath pathDst = PathFromString(std::get<5>(rTestData));
  297         TString strExpectedResultPath = std::get<8>(rTestData);
130 298
131           bool bIgnoreFolders = std::get<4>(rTestData);
132           bool bForceDirectories = std::get<5>(rTestData);
  299         bool bIgnoreFolders = std::get<6>(rTestData);
  300         bool bForceDirectories = std::get<7>(rTestData);
133 301
134 302         // setup
135 303         std::shared_ptr<NiceMock<IFilesystemMock> > spFilesystemMock(new NiceMock<IFilesystemMock>);
136 304         EXPECT_CALL(*spFilesystemMock, PathExist(_))
137 305                 .WillRepeatedly(Return(false));
138 306
139 307         // test execution
140 308         TSmartPath pathResult = TransformPath(spFilesystemMock,
141 309                 pathSrcBase,
142 310                 pathSrcRelativeToBase,
  311                 pathBaseDstOverride,
  312                 pathDstOverride,
143 313                 bSrcIsFile,
144 314                 pathDst,
145 315                 bIgnoreFolders,
146 316                 bForceDirectories);
147 317
148 318         // verification
149 319         ASSERT_STREQ(strExpectedResultPath.c_str(), pathResult.ToString());
150 320 }