Add further calendar tests.

tests/hard_coded/calendar_basics.{m,exp}:
    Add tests of current_{local,utc}_time/3.

    Fix spelling a spot.
This commit is contained in:
Julien Fischer
2026-04-07 11:59:00 +10:00
parent 00931a9c84
commit ad3b88bee1
2 changed files with 46 additions and 3 deletions

View File

@@ -122,7 +122,7 @@ Unix epoch microsecond = 0
julian_day_number(-4713-11-24 00:00:00) = 0 OK (Start of Julian period)
julian_day_number(1970-01-01 00:00:00) = 2440588 OK (Unix epoch)
julian_day_number(2000-01-01 00:00:00) = 2451545 OK (J2000)
julian_day_number(1582-10-14 00:00:00) = 2299160 OK (Day before Gregorian calender adoption)
julian_day_number(1582-10-14 00:00:00) = 2299160 OK (Day before Gregorian calendar adoption)
julian_day_number(1582-10-15 00:00:00) = 2299161 OK (First day of the Gregorian calendar)
julian_day_number(2000-02-29 00:00:00) = 2451604 OK (Leap day)
julian_day_number(2000-03-01 00:00:00) = 2451605 OK (Day after leap day)
@@ -137,3 +137,7 @@ julian_day_number(2000-01-01 00:00:00) = 2451545 OK (Midnight)
julian_day_number(2000-01-01 23:59:59) = 2451545 OK (End of day)
julian_day_number(10000-01-01 00:00:00) = 5373485 OK (Large year)
=== Test current_{local,utc}_time/3 ===
TEST: current_local_time/3 PASSED
TEST: current_utc_time/3 PASSED

View File

@@ -32,7 +32,8 @@ main(!IO) :-
test_days_in_month(!IO),
test_is_leap_year(!IO),
test_unix_epoch(!IO),
test_julian_day_number(!IO).
test_julian_day_number(!IO),
test_clocks(!IO).
%---------------------------------------------------------------------------%
@@ -223,7 +224,7 @@ julian_day_tests = [
2451545
),
julian_day_test(
"Day before Gregorian calender adoption",
"Day before Gregorian calendar adoption",
det_init_date_time(1582, october, 14, 0, 0, 0, 0),
2299160
),
@@ -313,6 +314,44 @@ months = [
december
].
%---------------------------------------------------------------------------%
:- pred test_clocks(io::di, io::uo) is cc_multi.
test_clocks(!IO) :-
io.write_string("=== Test current_{local,utc}_time/3 ===\n\n", !IO),
% Any test that examines the entire date_time returned by
% current_{local,utc}_time/3 will necessarily be nondeterministic.
% We can however check that:
%
% 1. The predicate returns a valid date_time and does not throw an
% exception.
% 2. The microsecond component is zero (as documented).
do_clock_test("current_local_time/3", current_local_time, !IO),
do_clock_test("current_utc_time/3", current_utc_time, !IO).
:- pred do_clock_test(string::in,
pred(date_time, io, io)::in(pred(out,di, uo) is det),
io::di, io::uo) is cc_multi.
do_clock_test(ClockDesc, ClockPred, !IO) :-
io.format("TEST: %s ", [s(ClockDesc)], !IO),
( try [io(!IO)]
ClockPred(DateTime, !IO)
then
Microseconds = DateTime ^ microsecond,
( if Microseconds = 0 then
io.write_string("PASSED\n", !IO)
else
io.format("FAILED (microseconds = %d)\n",
[i(Microseconds)], !IO)
)
catch_any _ ->
io.write_string("FAILED (exception)\n", !IO)
).
%---------------------------------------------------------------------------%
:- end_module calendar_basics.
%---------------------------------------------------------------------------%