cheatah
Source

stdlib/tests/datetime_test.cpp

1// Copyright (c) 2026 BigBrain LLC. MIT-licensed (see LICENSE).
2// Original work; see ACKNOWLEDGMENTS.md for the open-source ideas we build upon.
3#include "datetime.hpp"
5#include <cstdlib>
6#include <ctime>
7#include <string>
9#include <gtest/gtest.h>
11namespace dt = cheatah::datetime;
13namespace {
14// Components use local time; pin the process timezone to UTC so they're deterministic.
15void use_utc() {
16 setenv("TZ", "UTC", 1);
17 tzset();
19} // namespace
21TEST(CheatahDatetime, ComponentsOfKnownEpoch) {
22 use_utc();
23 const double e = 1609459200.0; // 2021-01-01 00:00:00 UTC
24 EXPECT_EQ(dt::year(e), 2021);
25 EXPECT_EQ(dt::month(e), 1);
26 EXPECT_EQ(dt::day(e), 1);
27 EXPECT_EQ(dt::hour(e), 0);
28 EXPECT_EQ(dt::minute(e), 0);
29 EXPECT_EQ(dt::second(e), 0);
30 EXPECT_EQ(dt::weekday(e), 4); // 2021-01-01 was a Friday (Mon=0 … Sun=6)
33TEST(CheatahDatetime, EpochZero) {
34 use_utc();
35 EXPECT_EQ(dt::year(0.0), 1970);
36 EXPECT_EQ(dt::month(0.0), 1);
37 EXPECT_EQ(dt::day(0.0), 1);
38 EXPECT_EQ(dt::weekday(0.0), 3); // 1970-01-01 was a Thursday
41TEST(CheatahDatetime, TimeOfDayComponents) {
42 use_utc();
43 const double e = 1609459200.0 + 13 * 3600 + 37 * 60 + 5; // 13:37:05 UTC
44 EXPECT_EQ(dt::hour(e), 13);
45 EXPECT_EQ(dt::minute(e), 37);
46 EXPECT_EQ(dt::second(e), 5);
49TEST(CheatahDatetime, Format) {
50 use_utc();
51 const double e = 1609459200.0;
52 EXPECT_EQ(dt::format(e, "%Y-%m-%d"), "2021-01-01");
53 EXPECT_EQ(dt::format(e, "%H:%M:%S"), "00:00:00");
56TEST(CheatahDatetime, NowTodayUtcnowTimestamp) {
57 EXPECT_GT(dt::timestamp(), 1.6e9); // well after 2020
58 EXPECT_EQ(dt::now().size(), 19u); // "YYYY-MM-DD HH:MM:SS"
59 EXPECT_EQ(dt::today().size(), 10u); // "YYYY-MM-DD"
60 const std::string u = dt::utcnow(); // "YYYY-MM-DDTHH:MM:SSZ"
61 ASSERT_EQ(u.size(), 20u);
62 EXPECT_EQ(u.back(), 'Z');
63 EXPECT_EQ(u[10], 'T');