diff --git a/tests/dbf_test.cc b/tests/dbf_test.cc index dff0189..fc9670b 100644 --- a/tests/dbf_test.cc +++ b/tests/dbf_test.cc @@ -1,6 +1,10 @@ +#include +#include +#include #include #include #include +#include #include #include @@ -81,6 +85,90 @@ TEST(DBFCreateTest, CreateAndClose) fs::remove(filename); } +static auto WriteDate(const fs::path &filename, + const std::unique_ptr &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>(); + 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(date); +} + +static auto GenerateUniqueFilename(std::string_view ext) -> auto +{ + const auto now = std::chrono::system_clock::now(); + const auto timestamp = + std::chrono::duration_cast( + 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(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 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)