OpenXLSX/Tests/testXLDateTime.cpp
2021-11-03 19:27:49 +01:00

230 lines
5.3 KiB
C++

//
// Created by Kenneth Balslev on 29/08/2021.
//
#include <OpenXLSX.hpp>
#include <catch.hpp>
#include <fstream>
using namespace OpenXLSX;
TEST_CASE("XLDateTime Tests", "[XLFormula]")
{
SECTION("Default construction")
{
XLDateTime dt;
REQUIRE(dt.serial() == Approx(1.0));
auto tm = dt.tm();
REQUIRE(tm.tm_year == 0);
REQUIRE(tm.tm_mon == 0);
REQUIRE(tm.tm_mday == 1);
REQUIRE(tm.tm_yday == 0);
REQUIRE(tm.tm_wday == 0);
REQUIRE(tm.tm_hour == 0);
REQUIRE(tm.tm_min == 0);
REQUIRE(tm.tm_sec == 0);
}
SECTION("Constructor (serial number)")
{
REQUIRE_THROWS(XLDateTime(0.0));
XLDateTime dt (6069.86742);
REQUIRE(dt.serial() == Approx(6069.86742));
auto tm = dt.tm();
REQUIRE(tm.tm_year == 16);
REQUIRE(tm.tm_mon == 7);
REQUIRE(tm.tm_mday == 12);
// REQUIRE(tm.tm_yday == 0);
REQUIRE(tm.tm_wday == 6);
REQUIRE(tm.tm_hour == 20);
REQUIRE(tm.tm_min == 49);
REQUIRE(tm.tm_sec == 5);
}
SECTION("Constructor (serial number, seconds rounding)")
{
REQUIRE_THROWS(XLDateTime(0.0));
const double serial = 6069.000008;
XLDateTime dt (serial);
REQUIRE(dt.serial() == Approx(serial));
auto tm = dt.tm();
REQUIRE(tm.tm_year == 16);
REQUIRE(tm.tm_mon == 7);
REQUIRE(tm.tm_mday == 12);
REQUIRE(tm.tm_wday == 6);
REQUIRE(tm.tm_hour == 0);
REQUIRE(tm.tm_min == 0);
REQUIRE(tm.tm_sec == 1);
}
SECTION("Constructor (std::tm object)")
{
std::tm tmo;
tmo.tm_year = -1;
tmo.tm_mon = 0;
tmo.tm_mday = 0;
tmo.tm_yday = 0;
tmo.tm_wday = 0;
tmo.tm_hour = 0;
tmo.tm_min = 0;
tmo.tm_sec = 0;
REQUIRE_THROWS(XLDateTime(tmo));
tmo.tm_year = 89;
tmo.tm_mon = 13;
REQUIRE_THROWS(XLDateTime(tmo));
tmo.tm_mon = -1;
REQUIRE_THROWS(XLDateTime(tmo));
tmo.tm_mon = 11;
tmo.tm_mday = 0;
REQUIRE_THROWS(XLDateTime(tmo));
tmo.tm_mday = 32;
REQUIRE_THROWS(XLDateTime(tmo));
tmo.tm_mday = 30;
tmo.tm_hour = 17;
tmo.tm_min = 6;
tmo.tm_sec = 28;
tmo.tm_wday = 6;
XLDateTime dt(tmo);
REQUIRE(dt.serial() == Approx(32872.7128));
}
SECTION("Copy Constructor")
{
XLDateTime dt (6069.86742);
XLDateTime dt2 = dt;
auto tm = dt2.tm();
REQUIRE(tm.tm_year == 16);
REQUIRE(tm.tm_mon == 7);
REQUIRE(tm.tm_mday == 12);
REQUIRE(tm.tm_wday == 6);
REQUIRE(tm.tm_hour == 20);
REQUIRE(tm.tm_min == 49);
REQUIRE(tm.tm_sec == 5);
}
SECTION("Move Constructor")
{
XLDateTime dt (6069.86742);
XLDateTime dt2 = std::move(dt);
auto tm = dt2.tm();
REQUIRE(tm.tm_year == 16);
REQUIRE(tm.tm_mon == 7);
REQUIRE(tm.tm_mday == 12);
REQUIRE(tm.tm_wday == 6);
REQUIRE(tm.tm_hour == 20);
REQUIRE(tm.tm_min == 49);
REQUIRE(tm.tm_sec == 5);
}
SECTION("Copy Assignment")
{
XLDateTime dt (6069.86742);
XLDateTime dt2;
dt2 = dt;
auto tm = dt2.tm();
REQUIRE(tm.tm_year == 16);
REQUIRE(tm.tm_mon == 7);
REQUIRE(tm.tm_mday == 12);
REQUIRE(tm.tm_wday == 6);
REQUIRE(tm.tm_hour == 20);
REQUIRE(tm.tm_min == 49);
REQUIRE(tm.tm_sec == 5);
}
SECTION("Move Assignment")
{
XLDateTime dt (6069.86742);
XLDateTime dt2;
dt2 = std::move(dt);
auto tm = dt2.tm();
REQUIRE(tm.tm_year == 16);
REQUIRE(tm.tm_mon == 7);
REQUIRE(tm.tm_mday == 12);
REQUIRE(tm.tm_wday == 6);
REQUIRE(tm.tm_hour == 20);
REQUIRE(tm.tm_min == 49);
REQUIRE(tm.tm_sec == 5);
}
SECTION("Serial Assignment")
{
XLDateTime dt (1.0);
dt = 6069.86742;
auto tm = dt.tm();
REQUIRE(tm.tm_year == 16);
REQUIRE(tm.tm_mon == 7);
REQUIRE(tm.tm_mday == 12);
REQUIRE(tm.tm_wday == 6);
REQUIRE(tm.tm_hour == 20);
REQUIRE(tm.tm_min == 49);
REQUIRE(tm.tm_sec == 5);
}
SECTION("std::tm Assignment")
{
std::tm tmo;
tmo.tm_year = 16;
tmo.tm_mon = 7;
tmo.tm_mday = 12;
tmo.tm_wday = 6;
tmo.tm_hour = 20;
tmo.tm_min = 49;
tmo.tm_sec = 5;
XLDateTime dt (1.0);
dt = tmo;
REQUIRE(dt.serial() == Approx(6069.86742));
}
SECTION("Implicit conversion")
{
std::tm tmo;
tmo.tm_year = 16;
tmo.tm_mon = 7;
tmo.tm_mday = 12;
tmo.tm_wday = 6;
tmo.tm_hour = 20;
tmo.tm_min = 49;
tmo.tm_sec = 5;
XLDateTime dt (1.0);
dt = tmo;
double serial = dt;
std::tm result = dt;
REQUIRE(serial == Approx(6069.86742));
REQUIRE(result.tm_year == 16);
REQUIRE(result.tm_mon == 7);
REQUIRE(result.tm_mday == 12);
REQUIRE(result.tm_wday == 6);
REQUIRE(result.tm_hour == 20);
REQUIRE(result.tm_min == 49);
REQUIRE(result.tm_sec == 5);
}
}