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.
21 #include "RepositoryFixtures.h"
24 extern CGitAdminDirMap g_AdminDirMap
; // not optimal yet
26 class GitIndexCBasicGitFixture
: public CBasicGitFixture
31 CBasicGitFixture::SetUp();
32 g_AdminDirMap
.clear();
36 class GitIndexCBasicGitWithEmptyRepositoryFixture
: public CBasicGitWithEmptyRepositoryFixture
41 CBasicGitWithEmptyRepositoryFixture::SetUp();
42 g_AdminDirMap
.clear();
46 class GitIndexCBasicGitWithTestRepoFixture
: public CBasicGitWithTestRepoFixture
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."));
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
);
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
);
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
));
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
);
171 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout --force forconflict"), &output
, CP_UTF8
));
172 EXPECT_FALSE(output
.IsEmpty());
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
;
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));
253 EXPECT_EQ(-1, GetRangeInSortVector(vector
, L
"0", 1, &start
, &end
, 0));
254 EXPECT_EQ(-1, start
);
257 EXPECT_EQ(-1, GetRangeInSortVector(vector
, L
"b", 1, &start
, &end
, 0));
258 EXPECT_EQ(-1, start
);
262 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"a", 1, &start
, &end
, 0));
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"));
273 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"a", 1, &start
, &end
, 0));
278 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 0));
283 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 1));
288 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 2));
293 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 4));
298 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 5));
302 EXPECT_EQ(-1, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 6)); // 6 is >= vector.size()
305 EXPECT_EQ(-1, GetRangeInSortVector(vector
, L
"c/", 2, &start
, &end
, 0));
306 EXPECT_EQ(-1, start
);
310 EXPECT_EQ(-1, GetRangeInSortVector(vector
, L
"c/", 2, &start
, &end
, 5));
311 EXPECT_EQ(-1, start
);
314 vector
.push_back(CGitFileName(L
"c"));
315 vector
.push_back(CGitFileName(L
"d"));
318 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 1));
323 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 2));
328 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 4));
333 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 5));
338 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"b/", 2, &start
, &end
, 6));
343 EXPECT_EQ(-1, GetRangeInSortVector(vector
, L
"c/", 2, &start
, &end
, 6));
344 EXPECT_EQ(-1, start
);
348 EXPECT_EQ(0, GetRangeInSortVector(vector
, L
"c", 1, &start
, &end
, 6));