test/datetime: fix test for windows
[platform/upstream/gstreamer.git] / tests / check / gst / gstdatetime.c
1 /* GStreamer
2  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
3  * Copyright (C) 2010 Christian Hergert <chris@dronelabs.com>
4  *
5  * gstdatetime.c: Unit tests for GstDateTime
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include <string.h>
28 #include <time.h>
29 #include <gst/check/gstcheck.h>
30
31 #define assert_almost_equals_int(a, b)                            \
32 G_STMT_START {                                                           \
33   int first = a;                                                         \
34   int second = b;                                                        \
35   fail_unless(ABS (first - second) <= 1,                                 \
36     "'" #a "' (%d) is not almost equal to '" #b"' (%d)", first, second); \
37 } G_STMT_END;
38
39 GST_START_TEST (test_GstDateTime_now)
40 {
41   GstDateTime *dt;
42   time_t t;
43   struct tm tm;
44
45   memset (&tm, 0, sizeof (tm));
46   t = time (NULL);
47 #ifdef HAVE_LOCALTIME_R
48   localtime_r (&t, &tm);
49 #else
50   memcpy (&tm, localtime (&t), sizeof (struct tm));
51 #endif
52   dt = gst_date_time_new_now_local_time ();
53   assert_equals_int (gst_date_time_get_year (dt), 1900 + tm.tm_year);
54   assert_equals_int (gst_date_time_get_month (dt), 1 + tm.tm_mon);
55   assert_equals_int (gst_date_time_get_day (dt), tm.tm_mday);
56   assert_equals_int (gst_date_time_get_hour (dt), tm.tm_hour);
57   assert_equals_int (gst_date_time_get_minute (dt), tm.tm_min);
58   assert_almost_equals_int (gst_date_time_get_second (dt), tm.tm_sec);
59   gst_date_time_unref (dt);
60 }
61
62 GST_END_TEST;
63
64 GST_START_TEST (test_GstDateTime_new_from_unix_epoch_local_time)
65 {
66   GstDateTime *dt;
67   struct tm tm;
68   time_t t;
69
70   memset (&tm, 0, sizeof (tm));
71   t = time (NULL);
72 #ifdef HAVE_LOCALTIME_R
73   localtime_r (&t, &tm);
74 #else
75   memcpy (&tm, localtime (&t), sizeof (struct tm));
76 #endif
77   dt = gst_date_time_new_from_unix_epoch_local_time (t);
78   assert_equals_int (gst_date_time_get_year (dt), 1900 + tm.tm_year);
79   assert_equals_int (gst_date_time_get_month (dt), 1 + tm.tm_mon);
80   assert_equals_int (gst_date_time_get_day (dt), tm.tm_mday);
81   assert_equals_int (gst_date_time_get_hour (dt), tm.tm_hour);
82   assert_equals_int (gst_date_time_get_minute (dt), tm.tm_min);
83   assert_equals_int (gst_date_time_get_second (dt), tm.tm_sec);
84   gst_date_time_unref (dt);
85
86   memset (&tm, 0, sizeof (tm));
87   tm.tm_year = 70;
88   tm.tm_mday = 1;
89   tm.tm_mon = 0;
90   tm.tm_hour = 1;
91   tm.tm_min = 0;
92   tm.tm_sec = 0;
93   t = mktime (&tm);
94   fail_unless (t != -1);
95   dt = gst_date_time_new_from_unix_epoch_local_time (t);
96   assert_equals_int (gst_date_time_get_year (dt), 1970);
97   assert_equals_int (gst_date_time_get_month (dt), 1);
98   assert_equals_int (gst_date_time_get_day (dt), 1);
99   assert_equals_int (gst_date_time_get_hour (dt), 1);
100   assert_equals_int (gst_date_time_get_minute (dt), 0);
101   assert_equals_int (gst_date_time_get_second (dt), 0);
102   gst_date_time_unref (dt);
103 }
104
105 GST_END_TEST;
106
107
108 GST_START_TEST (test_GstDateTime_new_from_unix_epoch_utc)
109 {
110   GstDateTime *dt;
111   struct tm tm;
112   time_t t;
113
114   memset (&tm, 0, sizeof (tm));
115   t = time (NULL);
116 #ifdef HAVE_GMTIME_R
117   gmtime_r (&t, &tm);
118 #else
119   memcpy (&tm, gmtime (&t), sizeof (struct tm));
120 #endif
121   dt = gst_date_time_new_from_unix_epoch_utc (t);
122   assert_equals_int (gst_date_time_get_year (dt), 1900 + tm.tm_year);
123   assert_equals_int (gst_date_time_get_month (dt), 1 + tm.tm_mon);
124   assert_equals_int (gst_date_time_get_day (dt), tm.tm_mday);
125   assert_equals_int (gst_date_time_get_hour (dt), tm.tm_hour);
126   assert_equals_int (gst_date_time_get_minute (dt), tm.tm_min);
127   assert_equals_int (gst_date_time_get_second (dt), tm.tm_sec);
128   assert_equals_int (gst_date_time_get_time_zone_offset (dt), 0);
129   gst_date_time_unref (dt);
130 }
131
132 GST_END_TEST;
133
134 GST_START_TEST (test_GstDateTime_get_dmy)
135 {
136   GstDateTime *dt;
137   time_t t;
138   struct tm tt;
139
140   t = time (NULL);
141 #ifdef HAVE_LOCALTIME_R
142   localtime_r (&t, &tt);
143 #else
144   memcpy (&tt, localtime (&t), sizeof (struct tm));
145 #endif
146   dt = gst_date_time_new_from_unix_epoch_local_time (t);
147   assert_equals_int (gst_date_time_get_year (dt), tt.tm_year + 1900);
148   assert_equals_int (gst_date_time_get_month (dt), tt.tm_mon + 1);
149   assert_equals_int (gst_date_time_get_day (dt), tt.tm_mday);
150
151   gst_date_time_unref (dt);
152 }
153
154 GST_END_TEST;
155
156 GST_START_TEST (test_GstDateTime_get_hour)
157 {
158   GstDateTime *dt;
159
160   dt = gst_date_time_new (0, 2009, 10, 19, 15, 13, 11);
161   assert_equals_int (15, gst_date_time_get_hour (dt));
162   gst_date_time_unref (dt);
163
164   dt = gst_date_time_new (0, 100, 10, 19, 1, 0, 0);
165   assert_equals_int (1, gst_date_time_get_hour (dt));
166   gst_date_time_unref (dt);
167
168   dt = gst_date_time_new (0, 100, 10, 19, 0, 0, 0);
169   assert_equals_int (0, gst_date_time_get_hour (dt));
170   gst_date_time_unref (dt);
171
172   dt = gst_date_time_new (0, 100, 10, 1, 23, 59, 59);
173   assert_equals_int (23, gst_date_time_get_hour (dt));
174   gst_date_time_unref (dt);
175 }
176
177 GST_END_TEST;
178
179 GST_START_TEST (test_GstDateTime_get_microsecond)
180 {
181   GTimeVal tv;
182   GstDateTime *dt;
183
184   g_get_current_time (&tv);
185   dt = gst_date_time_new (0, 2010, 7, 15, 11, 12,
186       13 + (tv.tv_usec / 1000000.0));
187   assert_almost_equals_int (tv.tv_usec, gst_date_time_get_microsecond (dt));
188   gst_date_time_unref (dt);
189 }
190
191 GST_END_TEST;
192
193 GST_START_TEST (test_GstDateTime_get_minute)
194 {
195   GstDateTime *dt;
196
197   dt = gst_date_time_new (0, 2009, 12, 1, 1, 31, 0);
198   assert_equals_int (31, gst_date_time_get_minute (dt));
199   gst_date_time_unref (dt);
200 }
201
202 GST_END_TEST;
203
204 GST_START_TEST (test_GstDateTime_get_second)
205 {
206   GstDateTime *dt;
207
208   dt = gst_date_time_new (0, 2009, 12, 1, 1, 31, 44);
209   assert_equals_int (44, gst_date_time_get_second (dt));
210   gst_date_time_unref (dt);
211 }
212
213 GST_END_TEST;
214
215 GST_START_TEST (test_GstDateTime_new_full)
216 {
217   GstDateTime *dt;
218
219   dt = gst_date_time_new (0, 2009, 12, 11, 12, 11, 10.001234);
220   assert_equals_int (2009, gst_date_time_get_year (dt));
221   assert_equals_int (12, gst_date_time_get_month (dt));
222   assert_equals_int (11, gst_date_time_get_day (dt));
223   assert_equals_int (12, gst_date_time_get_hour (dt));
224   assert_equals_int (11, gst_date_time_get_minute (dt));
225   assert_equals_int (10, gst_date_time_get_second (dt));
226   assert_equals_int (1234, gst_date_time_get_microsecond (dt));
227   assert_equals_float (0, gst_date_time_get_time_zone_offset (dt));
228   gst_date_time_unref (dt);
229
230   dt = gst_date_time_new (2.5, 2010, 3, 29, 12, 13, 16.5);
231   assert_equals_int (2010, gst_date_time_get_year (dt));
232   assert_equals_int (3, gst_date_time_get_month (dt));
233   assert_equals_int (29, gst_date_time_get_day (dt));
234   assert_equals_int (12, gst_date_time_get_hour (dt));
235   assert_equals_int (13, gst_date_time_get_minute (dt));
236   assert_equals_int (16, gst_date_time_get_second (dt));
237   assert_equals_int (500000, gst_date_time_get_microsecond (dt));
238   assert_equals_float (2.5, gst_date_time_get_time_zone_offset (dt));
239   gst_date_time_unref (dt);
240 }
241
242 GST_END_TEST;
243
244 GST_START_TEST (test_GstDateTime_utc_now)
245 {
246   GstDateTime *dt;
247   time_t t;
248   struct tm tm;
249
250   t = time (NULL);
251 #ifdef HAVE_GMTIME_R
252   gmtime_r (&t, &tm);
253 #else
254   memcpy (&tm, gmtime (&t), sizeof (struct tm));
255 #endif
256   dt = gst_date_time_new_now_utc ();
257   assert_equals_int (tm.tm_year + 1900, gst_date_time_get_year (dt));
258   assert_equals_int (tm.tm_mon + 1, gst_date_time_get_month (dt));
259   assert_equals_int (tm.tm_mday, gst_date_time_get_day (dt));
260   assert_equals_int (tm.tm_hour, gst_date_time_get_hour (dt));
261   assert_equals_int (tm.tm_min, gst_date_time_get_minute (dt));
262   assert_almost_equals_int (tm.tm_sec, gst_date_time_get_second (dt));
263   gst_date_time_unref (dt);
264 }
265
266 GST_END_TEST;
267
268 GST_START_TEST (test_GstDateTime_get_utc_offset)
269 {
270   struct tm tm;
271   time_t t;
272
273   t = time (NULL);
274   memset (&tm, 0, sizeof (tm));
275 #ifdef HAVE_LOCALTIME_R
276   localtime_r (&t, &tm);
277 #else
278   memcpy (&tm, localtime (&t), sizeof (struct tm));
279 #endif
280
281 #ifdef HAVE_TM_GMTOFF
282   {
283     GstDateTime *dt;
284     gfloat ts;
285
286     dt = gst_date_time_new_now_local_time ();
287     ts = gst_date_time_get_time_zone_offset (dt);
288     assert_equals_int (ts, tm.tm_gmtoff / 3600.0);
289     gst_date_time_unref (dt);
290   }
291 #endif
292 }
293
294 GST_END_TEST;
295
296 GST_START_TEST (test_GstDateTime_partial_fields)
297 {
298   GstDateTime *dt;
299
300   ASSERT_CRITICAL (gst_date_time_new (0.0, -1, -1, -1, -1, -1, -1));
301   ASSERT_CRITICAL (gst_date_time_new (0.0, 2012, 7, 18, 9, -1, -1));
302
303   dt = gst_date_time_new (0.0, 2012, -1, -1, -1, -1, -1);
304   fail_unless (gst_date_time_has_year (dt));
305   fail_unless_equals_int (gst_date_time_get_year (dt), 2012);
306   fail_if (gst_date_time_has_month (dt));
307   ASSERT_CRITICAL (gst_date_time_get_month (dt));
308   fail_if (gst_date_time_has_day (dt));
309   ASSERT_CRITICAL (gst_date_time_get_day (dt));
310   fail_if (gst_date_time_has_time (dt));
311   ASSERT_CRITICAL (gst_date_time_get_hour (dt));
312   ASSERT_CRITICAL (gst_date_time_get_minute (dt));
313   fail_if (gst_date_time_has_second (dt));
314   ASSERT_CRITICAL (gst_date_time_get_second (dt));
315   gst_date_time_unref (dt);
316
317   dt = gst_date_time_new (0.0, 2012, 7, -1, -1, -1, -1);
318   fail_unless (gst_date_time_has_year (dt));
319   fail_unless_equals_int (gst_date_time_get_year (dt), 2012);
320   fail_unless (gst_date_time_has_month (dt));
321   fail_unless_equals_int (gst_date_time_get_month (dt), 7);
322   fail_if (gst_date_time_has_day (dt));
323   ASSERT_CRITICAL (gst_date_time_get_day (dt));
324   fail_if (gst_date_time_has_time (dt));
325   ASSERT_CRITICAL (gst_date_time_get_hour (dt));
326   ASSERT_CRITICAL (gst_date_time_get_minute (dt));
327   fail_if (gst_date_time_has_second (dt));
328   ASSERT_CRITICAL (gst_date_time_get_second (dt));
329   gst_date_time_unref (dt);
330
331   dt = gst_date_time_new (0.0, 2012, 7, 1, -1, -1, -1);
332   fail_unless (gst_date_time_has_year (dt));
333   fail_unless (gst_date_time_has_month (dt));
334   fail_unless_equals_int (gst_date_time_get_month (dt), 7);
335   fail_unless (gst_date_time_has_day (dt));
336   fail_unless_equals_int (gst_date_time_get_day (dt), 1);
337   fail_if (gst_date_time_has_time (dt));
338   fail_if (gst_date_time_has_second (dt));
339   gst_date_time_unref (dt);
340
341   dt = gst_date_time_new (0.0, 2012, 7, 1, 18, 20, -1);
342   fail_unless (gst_date_time_has_year (dt));
343   fail_unless_equals_int (gst_date_time_get_year (dt), 2012);
344   fail_unless (gst_date_time_has_month (dt));
345   fail_unless_equals_int (gst_date_time_get_month (dt), 7);
346   fail_unless (gst_date_time_has_day (dt));
347   fail_unless_equals_int (gst_date_time_get_day (dt), 1);
348   fail_unless (gst_date_time_has_time (dt));
349   fail_unless_equals_int (gst_date_time_get_hour (dt), 18);
350   fail_unless_equals_int (gst_date_time_get_minute (dt), 20);
351   fail_if (gst_date_time_has_second (dt));
352   gst_date_time_unref (dt);
353
354   dt = gst_date_time_new (0.0, 2012, 7, 1, 18, 20, 25.0443);
355   fail_unless (gst_date_time_has_year (dt));
356   fail_unless (gst_date_time_has_month (dt));
357   fail_unless (gst_date_time_has_day (dt));
358   fail_unless (gst_date_time_has_time (dt));
359   fail_unless (gst_date_time_has_second (dt));
360   fail_unless_equals_int (gst_date_time_get_second (dt), 25);
361   /* fail_unless_equals_int (gst_date_time_get_microsecond (dt), 443); */
362   gst_date_time_unref (dt);
363 }
364
365 GST_END_TEST;
366
367 static gboolean
368 date_times_are_equal (GstDateTime * d1, GstDateTime * d2)
369 {
370   GValue val1 = G_VALUE_INIT;
371   GValue val2 = G_VALUE_INIT;
372   int ret;
373
374   g_value_init (&val1, GST_TYPE_DATE_TIME);
375   g_value_set_boxed (&val1, d1);
376   g_value_init (&val2, GST_TYPE_DATE_TIME);
377   g_value_set_boxed (&val2, d2);
378   ret = gst_value_compare (&val1, &val2);
379   g_value_unset (&val2);
380   g_value_unset (&val1);
381
382   return ret == GST_VALUE_EQUAL;
383 }
384
385 GST_START_TEST (test_GstDateTime_iso8601)
386 {
387   GstDateTime *dt, *dt2;
388   gchar *str, *str2;
389   GDateTime *gdt, *gdt2;
390
391   dt = gst_date_time_new_now_utc ();
392   fail_unless (gst_date_time_has_year (dt));
393   fail_unless (gst_date_time_has_month (dt));
394   fail_unless (gst_date_time_has_day (dt));
395   fail_unless (gst_date_time_has_time (dt));
396   fail_unless (gst_date_time_has_second (dt));
397   str = gst_date_time_to_iso8601_string (dt);
398   fail_unless (str != NULL);
399   fail_unless_equals_int (strlen (str), strlen ("2012-06-26T22:46:43Z"));
400   fail_unless (g_str_has_suffix (str, "Z"));
401   dt2 = gst_date_time_new_from_iso8601_string (str);
402   fail_unless (gst_date_time_get_year (dt) == gst_date_time_get_year (dt2));
403   fail_unless (gst_date_time_get_month (dt) == gst_date_time_get_month (dt2));
404   fail_unless (gst_date_time_get_day (dt) == gst_date_time_get_day (dt2));
405   fail_unless (gst_date_time_get_hour (dt) == gst_date_time_get_hour (dt2));
406   fail_unless (gst_date_time_get_minute (dt) == gst_date_time_get_minute (dt2));
407   fail_unless (gst_date_time_get_second (dt) == gst_date_time_get_second (dt2));
408   /* This will succeed because we're not comparing microseconds when
409    * checking for equality */
410   fail_unless (date_times_are_equal (dt, dt2));
411   str2 = gst_date_time_to_iso8601_string (dt2);
412   fail_unless_equals_string (str, str2);
413   g_free (str2);
414   gst_date_time_unref (dt2);
415   g_free (str);
416   gst_date_time_unref (dt);
417
418   /* ---- year only ---- */
419
420   dt = gst_date_time_new_y (2010);
421   fail_unless (gst_date_time_has_year (dt));
422   fail_unless (!gst_date_time_has_month (dt));
423   fail_unless (!gst_date_time_has_day (dt));
424   fail_unless (!gst_date_time_has_time (dt));
425   fail_unless (!gst_date_time_has_second (dt));
426   str = gst_date_time_to_iso8601_string (dt);
427   fail_unless (str != NULL);
428   fail_unless_equals_string (str, "2010");
429   dt2 = gst_date_time_new_from_iso8601_string (str);
430   fail_unless (gst_date_time_get_year (dt) == gst_date_time_get_year (dt2));
431   fail_unless (date_times_are_equal (dt, dt2));
432   str2 = gst_date_time_to_iso8601_string (dt2);
433   fail_unless_equals_string (str, str2);
434   g_free (str2);
435   gst_date_time_unref (dt2);
436   g_free (str);
437   gst_date_time_unref (dt);
438
439   /* ---- year and month ---- */
440
441   dt = gst_date_time_new_ym (2010, 10);
442   fail_unless (gst_date_time_has_year (dt));
443   fail_unless (gst_date_time_has_month (dt));
444   fail_unless (!gst_date_time_has_day (dt));
445   fail_unless (!gst_date_time_has_time (dt));
446   fail_unless (!gst_date_time_has_second (dt));
447   str = gst_date_time_to_iso8601_string (dt);
448   fail_unless (str != NULL);
449   fail_unless_equals_string (str, "2010-10");
450   dt2 = gst_date_time_new_from_iso8601_string (str);
451   fail_unless (gst_date_time_get_year (dt) == gst_date_time_get_year (dt2));
452   fail_unless (gst_date_time_get_month (dt) == gst_date_time_get_month (dt2));
453   fail_unless (date_times_are_equal (dt, dt2));
454   str2 = gst_date_time_to_iso8601_string (dt2);
455   fail_unless_equals_string (str, str2);
456   g_free (str2);
457   gst_date_time_unref (dt2);
458   g_free (str);
459   gst_date_time_unref (dt);
460
461   /* ---- year and month ---- */
462
463   dt = gst_date_time_new_ymd (2010, 10, 30);
464   fail_unless (gst_date_time_has_year (dt));
465   fail_unless (gst_date_time_has_month (dt));
466   fail_unless (gst_date_time_has_day (dt));
467   fail_unless (!gst_date_time_has_time (dt));
468   fail_unless (!gst_date_time_has_second (dt));
469   str = gst_date_time_to_iso8601_string (dt);
470   fail_unless (str != NULL);
471   fail_unless_equals_string (str, "2010-10-30");
472   dt2 = gst_date_time_new_from_iso8601_string (str);
473   fail_unless (gst_date_time_get_year (dt) == gst_date_time_get_year (dt2));
474   fail_unless (gst_date_time_get_month (dt) == gst_date_time_get_month (dt2));
475   fail_unless (gst_date_time_get_day (dt) == gst_date_time_get_day (dt2));
476   fail_unless (date_times_are_equal (dt, dt2));
477   str2 = gst_date_time_to_iso8601_string (dt2);
478   fail_unless_equals_string (str, str2);
479   g_free (str2);
480   gst_date_time_unref (dt2);
481   g_free (str);
482   gst_date_time_unref (dt);
483
484   /* ---- date and time, but no seconds ---- */
485
486   dt = gst_date_time_new (-4.5, 2010, 10, 30, 15, 50, -1);
487   fail_unless (gst_date_time_has_year (dt));
488   fail_unless (gst_date_time_has_month (dt));
489   fail_unless (gst_date_time_has_day (dt));
490   fail_unless (gst_date_time_has_time (dt));
491   fail_unless (!gst_date_time_has_second (dt));
492   str = gst_date_time_to_iso8601_string (dt);
493   fail_unless (str != NULL);
494   fail_unless_equals_string (str, "2010-10-30T15:50-0430");
495   dt2 = gst_date_time_new_from_iso8601_string (str);
496   fail_unless (gst_date_time_get_year (dt) == gst_date_time_get_year (dt2));
497   fail_unless (gst_date_time_get_month (dt) == gst_date_time_get_month (dt2));
498   fail_unless (gst_date_time_get_day (dt) == gst_date_time_get_day (dt2));
499   fail_unless (gst_date_time_get_hour (dt) == gst_date_time_get_hour (dt2));
500   fail_unless (gst_date_time_get_minute (dt) == gst_date_time_get_minute (dt2));
501   fail_unless (date_times_are_equal (dt, dt2));
502   str2 = gst_date_time_to_iso8601_string (dt2);
503   fail_unless_equals_string (str, str2);
504   g_free (str2);
505   gst_date_time_unref (dt2);
506   g_free (str);
507   gst_date_time_unref (dt);
508
509   /* ---- date and time, but no seconds (UTC) ---- */
510
511   dt = gst_date_time_new (0, 2010, 10, 30, 15, 50, -1);
512   fail_unless (gst_date_time_has_year (dt));
513   fail_unless (gst_date_time_has_month (dt));
514   fail_unless (gst_date_time_has_day (dt));
515   fail_unless (gst_date_time_has_time (dt));
516   fail_unless (!gst_date_time_has_second (dt));
517   str = gst_date_time_to_iso8601_string (dt);
518   fail_unless (str != NULL);
519   fail_unless_equals_string (str, "2010-10-30T15:50Z");
520   dt2 = gst_date_time_new_from_iso8601_string (str);
521   fail_unless (gst_date_time_get_year (dt) == gst_date_time_get_year (dt2));
522   fail_unless (gst_date_time_get_month (dt) == gst_date_time_get_month (dt2));
523   fail_unless (gst_date_time_get_day (dt) == gst_date_time_get_day (dt2));
524   fail_unless (gst_date_time_get_hour (dt) == gst_date_time_get_hour (dt2));
525   fail_unless (gst_date_time_get_minute (dt) == gst_date_time_get_minute (dt2));
526   fail_unless (date_times_are_equal (dt, dt2));
527   str2 = gst_date_time_to_iso8601_string (dt2);
528   fail_unless_equals_string (str, str2);
529   g_free (str2);
530   gst_date_time_unref (dt2);
531   g_free (str);
532   gst_date_time_unref (dt);
533
534   /* ---- date and time, with seconds ---- */
535
536   dt = gst_date_time_new (-4.5, 2010, 10, 30, 15, 50, 0);
537   fail_unless (gst_date_time_has_year (dt));
538   fail_unless (gst_date_time_has_month (dt));
539   fail_unless (gst_date_time_has_day (dt));
540   fail_unless (gst_date_time_has_time (dt));
541   fail_unless (gst_date_time_has_second (dt));
542   str = gst_date_time_to_iso8601_string (dt);
543   fail_unless (str != NULL);
544   fail_unless_equals_string (str, "2010-10-30T15:50:00-0430");
545   dt2 = gst_date_time_new_from_iso8601_string (str);
546   fail_unless (gst_date_time_get_year (dt) == gst_date_time_get_year (dt2));
547   fail_unless (gst_date_time_get_month (dt) == gst_date_time_get_month (dt2));
548   fail_unless (gst_date_time_get_day (dt) == gst_date_time_get_day (dt2));
549   fail_unless (gst_date_time_get_hour (dt) == gst_date_time_get_hour (dt2));
550   fail_unless (gst_date_time_get_minute (dt) == gst_date_time_get_minute (dt2));
551   fail_unless (date_times_are_equal (dt, dt2));
552   str2 = gst_date_time_to_iso8601_string (dt2);
553   fail_unless_equals_string (str, str2);
554   g_free (str2);
555   gst_date_time_unref (dt2);
556   g_free (str);
557   gst_date_time_unref (dt);
558
559   /* ---- date and time, with seconds (UTC) ---- */
560
561   dt = gst_date_time_new (0, 2010, 10, 30, 15, 50, 0);
562   fail_unless (gst_date_time_has_year (dt));
563   fail_unless (gst_date_time_has_month (dt));
564   fail_unless (gst_date_time_has_day (dt));
565   fail_unless (gst_date_time_has_time (dt));
566   fail_unless (gst_date_time_has_second (dt));
567   str = gst_date_time_to_iso8601_string (dt);
568   fail_unless (str != NULL);
569   fail_unless_equals_string (str, "2010-10-30T15:50:00Z");
570   dt2 = gst_date_time_new_from_iso8601_string (str);
571   fail_unless (gst_date_time_get_year (dt) == gst_date_time_get_year (dt2));
572   fail_unless (gst_date_time_get_month (dt) == gst_date_time_get_month (dt2));
573   fail_unless (gst_date_time_get_day (dt) == gst_date_time_get_day (dt2));
574   fail_unless (gst_date_time_get_hour (dt) == gst_date_time_get_hour (dt2));
575   fail_unless (gst_date_time_get_minute (dt) == gst_date_time_get_minute (dt2));
576   fail_unless (date_times_are_equal (dt, dt2));
577   str2 = gst_date_time_to_iso8601_string (dt2);
578   fail_unless_equals_string (str, str2);
579   g_free (str2);
580   gst_date_time_unref (dt2);
581   g_free (str);
582   gst_date_time_unref (dt);
583
584   /* ---- date and time, but without the 'T' and without timezone */
585   dt = gst_date_time_new_from_iso8601_string ("2010-10-30 15:50");
586   fail_unless (gst_date_time_get_year (dt) == 2010);
587   fail_unless (gst_date_time_get_month (dt) == 10);
588   fail_unless (gst_date_time_get_day (dt) == 30);
589   fail_unless (gst_date_time_get_hour (dt) == 15);
590   fail_unless (gst_date_time_get_minute (dt) == 50);
591   fail_unless (!gst_date_time_has_second (dt));
592   gst_date_time_unref (dt);
593
594   /* ---- date and time+secs, but without the 'T' and without timezone */
595   dt = gst_date_time_new_from_iso8601_string ("2010-10-30 15:50:33");
596   fail_unless (gst_date_time_get_year (dt) == 2010);
597   fail_unless (gst_date_time_get_month (dt) == 10);
598   fail_unless (gst_date_time_get_day (dt) == 30);
599   fail_unless (gst_date_time_get_hour (dt) == 15);
600   fail_unless (gst_date_time_get_minute (dt) == 50);
601   fail_unless (gst_date_time_get_second (dt) == 33);
602   gst_date_time_unref (dt);
603
604   /* ---- dates with 00s */
605   dt = gst_date_time_new_from_iso8601_string ("2010-10-00");
606   fail_unless (gst_date_time_get_year (dt) == 2010);
607   fail_unless (gst_date_time_get_month (dt) == 10);
608   fail_unless (!gst_date_time_has_day (dt));
609   fail_unless (!gst_date_time_has_time (dt));
610   gst_date_time_unref (dt);
611
612   dt = gst_date_time_new_from_iso8601_string ("2010-00-00");
613   fail_unless (gst_date_time_get_year (dt) == 2010);
614   fail_unless (!gst_date_time_has_month (dt));
615   fail_unless (!gst_date_time_has_day (dt));
616   fail_unless (!gst_date_time_has_time (dt));
617   gst_date_time_unref (dt);
618
619   dt = gst_date_time_new_from_iso8601_string ("2010-00-30");
620   fail_unless (gst_date_time_get_year (dt) == 2010);
621   fail_unless (!gst_date_time_has_month (dt));
622   fail_unless (!gst_date_time_has_day (dt));
623   fail_unless (!gst_date_time_has_time (dt));
624   gst_date_time_unref (dt);
625
626   /* completely invalid */
627   dt = gst_date_time_new_from_iso8601_string ("0000-00-00");
628   fail_unless (dt == NULL);
629
630   /* partially invalid - here we'll just extract the year */
631   dt = gst_date_time_new_from_iso8601_string ("2010/05/30");
632   fail_unless (gst_date_time_get_year (dt) == 2010);
633   fail_unless (!gst_date_time_has_month (dt));
634   fail_unless (!gst_date_time_has_day (dt));
635   fail_unless (!gst_date_time_has_time (dt));
636   gst_date_time_unref (dt);
637
638
639   /* only time provided - we assume today's date */
640   gdt = g_date_time_new_now_utc ();
641
642   dt = gst_date_time_new_from_iso8601_string ("15:50:33");
643   fail_unless (gst_date_time_get_year (dt) == g_date_time_get_year (gdt));
644   fail_unless (gst_date_time_get_month (dt) == g_date_time_get_month (gdt));
645   fail_unless (gst_date_time_get_day (dt) ==
646       g_date_time_get_day_of_month (gdt));
647   fail_unless (gst_date_time_get_hour (dt) == 15);
648   fail_unless (gst_date_time_get_minute (dt) == 50);
649   fail_unless (gst_date_time_get_second (dt) == 33);
650   gst_date_time_unref (dt);
651
652   dt = gst_date_time_new_from_iso8601_string ("15:50:33Z");
653   fail_unless (gst_date_time_get_year (dt) == g_date_time_get_year (gdt));
654   fail_unless (gst_date_time_get_month (dt) == g_date_time_get_month (gdt));
655   fail_unless (gst_date_time_get_day (dt) ==
656       g_date_time_get_day_of_month (gdt));
657   fail_unless (gst_date_time_get_hour (dt) == 15);
658   fail_unless (gst_date_time_get_minute (dt) == 50);
659   fail_unless (gst_date_time_get_second (dt) == 33);
660   gst_date_time_unref (dt);
661
662   dt = gst_date_time_new_from_iso8601_string ("15:50");
663   fail_unless (gst_date_time_get_year (dt) == g_date_time_get_year (gdt));
664   fail_unless (gst_date_time_get_month (dt) == g_date_time_get_month (gdt));
665   fail_unless (gst_date_time_get_day (dt) ==
666       g_date_time_get_day_of_month (gdt));
667   fail_unless (gst_date_time_get_hour (dt) == 15);
668   fail_unless (gst_date_time_get_minute (dt) == 50);
669   fail_unless (!gst_date_time_has_second (dt));
670   gst_date_time_unref (dt);
671
672   dt = gst_date_time_new_from_iso8601_string ("15:50Z");
673   fail_unless (gst_date_time_get_year (dt) == g_date_time_get_year (gdt));
674   fail_unless (gst_date_time_get_month (dt) == g_date_time_get_month (gdt));
675   fail_unless (gst_date_time_get_day (dt) ==
676       g_date_time_get_day_of_month (gdt));
677   fail_unless (gst_date_time_get_hour (dt) == 15);
678   fail_unless (gst_date_time_get_minute (dt) == 50);
679   fail_unless (!gst_date_time_has_second (dt));
680   gst_date_time_unref (dt);
681
682   gdt2 = g_date_time_add_minutes (gdt, -270);
683   g_date_time_unref (gdt);
684
685   dt = gst_date_time_new_from_iso8601_string ("15:50:33-0430");
686   fail_unless (gst_date_time_get_year (dt) == g_date_time_get_year (gdt2));
687   fail_unless (gst_date_time_get_month (dt) == g_date_time_get_month (gdt2));
688   fail_unless (gst_date_time_get_day (dt) ==
689       g_date_time_get_day_of_month (gdt2));
690   fail_unless (gst_date_time_get_hour (dt) == 15);
691   fail_unless (gst_date_time_get_minute (dt) == 50);
692   fail_unless (gst_date_time_get_second (dt) == 33);
693   gst_date_time_unref (dt);
694
695   dt = gst_date_time_new_from_iso8601_string ("15:50-0430");
696   fail_unless (gst_date_time_get_year (dt) == g_date_time_get_year (gdt2));
697   fail_unless (gst_date_time_get_month (dt) == g_date_time_get_month (gdt2));
698   fail_unless (gst_date_time_get_day (dt) ==
699       g_date_time_get_day_of_month (gdt2));
700   fail_unless (gst_date_time_get_hour (dt) == 15);
701   fail_unless (gst_date_time_get_minute (dt) == 50);
702   fail_unless (!gst_date_time_has_second (dt));
703   gst_date_time_unref (dt);
704
705   /* some bogus ones, make copy to detect out of bound read in valgrind/asan */
706   {
707     gchar *s = g_strdup ("0002000000T00000:00+0");
708     dt = gst_date_time_new_from_iso8601_string (s);
709     gst_date_time_unref (dt);
710     g_free (s);
711   }
712
713   g_date_time_unref (gdt2);
714 }
715
716 GST_END_TEST;
717
718 GST_START_TEST (test_GstDateTime_to_g_date_time)
719 {
720   GDateTime *gdt1;
721   GDateTime *gdt2;
722   GstDateTime *dt;
723
724   gdt1 = g_date_time_new_now_utc ();
725   g_date_time_ref (gdt1);       /* keep it alive for compare below */
726   dt = gst_date_time_new_from_g_date_time (gdt1);
727   gdt2 = gst_date_time_to_g_date_time (dt);
728
729   fail_unless (g_date_time_compare (gdt1, gdt2) == 0);
730
731   g_date_time_unref (gdt1);
732   g_date_time_unref (gdt2);
733   gst_date_time_unref (dt);
734 }
735
736 GST_END_TEST;
737
738 GST_START_TEST (test_GstDateTime_new_from_g_date_time)
739 {
740   GDateTime *gdt;
741   GstDateTime *dt;
742
743   gdt = g_date_time_new_now_utc ();
744   g_date_time_ref (gdt);        /* keep it alive for compare below */
745   dt = gst_date_time_new_from_g_date_time (gdt);
746
747   assert_equals_int (gst_date_time_get_year (dt), g_date_time_get_year (gdt));
748   assert_equals_int (gst_date_time_get_month (dt), g_date_time_get_month (gdt));
749   assert_equals_int (gst_date_time_get_day (dt),
750       g_date_time_get_day_of_month (gdt));
751   assert_equals_int (gst_date_time_get_hour (dt), g_date_time_get_hour (gdt));
752   assert_equals_int (gst_date_time_get_minute (dt),
753       g_date_time_get_minute (gdt));
754   assert_equals_int (gst_date_time_get_second (dt),
755       g_date_time_get_second (gdt));
756   assert_equals_int (gst_date_time_get_microsecond (dt),
757       g_date_time_get_microsecond (gdt));
758
759   g_date_time_unref (gdt);
760   gst_date_time_unref (dt);
761 }
762
763 GST_END_TEST;
764
765 static Suite *
766 gst_date_time_suite (void)
767 {
768   Suite *s = suite_create ("GstDateTime");
769   TCase *tc_chain = tcase_create ("general");
770
771   suite_add_tcase (s, tc_chain);
772   tcase_add_test (tc_chain, test_GstDateTime_get_dmy);
773   tcase_add_test (tc_chain, test_GstDateTime_get_hour);
774   tcase_add_test (tc_chain, test_GstDateTime_get_microsecond);
775   tcase_add_test (tc_chain, test_GstDateTime_get_minute);
776   tcase_add_test (tc_chain, test_GstDateTime_get_second);
777   tcase_add_test (tc_chain, test_GstDateTime_get_utc_offset);
778   tcase_add_test (tc_chain, test_GstDateTime_new_from_unix_epoch_local_time);
779   tcase_add_test (tc_chain, test_GstDateTime_new_from_unix_epoch_utc);
780   tcase_add_test (tc_chain, test_GstDateTime_new_full);
781   tcase_add_test (tc_chain, test_GstDateTime_now);
782   tcase_add_test (tc_chain, test_GstDateTime_utc_now);
783   tcase_add_test (tc_chain, test_GstDateTime_partial_fields);
784   tcase_add_test (tc_chain, test_GstDateTime_iso8601);
785   tcase_add_test (tc_chain, test_GstDateTime_to_g_date_time);
786   tcase_add_test (tc_chain, test_GstDateTime_new_from_g_date_time);
787
788   return s;
789 }
790
791 GST_CHECK_MAIN (gst_date_time)