This source file includes following definitions.
- main
 
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 #include <config.h>
  20 
  21 #include "posixtm.h"
  22 
  23 #include <stdio.h>
  24 #include <stdlib.h>
  25 #include <string.h>
  26 #include <stdint.h>
  27 #include <time.h>
  28 
  29 #include "intprops.h"
  30 #include "macros.h"
  31 
  32 struct posixtm_test
  33 {
  34   char const *in;
  35   unsigned int syntax_bits;
  36   bool valid;
  37   int_least64_t t_expected;
  38 };
  39 
  40 
  41 enum { LY = PDS_CENTURY | PDS_SECONDS };
  42 
  43 static struct posixtm_test const T[] =
  44   {
  45     
  46     { "12131415.16",     LY, 1,            0}, 
  47     { "12131415",        LY, 1,            0}, 
  48 
  49 #if !((defined __APPLE__ && defined __MACH__) || defined __sun)
  50     
  51 
  52 
  53     { "000001010000.00", LY, 1,
  54                       - INT64_C (62167219200)},
  55     { "000012312359.59", LY, 1,
  56                       - INT64_C (62135596801)},
  57 #endif
  58 
  59     { "000101010000.00", LY, 1,
  60                       - INT64_C (62135596800)},
  61     { "190112132045.51", LY, 1,
  62                        - INT64_C (2147483649)},
  63     { "190112132045.52", LY, 1,
  64                        - INT64_C (2147483648)},
  65     { "190112132045.53", LY, 1,  -2147483647}, 
  66     { "190112132046.52", LY, 1,  -2147483588}, 
  67     { "190112132145.52", LY, 1,  -2147480048}, 
  68     { "190112142045.52", LY, 1,  -2147397248}, 
  69     { "190201132045.52", LY, 1,  -2144805248}, 
  70     { "196912312359.59", LY, 1,           -1}, 
  71     { "197001010000.00", LY, 1,            0}, 
  72     { "197001010000.01", LY, 1,            1}, 
  73     { "197001010001.00", LY, 1,           60}, 
  74     { "197001010000.60", LY, 1,           60}, 
  75     { "197001010100.00", LY, 1,         3600}, 
  76     { "197001020000.00", LY, 1,        86400}, 
  77     { "197002010000.00", LY, 1,      2678400}, 
  78     { "197101010000.00", LY, 1,     31536000}, 
  79     { "197001000000.00", LY, 0,            0}, 
  80     { "197000010000.00", LY, 0,            0}, 
  81     { "197001010060.00", LY, 0,            0}, 
  82     { "197001012400.00", LY, 0,            0}, 
  83     { "197001320000.00", LY, 0,            0}, 
  84     { "197013010000.00", LY, 0,            0}, 
  85     { "203801190314.06", LY, 1,   2147483646}, 
  86     { "203801190314.07", LY, 1,   2147483647}, 
  87     { "203801190314.08", LY, 1,
  88                        INT64_C (  2147483648)},
  89     { "999912312359.59", LY, 1,
  90                        INT64_C (253402300799)},
  91     { "1112131415",      LY, 1,   1323785700}, 
  92     { "1112131415.16",   LY, 1,   1323785716}, 
  93     { "201112131415.16", LY, 1,   1323785716}, 
  94     { "191112131415.16", LY, 1,  -1831974284}, 
  95     { "203712131415.16", LY, 1,   2144326516}, 
  96     { "3712131415.16",   LY, 1,   2144326516}, 
  97     { "6812131415.16",   LY, 1,
  98                        INT64_C (  3122633716)},
  99     { "6912131415.16",   LY, 1,     -1590284}, 
 100     { "7012131415.16",   LY, 1,     29945716}, 
 101     { "1213141599",      PDS_TRAILING_YEAR,
 102                              1,    945094500}, 
 103     { "1213141500",      PDS_TRAILING_YEAR,
 104                              1,    976716900}, 
 105     { NULL,               0, 0,            0}
 106   };
 107 
 108 int
 109 main (void)
     
 110 {
 111   unsigned int i;
 112   int fail = 0;
 113   char curr_year_str[30];
 114   struct tm *tm;
 115   time_t t_now;
 116   int err;
 117   size_t n_bytes;
 118 
 119   
 120   err = setenv ("TZ", "UTC0", 1);
 121   ASSERT (err == 0);
 122 
 123   t_now = time (NULL);
 124   ASSERT (t_now != (time_t) -1);
 125   tm = localtime (&t_now);
 126   ASSERT (tm);
 127   n_bytes = strftime (curr_year_str, sizeof curr_year_str, "%Y", tm);
 128   ASSERT (0 < n_bytes);
 129 
 130   for (i = 0; T[i].in; i++)
 131     {
 132       time_t t_out;
 133       time_t t_exp;
 134       bool ok;
 135 
 136       
 137 
 138       if (T[i].t_expected < 0 && ! TYPE_SIGNED (time_t))
 139         {
 140           printf ("skipping %s: result is negative, "
 141                   "but your time_t is unsigned\n", T[i].in);
 142           continue;
 143         }
 144 
 145       if (! (TYPE_MINIMUM (time_t) <= T[i].t_expected
 146              && T[i].t_expected <= TYPE_MAXIMUM (time_t)))
 147         {
 148           printf ("skipping %s: result is out of range of your time_t\n",
 149                   T[i].in);
 150           continue;
 151         }
 152 
 153       t_exp = T[i].t_expected;
 154 
 155       
 156 
 157 
 158       if (8 <= strlen (T[i].in)
 159           && (T[i].in[8] == '.' || T[i].in[8] == '\0'))
 160         {
 161           char tmp_buf[20];
 162           stpcpy (stpcpy (tmp_buf, curr_year_str), T[i].in);
 163           ASSERT (posixtime (&t_exp, tmp_buf, T[i].syntax_bits));
 164         }
 165 
 166       ok = posixtime (&t_out, T[i].in, T[i].syntax_bits);
 167       if (ok != !!T[i].valid)
 168         {
 169           printf ("%s return value mismatch: got %d, expected %d\n",
 170                   T[i].in, !!ok, T[i].valid);
 171           fail = 1;
 172           continue;
 173         }
 174 
 175       if (!ok)
 176         continue;
 177 
 178       if (t_out != t_exp)
 179         {
 180           printf ("%s mismatch (-: actual; +:expected)\n-%12ld\n+%12ld\n",
 181                   T[i].in, (long) t_out, (long) t_exp);
 182           fail = 1;
 183         }
 184     }
 185 
 186   return fail;
 187 }
 188 
 189 
 190 
 191 
 192 
 193