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. Each4
// writes a tiny .purr that calls a single datetime function, compiles it with5
// 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 the7
// per-module system-level test (StdlibE2E.Datetime).8
//9
// Component getters and `format` use local time, so they are pinned to a FIXED10
// epoch (0.0 = 1970-01-01 UTC) and run under TZ=UTC (passed as the 4th11
// expect_e2e arg) to make their output deterministic. The current-time12
// functions (timestamp/now/utcnow/today) are non-deterministic, so they assert13
// a DETERMINISTIC property (sign / length) instead of a raw value.14
#include "e2e_harness.hpp"16
TEST(DatetimeCompileRun, Timestamp) {17
e2e::expect_e2e("datetime_timestamp", R"PURR(import io18
import datetime19
io.print(datetime.timestamp() > 0.0)20
)PURR", "True\n");21
}23
TEST(DatetimeCompileRun, Now) {24
// "YYYY-MM-DD HH:MM:SS" is always 19 characters.25
e2e::expect_e2e("datetime_now", R"PURR(import io26
import datetime27
io.print(len(datetime.now()) == 19)28
)PURR", "True\n");29
}31
TEST(DatetimeCompileRun, Utcnow) {32
// "YYYY-MM-DDTHH:MM:SSZ" is always 20 characters.33
e2e::expect_e2e("datetime_utcnow", R"PURR(import io34
import datetime35
io.print(len(datetime.utcnow()) == 20)36
)PURR", "True\n");37
}39
TEST(DatetimeCompileRun, Today) {40
// "YYYY-MM-DD" is always 10 characters.41
e2e::expect_e2e("datetime_today", R"PURR(import io42
import datetime43
io.print(len(datetime.today()) == 10)44
)PURR", "True\n");45
}47
TEST(DatetimeCompileRun, Format) {48
e2e::expect_e2e("datetime_format", R"PURR(import io49
import datetime50
io.print(datetime.format(0.0, "%Y-%m-%d %H:%M:%S"))51
)PURR", "1970-01-01 00:00:00\n", "TZ=UTC ");52
}54
TEST(DatetimeCompileRun, Year) {55
e2e::expect_e2e("datetime_year", R"PURR(import io56
import datetime57
io.print(datetime.year(0.0))58
)PURR", "1970\n", "TZ=UTC ");59
}61
TEST(DatetimeCompileRun, Month) {62
e2e::expect_e2e("datetime_month", R"PURR(import io63
import datetime64
io.print(datetime.month(0.0))65
)PURR", "1\n", "TZ=UTC ");66
}68
TEST(DatetimeCompileRun, Day) {69
e2e::expect_e2e("datetime_day", R"PURR(import io70
import datetime71
io.print(datetime.day(0.0))72
)PURR", "1\n", "TZ=UTC ");73
}75
TEST(DatetimeCompileRun, Hour) {76
e2e::expect_e2e("datetime_hour", R"PURR(import io77
import datetime78
io.print(datetime.hour(0.0))79
)PURR", "0\n", "TZ=UTC ");80
}82
TEST(DatetimeCompileRun, Minute) {83
e2e::expect_e2e("datetime_minute", R"PURR(import io84
import datetime85
io.print(datetime.minute(0.0))86
)PURR", "0\n", "TZ=UTC ");87
}89
TEST(DatetimeCompileRun, Second) {90
e2e::expect_e2e("datetime_second", R"PURR(import io91
import datetime92
io.print(datetime.second(0.0))93
)PURR", "0\n", "TZ=UTC ");94
}96
TEST(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 io99
import datetime100
io.print(datetime.weekday(0.0))101
)PURR", "3\n", "TZ=UTC ");102
}