Add new tests for SearchInSortVector and GetRangeInSortVector
[TortoiseGit.git] / test / UnitTests / GitIndexTest.cpp
blob000b5b5b9df3b2a80de294e216000a55ab4727c8
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2015 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "stdafx.h"
21 #include "RepositoryFixtures.h"
22 #include "gitindex.h"
24 extern CGitAdminDirMap g_AdminDirMap; // not optimal yet
26 class GitIndexCBasicGitFixture : public CBasicGitFixture
28 protected:
29 virtual void SetUp()
31 CBasicGitFixture::SetUp();
32 g_AdminDirMap.clear();
36 class GitIndexCBasicGitWithEmptyRepositoryFixture : public CBasicGitWithEmptyRepositoryFixture
38 protected:
39 virtual void SetUp()
41 CBasicGitWithEmptyRepositoryFixture::SetUp();
42 g_AdminDirMap.clear();
46 class GitIndexCBasicGitWithTestRepoFixture : public CBasicGitWithTestRepoFixture
48 protected:
49 virtual void SetUp()
51 CBasicGitWithTestRepoFixture::SetUp();
52 g_AdminDirMap.clear();
56 INSTANTIATE_TEST_CASE_P(GitIndex, GitIndexCBasicGitFixture, testing::Values(LIBGIT2));
57 INSTANTIATE_TEST_CASE_P(GitIndex, GitIndexCBasicGitWithEmptyRepositoryFixture, testing::Values(LIBGIT2));
58 INSTANTIATE_TEST_CASE_P(GitIndex, GitIndexCBasicGitWithTestRepoFixture, testing::Values(LIBGIT2));
60 TEST_P(GitIndexCBasicGitFixture, EmptyDir)
62 CGitIndexList indexList;
63 EXPECT_EQ(-1, indexList.ReadIndex(m_Dir.GetTempDir()));
64 EXPECT_EQ(0, indexList.size());
68 static void ReadAndCheckIndex(CGitIndexList& indexList, const CString& gitdir, int offset = 0)
70 EXPECT_EQ(0, indexList.ReadIndex(gitdir));
71 ASSERT_EQ(14 + offset, indexList.size());
73 EXPECT_STREQ(L"ansi.txt", indexList[offset].m_FileName);
74 EXPECT_EQ(102, indexList[offset].m_Size);
75 EXPECT_EQ(8, indexList[offset].m_Flags);
76 EXPECT_STREQ(L"961bdffbfce1bc617fb594091c3229f1cc674d76", indexList[offset].m_IndexHash.ToString());
77 EXPECT_STREQ(L"copy/ansi.txt", indexList[1 + offset].m_FileName);
78 EXPECT_EQ(103, indexList[1 + offset].m_Size);
79 EXPECT_EQ(13, indexList[1 + offset].m_Flags);
80 EXPECT_STREQ(L"4c44667203f943dc5dbdf3cb526cb7ec24f60c09", indexList[1 + offset].m_IndexHash.ToString());
81 EXPECT_STREQ(L"copy/utf16-le-nobom.txt", indexList[5 + offset].m_FileName);
82 EXPECT_EQ(218, indexList[5 + offset].m_Size);
83 EXPECT_EQ(23, indexList[5 + offset].m_Flags);
84 EXPECT_STREQ(L"fbea9ccd85c33fcdb542d8c73f910ea0e70c3ddc", indexList[5 + offset].m_IndexHash.ToString());
85 EXPECT_STREQ(L"utf8-nobom.txt", indexList[13 + offset].m_FileName);
86 EXPECT_EQ(139, indexList[13 + offset].m_Size);
87 EXPECT_EQ(14, indexList[13 + offset].m_Flags);
88 EXPECT_STREQ(L"c225b3f14869ec8b6da32d52bd15dba0b043031d", indexList[13 + offset].m_IndexHash.ToString());
91 TEST_P(GitIndexCBasicGitWithTestRepoFixture, ReadIndex)
93 CGitIndexList indexList;
94 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
96 CString testFile = m_Dir.GetTempDir() + L"\\1.txt";
97 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)testFile, L"this is testing file."));
98 CString output;
99 EXPECT_EQ(0, m_Git.Run(_T("git.exe add 1.txt"), &output, CP_UTF8));
100 EXPECT_TRUE(output.IsEmpty());
102 ReadAndCheckIndex(indexList, m_Dir.GetTempDir(), 1);
104 EXPECT_STREQ(L"1.txt", indexList[0].m_FileName);
105 EXPECT_EQ(21, indexList[0].m_Size);
106 EXPECT_EQ(5, indexList[0].m_Flags);
107 EXPECT_STREQ(L"e4aac1275dfc440ec521a76e9458476fe07038bb", indexList[0].m_IndexHash.ToString());
109 EXPECT_EQ(0, m_Git.Run(_T("git.exe rm -f 1.txt"), &output, CP_UTF8));
111 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
114 TEST_P(GitIndexCBasicGitWithTestRepoFixture, GetFileStatus)
116 CGitIndexList indexList;
117 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
119 git_wc_status_kind status = git_wc_status_none;
120 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"does-not-exist.txt", &status, 10, 20));
121 EXPECT_EQ(git_wc_status_unversioned, status);
123 __int64 time = -1;
124 __int64 filesize = -1;
125 status = git_wc_status_none;
126 bool skipworktree = false;
127 EXPECT_EQ(-1, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
128 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize));
129 EXPECT_EQ(git_wc_status_modified, status);
131 CString output;
132 EXPECT_EQ(0, m_Git.Run(_T("git.exe reset --hard"), &output, CP_UTF8));
134 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
135 status = git_wc_status_none;
136 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize));
137 EXPECT_EQ(git_wc_status_normal, status);
139 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), L"this is testing file."));
140 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
141 status = git_wc_status_none;
142 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize, nullptr, nullptr, nullptr, nullptr, &skipworktree));
143 EXPECT_EQ(git_wc_status_modified, status);
144 EXPECT_FALSE(skipworktree);
146 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), L"this is testing file."));
147 EXPECT_EQ(0, m_Git.Run(_T("git.exe add -- just-added.txt"), &output, CP_UTF8));
149 EXPECT_EQ(0, m_Git.Run(_T("git.exe update-index --skip-worktree -- ansi.txt"), &output, CP_UTF8));
150 EXPECT_EQ(0, indexList.ReadIndex(m_Dir.GetTempDir()));
151 status = git_wc_status_none;
152 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize, nullptr, nullptr, nullptr, nullptr, &skipworktree));
153 EXPECT_EQ(git_wc_status_normal, status);
154 EXPECT_TRUE(skipworktree);
156 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), &time, nullptr, &filesize));
157 status = git_wc_status_none;
158 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"just-added.txt", &status, time, filesize));
159 EXPECT_EQ(git_wc_status_normal, status);
161 EXPECT_EQ(0, m_Git.Run(_T("git.exe update-index --no-skip-worktree ansi.txt"), &output, CP_UTF8));
163 Sleep(1000);
164 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), L"this IS testing file."));
165 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), &time, nullptr, &filesize));
166 status = git_wc_status_none;
167 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"just-added.txt", &status, time, filesize));
168 EXPECT_EQ(git_wc_status_modified, status);
170 output.Empty();
171 EXPECT_EQ(0, m_Git.Run(_T("git.exe checkout --force forconflict"), &output, CP_UTF8));
172 EXPECT_FALSE(output.IsEmpty());
174 output.Empty();
175 EXPECT_EQ(1, m_Git.Run(_T("git.exe merge simple-conflict"), &output, CP_UTF8));
176 EXPECT_FALSE(output.IsEmpty());
178 EXPECT_EQ(0, indexList.ReadIndex(m_Dir.GetTempDir()));
179 EXPECT_EQ(9, indexList.size());
181 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
182 status = git_wc_status_none;
183 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize));
184 EXPECT_EQ(git_wc_status_conflicted, status);
187 TEST(GitIndex, SearchInSortVector)
189 std::vector<CGitFileName> vector;
190 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 9));
191 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 0));
192 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", -1));
194 vector.push_back(CGitFileName(L"One"));
195 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 9));
196 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", -1));
197 EXPECT_EQ(0, SearchInSortVector(vector, L"something", 0)); // do we really need this behavior?
198 EXPECT_EQ(0, SearchInSortVector(vector, L"one", 3));
199 EXPECT_EQ(0, SearchInSortVector(vector, L"one", -1));
200 EXPECT_EQ(-1, SearchInSortVector(vector, L"one/", 4));
201 EXPECT_EQ(-1, SearchInSortVector(vector, L"One", 3));
203 vector.push_back(CGitFileName(L"tWo"));
204 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 9));
205 EXPECT_EQ(0, SearchInSortVector(vector, L"one", 3));
206 EXPECT_EQ(-1, SearchInSortVector(vector, L"One", 3));
207 EXPECT_EQ(1, SearchInSortVector(vector, L"two", 3));
208 EXPECT_EQ(-1, SearchInSortVector(vector, L"tWo", 3));
209 EXPECT_EQ(1, SearchInSortVector(vector, L"t", 1));
210 EXPECT_EQ(-1, SearchInSortVector(vector, L"0", 1));
211 EXPECT_EQ(-1, SearchInSortVector(vector, L"z", 1));
213 vector.push_back(CGitFileName(L"a"));
214 vector.push_back(CGitFileName(L"b/1"));
215 vector.push_back(CGitFileName(L"b/2"));
216 vector.push_back(CGitFileName(L"b/3"));
217 vector.push_back(CGitFileName(L"b/4"));
218 vector.push_back(CGitFileName(L"b/5"));
219 std::sort(vector.begin(), vector.end(), SortCGitFileName);
220 EXPECT_EQ(2, SearchInSortVector(vector, L"b/2", 3));
221 EXPECT_EQ(2, SearchInSortVector(vector, L"b/2", -1));
222 EXPECT_EQ(3, SearchInSortVector(vector, L"b/", 2));
223 EXPECT_EQ(-1, SearchInSortVector(vector, L"b/6", 3));
224 EXPECT_EQ(0, SearchInSortVector(vector, L"a", 1));
225 EXPECT_EQ(6, SearchInSortVector(vector, L"one", 3));
226 EXPECT_EQ(7, SearchInSortVector(vector, L"two", 3));
229 TEST(GitIndex, GetRangeInSortVector)
231 std::vector<CGitFileName> vector;
233 int start = -2;
234 int end = -2;
235 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, &end, -1));
236 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, &end, 0));
237 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, nullptr, 0));
238 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 0));
239 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 1));
241 vector.push_back(CGitFileName(L"a"));
242 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, &end, -1));
243 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, nullptr, 0));
244 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 0));
245 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 1));
247 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, &start, &end, -1));
248 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, &start, nullptr, 0));
249 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, nullptr, &end, 0));
250 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, nullptr, &end, 1));
252 start = end = -2;
253 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"0", 1, &start, &end, 0));
254 EXPECT_EQ(-1, start);
255 EXPECT_EQ(-1, end);
256 start = end = -2;
257 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"b", 1, &start, &end, 0));
258 EXPECT_EQ(-1, start);
259 EXPECT_EQ(-1, end);
261 start = end = -2;
262 EXPECT_EQ(0, GetRangeInSortVector(vector, L"a", 1, &start, &end, 0));
263 EXPECT_EQ(0, start);
264 EXPECT_EQ(0, end);
266 vector.push_back(CGitFileName(L"b/1"));
267 vector.push_back(CGitFileName(L"b/2"));
268 vector.push_back(CGitFileName(L"b/3"));
269 vector.push_back(CGitFileName(L"b/4"));
270 vector.push_back(CGitFileName(L"b/5"));
272 start = end = -2;
273 EXPECT_EQ(0, GetRangeInSortVector(vector, L"a", 1, &start, &end, 0));
274 EXPECT_EQ(0, start);
275 EXPECT_EQ(0, end);
277 start = end = -2;
278 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 0));
279 EXPECT_EQ(1, start);
280 EXPECT_EQ(5, end);
282 start = end = -2;
283 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 1));
284 EXPECT_EQ(1, start);
285 EXPECT_EQ(5, end);
287 start = end = -2;
288 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 2));
289 EXPECT_EQ(1, start);
290 EXPECT_EQ(5, end);
292 start = end = -2;
293 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 4));
294 EXPECT_EQ(1, start);
295 EXPECT_EQ(5, end);
297 start = end = -2;
298 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 5));
299 EXPECT_EQ(1, start);
300 EXPECT_EQ(5, end);
302 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 6)); // 6 is >= vector.size()
304 start = end = -2;
305 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, &start, &end, 0));
306 EXPECT_EQ(-1, start);
307 EXPECT_EQ(-1, end);
309 start = end = -2;
310 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, &start, &end, 5));
311 EXPECT_EQ(-1, start);
312 EXPECT_EQ(-1, end);
314 vector.push_back(CGitFileName(L"c"));
315 vector.push_back(CGitFileName(L"d"));
317 start = end = -2;
318 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 1));
319 EXPECT_EQ(1, start);
320 EXPECT_EQ(5, end);
322 start = end = -2;
323 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 2));
324 EXPECT_EQ(1, start);
325 EXPECT_EQ(5, end);
327 start = end = -2;
328 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 4));
329 EXPECT_EQ(1, start);
330 EXPECT_EQ(5, end);
332 start = end = -2;
333 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 5));
334 EXPECT_EQ(1, start);
335 EXPECT_EQ(5, end);
337 start = end = -2;
338 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 6));
339 EXPECT_EQ(1, start);
340 EXPECT_EQ(5, end);
342 start = end = -2;
343 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, &start, &end, 6));
344 EXPECT_EQ(-1, start);
345 EXPECT_EQ(-1, end);
347 start = end = -2;
348 EXPECT_EQ(0, GetRangeInSortVector(vector, L"c", 1, &start, &end, 6));
349 EXPECT_EQ(6, start);
350 EXPECT_EQ(6, end);