2 * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
3 * Copyright (C) 2010 Christian Hergert <chris@dronelabs.com>
5 * gstdatetime.c: Unit tests for GstDateTime
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.
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.
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.
29 #include <gst/check/gstcheck.h>
31 #define assert_almost_equals_int(a, b) \
35 fail_unless(ABS (first - second) <= 1, \
36 "'" #a "' (%d) is not almost equal to '" #b"' (%d)", first, second); \
39 GST_START_TEST (test_GstDateTime_now)
45 memset (&tm, 0, sizeof (tm));
47 #ifdef HAVE_LOCALTIME_R
48 localtime_r (&t, &tm);
50 memcpy (&tm, localtime (&t), sizeof (struct tm));
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);
64 GST_START_TEST (test_GstDateTime_new_from_unix_epoch_local_time)
70 memset (&tm, 0, sizeof (tm));
72 #ifdef HAVE_LOCALTIME_R
73 localtime_r (&t, &tm);
75 memcpy (&tm, localtime (&t), sizeof (struct tm));
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);
86 memset (&tm, 0, sizeof (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);
108 GST_START_TEST (test_GstDateTime_new_from_unix_epoch_utc)
114 memset (&tm, 0, sizeof (tm));
119 memcpy (&tm, gmtime (&t), sizeof (struct tm));
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);
134 GST_START_TEST (test_GstDateTime_get_dmy)
141 #ifdef HAVE_LOCALTIME_R
142 localtime_r (&t, &tt);
144 memcpy (&tt, localtime (&t), sizeof (struct tm));
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);
151 gst_date_time_unref (dt);
156 GST_START_TEST (test_GstDateTime_get_hour)
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);
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);
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);
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);
179 GST_START_TEST (test_GstDateTime_get_microsecond)
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);
193 GST_START_TEST (test_GstDateTime_get_minute)
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);
204 GST_START_TEST (test_GstDateTime_get_second)
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);
215 GST_START_TEST (test_GstDateTime_new_full)
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);
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);
244 GST_START_TEST (test_GstDateTime_utc_now)
254 memcpy (&tm, gmtime (&t), sizeof (struct tm));
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);
268 GST_START_TEST (test_GstDateTime_get_utc_offset)
274 memset (&tm, 0, sizeof (tm));
275 #ifdef HAVE_LOCALTIME_R
276 localtime_r (&t, &tm);
278 memcpy (&tm, localtime (&t), sizeof (struct tm));
281 #ifdef HAVE_TM_GMTOFF
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);
296 GST_START_TEST (test_GstDateTime_partial_fields)
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));
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);
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);
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);
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);
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);
368 date_times_are_equal (GstDateTime * d1, GstDateTime * d2)
370 GValue val1 = G_VALUE_INIT;
371 GValue val2 = G_VALUE_INIT;
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);
382 return ret == GST_VALUE_EQUAL;
385 GST_START_TEST (test_GstDateTime_iso8601)
387 GstDateTime *dt, *dt2;
389 GDateTime *gdt, *gdt2;
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);
414 gst_date_time_unref (dt2);
416 gst_date_time_unref (dt);
418 /* ---- year only ---- */
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);
435 gst_date_time_unref (dt2);
437 gst_date_time_unref (dt);
439 /* ---- year and month ---- */
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);
457 gst_date_time_unref (dt2);
459 gst_date_time_unref (dt);
461 /* ---- year and month ---- */
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);
480 gst_date_time_unref (dt2);
482 gst_date_time_unref (dt);
484 /* ---- date and time, but no seconds ---- */
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);
505 gst_date_time_unref (dt2);
507 gst_date_time_unref (dt);
509 /* ---- date and time, but no seconds (UTC) ---- */
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);
530 gst_date_time_unref (dt2);
532 gst_date_time_unref (dt);
534 /* ---- date and time, with seconds ---- */
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);
555 gst_date_time_unref (dt2);
557 gst_date_time_unref (dt);
559 /* ---- date and time, with seconds (UTC) ---- */
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);
580 gst_date_time_unref (dt2);
582 gst_date_time_unref (dt);
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);
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);
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);
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);
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);
626 /* completely invalid */
627 dt = gst_date_time_new_from_iso8601_string ("0000-00-00");
628 fail_unless (dt == NULL);
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);
639 /* only time provided - we assume today's date */
640 gdt = g_date_time_new_now_utc ();
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);
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);
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);
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);
682 gdt2 = g_date_time_add_minutes (gdt, -270);
683 g_date_time_unref (gdt);
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);
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);
705 /* some bogus ones, make copy to detect out of bound read in valgrind/asan */
707 gchar *s = g_strdup ("0002000000T00000:00+0");
708 dt = gst_date_time_new_from_iso8601_string (s);
709 gst_date_time_unref (dt);
713 g_date_time_unref (gdt2);
718 GST_START_TEST (test_GstDateTime_to_g_date_time)
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);
729 fail_unless (g_date_time_compare (gdt1, gdt2) == 0);
731 g_date_time_unref (gdt1);
732 g_date_time_unref (gdt2);
733 gst_date_time_unref (dt);
738 GST_START_TEST (test_GstDateTime_new_from_g_date_time)
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);
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));
759 g_date_time_unref (gdt);
760 gst_date_time_unref (dt);
766 gst_date_time_suite (void)
768 Suite *s = suite_create ("GstDateTime");
769 TCase *tc_chain = tcase_create ("general");
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);
791 GST_CHECK_MAIN (gst_date_time)