File: test_date.ml

package info (click to toggle)
calendar 3.0.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 732 kB
  • sloc: ml: 2,651; makefile: 15
file content (188 lines) | stat: -rw-r--r-- 10,371 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
(**************************************************************************)
(*                                                                        *)
(*  This file is part of Calendar.                                        *)
(*                                                                        *)
(*  Copyright (C) 2003-2011 Julien Signoles                               *)
(*                                                                        *)
(*  you can redistribute it and/or modify it under the terms of the GNU   *)
(*  Lesser General Public License version 2.1 as published by the         *)
(*  Free Software Foundation, with a special linking exception (usual     *)
(*  for Objective Caml libraries).                                        *)
(*                                                                        *)
(*  It is distributed in the hope that it will be useful,                 *)
(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR                           *)
(*                                                                        *)
(*  See the GNU Lesser General Public Licence version 2.1 for more        *)
(*  details (enclosed in the file LGPL).                                  *)
(*                                                                        *)
(*  The special linking exception is detailled in the enclosed file       *)
(*  LICENSE.                                                              *)
(**************************************************************************)

open CalendarLib;;
open Date;;

let test() =
  let test x s = Alcotest.(check bool) s true x in

  Gen_test.test_exn (lazy (make (-4713) 1 1)) "make (-4713) 1 1";
  Gen_test.test_exn (lazy (make 3268 1 23)) "make 3268 1 23";
  Gen_test.test_exn (lazy (make 1582 10 5)) "make 1582 10 10";
  test (compare (make 2003 2 29) (make 2003 3 1) = 0) "2003-2-29 = 2003-3-1";

  test ((make 2018 10 29) > (make 2018 10 28)) "2018-10-29 > 2018-10-28";
  test ((make 2018 10 29) >= (make 2018 10 28)) "2018-10-29 >= 2018-10-28";
  test ((make 2018 10 29) >= (make 2018 10 29)) "2018-10-29 >= 2018-10-29";
  test ((make 2018 10 29) < (make 2018 10 30)) "2018-10-29 < 2018-10-30";
  test ((make 2018 10 29) <= (make 2018 10 30)) "2018-10-29 <= 2018-10-30";
  test ((make 2018 10 29) <= (make 2018 10 29)) "2018-10-29 <= 2018-10-29";

  let d = make 2003 12 31 in
  test (next d `Month = make 2004 1 31) "2003-12-31 + 1 mois";
  test (add d (Period.month 2) = make 2004 3 2) "2003-12-31 + 2 mois";
  test (add (make 2008 12 31) (Period.month 6) = make 2009 7 1)
    "2008-12-31 + 6 mois";
  test (rem (make 2008 6 2) (Period.month 12) = make 2007 6 2)
    "2008-6-2 - 12 mois";
  test (rem (make 2007 2 30) (Period.month 4) = make 2006 11 2)
    "2008-2-30 - 4 mois";
  test (make 2007 (-38) 30 = make 2003 10 30)
    "2007-(-38)-30 - 2003 10 30";
  test (rem (make 2007 2 30) (Period.month 40) = make 2003 11 2)
    "2008-2-30 - 40 mois";
  let d2 = make (-3000) 1 1 in
  test (rem d (sub d d2) = d2) "rem x (sub x y) = y";
  test (Period.ymd (precise_sub (make 2010 10 5) (make 2010 6 2)) = (0, 4, 3))
  "precise_sub 2010-10-5 2010-6-2";
  test (Period.ymd (precise_sub (make 2010 10 5) (make 2010 6 5)) = (0, 4, 0))
  "precise_sub 2010-10-5 2010-6-2";
  test (Period.ymd (precise_sub (make 2010 10 5) (make 2010 6 6)) = (0, 3, 29))
  "precise_sub 2010-10-5 2010-6-6";
  test (Period.ymd (precise_sub (make 2010 10 5) (make 2010 6 4)) = (0, 4, 1))
  "precise_sub 2010-10-5 2010-6-4";
  test (Period.ymd (precise_sub (make 2010 1 1) (make 2000 1 1)) = (10, 0, 0))
  "precise_sub 2010-1-1 2000-1-1";
  test (from_jd 0 = make (-4712) 1 1) "from_jd 0 = 4713 BC-1-1";
  test (to_jd (from_jd 12345) = 12345) "to_jd (from_jd x) = x";
  test (from_mjd 0 = make 1858 11 17) "from_mjd 0 = 1858-11-17";
  test (to_mjd (from_mjd 12345) = 12345) "to_mjd (from_mjd x) = x";
  test (is_leap_day (make 2000 2 24)) "2000-2-24 leap day";
  test (not (is_leap_day (make 2000 2 25))) "2000-2-25 not leap day";
  test (is_gregorian (make 1600 1 1)) "1600-1-1 gregorian";
  test (not (is_gregorian (make 1400 1 1))) "1400-1-1 not gregorian";
  test (is_julian (make 1582 1 1)) "1582-1-1 julian";
  test (not (is_julian (make 1583 1 1))) "1583-1-1 not julian";
  test (int_of_day Mon = 1) "Monday = 1";
  test (int_of_day Sun = 7) "Sunday = 7";
  test (day_of_int 1 = Mon) "1 = Monday";
  test (day_of_int 7 = Sun) "1 = Monday";
  test (int_of_month Jan = 1) "January = 1";
  test (month_of_int 12 = Dec) "12 = December";
  test (not (is_leap_year 1999)) "1999 not leap year";
  test (not (is_leap_year 1800)) "1800 not leap year";
  test (is_leap_year 1996) "1996 leap year";
  test (is_leap_year 1600) "1600 leap year";
  test (same_calendar 1956 1900) "same calendar 1956 1900";
  test (same_calendar 2001 2013) "same calendar 2001 2013";
  test (same_calendar 1998 2009) "same calendar 1998 2009";
  test (same_calendar 2003 2025) "same calendar 2003 2025";
  test (days_in_year 2000 = 366) "days_in_year 2000";
  test (days_in_year 1900 = 365) "days_in_year 1900";
  test (days_in_year ~month:Jan 2000 = 31) "days_in_year Jan 2000";
  test (days_in_year ~month:Feb 2000 = 60) "days_in_year Feb 2000";
  test (days_in_year ~month:Jan 2000 = 31) "days_in_year Jan 2000";
  test (days_in_year ~month:Mar 1900 = 90) "days_in_year Mar 1900";
  test (weeks_in_year 2000 = 52) "weeks_in_year 2000";
  test (weeks_in_year 2020 = 53) "weeks_in_year 2020";
  test (weeks_in_year 1991 = 52) "weeks_in_year 1991";
  test (weeks_in_year 1999 = 52) "weeks_in_year 1999";
  test (days_in_month (make 2000 2 18) = 29) "days_in_month 2000-2-18";
  test (days_in_month (make_year_month 2000 2) = 29) "days_in_month 2000-2";
  (* untypable: *)
  (* test (days_in_month ((make_year 2000 :> [ `Year | `Month ] Date.date)) = 29) "days_in_month 2000-2"; *)
  test (days_in_year 1900 = 365) "days_in_year 1900";
  test (century 2000 = 20) "century 2000";
  test (century 2001 = 21) "century 2001";
  test (millenium 2000 = 2) "millenium 2000";
  test (millenium 2001 = 3) "millenium 2001";
  test (year (make_year_month 2000 3) = 2000) "year 2000-3";
  test (year (make_year 2000) = 2000) "year 2000";
  test (month (make 2000 4 23) = Apr) "year 2000-4-23";
  test (month (make_year_month 2000 3) = Mar) "year 2000-3";
  (* untypable: *)
  (*test (month (make_year 2000) = Mar) "year 2000";*)
  test (easter 2003 = make 2003 4 20) "Paques 2003";
  test (Period.nb_days (Period.make 0 0 6) = 6) "Period.nb_days ok";
  test (Period.safe_nb_days (Period.week 3) = 21) "Period.safe_nb_days ok";
  Gen_test.test_exn (lazy (Period.nb_days (Period.make 1 0 0))) "Period.nb_days ko";

  test (week_first_last 21 2004 = (make 2004 5 17, make 2004 5 23))
    "week_beggining_end";

  (* January 4th must be in the first week (ISO 8601) *)
  (* 2015 is an interesting year in this regard as it tests this rule
     to its extreme *)
  test (week_first_last 1 2015 = (make 2014 12 29, make 2015 1 4))
    "iso_week_number_startof_2015";
  test (week_first_last 53 2015 = (make 2015 12 28, make 2016 1 3))
    "iso_week_number_endof_2015";

  test (Period.ymd (Period.make 1 2 3) = (1, 2, 3)) "Period.ymd";
  test (nth_weekday_of_month 2004 Oct Thu 4 = make 2004 10 28)
    "nth_weekday_of_month";
  test (nth_weekday_of_month 2006 Mar Fri 3 = make 2006 3 17)
    "nth_weekday_of_month";
  test (equal (from_day_of_year 2008 39) (make 2008 2 8))
    "from_day_of_year";
  test (is_valid_date 2008 2 8) "is_valid_date";
  test (not (is_valid_date 2008 2 30)) "not is_valid_date";

  (* Unix *)
  Time_Zone.change Time_Zone.UTC;
  test (to_unixfloat (make 1970 1 1) = 0.) "to_unixfloat 1 Jan 1970";
  test (from_unixfloat 0. = make 1970 1 1) "from_unixfloat 0.";
  test (to_unixfloat (make 2004 11 13) = 1100304000.) "to_unixfloat";
  test (from_unixfloat 1100304000. = make 2004 11 13) "from_unixfloat";
  test (from_unixtm (to_unixtm (make 2003 7 16)) = make 2003 7 16)
    "from_unixtm to_unixtm = id";
  Time_Zone.change (Time_Zone.UTC_Plus (-1));
  test (from_unixfloat 0. = make 1969 12 31) "from_unixfloat 0. (dec-)";
  test (from_unixtm { Unix.tm_sec = 0; tm_min = 0; tm_hour = 0; tm_mday = 1;
              tm_mon = 0; tm_year = 70; tm_wday = 4; tm_yday = 0;
              tm_isdst = false } = make 1969 12 31)
    "from_unixtm (dec-)";
  Time_Zone.change (Time_Zone.UTC_Plus 1);
  test (from_unixfloat 1100390390. = make 2004 11 14) "from_unixfloat (dec+)";
  test (from_unixtm { Unix.tm_sec = 0; tm_min = 0; tm_hour = 0; tm_mday = 14;
              tm_mon = 10; tm_year = 104; tm_wday = 0; tm_yday = 318;
              tm_isdst = false } = make 2004 11 14)
    "from_unixtm (dec+)";
  test (from_unixtm (to_unixtm (make 2003 7 16)) = make 2003 7 16)
    "from_unixtm to_unixtm = id";

  (* to_business *)
  test (to_business (make 2003 1 1) = (2003, 1, Wed)) "to_business 1";
  test (to_business (make 2003 12 31) = (2004, 1, Wed)) "to_business 2";
  test (to_business (make 2002 12 31) = (2003, 1, Tue)) "to_business 3";
  test (to_business (make 2005 1 1) = (2004, 53, Sat)) "to_business 4";
  test (to_business (make 2004 12 31) = (2004, 53, Fri)) "to_business 5";
  test (to_business (make 2006 1 1) = (2005, 52, Sun)) "to_business 6";
  test (to_business (make 2005 1 17) = (2005, 3, Mon)) "to_business 7";
  test (to_business (make 2006 1 31) = (2006, 5, Tue)) "to_business 8";
  test (to_business (make 2005 1 31) = (2005, 5, Mon)) "to_business 9";
  (* from_business *)
  test (from_business 2003 1 Wed = make 2003 1 1) "from_business 1";
  test (from_business 2004 1 Wed = make 2003 12 31) "from_business 2";
  test (from_business 2003 1 Tue = make 2002 12 31) "from_business 3";
  test (from_business 2004 53 Sat = make 2005 1 1) "from_business 4";
  test (from_business 2004 53 Fri = make 2004 12 31) "from_business 5";
  test (from_business 2005 52 Sun = make 2006 1 1) "from_business 6";
  test (from_business 2005 3 Mon = make 2005 1 17) "from_business 7";
  test (from_business 2006 5 Tue = make 2006 1 31) "from_business 8";
  test (from_business 2005 5 Mon = make 2005 1 31) "from_business 9";
  Gen_test.test_exn (lazy (from_business 2005 0 Sun)) "from_business_bad 1";
  Gen_test.test_exn (lazy (from_business 2005 53 Sun)) "from_business_bad 2";
  ()

let suite = ["test_date", `Quick, test]