cheatah
Source

tests/purrc/datetime_cr_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// Compile-run unit tests for the `datetime` module: one test per function. Each
4// writes a tiny .purr that calls a single datetime function, compiles it with
5// purrc, runs it under the cheatah runtime, and asserts the exact stdout.
6// Complements the in-process unit tests (stdlib/tests/datetime_test.cpp) and the
7// per-module system-level test (StdlibE2E.Datetime).
8//
9// Component getters and `format` use local time, so they are pinned to a FIXED
10// epoch (0.0 = 1970-01-01 UTC) and run under TZ=UTC (passed as the 4th
11// expect_e2e arg) to make their output deterministic. The current-time
12// functions (timestamp/now/utcnow/today) are non-deterministic, so they assert
13// a DETERMINISTIC property (sign / length) instead of a raw value.
14#include "e2e_harness.hpp"
16TEST(DatetimeCompileRun, Timestamp) {
17 e2e::expect_e2e("datetime_timestamp", R"PURR(import io
18import datetime
19io.print(datetime.timestamp() > 0.0)
20)PURR", "True\n");
23TEST(DatetimeCompileRun, Now) {
24 // "YYYY-MM-DD HH:MM:SS" is always 19 characters.
25 e2e::expect_e2e("datetime_now", R"PURR(import io
26import datetime
27io.print(len(datetime.now()) == 19)
28)PURR", "True\n");
31TEST(DatetimeCompileRun, Utcnow) {
32 // "YYYY-MM-DDTHH:MM:SSZ" is always 20 characters.
33 e2e::expect_e2e("datetime_utcnow", R"PURR(import io
34import datetime
35io.print(len(datetime.utcnow()) == 20)
36)PURR", "True\n");
39TEST(DatetimeCompileRun, Today) {
40 // "YYYY-MM-DD" is always 10 characters.
41 e2e::expect_e2e("datetime_today", R"PURR(import io
42import datetime
43io.print(len(datetime.today()) == 10)
44)PURR", "True\n");
47TEST(DatetimeCompileRun, Format) {
48 e2e::expect_e2e("datetime_format", R"PURR(import io
49import datetime
50io.print(datetime.format(0.0, "%Y-%m-%d %H:%M:%S"))
51)PURR", "1970-01-01 00:00:00\n", "TZ=UTC ");
54TEST(DatetimeCompileRun, Year) {
55 e2e::expect_e2e("datetime_year", R"PURR(import io
56import datetime
57io.print(datetime.year(0.0))
58)PURR", "1970\n", "TZ=UTC ");
61TEST(DatetimeCompileRun, Month) {
62 e2e::expect_e2e("datetime_month", R"PURR(import io
63import datetime
64io.print(datetime.month(0.0))
65)PURR", "1\n", "TZ=UTC ");
68TEST(DatetimeCompileRun, Day) {
69 e2e::expect_e2e("datetime_day", R"PURR(import io
70import datetime
71io.print(datetime.day(0.0))
72)PURR", "1\n", "TZ=UTC ");
75TEST(DatetimeCompileRun, Hour) {
76 e2e::expect_e2e("datetime_hour", R"PURR(import io
77import datetime
78io.print(datetime.hour(0.0))
79)PURR", "0\n", "TZ=UTC ");
82TEST(DatetimeCompileRun, Minute) {
83 e2e::expect_e2e("datetime_minute", R"PURR(import io
84import datetime
85io.print(datetime.minute(0.0))
86)PURR", "0\n", "TZ=UTC ");
89TEST(DatetimeCompileRun, Second) {
90 e2e::expect_e2e("datetime_second", R"PURR(import io
91import datetime
92io.print(datetime.second(0.0))
93)PURR", "0\n", "TZ=UTC ");
96TEST(DatetimeCompileRun, Weekday) {
97 // 1970-01-01 is a Thursday => 3 under Python's Monday=0 convention.
98 e2e::expect_e2e("datetime_weekday", R"PURR(import io
99import datetime
100io.print(datetime.weekday(0.0))
101)PURR", "3\n", "TZ=UTC ");