Branch data Line data Source code
1 : : /*
2 : : * Copyright 2015 Canonical Limited
3 : : *
4 : : * SPDX-License-Identifier: LGPL-2.1-or-later
5 : : *
6 : : * This library is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU Lesser General Public
8 : : * License as published by the Free Software Foundation; either
9 : : * version 2.1 of the License, or (at your option) any later version.
10 : : *
11 : : * See the included COPYING file for more information.
12 : : *
13 : : * Author: Allison Ryan Lortie <desrt@desrt.ca>
14 : : */
15 : :
16 : : #include <glib.h>
17 : :
18 : : typedef struct
19 : : {
20 : : gboolean success;
21 : : guint64 c, a, b;
22 : : } Case;
23 : :
24 : : static void
25 : 2 : test_checked_guint_add (void)
26 : : {
27 : : static const Case cases[] = {
28 : : /* success c = a + b */
29 : : { TRUE, 0, 0, 0 },
30 : : { TRUE, G_MAXINT, G_MAXINT, 0 },
31 : : { TRUE, G_MAXINT, 0, G_MAXINT },
32 : : { TRUE, G_MAXUINT, G_MAXUINT, 0 },
33 : : { TRUE, G_MAXUINT, 0, G_MAXUINT },
34 : : { TRUE, G_MAXUINT - 1, G_MAXINT, G_MAXINT },
35 : : { FALSE, 0, G_MAXUINT, 1 },
36 : : { FALSE, 0, 1, G_MAXUINT },
37 : : { FALSE, 0, G_MAXUINT, G_MAXUINT }
38 : : };
39 : : guint i;
40 : :
41 [ + + ]: 20 : for (i = 0; i < G_N_ELEMENTS (cases); i++)
42 : : {
43 : : guint result;
44 : :
45 : 18 : g_assert_cmpuint (cases[i].success, ==, g_uint_checked_add (&result, cases[i].a, cases[i].b));
46 [ + + ]: 18 : if (cases[i].success)
47 : 12 : g_assert_cmpuint (cases[i].c, ==, result);
48 : : }
49 : 2 : }
50 : :
51 : : static void
52 : 2 : test_checked_guint_mul (void)
53 : : {
54 : : static const Case cases[] = {
55 : : /* success c = a * b */
56 : : { TRUE, 0, 0, 0 },
57 : : { TRUE, 0, G_MAXINT, 0 },
58 : : { TRUE, G_MAXINT, G_MAXINT, 1 },
59 : : { TRUE, 0, G_MAXUINT, 0 },
60 : : { TRUE, G_MAXUINT, G_MAXUINT, 1 },
61 : : { TRUE, 2 * (guint) G_MAXINT, 2, G_MAXINT },
62 : : { TRUE, 2 * (guint) G_MAXINT, G_MAXINT, 2 },
63 : : { FALSE, 0, 3, G_MAXINT },
64 : : { FALSE, 0, G_MAXINT, 3 }
65 : : };
66 : : guint i;
67 : :
68 [ + + ]: 20 : for (i = 0; i < G_N_ELEMENTS (cases); i++)
69 : : {
70 : : guint result;
71 : :
72 : 18 : g_assert_cmpuint (cases[i].success, ==, g_uint_checked_mul (&result, cases[i].a, cases[i].b));
73 [ + + ]: 18 : if (cases[i].success)
74 : 14 : g_assert_cmpuint (cases[i].c, ==, result);
75 : : }
76 : 2 : }
77 : :
78 : :
79 : : static void
80 : 2 : test_checked_guint64_add (void)
81 : : {
82 : : static const Case cases[] = {
83 : : /* success c = a + b */
84 : : { TRUE, 0, 0, 0 },
85 : : { TRUE, G_MAXINT64, G_MAXINT64, 0 },
86 : : { TRUE, G_MAXINT64, 0, G_MAXINT64 },
87 : : { TRUE, G_MAXUINT64, G_MAXUINT64, 0 },
88 : : { TRUE, G_MAXUINT64, 0, G_MAXUINT64 },
89 : : { TRUE, G_MAXUINT64 - 1, G_MAXINT64, G_MAXINT64 },
90 : : { FALSE, 0, G_MAXUINT64, 1 },
91 : : { FALSE, 0, 1, G_MAXUINT64 },
92 : : { FALSE, 0, G_MAXUINT64, G_MAXUINT64 }
93 : : };
94 : : guint i;
95 : :
96 [ + + ]: 20 : for (i = 0; i < G_N_ELEMENTS (cases); i++)
97 : : {
98 : : guint64 result;
99 : :
100 : 18 : g_assert_cmpuint (cases[i].success, ==, g_uint64_checked_add (&result, cases[i].a, cases[i].b));
101 [ + + ]: 18 : if (cases[i].success)
102 : 12 : g_assert_cmpuint (cases[i].c, ==, result);
103 : : }
104 : 2 : }
105 : :
106 : : static void
107 : 2 : test_checked_guint64_mul (void)
108 : : {
109 : : static const Case cases[] = {
110 : : /* success c = a * b */
111 : : { TRUE, 0, 0, 0 },
112 : : { TRUE, 0, G_MAXINT64, 0 },
113 : : { TRUE, G_MAXINT64, G_MAXINT64, 1 },
114 : : { TRUE, 0, G_MAXUINT64, 0 },
115 : : { TRUE, G_MAXUINT64, G_MAXUINT64, 1 },
116 : : { TRUE, 2 * (guint64) G_MAXINT64, 2, G_MAXINT64 },
117 : : { TRUE, 2 * (guint64) G_MAXINT64, G_MAXINT64, 2 },
118 : : { FALSE, 0, 3, G_MAXINT64 },
119 : : { FALSE, 0, G_MAXINT64, 3 }
120 : : };
121 : : guint i;
122 : :
123 [ + + ]: 20 : for (i = 0; i < G_N_ELEMENTS (cases); i++)
124 : : {
125 : : guint64 result;
126 : :
127 : 18 : g_assert_cmpuint (cases[i].success, ==, g_uint64_checked_mul (&result, cases[i].a, cases[i].b));
128 [ + + ]: 18 : if (cases[i].success)
129 : 14 : g_assert_cmpuint (cases[i].c, ==, result);
130 : : }
131 : 2 : }
132 : :
133 : :
134 : : static void
135 : 2 : test_checked_gsize_add (void)
136 : : {
137 : : static const Case cases[] = {
138 : : /* success c = a + b */
139 : : { TRUE, 0, 0, 0 },
140 : : { TRUE, G_MAXSSIZE, G_MAXSSIZE, 0 },
141 : : { TRUE, G_MAXSSIZE, 0, G_MAXSSIZE },
142 : : { TRUE, G_MAXSIZE, G_MAXSIZE, 0 },
143 : : { TRUE, G_MAXSIZE, 0, G_MAXSIZE },
144 : : { TRUE, G_MAXSIZE - 1, G_MAXSSIZE, G_MAXSSIZE },
145 : : { FALSE, 0, G_MAXSIZE, 1 },
146 : : { FALSE, 0, 1, G_MAXSIZE },
147 : : { FALSE, 0, G_MAXSIZE, G_MAXSIZE }
148 : : };
149 : : guint i;
150 : :
151 [ + + ]: 20 : for (i = 0; i < G_N_ELEMENTS (cases); i++)
152 : : {
153 : : gsize result;
154 : :
155 : 18 : g_assert_cmpuint (cases[i].success, ==, g_size_checked_add (&result, cases[i].a, cases[i].b));
156 [ + + ]: 18 : if (cases[i].success)
157 : 12 : g_assert_cmpuint (cases[i].c, ==, result);
158 : : }
159 : 2 : }
160 : :
161 : : static void
162 : 2 : test_checked_gsize_mul (void)
163 : : {
164 : : static const Case cases[] = {
165 : : /* success c = a * b */
166 : : { TRUE, 0, 0, 0 },
167 : : { TRUE, 0, G_MAXSSIZE, 0 },
168 : : { TRUE, G_MAXSSIZE, G_MAXSSIZE, 1 },
169 : : { TRUE, 0, G_MAXSIZE, 0 },
170 : : { TRUE, G_MAXSIZE, G_MAXSIZE, 1 },
171 : : { TRUE, 2 * (gsize) G_MAXSSIZE, 2, G_MAXSSIZE },
172 : : { TRUE, 2 * (gsize) G_MAXSSIZE, G_MAXSSIZE, 2 },
173 : : { FALSE, 0, 3, G_MAXSSIZE },
174 : : { FALSE, 0, G_MAXSSIZE, 3 }
175 : : };
176 : : guint i;
177 : :
178 [ + + ]: 20 : for (i = 0; i < G_N_ELEMENTS (cases); i++)
179 : : {
180 : : gsize result;
181 : :
182 : 18 : g_assert_cmpuint (cases[i].success, ==, g_size_checked_mul (&result, cases[i].a, cases[i].b));
183 [ + + ]: 18 : if (cases[i].success)
184 : 14 : g_assert_cmpuint (cases[i].c, ==, result);
185 : : }
186 : 2 : }
187 : :
188 : : int
189 : 2 : main (int argc, char **argv)
190 : : {
191 : 2 : g_test_init (&argc, &argv, NULL);
192 : :
193 : 2 : g_test_add_func ("/glib/checked-math/guint-add", test_checked_guint_add);
194 : 2 : g_test_add_func ("/glib/checked-math/guint-mul", test_checked_guint_mul);
195 : 2 : g_test_add_func ("/glib/checked-math/guint64-add", test_checked_guint64_add);
196 : 2 : g_test_add_func ("/glib/checked-math/guint64-mul", test_checked_guint64_mul);
197 : 2 : g_test_add_func ("/glib/checked-math/gsize-add", test_checked_gsize_add);
198 : 2 : g_test_add_func ("/glib/checked-math/gsize-mul", test_checked_gsize_mul);
199 : :
200 : 2 : return g_test_run ();
201 : : }
|