133 lines
4.3 KiB
OCaml
133 lines
4.3 KiB
OCaml
(*---------------------------------------------------------------------------
|
|
Copyright (c) 2015 The ptime programmers. All rights reserved.
|
|
SPDX-License-Identifier: ISC
|
|
---------------------------------------------------------------------------*)
|
|
|
|
open B0_testing
|
|
open Testing_ptime
|
|
|
|
let test_bounds () =
|
|
Test.test "calendar date field bounds" @@ fun () ->
|
|
let valid_date ?__POS__ d =
|
|
Test.holds ?__POS__ (Option.is_some (Ptime.of_date ?tz_offset_s:None d))
|
|
in
|
|
let wrong_date ?__POS__ d =
|
|
Test.holds ?__POS__ (Option.is_none (Ptime.of_date ?tz_offset_s:None d))
|
|
in
|
|
(* Check year bounds *)
|
|
wrong_date ~__POS__ (-1, 01, 01);
|
|
valid_date ~__POS__ (0, 01, 01);
|
|
valid_date ~__POS__ (1, 01, 01);
|
|
valid_date ~__POS__ (9999, 01, 01);
|
|
wrong_date ~__POS__ (10000, 01, 01);
|
|
wrong_date ~__POS__ (10001, 01, 01);
|
|
(* Check month bounds *)
|
|
wrong_date ~__POS__ (0, 00, 01);
|
|
valid_date ~__POS__ (0, 01, 01);
|
|
valid_date ~__POS__ (0, 12, 01);
|
|
wrong_date ~__POS__ (0, 13, 01);
|
|
(* Check day bounds in 2015 (month lengths) *)
|
|
(* Jan 2015 *)
|
|
wrong_date ~__POS__ (2015, 01, -1);
|
|
valid_date ~__POS__ (2015, 01, 01);
|
|
valid_date ~__POS__ (2015, 01, 31);
|
|
wrong_date ~__POS__ (2015, 01, 32);
|
|
(* Feb 2015, is not leap *)
|
|
wrong_date ~__POS__ (2015, 02, -1);
|
|
valid_date ~__POS__ (2015, 02, 01);
|
|
valid_date ~__POS__ (2015, 02, 28);
|
|
wrong_date ~__POS__ (2015, 02, 29);
|
|
(* Mar 2015 *)
|
|
wrong_date ~__POS__ (2015, 03, -1);
|
|
valid_date ~__POS__ (2015, 03, 01);
|
|
valid_date ~__POS__ (2015, 03, 31);
|
|
wrong_date ~__POS__ (2015, 03, 32);
|
|
(* Apr 2015 *)
|
|
wrong_date ~__POS__ (2015, 04, -1);
|
|
valid_date ~__POS__ (2015, 04, 01);
|
|
valid_date ~__POS__ (2015, 04, 30);
|
|
wrong_date ~__POS__ (2015, 04, 31);
|
|
(* May 2015 *)
|
|
wrong_date ~__POS__ (2015, 05, -1);
|
|
valid_date ~__POS__ (2015, 05, 01);
|
|
valid_date ~__POS__ (2015, 05, 31);
|
|
wrong_date ~__POS__ (2015, 05, 32);
|
|
(* June 2015 *)
|
|
wrong_date ~__POS__ (2015, 06, -1);
|
|
valid_date ~__POS__ (2015, 06, 01);
|
|
valid_date ~__POS__ (2015, 06, 30);
|
|
wrong_date ~__POS__ (2015, 06, 31);
|
|
(* July 2015 *)
|
|
wrong_date ~__POS__ (2015, 07, -1);
|
|
valid_date ~__POS__ (2015, 07, 01);
|
|
valid_date ~__POS__ (2015, 07, 31);
|
|
wrong_date ~__POS__ (2015, 07, 32);
|
|
(* Aug 2015 *)
|
|
wrong_date ~__POS__ (2015, 08, -1);
|
|
valid_date ~__POS__ (2015, 08, 01);
|
|
valid_date ~__POS__ (2015, 08, 31);
|
|
wrong_date ~__POS__ (2015, 08, 32);
|
|
(* Sept 2015 *)
|
|
wrong_date ~__POS__ (2015, 09, -1);
|
|
valid_date ~__POS__ (2015, 09, 01);
|
|
valid_date ~__POS__ (2015, 09, 30);
|
|
wrong_date ~__POS__ (2015, 09, 31);
|
|
(* Oct 2015 *)
|
|
wrong_date ~__POS__ (2015, 10, -1);
|
|
valid_date ~__POS__ (2015, 10, 01);
|
|
valid_date ~__POS__ (2015, 10, 31);
|
|
wrong_date ~__POS__ (2015, 10, 32);
|
|
(* Nov 2015 *)
|
|
wrong_date ~__POS__ (2015, 11, -1);
|
|
valid_date ~__POS__ (2015, 11, 01);
|
|
valid_date ~__POS__ (2015, 11, 30);
|
|
wrong_date ~__POS__ (2015, 11, 31);
|
|
(* Dec 2015 *)
|
|
wrong_date ~__POS__ (2015, 12, -1);
|
|
valid_date ~__POS__ (2015, 12, 01);
|
|
valid_date ~__POS__ (2015, 12, 31);
|
|
wrong_date ~__POS__ (2015, 12, 32);
|
|
(* 1500 is not leap *)
|
|
valid_date ~__POS__ (1500, 02, 28);
|
|
wrong_date ~__POS__ (1500, 02, 29);
|
|
(* 1700 is not leap *)
|
|
valid_date ~__POS__ (1700, 02, 28);
|
|
wrong_date ~__POS__ (1700, 02, 29);
|
|
(* 1800 is not leap *)
|
|
valid_date ~__POS__ (1800, 02, 28);
|
|
wrong_date ~__POS__ (1800, 02, 29);
|
|
(* 1900 is not leap, Lotus 1-2-3 & Excel bug *)
|
|
valid_date ~__POS__ (1900, 02, 28);
|
|
wrong_date ~__POS__ (1900, 02, 29);
|
|
(* 2000 is leap *)
|
|
valid_date ~__POS__ (2000, 02, 28);
|
|
valid_date ~__POS__ (2000, 02, 29);
|
|
wrong_date ~__POS__ (2000, 02, 30);
|
|
(* 2010 is not leap *)
|
|
valid_date ~__POS__ (2010, 02, 28);
|
|
wrong_date ~__POS__ (2010, 02, 29);
|
|
(* 2012 is leap *)
|
|
valid_date ~__POS__ (2012, 02, 29);
|
|
valid_date ~__POS__ (2012, 02, 29);
|
|
wrong_date ~__POS__ (2012, 02, 30);
|
|
(* 2100 is not leap *)
|
|
valid_date ~__POS__ (2100, 02, 28);
|
|
wrong_date ~__POS__ (2100, 02, 29);
|
|
()
|
|
|
|
let test_stamp_trips () =
|
|
Test.test "random valid dates to stamps round trips" @@ fun () ->
|
|
let of_date ?__POS__ d =
|
|
Ptime.of_date ?tz_offset_s:None d |> Test.get_some ?__POS__
|
|
in
|
|
for i = 1 to Rand.loop_len () do
|
|
let date = Rand.date () in
|
|
let trip = Ptime.to_date (of_date date) in
|
|
T.date ~__POS__ date trip
|
|
done;
|
|
()
|
|
|
|
let tests () =
|
|
test_bounds ();
|
|
test_stamp_trips ();
|
|
()
|