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>11
namespace dt = cheatah::datetime;13
namespace {14
// Components use local time; pin the process timezone to UTC so they're deterministic.15
void use_utc() {16
setenv("TZ", "UTC", 1);17
tzset();18
}19
} // namespace21
TEST(CheatahDatetime, ComponentsOfKnownEpoch) {22
use_utc();23
const double e = 1609459200.0; // 2021-01-01 00:00:00 UTC24
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)31
}33
TEST(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 Thursday39
}41
TEST(CheatahDatetime, TimeOfDayComponents) {42
use_utc();43
const double e = 1609459200.0 + 13 * 3600 + 37 * 60 + 5; // 13:37:05 UTC44
EXPECT_EQ(dt::hour(e), 13);45
EXPECT_EQ(dt::minute(e), 37);46
EXPECT_EQ(dt::second(e), 5);47
}49
TEST(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");54
}56
TEST(CheatahDatetime, NowTodayUtcnowTimestamp) {57
EXPECT_GT(dt::timestamp(), 1.6e9); // well after 202058
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');64
}