145 lines
5.4 KiB
OCaml
145 lines
5.4 KiB
OCaml
|
|
(*---------------------------------------------------------------------------
|
||
|
|
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 ();
|
||
|
|
()
|