Skip to content

Commit

Permalink
Add unit tests for DBFReadDateAttribute/DBFWriteDateAttribute
Browse files Browse the repository at this point in the history
  • Loading branch information
thbeu committed Mar 14, 2024
1 parent ce0528a commit 3804db8
Showing 1 changed file with 88 additions and 0 deletions.
88 changes: 88 additions & 0 deletions tests/dbf_test.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
#include <array>
#include <chrono>
#include <cstring>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <string_view>

Expand Down Expand Up @@ -81,6 +85,90 @@ TEST(DBFCreateTest, CreateAndClose)
fs::remove(filename);
}

static auto WriteDate(const fs::path &filename,
const std::unique_ptr<const SHPDate> &date) -> auto
{
const auto handle = DBFCreate(filename.string().c_str());
EXPECT_NE(nullptr, handle);
const auto fid = DBFAddField(handle, "date", FTDate, 8, 0);
EXPECT_GE(fid, 0);
const auto success = DBFWriteDateAttribute(handle, 0, fid, date.get());
EXPECT_TRUE(success);
const auto recordcount = DBFGetRecordCount(handle);
EXPECT_EQ(1, recordcount);
DBFClose(handle);
}

static auto ReadDate(const fs::path &filename) -> auto
{
const auto handle = DBFOpen(filename.string().c_str(), "rb");
EXPECT_NE(nullptr, handle);
const auto fieldcount = DBFGetFieldCount(handle);
EXPECT_EQ(1, fieldcount);
const auto fieldname =
std::make_unique<std::array<char, XBASE_FLDNAME_LEN_READ + 1>>();
int width, decimals;
const auto fieldtype =
DBFGetFieldInfo(handle, 0, fieldname->data(), &width, &decimals);
EXPECT_EQ(FTDate, fieldtype);
EXPECT_EQ(0, std::strcmp("date", fieldname->data()));
EXPECT_EQ(8, width);
EXPECT_EQ(0, decimals);
const auto recordcount = DBFGetRecordCount(handle);
EXPECT_EQ(1, recordcount);
const auto date = DBFReadDateAttribute(handle, 0, 0);
DBFClose(handle);
return std::make_unique<const SHPDate>(date);
}

static auto GenerateUniqueFilename(std::string_view ext) -> auto
{
const auto now = std::chrono::system_clock::now();
const auto timestamp =
std::chrono::duration_cast<std::chrono::milliseconds>(
now.time_since_epoch())
.count();
std::ostringstream oss;
oss << "test_" << timestamp << ext;
return oss.str();
}

TEST(DBFFieldTest, SetAndGetDateToday)
{
const auto filename =
fs::temp_directory_path() / GenerateUniqueFilename(".dbf");
const auto today = []
{
const auto calendarTime = std::chrono::system_clock::to_time_t(
std::chrono::system_clock::now());
const auto tlocal = std::localtime(&calendarTime);
return std::make_unique<const SHPDate>(SHPDate{
1900 + tlocal->tm_year, tlocal->tm_mon + 1, tlocal->tm_mday});
}();
WriteDate(filename, today);
const auto size = fs::file_size(filename);
EXPECT_EQ(75, size);
const auto date = ReadDate(filename);
EXPECT_EQ(today->year, date->year);
EXPECT_EQ(today->month, date->month);
EXPECT_EQ(today->day, date->day);
fs::remove(filename);
}

TEST(DBFFieldTest, SetAndGetDateInvalid)
{
const auto filename =
fs::temp_directory_path() / GenerateUniqueFilename(".dbf");
WriteDate(filename, std::make_unique<const SHPDate>());
const auto size = fs::file_size(filename);
EXPECT_EQ(75, size);
const auto date = ReadDate(filename);
EXPECT_EQ(0, date->year);
EXPECT_EQ(0, date->month);
EXPECT_EQ(0, date->day);
fs::remove(filename);
}

} // namespace

int main(int argc, char **argv)
Expand Down

0 comments on commit 3804db8

Please sign in to comment.