Blame glib/tests/date.c

Packit ae235b
#undef G_DISABLE_ASSERT
Packit ae235b
#undef G_LOG_DOMAIN
Packit ae235b
Packit ae235b
/* We are testing some deprecated APIs here */
Packit ae235b
#define GLIB_DISABLE_DEPRECATION_WARNINGS
Packit ae235b
Packit ae235b
#include "glib.h"
Packit ae235b
Packit ae235b
#include <stdio.h>
Packit ae235b
#include <string.h>
Packit ae235b
#include <stdlib.h>
Packit ae235b
#include <locale.h>
Packit ae235b
#include <time.h>
Packit ae235b
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
#define WIN32_LEAN_AND_MEAN
Packit ae235b
#include <windows.h>
Packit ae235b
#endif
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_basic (void)
Packit ae235b
{
Packit ae235b
  g_assert_cmpint (sizeof (GDate), <,  9);
Packit ae235b
  g_assert (!g_date_valid_month (G_DATE_BAD_MONTH));
Packit ae235b
  g_assert (!g_date_valid_month (13));
Packit ae235b
  g_assert (!g_date_valid_day (G_DATE_BAD_DAY));
Packit ae235b
  g_assert (!g_date_valid_day (32));
Packit ae235b
  g_assert (!g_date_valid_year (G_DATE_BAD_YEAR));
Packit ae235b
  g_assert (!g_date_valid_julian (G_DATE_BAD_JULIAN));
Packit ae235b
  g_assert (!g_date_valid_weekday (G_DATE_BAD_WEEKDAY));
Packit ae235b
  g_assert (g_date_is_leap_year (2000));
Packit ae235b
  g_assert (!g_date_is_leap_year (1999));
Packit ae235b
  g_assert (g_date_is_leap_year (1996));
Packit ae235b
  g_assert (g_date_is_leap_year (1600));
Packit ae235b
  g_assert (!g_date_is_leap_year (2100));
Packit ae235b
  g_assert (!g_date_is_leap_year (1800));
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_empty_constructor (void)
Packit ae235b
{
Packit ae235b
  GDate *d;
Packit ae235b
Packit ae235b
  d = g_date_new ();
Packit ae235b
  g_assert (!g_date_valid (d));
Packit ae235b
  g_date_free (d);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_dmy_constructor (void)
Packit ae235b
{
Packit ae235b
  GDate *d;
Packit ae235b
  guint32 j;
Packit ae235b
Packit ae235b
  d = g_date_new_dmy (1, 1, 1);
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
  j = g_date_get_julian (d);
Packit ae235b
  g_assert_cmpint (j, ==, 1);
Packit ae235b
  g_assert_cmpint (g_date_get_month (d), ==, G_DATE_JANUARY);
Packit ae235b
  g_assert_cmpint (g_date_get_day (d), ==, 1);
Packit ae235b
  g_assert_cmpint (g_date_get_year (d), ==, 1);
Packit ae235b
  g_date_free (d);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_julian_constructor (void)
Packit ae235b
{
Packit ae235b
  GDate *d1;
Packit ae235b
  GDate *d2;
Packit ae235b
Packit ae235b
  d1 = g_date_new_julian (4000);
Packit ae235b
  d2 = g_date_new_julian (5000);
Packit ae235b
  g_assert_cmpint (g_date_get_julian (d1), ==, 4000);
Packit ae235b
  g_assert_cmpint (g_date_days_between (d1, d2), ==, 1000);
Packit ae235b
  g_assert_cmpint (g_date_get_year (d1), ==, 11);
Packit ae235b
  g_assert_cmpint (g_date_get_day (d2), ==, 9);
Packit ae235b
  g_date_free (d1);
Packit ae235b
  g_date_free (d2);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_dates (void)
Packit ae235b
{
Packit ae235b
  GDate *d;
Packit ae235b
  GTimeVal tv;
Packit ae235b
Packit ae235b
  d = g_date_new ();
Packit ae235b
Packit ae235b
  /* today */
Packit ae235b
  g_date_set_time (d, time (NULL));
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
Packit ae235b
  /* Unix epoch */
Packit ae235b
  g_date_set_time (d, 1);
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
Packit ae235b
  tv.tv_sec = 0;
Packit ae235b
  tv.tv_usec = 0;
Packit ae235b
  g_date_set_time_val (d, &tv;;
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
Packit ae235b
  /* Julian day 1 */
Packit ae235b
  g_date_set_julian (d, 1);
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
Packit ae235b
  g_date_set_year (d, 3);
Packit ae235b
  g_date_set_day (d, 3);
Packit ae235b
  g_date_set_month (d, 3);
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
  g_assert_cmpint (g_date_get_year (d), ==, 3);
Packit ae235b
  g_assert_cmpint (g_date_get_month (d), ==, 3);
Packit ae235b
  g_assert_cmpint (g_date_get_day (d), ==, 3);
Packit ae235b
  g_assert (!g_date_is_first_of_month (d));
Packit ae235b
  g_assert (!g_date_is_last_of_month (d));
Packit ae235b
  g_date_set_day (d, 1);
Packit ae235b
  g_assert (g_date_is_first_of_month (d));
Packit ae235b
  g_date_subtract_days (d, 1);
Packit ae235b
  g_assert (g_date_is_last_of_month (d));
Packit ae235b
Packit ae235b
  g_date_free (d);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_parse (void)
Packit ae235b
{
Packit ae235b
  GDate *d;
Packit ae235b
  gchar buf[101];
Packit ae235b
Packit ae235b
  d = g_date_new ();
Packit ae235b
Packit ae235b
  g_date_set_dmy (d, 10, 1, 2000);
Packit ae235b
  g_date_strftime (buf, 100, "%x", d);
Packit ae235b
Packit ae235b
  g_date_set_parse (d, buf);
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
  g_assert_cmpint (g_date_get_month (d), ==, 1);
Packit ae235b
  g_assert_cmpint (g_date_get_day (d), ==, 10);
Packit ae235b
  g_assert_cmpint (g_date_get_year (d), ==, 2000);
Packit ae235b
Packit ae235b
  g_date_set_parse (d, "2001 10 1");
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
  g_assert_cmpint (g_date_get_month (d), ==, 10);
Packit ae235b
  g_assert_cmpint (g_date_get_day (d), ==, 1);
Packit ae235b
  g_assert_cmpint (g_date_get_year (d), ==, 2001);
Packit ae235b
Packit ae235b
  g_date_set_parse (d, "2001 10");
Packit ae235b
  g_assert (!g_date_valid (d));
Packit ae235b
Packit ae235b
  g_date_set_parse (d, "2001 10 1 1");
Packit ae235b
  g_assert (!g_date_valid (d));
Packit ae235b
Packit ae235b
  g_date_set_parse (d, "March 1999");
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
  g_assert_cmpint (g_date_get_month (d), ==, 3);
Packit ae235b
  g_assert_cmpint (g_date_get_day (d), ==, 1);
Packit ae235b
  g_assert_cmpint (g_date_get_year (d), ==, 1999);
Packit ae235b
Packit ae235b
  g_date_set_parse (d, "10 Sep 1087");
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
  g_assert_cmpint (g_date_get_month (d), ==, 9);
Packit ae235b
  g_assert_cmpint (g_date_get_day (d), ==, 10);
Packit ae235b
  g_assert_cmpint (g_date_get_year (d), ==, 1087);
Packit ae235b
Packit ae235b
  g_date_set_parse (d, "19990301");
Packit ae235b
  g_assert (g_date_valid (d));
Packit ae235b
  g_assert_cmpint (g_date_get_month (d), ==, 3);
Packit ae235b
  g_assert_cmpint (g_date_get_day (d), ==, 1);
Packit ae235b
  g_assert_cmpint (g_date_get_year (d), ==, 1999);
Packit ae235b
Packit ae235b
  g_date_set_parse (d, "20011320");
Packit ae235b
  g_assert (!g_date_valid (d));
Packit ae235b
Packit ae235b
  g_date_free (d);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_month_names (void)
Packit ae235b
{
Packit ae235b
#if defined(HAVE_LANGINFO_ABALTMON) || defined(G_OS_WIN32)
Packit ae235b
  GDate *gdate;
Packit ae235b
  gchar buf[101];
Packit ae235b
  gchar *oldlocale;
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  LCID old_lcid;
Packit ae235b
#endif
Packit ae235b
#endif  /* defined(HAVE_LANGINFO_ABALTMON) || defined(G_OS_WIN32) */
Packit ae235b
Packit ae235b
  g_test_bug ("749206");
Packit ae235b
Packit ae235b
  /* This test can only work (on non-Windows platforms) if libc supports
Packit ae235b
   * the %OB (etc.) format placeholders. If it doesn’t, strftime() (and hence
Packit ae235b
   * g_date_strftime()) will return the placeholder unsubstituted.
Packit ae235b
   * g_date_strftime() explicitly documents that it doesn’t provide any more
Packit ae235b
   * format placeholders than the system strftime(), so we should skip the test
Packit ae235b
   * in that case. If people need %OB support, they should depend on a suitable
Packit ae235b
   * version of libc, or use g_date_time_format(). Note: a test for a support
Packit ae235b
   * of _NL_ABALTMON_* is not strictly the same as checking for %OB support.
Packit ae235b
   * Some platforms (BSD, OS X) support %OB while _NL_ABALTMON_* and %Ob
Packit ae235b
   * are supported only by glibc 2.27 and newer. But we don’t care about BSD
Packit ae235b
   * here, the aim of this test is to make sure that our custom implementation
Packit ae235b
   * for Windows works the same as glibc 2.27 native implementation. */
Packit ae235b
#if !defined(HAVE_LANGINFO_ABALTMON) && !defined(G_OS_WIN32)
Packit ae235b
  g_test_skip ("libc doesn’t support all alternative month names");
Packit ae235b
#else
Packit ae235b
Packit ae235b
#define TEST_DATE(d,m,y,f,o)                                    \
Packit ae235b
  g_date_set_dmy (gdate, d, m, y);                              \
Packit ae235b
  g_date_strftime (buf, 100, f, gdate);                         \
Packit ae235b
  g_assert_cmpstr (buf, ==, (o));                               \
Packit ae235b
  g_date_set_parse (gdate, buf);                                \
Packit ae235b
  g_assert (g_date_valid (gdate));                              \
Packit ae235b
  g_assert_cmpint (g_date_get_day (gdate), ==, d);              \
Packit ae235b
  g_assert_cmpint (g_date_get_month (gdate), ==, m);            \
Packit ae235b
  g_assert_cmpint (g_date_get_year (gdate), ==, y);
Packit ae235b
Packit ae235b
  oldlocale = g_strdup (setlocale (LC_ALL, NULL));
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  old_lcid = GetThreadLocale ();
Packit ae235b
#endif
Packit ae235b
Packit ae235b
  gdate = g_date_new ();
Packit ae235b
Packit ae235b
  /* Note: Windows implementation of g_date_strftime() does not support
Packit ae235b
   * "-" format modifier (e.g., "%-d", "%-e") so we will not use it.
Packit ae235b
   */
Packit ae235b
Packit ae235b
  /* Make sure that nothing has been changed in western European languages.  */
Packit ae235b
  setlocale (LC_ALL, "en_GB.utf-8");
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (MAKELCID (MAKELANGID (LANG_ENGLISH, SUBLANG_ENGLISH_UK), SORT_DEFAULT));
Packit ae235b
#endif
Packit ae235b
  if (strstr (setlocale (LC_ALL, NULL), "en_GB") != NULL)
Packit ae235b
    {
Packit ae235b
      TEST_DATE (1,  1, 2018, "%B %d, %Y", "January 01, 2018");
Packit ae235b
      TEST_DATE (1,  2, 2018,    "%OB %Y",    "February 2018");
Packit ae235b
      TEST_DATE (1,  3, 2018,  "%e %b %Y",      " 1 Mar 2018");
Packit ae235b
      TEST_DATE (1,  4, 2018,    "%Ob %Y",         "Apr 2018");
Packit ae235b
      TEST_DATE (1,  5, 2018,  "%d %h %Y",      "01 May 2018");
Packit ae235b
      TEST_DATE (1,  6, 2018,    "%Oh %Y",         "Jun 2018");
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    g_test_incomplete ("locale en_GB not available, skipping English month names test");
Packit ae235b
Packit ae235b
  setlocale (LC_ALL, "de_DE.utf-8");
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (MAKELCID (MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT));
Packit ae235b
#endif
Packit ae235b
  if (strstr (setlocale (LC_ALL, NULL), "de_DE") != NULL)
Packit ae235b
    {
Packit ae235b
      TEST_DATE (16,  7, 2018, "%d. %B %Y", "16. Juli 2018");
Packit ae235b
      TEST_DATE ( 1,  8, 2018,    "%OB %Y",   "August 2018");
Packit ae235b
      TEST_DATE (18,  9, 2018, "%e. %b %Y",  "18. Sep 2018");
Packit ae235b
      TEST_DATE ( 1, 10, 2018,    "%Ob %Y",      "Okt 2018");
Packit ae235b
      TEST_DATE (20, 11, 2018, "%d. %h %Y",  "20. Nov 2018");
Packit ae235b
      TEST_DATE ( 1, 12, 2018,    "%Oh %Y",      "Dez 2018");
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    g_test_incomplete ("locale de_DE not available, skipping German month names test");
Packit ae235b
Packit ae235b
Packit ae235b
  setlocale (LC_ALL, "es_ES.utf-8");
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (MAKELCID (MAKELANGID (LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT));
Packit ae235b
#endif
Packit ae235b
  if (strstr (setlocale (LC_ALL, NULL), "es_ES") != NULL)
Packit ae235b
    {
Packit ae235b
      TEST_DATE ( 9,  1, 2018, "%d de %B de %Y", "09 de enero de 2018");
Packit ae235b
      TEST_DATE ( 1,  2, 2018,      "%OB de %Y",     "febrero de 2018");
Packit ae235b
      TEST_DATE (10,  3, 2018, "%e de %b de %Y",   "10 de mar de 2018");
Packit ae235b
      TEST_DATE ( 1,  4, 2018,      "%Ob de %Y",         "abr de 2018");
Packit ae235b
      TEST_DATE (11,  5, 2018, "%d de %h de %Y",   "11 de may de 2018");
Packit ae235b
      TEST_DATE ( 1,  6, 2018,      "%Oh de %Y",         "jun de 2018");
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    g_test_incomplete ("locale es_ES not available, skipping Spanish month names test");
Packit ae235b
Packit ae235b
  setlocale (LC_ALL, "fr_FR.utf-8");
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (MAKELCID (MAKELANGID (LANG_FRENCH, SUBLANG_FRENCH), SORT_DEFAULT));
Packit ae235b
#endif
Packit ae235b
  if (strstr (setlocale (LC_ALL, NULL), "fr_FR") != NULL)
Packit ae235b
    {
Packit ae235b
      TEST_DATE (31,  7, 2018, "%d %B %Y", "31 juillet 2018");
Packit ae235b
      TEST_DATE ( 1,  8, 2018,   "%OB %Y",       "août 2018");
Packit ae235b
      TEST_DATE (30,  9, 2018, "%e %b %Y",   "30 sept. 2018");
Packit ae235b
      TEST_DATE ( 1, 10, 2018,   "%Ob %Y",       "oct. 2018");
Packit ae235b
      TEST_DATE (29, 11, 2018, "%d %h %Y",    "29 nov. 2018");
Packit ae235b
      TEST_DATE ( 1, 12, 2018,   "%Oh %Y",       "déc. 2018");
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    g_test_incomplete ("locale fr_FR not available, skipping French month names test");
Packit ae235b
Packit ae235b
  /* Make sure that there are visible changes in some European languages.  */
Packit ae235b
  setlocale (LC_ALL, "el_GR.utf-8");
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (MAKELCID (MAKELANGID (LANG_GREEK, SUBLANG_GREEK_GREECE), SORT_DEFAULT));
Packit ae235b
#endif
Packit ae235b
  if (strstr (setlocale (LC_ALL, NULL), "el_GR") != NULL)
Packit ae235b
    {
Packit ae235b
      TEST_DATE ( 2,  1, 2018, "%d %B %Y",  "02 Ιανουαρίου 2018");
Packit ae235b
      TEST_DATE ( 4,  2, 2018, "%e %B %Y", " 4 Φεβρουαρίου 2018");
Packit ae235b
      TEST_DATE (15,  3, 2018, "%d %B %Y",     "15 Μαρτίου 2018");
Packit ae235b
      TEST_DATE ( 1,  4, 2018,   "%OB %Y",       "Απρίλιος 2018");
Packit ae235b
      TEST_DATE ( 1,  5, 2018,   "%OB %Y",          "Μάιος 2018");
Packit ae235b
      TEST_DATE ( 1,  6, 2018,   "%OB %Y",        "Ιούνιος 2018");
Packit ae235b
      TEST_DATE (16,  7, 2018, "%e %b %Y",        "16 Ιούλ 2018");
Packit ae235b
      TEST_DATE ( 1,  8, 2018,   "%Ob %Y",            "Αύγ 2018");
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    g_test_incomplete ("locale el_GR not available, skipping Greek month names test");
Packit ae235b
Packit ae235b
  setlocale (LC_ALL, "hr_HR.utf-8");
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (MAKELCID (MAKELANGID (LANG_CROATIAN, SUBLANG_CROATIAN_CROATIA), SORT_DEFAULT));
Packit ae235b
#endif
Packit ae235b
  if (strstr (setlocale (LC_ALL, NULL), "hr_HR") != NULL)
Packit ae235b
    {
Packit ae235b
      TEST_DATE ( 8,  5, 2018, "%d. %B %Y", "08. svibnja 2018");
Packit ae235b
      TEST_DATE ( 9,  6, 2018, "%e. %B %Y",  " 9. lipnja 2018");
Packit ae235b
      TEST_DATE (10,  7, 2018, "%d. %B %Y",  "10. srpnja 2018");
Packit ae235b
      TEST_DATE ( 1,  8, 2018,    "%OB %Y",     "Kolovoz 2018");
Packit ae235b
      TEST_DATE ( 1,  9, 2018,    "%OB %Y",       "Rujan 2018");
Packit ae235b
      TEST_DATE ( 1, 10, 2018,    "%OB %Y",    "Listopad 2018");
Packit ae235b
      TEST_DATE (11, 11, 2018, "%e. %b %Y",     "11. Stu 2018");
Packit ae235b
      TEST_DATE ( 1, 12, 2018,    "%Ob %Y",         "Pro 2018");
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    g_test_incomplete ("locale hr_HR not available, skipping Croatian month names test");
Packit ae235b
Packit ae235b
  setlocale (LC_ALL, "lt_LT.utf-8");
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (MAKELCID (MAKELANGID (LANG_LITHUANIAN, SUBLANG_LITHUANIAN_LITHUANIA), SORT_DEFAULT));
Packit ae235b
#endif
Packit ae235b
  if (strstr (setlocale (LC_ALL, NULL), "lt_LT") != NULL)
Packit ae235b
    {
Packit ae235b
      TEST_DATE ( 1,  1, 2018, "%Y m. %B %d d.",  "2018 m. sausio 01 d.");
Packit ae235b
      TEST_DATE ( 2,  2, 2018, "%Y m. %B %e d.", "2018 m. vasario  2 d.");
Packit ae235b
      TEST_DATE ( 3,  3, 2018, "%Y m. %B %d d.",    "2018 m. kovo 03 d.");
Packit ae235b
      TEST_DATE ( 1,  4, 2018,      "%Y m. %OB",      "2018 m. balandis");
Packit ae235b
      TEST_DATE ( 1,  5, 2018,      "%Y m. %OB",        "2018 m. gegužė");
Packit ae235b
      TEST_DATE ( 1,  6, 2018,      "%Y m. %OB",      "2018 m. birželis");
Packit ae235b
      TEST_DATE (17,  7, 2018, "%Y m. %b %e d.",     "2018 m. Lie 17 d.");
Packit ae235b
      TEST_DATE ( 1,  8, 2018,      "%Y m. %Ob",           "2018 m. Rgp");
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    g_test_incomplete ("locale lt_LT not available, skipping Lithuanian month names test");
Packit ae235b
Packit ae235b
  setlocale (LC_ALL, "pl_PL.utf-8");
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (MAKELCID (MAKELANGID (LANG_POLISH, SUBLANG_POLISH_POLAND), SORT_DEFAULT));
Packit ae235b
#endif
Packit ae235b
  if (strstr (setlocale (LC_ALL, NULL), "pl_PL") != NULL)
Packit ae235b
    {
Packit ae235b
      TEST_DATE ( 3,  5, 2018, "%d %B %Y",     "03 maja 2018");
Packit ae235b
      TEST_DATE ( 4,  6, 2018, "%e %B %Y",  " 4 czerwca 2018");
Packit ae235b
      TEST_DATE (20,  7, 2018, "%d %B %Y",    "20 lipca 2018");
Packit ae235b
      TEST_DATE ( 1,  8, 2018,   "%OB %Y",    "sierpień 2018");
Packit ae235b
      TEST_DATE ( 1,  9, 2018,   "%OB %Y",    "wrzesień 2018");
Packit ae235b
      TEST_DATE ( 1, 10, 2018,   "%OB %Y", "październik 2018");
Packit ae235b
      TEST_DATE (25, 11, 2018, "%e %b %Y",      "25 lis 2018");
Packit ae235b
      TEST_DATE ( 1, 12, 2018,   "%Ob %Y",         "gru 2018");
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    g_test_incomplete ("locale pl_PL not available, skipping Polish month names test");
Packit ae235b
Packit ae235b
  setlocale (LC_ALL, "ru_RU.utf-8");
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (MAKELCID (MAKELANGID (LANG_RUSSIAN, SUBLANG_RUSSIAN_RUSSIA), SORT_DEFAULT));
Packit ae235b
#endif
Packit ae235b
  if (strstr (setlocale (LC_ALL, NULL), "ru_RU") != NULL)
Packit ae235b
    {
Packit ae235b
      TEST_DATE ( 3,  1, 2018,      "%d %B %Y",  "03 января 2018");
Packit ae235b
      TEST_DATE ( 4,  2, 2018,      "%e %B %Y", " 4 февраля 2018");
Packit ae235b
      TEST_DATE (23,  3, 2018,      "%d %B %Y",   "23 марта 2018");
Packit ae235b
      TEST_DATE ( 1,  4, 2018,        "%OB %Y",     "Апрель 2018");
Packit ae235b
      TEST_DATE ( 1,  5, 2018,        "%OB %Y",        "Май 2018");
Packit ae235b
      TEST_DATE ( 1,  6, 2018,        "%OB %Y",       "Июнь 2018");
Packit ae235b
      TEST_DATE (24,  7, 2018,      "%e %b %Y",     "24 июл 2018");
Packit ae235b
      TEST_DATE ( 1,  8, 2018,        "%Ob %Y",        "авг 2018");
Packit ae235b
      /* This difference is very important in Russian:  */
Packit ae235b
      TEST_DATE (19,  5, 2018,      "%e %b %Y",     "19 мая 2018");
Packit ae235b
      TEST_DATE (20,  5, 2018, "%Ob, %d-е, %Y", "май, 20-е, 2018");
Packit ae235b
    }
Packit ae235b
  else
Packit ae235b
    g_test_incomplete ("locale ru_RU not available, skipping Russian month names test");
Packit ae235b
Packit ae235b
  g_date_free (gdate);
Packit ae235b
Packit ae235b
  setlocale (LC_ALL, oldlocale);
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (old_lcid);
Packit ae235b
#endif
Packit ae235b
  g_free (oldlocale);
Packit ae235b
#endif  /* defined(HAVE_LANGINFO_ABALTMON) || defined(G_OS_WIN32) */
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_year (gconstpointer t)
Packit ae235b
{
Packit ae235b
  GDateYear y = GPOINTER_TO_INT (t);
Packit ae235b
  GDateMonth m;
Packit ae235b
  GDateDay day;
Packit ae235b
  guint32 j;
Packit ae235b
  GDate *d;
Packit ae235b
  gint i;
Packit ae235b
  GDate tmp;
Packit ae235b
Packit ae235b
  guint32 first_day_of_year = G_DATE_BAD_JULIAN;
Packit ae235b
  guint16 days_in_year = g_date_is_leap_year (y) ? 366 : 365;
Packit ae235b
  guint   sunday_week_of_year = 0;
Packit ae235b
  guint   sunday_weeks_in_year = g_date_get_sunday_weeks_in_year (y);
Packit ae235b
  guint   monday_week_of_year = 0;
Packit ae235b
  guint   monday_weeks_in_year = g_date_get_monday_weeks_in_year (y);
Packit ae235b
  guint   iso8601_week_of_year = 0;
Packit ae235b
Packit ae235b
  g_assert (g_date_valid_year (y));
Packit ae235b
  /* Years ought to have roundabout 52 weeks */
Packit ae235b
  g_assert (sunday_weeks_in_year == 52 || sunday_weeks_in_year == 53);
Packit ae235b
  g_assert (monday_weeks_in_year == 52 || monday_weeks_in_year == 53);
Packit ae235b
Packit ae235b
  m = 1;
Packit ae235b
  while (m < 13)
Packit ae235b
    {
Packit ae235b
      guint8 dim = g_date_get_days_in_month (m, y);
Packit ae235b
      GDate days[31];
Packit ae235b
Packit ae235b
      g_date_clear (days, 31);
Packit ae235b
Packit ae235b
      g_assert (dim > 0 && dim < 32);
Packit ae235b
      g_assert (g_date_valid_month (m));
Packit ae235b
Packit ae235b
      day = 1;
Packit ae235b
      while (day <= dim)
Packit ae235b
        {
Packit ae235b
          g_assert (g_date_valid_dmy (day, m, y));
Packit ae235b
Packit ae235b
          d = &days[day - 1];
Packit ae235b
          //g_assert (!g_date_valid (d));
Packit ae235b
Packit ae235b
          g_date_set_dmy (d, day, m, y);
Packit ae235b
Packit ae235b
          g_assert (g_date_valid (d));
Packit ae235b
Packit ae235b
          if (m == G_DATE_JANUARY && day == 1)
Packit ae235b
            first_day_of_year = g_date_get_julian (d);
Packit ae235b
Packit ae235b
          g_assert (first_day_of_year != G_DATE_BAD_JULIAN);
Packit ae235b
Packit ae235b
          g_assert_cmpint (g_date_get_month (d), ==, m);
Packit ae235b
          g_assert_cmpint (g_date_get_year (d), ==, y);
Packit ae235b
          g_assert_cmpint (g_date_get_day (d), ==, day);
Packit ae235b
Packit ae235b
          g_assert (g_date_get_julian (d) + 1 - first_day_of_year ==
Packit ae235b
                    g_date_get_day_of_year (d));
Packit ae235b
Packit ae235b
          if (m == G_DATE_DECEMBER && day == 31)
Packit ae235b
            g_assert_cmpint (g_date_get_day_of_year (d), ==, days_in_year);
Packit ae235b
Packit ae235b
          g_assert_cmpint (g_date_get_day_of_year (d), <=, days_in_year);
Packit ae235b
          g_assert_cmpint (g_date_get_monday_week_of_year (d), <=, monday_weeks_in_year);
Packit ae235b
          g_assert_cmpint (g_date_get_monday_week_of_year (d), >=, monday_week_of_year);
Packit ae235b
Packit ae235b
          if (g_date_get_weekday(d) == G_DATE_MONDAY)
Packit ae235b
            {
Packit ae235b
              g_assert_cmpint (g_date_get_monday_week_of_year (d) - monday_week_of_year, ==, 1);
Packit ae235b
              if ((m == G_DATE_JANUARY && day <= 4) ||
Packit ae235b
                  (m == G_DATE_DECEMBER && day >= 29))
Packit ae235b
                 g_assert_cmpint (g_date_get_iso8601_week_of_year (d), ==, 1);
Packit ae235b
              else
Packit ae235b
                g_assert_cmpint (g_date_get_iso8601_week_of_year (d) - iso8601_week_of_year, ==, 1);
Packit ae235b
            }
Packit ae235b
          else
Packit ae235b
            {
Packit ae235b
              g_assert_cmpint (g_date_get_monday_week_of_year(d) - monday_week_of_year, ==, 0);
Packit ae235b
              if (!(day == 1 && m == G_DATE_JANUARY))
Packit ae235b
                g_assert_cmpint (g_date_get_iso8601_week_of_year(d) - iso8601_week_of_year, ==, 0);
Packit ae235b
            }
Packit ae235b
Packit ae235b
          monday_week_of_year = g_date_get_monday_week_of_year (d);
Packit ae235b
          iso8601_week_of_year = g_date_get_iso8601_week_of_year (d);
Packit ae235b
Packit ae235b
          g_assert_cmpint (g_date_get_sunday_week_of_year (d), <=, sunday_weeks_in_year);
Packit ae235b
          g_assert_cmpint (g_date_get_sunday_week_of_year (d), >=, sunday_week_of_year);
Packit ae235b
          if (g_date_get_weekday(d) == G_DATE_SUNDAY)
Packit ae235b
            g_assert_cmpint (g_date_get_sunday_week_of_year (d) - sunday_week_of_year, ==, 1);
Packit ae235b
          else
Packit ae235b
            g_assert_cmpint (g_date_get_sunday_week_of_year (d) - sunday_week_of_year, ==, 0);
Packit ae235b
Packit ae235b
          sunday_week_of_year = g_date_get_sunday_week_of_year (d);
Packit ae235b
Packit ae235b
          g_assert_cmpint (g_date_compare (d, d), ==, 0);
Packit ae235b
Packit ae235b
          i = 1;
Packit ae235b
          while (i < 402) /* Need to get 400 year increments in */
Packit ae235b
            {
Packit ae235b
              tmp = *d;
Packit ae235b
              g_date_add_days (d, i);
Packit ae235b
              g_assert_cmpint (g_date_compare (d, &tmp), >, 0);
Packit ae235b
              g_date_subtract_days (d, i);
Packit ae235b
              g_assert_cmpint (g_date_get_day (d), ==, day);
Packit ae235b
              g_assert_cmpint (g_date_get_month (d), ==, m);
Packit ae235b
              g_assert_cmpint (g_date_get_year (d), ==, y);
Packit ae235b
Packit ae235b
              tmp = *d;
Packit ae235b
              g_date_add_months (d, i);
Packit ae235b
              g_assert_cmpint (g_date_compare (d, &tmp), >, 0);
Packit ae235b
              g_date_subtract_months (d, i);
Packit ae235b
              g_assert_cmpint (g_date_get_month (d), ==, m);
Packit ae235b
              g_assert_cmpint (g_date_get_year (d), ==, y);
Packit ae235b
Packit ae235b
              if (day < 29)
Packit ae235b
                g_assert_cmpint (g_date_get_day (d), ==, day);
Packit ae235b
              else
Packit ae235b
                g_date_set_day (d, day);
Packit ae235b
Packit ae235b
              tmp = *d;
Packit ae235b
              g_date_add_years (d, i);
Packit ae235b
              g_assert_cmpint (g_date_compare (d, &tmp), >, 0);
Packit ae235b
              g_date_subtract_years (d, i);
Packit ae235b
              g_assert_cmpint (g_date_get_month (d), ==, m);
Packit ae235b
              g_assert_cmpint (g_date_get_year (d), ==, y);
Packit ae235b
Packit ae235b
              if (m != 2 && day != 29)
Packit ae235b
                g_assert_cmpint (g_date_get_day (d), ==, day);
Packit ae235b
              else
Packit ae235b
                g_date_set_day (d, day); /* reset */
Packit ae235b
Packit ae235b
              i += 10;
Packit ae235b
            }
Packit ae235b
Packit ae235b
          j = g_date_get_julian (d);
Packit ae235b
Packit ae235b
          ++day;
Packit ae235b
        }
Packit ae235b
      ++m;
Packit ae235b
   }
Packit ae235b
Packit ae235b
  /* at this point, d is the last day of year y */
Packit ae235b
  g_date_set_dmy (&tmp, 1, 1, y + 1);
Packit ae235b
  g_assert_cmpint (j + 1, ==, g_date_get_julian (&tmp));
Packit ae235b
Packit ae235b
  g_date_add_days (&tmp, 1);
Packit ae235b
  g_assert_cmpint (j + 2, ==, g_date_get_julian (&tmp));
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_clamp (void)
Packit ae235b
{
Packit ae235b
  GDate d1, d2, d, o;
Packit ae235b
Packit ae235b
  g_date_set_dmy (&d1, 1, 1, 1970);
Packit ae235b
  g_date_set_dmy (&d2, 1, 1, 1980);
Packit ae235b
  g_date_set_dmy (&d, 1, 1, 1);
Packit ae235b
Packit ae235b
  o = d;
Packit ae235b
  g_date_clamp (&o, NULL, NULL);
Packit ae235b
  g_assert (g_date_compare (&o, &d) == 0);
Packit ae235b
Packit ae235b
  g_date_clamp (&o,  &d1, &d2;;
Packit ae235b
  g_assert (g_date_compare (&o, &d1) == 0);
Packit ae235b
Packit ae235b
  g_date_set_dmy (&o, 1, 1, 2000);
Packit ae235b
Packit ae235b
  g_date_clamp (&o,  &d1, &d2;;
Packit ae235b
  g_assert (g_date_compare (&o, &d2) == 0);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_order (void)
Packit ae235b
{
Packit ae235b
  GDate d1, d2;
Packit ae235b
Packit ae235b
  g_date_set_dmy (&d1, 1, 1, 1970);
Packit ae235b
  g_date_set_dmy (&d2, 1, 1, 1980);
Packit ae235b
Packit ae235b
  g_assert (g_date_compare (&d1, &d2) == -1);
Packit ae235b
  g_date_order (&d2, &d1;;
Packit ae235b
  g_assert (g_date_compare (&d1, &d2) == 1);
Packit ae235b
}
Packit ae235b
Packit ae235b
static void
Packit ae235b
test_copy (void)
Packit ae235b
{
Packit ae235b
  GDate *d;
Packit ae235b
  GDate *c;
Packit ae235b
Packit ae235b
  d = g_date_new ();
Packit ae235b
  g_assert_false (g_date_valid (d));
Packit ae235b
Packit ae235b
  c = g_date_copy (d);
Packit ae235b
  g_assert_nonnull (c);
Packit ae235b
  g_assert_false (g_date_valid (c));
Packit ae235b
  g_date_free (c);
Packit ae235b
Packit ae235b
  g_date_set_day (d, 10);
Packit ae235b
Packit ae235b
  c = g_date_copy (d);
Packit ae235b
  g_date_set_month (c, 1);
Packit ae235b
  g_date_set_year (c, 2015);
Packit ae235b
  g_assert_true (g_date_valid (c));
Packit ae235b
  g_assert_cmpuint (g_date_get_day (c), ==, 10);
Packit ae235b
  g_date_free (c);
Packit ae235b
Packit ae235b
  g_date_free (d);
Packit ae235b
}
Packit ae235b
Packit ae235b
int
Packit ae235b
main (int argc, char** argv)
Packit ae235b
{
Packit ae235b
  gchar *path;
Packit ae235b
  gint i;
Packit ae235b
Packit ae235b
  /* Try to get all the leap year cases. */
Packit ae235b
  int check_years[] = {
Packit ae235b
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
Packit ae235b
    11, 12, 13, 14, 98, 99, 100, 101, 102, 103, 397,
Packit ae235b
    398, 399, 400, 401, 402, 403, 404, 405, 406,
Packit ae235b
    1598, 1599, 1600, 1601, 1602, 1650, 1651,
Packit ae235b
    1897, 1898, 1899, 1900, 1901, 1902, 1903,
Packit ae235b
    1961, 1962, 1963, 1964, 1965, 1967,
Packit ae235b
    1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976,
Packit ae235b
    1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985,
Packit ae235b
    1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
Packit ae235b
    1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
Packit ae235b
    2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012,
Packit ae235b
    3000, 3001, 3002, 3998, 3999, 4000, 4001, 4002, 4003
Packit ae235b
  };
Packit ae235b
Packit ae235b
  g_setenv ("LC_ALL", "en_US.utf-8", TRUE);
Packit ae235b
  setlocale (LC_ALL, "");
Packit ae235b
#ifdef G_OS_WIN32
Packit ae235b
  SetThreadLocale (MAKELCID (MAKELANGID (LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT));
Packit ae235b
#endif
Packit ae235b
Packit ae235b
  g_test_init (&argc, &argv, NULL);
Packit ae235b
  g_test_bug_base ("http://bugzilla.gnome.org/");
Packit ae235b
Packit ae235b
  g_test_add_func ("/date/basic", test_basic);
Packit ae235b
  g_test_add_func ("/date/empty", test_empty_constructor);
Packit ae235b
  g_test_add_func ("/date/dmy", test_dmy_constructor);
Packit ae235b
  g_test_add_func ("/date/julian", test_julian_constructor);
Packit ae235b
  g_test_add_func ("/date/dates", test_dates);
Packit ae235b
  g_test_add_func ("/date/parse", test_parse);
Packit ae235b
  g_test_add_func ("/date/month_names", test_month_names);
Packit ae235b
  g_test_add_func ("/date/clamp", test_clamp);
Packit ae235b
  g_test_add_func ("/date/order", test_order);
Packit ae235b
  for (i = 0; i < G_N_ELEMENTS (check_years); i++)
Packit ae235b
    {
Packit ae235b
      path = g_strdup_printf ("/date/year/%d", check_years[i]);
Packit ae235b
      g_test_add_data_func (path, GINT_TO_POINTER(check_years[i]), test_year);
Packit ae235b
      g_free (path);
Packit ae235b
    }
Packit ae235b
  g_test_add_func ("/date/copy", test_copy);
Packit ae235b
Packit ae235b
  return g_test_run ();
Packit ae235b
}
Packit ae235b
Packit ae235b