OXYGENHUB
◆ main openmsx / src / unittest / Date_test.cc
2.8 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#include "catch.hpp"
2
#include "Date.hh"
3
4
#include "ranges.hh"
5
#include "setenv.hh"
6
7
#include <array>
8
#include <cstring>
9
10
using namespace openmsx;
11
12
static void test(time_t t, const char* s)
13
{
14
	REQUIRE(strlen(s) >= 24); // precondition
15
	CHECK(Date::fromString(std::span<const char, 24>{s, 24}) == t);
16
	CHECK(Date::toString(t) == s);
17
18
	// Test buffer-based overload
19
	std::array<char, 24> buf;
20
	auto result = Date::toString(t, buf);
21
	CHECK(result == s);
22
}
23
24
TEST_CASE("Date")
25
{
26
	setenv("TZ", "UTC", 1);
27
	tzset();
28
	test(         0, "Thu Jan 01 00:00:00 1970");
29
	test(         1, "Thu Jan 01 00:00:01 1970");
30
	test(        60, "Thu Jan 01 00:01:00 1970");
31
	test(      3600, "Thu Jan 01 01:00:00 1970");
32
	test(1318850077, "Mon Oct 17 11:14:37 2011");
33
	test(1403092862, "Wed Jun 18 12:01:02 2014");
34
35
	// Check invalid formats
36
	// - invalid separator characters
37
	CHECK(Date::fromString(subspan<24>("WedXJun 18 12:01:02 2014")) == Date::INVALID_TIME_T);
38
	CHECK(Date::fromString(subspan<24>("Wed JunX18 12:01:02 2014")) == Date::INVALID_TIME_T);
39
	CHECK(Date::fromString(subspan<24>("Wed Jun 18X12:01:02 2014")) == Date::INVALID_TIME_T);
40
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12X01:02 2014")) == Date::INVALID_TIME_T);
41
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12:01X02 2014")) == Date::INVALID_TIME_T);
42
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12:01:02X2014")) == Date::INVALID_TIME_T);
43
	// - weekday is not verified
44
	// - invalid month (must also have correct case)
45
	CHECK(Date::fromString(subspan<24>("Wed Foo 18 12:01:02 2014")) == Date::INVALID_TIME_T);
46
	CHECK(Date::fromString(subspan<24>("Wed jun 18 12:01:02 2014")) == Date::INVALID_TIME_T);
47
	// - invalid day
48
	CHECK(Date::fromString(subspan<24>("Wed Jun 00 12:01:02 2014")) == Date::INVALID_TIME_T);
49
	CHECK(Date::fromString(subspan<24>("Wed Jun 32 12:01:02 2014")) == Date::INVALID_TIME_T);
50
	// - invalid hour
51
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 24:01:02 2014")) == Date::INVALID_TIME_T);
52
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 xx:01:02 2014")) == Date::INVALID_TIME_T);
53
	// - invalid minute
54
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12:60:02 2014")) == Date::INVALID_TIME_T);
55
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12:-1:02 2014")) == Date::INVALID_TIME_T);
56
	// - invalid second
57
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12:01:60 2014")) == Date::INVALID_TIME_T);
58
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12:01:0 2014 ")) == Date::INVALID_TIME_T);
59
	// - invalid year
60
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12:01:02 1800")) == Date::INVALID_TIME_T);
61
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12:01:02 X800")) == Date::INVALID_TIME_T);
62
63
	// extra characters at the end are ignored, even digits
64
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12:01:02 2014x")) == 1403092862);
65
	CHECK(Date::fromString(subspan<24>("Wed Jun 18 12:01:02 20140")) == 1403092862);
66
}