Code

frontend: Improved parser error reporting.
[sysdb.git] / t / unit / core / time_test.c
1 /*
2  * SysDB - t/unit/core/time_test.c
3  * Copyright (C) 2014 Sebastian 'tokkee' Harl <sh@tokkee.org>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
28 #include "core/time.h"
29 #include "libsysdb_test.h"
31 #include <check.h>
33 START_TEST(test_strfinterval)
34 {
35         char buf[1024];
36         size_t check;
38         struct {
39                 sdb_time_t  interval;
40                 const char *expected;
41         } golden_data[] = {
42                 { 0,                    "0s" },
43                 { 4711,                 ".000004711s" },
44                 { 1000123400,           "1.0001234s" },
45                 { 47940228000000000L,   "1Y6M7D" },
46                 { SDB_INTERVAL_YEAR,    "1Y" },
47                 { SDB_INTERVAL_MONTH,   "1M" },
48                 { SDB_INTERVAL_DAY,     "1D" },
49                 { SDB_INTERVAL_HOUR,    "1h" },
50                 { SDB_INTERVAL_MINUTE,  "1m" },
51                 { SDB_INTERVAL_SECOND,  "1s" },
52                 { SDB_INTERVAL_YEAR
53                   + SDB_INTERVAL_MONTH
54                   + SDB_INTERVAL_DAY
55                   + SDB_INTERVAL_HOUR
56                   + SDB_INTERVAL_MINUTE
57                   + SDB_INTERVAL_SECOND
58                   + 1234,               "1Y1M1D1h1m1.000001234s" },
59         };
61         size_t i;
63         /* this should return the number of bytes which would have been written;
64          * most notably, it should not segfault ;-) */
65         check = sdb_strfinterval(NULL, 0, 4711); /* expected: .000004711s */
66         fail_unless(check == 11,
67                         "sdb_strfinterval(NULL, 0, 4711) = %zu; expected: 11", check);
69         for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
70                 check = sdb_strfinterval(buf, sizeof(buf), golden_data[i].interval);
71                 fail_unless(check > 0,
72                                 "sdb_strfinterval(<buf>, <size>, %"PRIsdbTIME") = %zu; "
73                                 "expected: >0", golden_data[i].interval, check);
74                 fail_unless(!strcmp(buf, golden_data[i].expected),
75                                 "sdb_strfinterval(<buf>, <size>, %"PRIsdbTIME") did not "
76                                 "format interval correctly; got: '%s'; expected: '%s'",
77                                 golden_data[i].interval, buf, golden_data[i].expected);
78                 fail_unless(check == strlen(golden_data[i].expected),
79                                 "sdb_strfinterval(<buf>, <size>, %"PRIsdbTIME") = %zu; "
80                                 "expected: %zu", golden_data[i].interval, check,
81                                 strlen(golden_data[i].expected));
82         }
83 }
84 END_TEST
86 START_TEST(test_strpunit)
87 {
88         struct {
89                 const char *s;
90                 sdb_time_t expected;
91         } golden_data[] = {
92                 { "Y",  SDB_INTERVAL_YEAR },
93                 { "M",  SDB_INTERVAL_MONTH },
94                 { "D",  SDB_INTERVAL_DAY },
95                 { "h",  SDB_INTERVAL_HOUR },
96                 { "m",  SDB_INTERVAL_MINUTE },
97                 { "s",  SDB_INTERVAL_SECOND },
98                 { "ms", 1000000L },
99                 { "us", 1000L },
100                 { "ns", 1L },
101                 /* invalid units */
102                 { "y",  0 },
103                 { "d",  0 },
104                 { "H",  0 },
105                 { "S",  0 },
106                 { "ps", 0 },
107         };
109         size_t i;
111         for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
112                 sdb_time_t check = sdb_strpunit(golden_data[i].s);
114                 fail_unless(check == golden_data[i].expected,
115                                 "sdb_strpunit(%s) = %"PRIsdbTIME"; expected: %"PRIsdbTIME,
116                                 golden_data[i].s, check, golden_data[i].expected);
117         }
119 END_TEST
121 Suite *
122 core_time_suite(void)
124         Suite *s = suite_create("core::time");
125         TCase *tc;
127         tc = tcase_create("core");
128         tcase_add_test(tc, test_strfinterval);
129         tcase_add_test(tc, test_strpunit);
130         suite_add_tcase(s, tc);
132         return s;
133 } /* core_time_suite */
135 /* vim: set tw=78 sw=4 ts=4 noexpandtab : */