summaryrefslogtreecommitdiff
path: root/test/test_date.ml
blob: 5c3dc083777e841c99c0fde7676dfd548d3731a6 (plain)
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
(*---------------------------------------------------------------------------
   Copyright (c) 2015 The ptime programmers. All rights reserved.
   Distributed under the ISC license, see terms at the end of the file.
  ---------------------------------------------------------------------------*)

open Testing
open Testing_ptime

let stamp_of_date_time d =
  (Ptime.of_date_time $ raw_date_time @-> ret_get_option stamp) d

let valid_date d =
  ignore ((Ptime.of_date $ raw_date @-> ret_some stamp) d)

let wrong_date d =
  ignore ((Ptime.of_date $ raw_date @-> ret_none stamp) d)

let bounds = test "Testing calendar date field bounds" @@ fun () ->
  (* Check year bounds *)
  wrong_date (-1, 01, 01);
  valid_date (0, 01, 01);
  valid_date (1, 01, 01);
  valid_date (9999, 01, 01);
  wrong_date (10000, 01, 01);
  wrong_date (10001, 01, 01);
  (* Check month bounds *)
  wrong_date (0, 00, 01);
  valid_date (0, 01, 01);
  valid_date (0, 12, 01);
  wrong_date (0, 13, 01);
  (* Check day bounds in 2015 (month lengths) *)
  (* Jan 2015 *)
  wrong_date (2015, 01, -1);
  valid_date (2015, 01, 01);
  valid_date (2015, 01, 31);
  wrong_date (2015, 01, 32);
  (* Feb 2015, is not leap *)
  wrong_date (2015, 02, -1);
  valid_date (2015, 02, 01);
  valid_date (2015, 02, 28);
  wrong_date (2015, 02, 29);
  (* Mar 2015 *)
  wrong_date (2015, 03, -1);
  valid_date (2015, 03, 01);
  valid_date (2015, 03, 31);
  wrong_date (2015, 03, 32);
  (* Apr 2015 *)
  wrong_date (2015, 04, -1);
  valid_date (2015, 04, 01);
  valid_date (2015, 04, 30);
  wrong_date (2015, 04, 31);
  (* May 2015 *)
  wrong_date (2015, 05, -1);
  valid_date (2015, 05, 01);
  valid_date (2015, 05, 31);
  wrong_date (2015, 05, 32);
  (* June 2015 *)
  wrong_date (2015, 06, -1);
  valid_date (2015, 06, 01);
  valid_date (2015, 06, 30);
  wrong_date (2015, 06, 31);
  (* July 2015 *)
  wrong_date (2015, 07, -1);
  valid_date (2015, 07, 01);
  valid_date (2015, 07, 31);
  wrong_date (2015, 07, 32);
  (* Aug 2015 *)
  wrong_date (2015, 08, -1);
  valid_date (2015, 08, 01);
  valid_date (2015, 08, 31);
  wrong_date (2015, 08, 32);
  (* Sept 2015 *)
  wrong_date (2015, 09, -1);
  valid_date (2015, 09, 01);
  valid_date (2015, 09, 30);
  wrong_date (2015, 09, 31);
  (* Oct 2015 *)
  wrong_date (2015, 10, -1);
  valid_date (2015, 10, 01);
  valid_date (2015, 10, 31);
  wrong_date (2015, 10, 32);
  (* Nov 2015 *)
  wrong_date (2015, 11, -1);
  valid_date (2015, 11, 01);
  valid_date (2015, 11, 30);
  wrong_date (2015, 11, 31);
  (* Dec 2015 *)
  wrong_date (2015, 12, -1);
  valid_date (2015, 12, 01);
  valid_date (2015, 12, 31);
  wrong_date (2015, 12, 32);
  (* 1500 is not leap *)
  valid_date (1500, 02, 28);
  wrong_date (1500, 02, 29);
  (* 1700 is not leap *)
  valid_date (1700, 02, 28);
  wrong_date (1700, 02, 29);
  (* 1800 is not leap *)
  valid_date (1800, 02, 28);
  wrong_date (1800, 02, 29);
  (* 1900 is not leap, Lotus 1-2-3 & Excel bug *)
  valid_date (1900, 02, 28);
  wrong_date (1900, 02, 29);
  (* 2000 is leap *)
  valid_date (2000, 02, 28);
  valid_date (2000, 02, 29);
  wrong_date (2000, 02, 30);
  (* 2010 is not leap *)
  valid_date (2010, 02, 28);
  wrong_date (2010, 02, 29);
  (* 2012 is leap *)
  valid_date (2012, 02, 29);
  valid_date (2012, 02, 29);
  wrong_date (2012, 02, 30);
  (* 2100 is not leap *)
  valid_date (2100, 02, 28);
  wrong_date (2100, 02, 29);
  ()

let stamp_trips = test "Random valid dates to stamps round trips" @@ fun () ->
  let of_date = Ptime.of_date $ raw_date @-> ret_get_option stamp in
  for i = 1 to Test_rand.loop_len () do
    let date = Test_rand.date () in
    let trip = Ptime.to_date (of_date date) in
    eq_date date trip
  done;
  ()

let suite = suite "Ptime date tests"
    [ bounds;
      stamp_trips; ]

(*---------------------------------------------------------------------------
   Copyright (c) 2015 The ptime programmers

   Permission to use, copy, modify, and/or distribute this software for any
   purpose with or without fee is hereby granted, provided that the above
   copyright notice and this permission notice appear in all copies.

   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  ---------------------------------------------------------------------------*)