mte/unikernel/duniverse/ptime/test/test_base.ml

145 lines
5.4 KiB
OCaml
Raw Normal View History

2025-11-11 02:07:51 +01:00
(*---------------------------------------------------------------------------
Copyright (c) 2015 The ptime programmers. All rights reserved.
SPDX-License-Identifier: ISC
---------------------------------------------------------------------------*)
open B0_testing
open Testing_ptime
let span_of_d_ps ?__POS__ s = Ptime.Span.of_d_ps s |> Test.get_some ?__POS__
let test_base () =
Test.test "stamp constants and base constructors" @@ fun () ->
let of_span s = Ptime.(of_span (span_of_d_ps s)) in
let get_of_span s = match of_span s with None -> assert false | Some s -> s in
let to_raw_span t = Ptime.(Span.to_d_ps (to_span t)) in
T.raw_span ~__POS__
(to_raw_span Ptime.epoch) (0, 0L);
T.stamp_option ~__POS__
(of_span (0, 0L)) (Some Ptime.epoch);
T.raw_span ~__POS__
(to_raw_span Ptime.min) (-719528, 0L);
T.stamp_option ~__POS__
(of_span (-719528, 0L)) (Some Ptime.min);
T.stamp_option ~__POS__
(of_span (-719529, 86_399_999_999_999_999L)) None;
T.raw_span ~__POS__
(to_raw_span Ptime.max) (2932896, 86_399_999_999_999_999L);
T.stamp_option ~__POS__
(of_span (2932896, 86_399_999_999_999_999L)) (Some Ptime.max);
T.stamp_option ~__POS__
(of_span (2932897, 0L)) None;
Test.float ~__POS__
(Ptime.to_float_s Ptime.epoch) 0.;
T.stamp_option ~__POS__
(Ptime.of_float_s 0.) (Some Ptime.epoch);
Test.float ~__POS__
(Ptime.to_float_s Ptime.min) ~-.62167219200.;
T.stamp_option ~__POS__
(Ptime.of_float_s ~-.62167219200.) (Some Ptime.min);
T.stamp_option ~__POS__
(Ptime.of_float_s ~-.62167219201.) None;
Test.float ~__POS__
(Ptime.to_float_s (Ptime.truncate ~frac_s:0 Ptime.max)) 253402300799.;
T.stamp_option ~__POS__
(Ptime.of_float_s 253402300799.)
(Some (Ptime.truncate ~frac_s:0 Ptime.max));
T.stamp_option ~__POS__
(Ptime.of_float_s 253402300800.) None;
T.stamp_option ~__POS__
(Ptime.of_float_s nan) None;
T.stamp_option ~__POS__
(Ptime.of_float_s infinity) None;
T.stamp_option ~__POS__
(Ptime.of_float_s ~-.infinity) None;
T.raw_span ~__POS__
Ptime.(Span.to_d_ps (frac_s Ptime.max)) (0, 999_999_999_999L);
T.span ~__POS__
(Ptime.frac_s @@ get_of_span (0, 100_000_000_000L))
(span_of_d_ps (0, 100_000_000_000L));
T.span ~__POS__
(Ptime.frac_s @@ get_of_span (-1, 100_000_000_000L))
(span_of_d_ps (0, 100_000_000_000L));
()
let test_predicates () =
Test.test "stamp predicates" @@ fun () ->
Test.bool ~__POS__ Ptime.(is_earlier min ~than:min) false;
Test.bool ~__POS__ Ptime.(is_earlier min ~than:epoch) true;
Test.bool ~__POS__ Ptime.(is_earlier min ~than:max) true;
Test.bool ~__POS__ Ptime.(is_earlier epoch ~than:min) false;
Test.bool ~__POS__ Ptime.(is_earlier epoch ~than:epoch) false;
Test.bool ~__POS__ Ptime.(is_earlier epoch ~than:max) true;
Test.bool ~__POS__ Ptime.(is_earlier max ~than:min) false;
Test.bool ~__POS__ Ptime.(is_earlier max ~than:epoch) false;
Test.bool ~__POS__ Ptime.(is_earlier max ~than:max) false;
Test.bool ~__POS__ Ptime.(is_later min ~than:min) false;
Test.bool ~__POS__ Ptime.(is_later min ~than:epoch) false;
Test.bool ~__POS__ Ptime.(is_later min ~than:max) false;
Test.bool ~__POS__ Ptime.(is_later epoch ~than:min) true;
Test.bool ~__POS__ Ptime.(is_later epoch ~than:epoch) false;
Test.bool ~__POS__ Ptime.(is_later epoch ~than:max) false;
Test.bool ~__POS__ Ptime.(is_later max ~than:min) true;
Test.bool ~__POS__ Ptime.(is_later max ~than:epoch) true;
Test.bool ~__POS__ Ptime.(is_later max ~than:max) false;
()
let test_posix_arithmetic () =
Test.test "stamp POSIX arithmetic" @@ fun () ->
let span ps = span_of_d_ps (0, ps) in
let nspan ps = Ptime.Span.(neg (span_of_d_ps (0, ps))) in
(* Test limits *)
T.stamp_option ~__POS__ Ptime.(add_span max (span 1L)) None;
T.stamp_option ~__POS__ Ptime.(add_span min (nspan (1L))) None;
T.stamp_option ~__POS__ Ptime.(sub_span min (span 1L)) None;
T.stamp_option ~__POS__ Ptime.(sub_span max (nspan (1L))) None;
(* Test arithmetic *)
T.stamp_option ~__POS__
(Ptime.of_span (span 10L)) Ptime.(add_span epoch (span 10L));
T.stamp_option ~__POS__
(Ptime.of_span (nspan 10L)) Ptime.(sub_span epoch (span 10L));
T.stamp_option ~__POS__
(Ptime.of_span (nspan (10L))) Ptime.(sub_span epoch (span 10L));
Test.block @@ fun () ->
let of_span ps =
let s = span_of_d_ps (0, Int64.abs ps) in
Ptime.of_span (if ps < 0L then Ptime.Span.neg s else s)
in
let get ?__POS__ s = of_span s |> Test.get_some ?__POS__ in
let t0 = get ~__POS__ 20L in
let t1 = get ~__POS__ 10L in
let t2 = get ~__POS__ (-10L) in
T.span ~__POS__ (Ptime.diff t0 t1) (span 10L);
T.span ~__POS__ (Ptime.diff t1 t0) (nspan 10L);
T.span ~__POS__ (Ptime.diff t2 t0) (nspan 30L);
T.span ~__POS__ (Ptime.diff t0 t2) (span 30L);
()
let test_truncation () =
Test.test "stamp truncation" @@ fun () ->
let p ~frac_s t =
let d1 = Ptime.(diff t min) |> Ptime.Span.truncate ~frac_s
and d2 = Ptime.diff (Ptime.truncate ~frac_s t) Ptime.min in
T.span ~__POS__ d1 d2
in
let t ~frac_s ps =
p ~frac_s (Ptime.v (0, ps));
p ~frac_s (Ptime.v (1, ps));
p ~frac_s (Ptime.v (-1, ps));
p ~frac_s (Ptime.v (2932896, ps));
p ~frac_s (Ptime.v (-719528, ps));
in
for i = 0 to 12 do
t ~frac_s:i 0L;
t ~frac_s:i 86_399_999_999_999_999L;
t ~frac_s:i 86_399_000_000_000_000L;
done;
()
let tests () =
test_base ();
test_predicates ();
test_posix_arithmetic ();
test_truncation ();
()