forked from organicmaps/organicmaps
function that compares files added
function tests
This commit is contained in:
parent
afd954e47f
commit
5d0bde083b
3 changed files with 90 additions and 0 deletions
|
@ -17,6 +17,12 @@ namespace
|
|||
f.Write(name.c_str(), name.size());
|
||||
}
|
||||
|
||||
void MakeFile(string const & name, size_t const size, const char c)
|
||||
{
|
||||
my::FileData f(name, my::FileData::OP_WRITE_TRUNCATE);
|
||||
f.Write(string(size, c).c_str(), size);
|
||||
}
|
||||
|
||||
void CheckFileOK(string const & name)
|
||||
{
|
||||
my::FileData f(name, my::FileData::OP_READ);
|
||||
|
@ -106,3 +112,58 @@ UNIT_TEST(FileData_SharingAV_Windows)
|
|||
TEST(my::DeleteFileX(name2), ());
|
||||
}
|
||||
#endif
|
||||
|
||||
UNIT_TEST(Equal_Function_Test)
|
||||
{
|
||||
MakeFile(name1);
|
||||
MakeFile(name2);
|
||||
TEST(my::IsEqualFiles(name1, name1), ());
|
||||
TEST(my::IsEqualFiles(name2, name2), ());
|
||||
TEST(!my::IsEqualFiles(name1, name2), ());
|
||||
|
||||
TEST(my::DeleteFileX(name1), ());
|
||||
TEST(my::DeleteFileX(name2), ());
|
||||
}
|
||||
|
||||
UNIT_TEST(Equal_Function_Test_For_Big_Files)
|
||||
{
|
||||
{
|
||||
MakeFile(name1, 1024 * 1024, 'a');
|
||||
MakeFile(name2, 1024 * 1024, 'a');
|
||||
TEST(my::IsEqualFiles(name1, name2), ());
|
||||
TEST(my::DeleteFileX(name1), ());
|
||||
TEST(my::DeleteFileX(name2), ());
|
||||
}
|
||||
{
|
||||
MakeFile(name1, 1024 * 1024 + 512, 'a');
|
||||
MakeFile(name2, 1024 * 1024 + 512, 'a');
|
||||
TEST(my::IsEqualFiles(name1, name2), ());
|
||||
TEST(my::DeleteFileX(name1), ());
|
||||
TEST(my::DeleteFileX(name2), ());
|
||||
}
|
||||
{
|
||||
MakeFile(name1, 1024 * 1024 + 1, 'a');
|
||||
MakeFile(name2, 1024 * 1024 + 1, 'b');
|
||||
TEST(my::IsEqualFiles(name1, name1), ());
|
||||
TEST(my::IsEqualFiles(name2, name2), ());
|
||||
TEST(!my::IsEqualFiles(name1, name2), ());
|
||||
TEST(my::DeleteFileX(name1), ());
|
||||
TEST(my::DeleteFileX(name2), ());
|
||||
}
|
||||
{
|
||||
MakeFile(name1, 1024 * 1024, 'a');
|
||||
MakeFile(name2, 1024 * 1024, 'b');
|
||||
TEST(my::IsEqualFiles(name1, name1), ());
|
||||
TEST(my::IsEqualFiles(name2, name2), ());
|
||||
TEST(!my::IsEqualFiles(name1, name2), ());
|
||||
TEST(my::DeleteFileX(name1), ());
|
||||
TEST(my::DeleteFileX(name2), ());
|
||||
}
|
||||
{
|
||||
MakeFile(name1, 1024 * 1024, 'a');
|
||||
MakeFile(name2, 1024 * 1024 + 1, 'b');
|
||||
TEST(!my::IsEqualFiles(name1, name2), ());
|
||||
TEST(my::DeleteFileX(name1), ());
|
||||
TEST(my::DeleteFileX(name2), ());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -263,4 +263,32 @@ bool CopyFile(string const & fOld, string const & fNew)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool IsEqualFiles(string const & firstFile, string const & secondFile)
|
||||
{
|
||||
my::FileData first(firstFile, my::FileData::OP_READ);
|
||||
my::FileData second(secondFile, my::FileData::OP_READ);
|
||||
if (first.Size() != second.Size())
|
||||
return false;
|
||||
|
||||
size_t const bufSize = 512 * 1024;
|
||||
vector<char> buf1, buf2;
|
||||
buf1.resize(bufSize);
|
||||
buf2.resize(bufSize);
|
||||
size_t const fileSize = first.Size();
|
||||
size_t currSize = 0;
|
||||
|
||||
while (currSize < fileSize)
|
||||
{
|
||||
size_t toRead = fileSize - currSize;
|
||||
if (toRead > bufSize)
|
||||
toRead = bufSize;
|
||||
first.Read(step * bufSize, &buf1[0], readingLength);
|
||||
second.Read(step * bufSize, &buf2[0], readingLength);
|
||||
if (buf1 != buf2)
|
||||
return false;
|
||||
currSize += toRead;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -49,5 +49,6 @@ bool DeleteFileX(string const & fName);
|
|||
bool RenameFileX(string const & fOld, string const & fNew);
|
||||
/// @return false if copy fails. DO NOT THROWS exceptions
|
||||
bool CopyFile(string const & fOld, string const & fNew);
|
||||
bool IsEqualFiles(string const & firstFile, string const & secondFile);
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue