Add delete_lines_after to the Editor.
[libdcp.git] / test / local_time_test.cc
1 /*
2     Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
3
4     This file is part of libdcp.
5
6     libdcp is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     libdcp is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with libdcp.  If not, see <http://www.gnu.org/licenses/>.
18
19     In addition, as a special exception, the copyright holders give
20     permission to link the code of portions of this program with the
21     OpenSSL library under certain conditions as described in each
22     individual source file, and distribute linked combinations
23     including the two.
24
25     You must obey the GNU General Public License in all respects
26     for all of the code used other than OpenSSL.  If you modify
27     file(s) with this exception, you may extend this exception to your
28     version of the file(s), but you are not obligated to do so.  If you
29     do not wish to do so, delete this exception statement from your
30     version.  If you delete this exception statement from all source
31     files in the program, then also delete it here.
32 */
33
34
35 #include "exceptions.h"
36 #include "local_time.h"
37 #include <boost/test/unit_test.hpp>
38
39
40 /** Check that dcp::LocalTime works */
41 BOOST_AUTO_TEST_CASE (local_time_basic_test)
42 {
43         /* Badly-formatted times */
44         BOOST_CHECK_THROW (dcp::LocalTime (""), dcp::TimeFormatError);
45         BOOST_CHECK_THROW (dcp::LocalTime ("XXX"), dcp::TimeFormatError);
46         BOOST_CHECK_THROW (dcp::LocalTime ("2013-01-05T18:06:59+04:0"), dcp::TimeFormatError);
47         BOOST_CHECK_THROW (dcp::LocalTime ("2013-01-05T18:06:59X04:00"), dcp::TimeFormatError);
48         BOOST_CHECK_THROW (dcp::LocalTime ("2013-01-05T18-06:59+04:00"), dcp::TimeFormatError);
49         BOOST_CHECK_THROW (dcp::LocalTime ("2013!01-05T18:06:59+04:00"), dcp::TimeFormatError);
50
51         /* Correctly-formatted */
52
53         {
54                 dcp::LocalTime t ("2013-01-05T18:06:59+04:00");
55                 BOOST_CHECK_EQUAL (t._year, 2013);
56                 BOOST_CHECK_EQUAL (t._month, 1);
57                 BOOST_CHECK_EQUAL (t._day, 5);
58                 BOOST_CHECK_EQUAL (t._hour, 18);
59                 BOOST_CHECK_EQUAL (t._minute, 6);
60                 BOOST_CHECK_EQUAL (t._second, 59);
61                 BOOST_CHECK(t._offset == dcp::UTCOffset(4, 0));
62                 BOOST_CHECK_EQUAL (t.as_string(), "2013-01-05T18:06:59+04:00");
63         }
64
65         {
66                 dcp::LocalTime t ("2011-11-20T01:06:59-09:30");
67                 BOOST_CHECK_EQUAL (t._year, 2011);
68                 BOOST_CHECK_EQUAL (t._month, 11);
69                 BOOST_CHECK_EQUAL (t._day, 20);
70                 BOOST_CHECK_EQUAL (t._hour, 1);
71                 BOOST_CHECK_EQUAL (t._minute, 6);
72                 BOOST_CHECK_EQUAL (t._second, 59);
73                 BOOST_CHECK(t._offset == dcp::UTCOffset(-9, -30));
74                 BOOST_CHECK_EQUAL (t.as_string(), "2011-11-20T01:06:59-09:30");
75         }
76
77         {
78                 dcp::LocalTime t ("2011-11-20T01:06:59.456-09:30");
79                 BOOST_CHECK_EQUAL (t._year, 2011);
80                 BOOST_CHECK_EQUAL (t._month, 11);
81                 BOOST_CHECK_EQUAL (t._day, 20);
82                 BOOST_CHECK_EQUAL (t._hour, 1);
83                 BOOST_CHECK_EQUAL (t._minute, 6);
84                 BOOST_CHECK_EQUAL (t._second, 59);
85                 BOOST_CHECK_EQUAL (t._millisecond, 456);
86                 BOOST_CHECK(t._offset == dcp::UTCOffset(-9, -30));
87                 BOOST_CHECK_EQUAL (t.as_string(true), "2011-11-20T01:06:59.456-09:30");
88         }
89
90         {
91                 /* Construction from boost::posix_time::ptime */
92                 dcp::LocalTime b (boost::posix_time::time_from_string ("2002-01-20 19:03:56"));
93                 BOOST_CHECK_EQUAL (b._year, 2002);
94                 BOOST_CHECK_EQUAL (b._month, 1);
95                 BOOST_CHECK_EQUAL (b._day, 20);
96                 BOOST_CHECK_EQUAL (b._hour, 19);
97                 BOOST_CHECK_EQUAL (b._minute, 3);
98                 BOOST_CHECK_EQUAL (b._second, 56);
99         }
100
101         {
102                 /* Construction from boost::posix_time::ptime with milliseconds */
103                 dcp::LocalTime b (boost::posix_time::time_from_string ("2002-01-20 19:03:56.491"));
104                 BOOST_CHECK_EQUAL (b._year, 2002);
105                 BOOST_CHECK_EQUAL (b._month, 1);
106                 BOOST_CHECK_EQUAL (b._day, 20);
107                 BOOST_CHECK_EQUAL (b._hour, 19);
108                 BOOST_CHECK_EQUAL (b._minute, 3);
109                 BOOST_CHECK_EQUAL (b._second, 56);
110                 BOOST_CHECK_EQUAL (b._millisecond, 491);
111         }
112
113         {
114                 dcp::LocalTime b ("2015-11-18T19:26:45");
115                 BOOST_CHECK_EQUAL (b._year, 2015);
116                 BOOST_CHECK_EQUAL (b._month, 11);
117                 BOOST_CHECK_EQUAL (b._day, 18);
118                 BOOST_CHECK_EQUAL (b._hour, 19);
119                 BOOST_CHECK_EQUAL (b._minute, 26);
120                 BOOST_CHECK_EQUAL (b._second, 45);
121                 BOOST_CHECK_EQUAL (b._millisecond, 0);
122                 BOOST_CHECK(b._offset == dcp::UTCOffset());
123         }
124
125         /* Check negative times with non-zero timezone offset minutes */
126         {
127                 dcp::LocalTime t ("2013-01-05T18:06:59-04:30");
128                 BOOST_CHECK_EQUAL (t._year, 2013);
129                 BOOST_CHECK_EQUAL (t._month, 1);
130                 BOOST_CHECK_EQUAL (t._day, 5);
131                 BOOST_CHECK_EQUAL (t._hour, 18);
132                 BOOST_CHECK_EQUAL (t._minute, 6);
133                 BOOST_CHECK_EQUAL (t._second, 59);
134                 BOOST_CHECK(t._offset == dcp::UTCOffset(-4, -30));
135                 BOOST_CHECK_EQUAL (t.as_string(), "2013-01-05T18:06:59-04:30");
136         }
137 }
138
139
140 BOOST_AUTO_TEST_CASE (local_time_add_minutes_test)
141 {
142         {
143                 dcp::LocalTime t("2018-01-01T10:00:00+01:00");
144                 t.add_minutes (3);
145                 BOOST_CHECK_EQUAL (t.as_string(), "2018-01-01T10:03:00+01:00");
146         }
147
148         {
149                 dcp::LocalTime t("2018-01-01T10:00:15+01:00");
150                 t.add_minutes (3);
151                 BOOST_CHECK_EQUAL (t.as_string(), "2018-01-01T10:03:15+01:00");
152         }
153
154         {
155                 dcp::LocalTime t("2018-01-01T10:40:20+01:00");
156                 t.add_minutes (23);
157                 BOOST_CHECK_EQUAL (t.as_string(), "2018-01-01T11:03:20+01:00");
158         }
159
160         {
161                 dcp::LocalTime t("2018-01-01T10:40:20+01:00");
162                 t.add_minutes (123);
163                 BOOST_CHECK_EQUAL (t.as_string(), "2018-01-01T12:43:20+01:00");
164         }
165
166         {
167                 dcp::LocalTime t("2018-01-01T23:55:00+01:00");
168                 t.add_minutes (7);
169                 BOOST_CHECK_EQUAL (t.as_string(), "2018-01-02T00:02:00+01:00");
170         }
171
172         {
173                 dcp::LocalTime t("2018-01-31T23:55:00+01:00");
174                 t.add_minutes (7);
175                 BOOST_CHECK_EQUAL (t.as_string(), "2018-02-01T00:02:00+01:00");
176         }
177
178         {
179                 dcp::LocalTime t("2018-01-31T23:55:00.123");
180                 t.add_minutes (7);
181                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2018-02-01T00:02:00.123"));
182         }
183 }
184
185
186 BOOST_AUTO_TEST_CASE (local_time_add_months_test)
187 {
188         {
189                 dcp::LocalTime t("2013-06-23T18:06:59.123");
190                 t.add_months(-1);
191                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-05-23T18:06:59.123"));
192                 t.add_months(1);
193                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-06-23T18:06:59.123"));
194                 t.add_months(1);
195                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-07-23T18:06:59.123"));
196                 t.add_months(4);
197                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-11-23T18:06:59.123"));
198                 t.add_months(2);
199                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2014-01-23T18:06:59.123"));
200                 t.add_months(-14);
201                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2012-11-23T18:06:59.123"));
202                 t.add_months(14);
203                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2014-01-23T18:06:59.123"));
204         }
205
206         {
207                 dcp::LocalTime t("2018-01-30T11:00:00+01:00");
208                 t.add_months (1);
209                 BOOST_CHECK_EQUAL (t.as_string(), "2018-02-28T11:00:00+01:00");
210         }
211 }
212
213
214 BOOST_AUTO_TEST_CASE (local_time_from_asn1_utctime_test)
215 {
216         BOOST_CHECK_EQUAL (dcp::LocalTime::from_asn1_utc_time("991231235952").as_string(), "1999-12-31T23:59:52+00:00");
217         BOOST_CHECK_EQUAL (dcp::LocalTime::from_asn1_utc_time("210215165952").as_string(), "2021-02-15T16:59:52+00:00");
218 }
219
220
221 BOOST_AUTO_TEST_CASE (local_time_from_asn1_generalized_time_test)
222 {
223         BOOST_CHECK_EQUAL (dcp::LocalTime::from_asn1_generalized_time("19991231235952").as_string(), "1999-12-31T23:59:52+00:00");
224         BOOST_CHECK_EQUAL (dcp::LocalTime::from_asn1_generalized_time("20210215165952").as_string(), "2021-02-15T16:59:52+00:00");
225 }
226