Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / src / lib / support / tests / TestSafeInt.cpp
1 /*
2  *
3  *    Copyright (c) 2020 Project CHIP Authors
4  *    All rights reserved.
5  *
6  *    Licensed under the Apache License, Version 2.0 (the "License");
7  *    you may not use this file except in compliance with the License.
8  *    You may obtain a copy of the License at
9  *
10  *        http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *    Unless required by applicable law or agreed to in writing, software
13  *    distributed under the License is distributed on an "AS IS" BASIS,
14  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *    See the License for the specific language governing permissions and
16  *    limitations under the License.
17  */
18
19 /**
20  *    @file
21  *      This file implements a unit test suite for CHIP SafeInt functions
22  *
23  */
24
25 #include <support/SafeInt.h>
26 #include <support/UnitTestRegistration.h>
27
28 #include <nlunit-test.h>
29
30 using namespace chip;
31
32 static void TestCanCastTo_Int8(nlTestSuite * inSuite, void * inContext)
33 {
34     NL_TEST_ASSERT(inSuite, CanCastTo<uint8_t>(0));
35     NL_TEST_ASSERT(inSuite, CanCastTo<uint8_t>(127));
36     NL_TEST_ASSERT(inSuite, CanCastTo<uint8_t>(128));
37     NL_TEST_ASSERT(inSuite, CanCastTo<uint8_t>(129));
38     NL_TEST_ASSERT(inSuite, CanCastTo<uint8_t>(255));
39     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(256));
40     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(32767));
41     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(32768));
42     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(32769));
43     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(65535));
44     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(65536));
45     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(2147483647ll));
46     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(2147483648ll));
47     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(2147483649ll));
48     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(4294967295ll));
49     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(4294967296ll));
50     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(9223372036854775807ull));
51     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(9223372036854775808ull));
52
53     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-1));
54     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-127));
55     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-128));
56     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-129));
57     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-255));
58     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-256));
59     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-32767));
60     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-32768));
61     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-32769));
62     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-65535));
63     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-65536));
64     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-2147483647ll));
65     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-2147483648ll));
66     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-2147483649ll));
67     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-4294967295ll));
68     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-4294967296ll));
69     NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-9223372036854775807ll));
70
71     NL_TEST_ASSERT(inSuite, CanCastTo<int8_t>(0));
72     NL_TEST_ASSERT(inSuite, CanCastTo<int8_t>(127));
73     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(128));
74     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(129));
75     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(255));
76     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(256));
77     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(32767));
78     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(32768));
79     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(32769));
80     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(65535));
81     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(65536));
82     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(2147483647ll));
83     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(2147483648ll));
84     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(2147483649ll));
85     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(4294967295ll));
86     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(4294967296ll));
87     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(9223372036854775807ull));
88     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(9223372036854775808ull));
89
90     NL_TEST_ASSERT(inSuite, CanCastTo<int8_t>(-1));
91     NL_TEST_ASSERT(inSuite, CanCastTo<int8_t>(-127));
92     NL_TEST_ASSERT(inSuite, CanCastTo<int8_t>(-128));
93     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-129));
94     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-255));
95     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-256));
96     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-32767));
97     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-32768));
98     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-32769));
99     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-65535));
100     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-65536));
101     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-2147483647ll));
102     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-2147483648ll));
103     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-2147483649ll));
104     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-4294967295ll));
105     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-4294967296ll));
106     NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-9223372036854775807ll));
107 }
108
109 static void TestCanCastTo_Int16(nlTestSuite * inSuite, void * inContext)
110 {
111     NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(0));
112     NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(127));
113     NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(128));
114     NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(129));
115     NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(255));
116     NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(256));
117     NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(32767));
118     NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(32768));
119     NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(32769));
120     NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(65535));
121     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(65536));
122     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(2147483647ll));
123     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(2147483648ll));
124     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(2147483649ll));
125     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(4294967295ll));
126     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(4294967296ll));
127     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(9223372036854775807ull));
128     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(9223372036854775808ull));
129
130     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-1));
131     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-127));
132     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-128));
133     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-129));
134     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-255));
135     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-256));
136     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-32767));
137     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-32768));
138     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-32769));
139     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-65535));
140     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-65536));
141     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-2147483647ll));
142     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-2147483648ll));
143     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-2147483649ll));
144     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-4294967295ll));
145     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-4294967296ll));
146     NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-9223372036854775807ll));
147
148     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(0));
149     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(127));
150     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(128));
151     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(129));
152     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(255));
153     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(256));
154     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(32767));
155     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(32768));
156     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(32769));
157     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(65535));
158     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(65536));
159     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(2147483647ll));
160     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(2147483648ll));
161     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(2147483649ll));
162     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(4294967295ll));
163     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(4294967296ll));
164     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(9223372036854775807ull));
165     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(9223372036854775808ull));
166
167     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-1));
168     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-127));
169     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-128));
170     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-129));
171     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-255));
172     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-256));
173     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-32767));
174     NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-32768));
175     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-32769));
176     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-65535));
177     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-65536));
178     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-2147483647ll));
179     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-2147483648ll));
180     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-2147483649ll));
181     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-4294967295ll));
182     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-4294967296ll));
183     NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-9223372036854775807ll));
184 }
185
186 static void TestCanCastTo_Int32(nlTestSuite * inSuite, void * inContext)
187 {
188     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(0));
189     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(127));
190     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(128));
191     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(129));
192     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(255));
193     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(256));
194     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(32767));
195     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(32768));
196     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(32769));
197     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(65535));
198     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(65536));
199     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(2147483647ll));
200     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(2147483648ll));
201     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(2147483649ll));
202     NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(4294967295ll));
203     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(4294967296ll));
204     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(9223372036854775807ull));
205     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(9223372036854775808ull));
206
207     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-1));
208     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-127));
209     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-128));
210     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-129));
211     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-255));
212     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-256));
213     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-32767));
214     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-32768));
215     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-32769));
216     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-65535));
217     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-65536));
218     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-2147483647ll));
219     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-2147483648ll));
220     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-2147483649ll));
221     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-4294967295ll));
222     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-4294967296ll));
223     NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-9223372036854775807ll));
224
225     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(0));
226     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(127));
227     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(128));
228     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(129));
229     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(255));
230     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(256));
231     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(32767));
232     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(32768));
233     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(32769));
234     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(65535));
235     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(65536));
236     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(2147483647ll));
237     NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(2147483648ll));
238     NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(2147483649ll));
239     NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(4294967295ll));
240     NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(4294967296ll));
241     NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(9223372036854775807ull));
242     NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(9223372036854775808ull));
243
244     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-1));
245     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-127));
246     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-128));
247     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-129));
248     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-255));
249     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-256));
250     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-32767));
251     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-32768));
252     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-32769));
253     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-65535));
254     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-65536));
255     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-2147483647ll));
256     NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-2147483648ll));
257     NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(-2147483649ll));
258     NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(-4294967295ll));
259     NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(-4294967296ll));
260     NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(-9223372036854775807ll));
261 }
262
263 static void TestCanCastTo_Int64(nlTestSuite * inSuite, void * inContext)
264 {
265     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(0));
266     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(127));
267     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(128));
268     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(129));
269     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(255));
270     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(256));
271     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(32767));
272     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(32768));
273     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(32769));
274     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(65535));
275     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(65536));
276     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(2147483647ll));
277     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(2147483648ll));
278     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(2147483649ll));
279     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(4294967295ll));
280     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(4294967296ll));
281     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(9223372036854775807ull));
282     NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(9223372036854775808ull));
283
284     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-1));
285     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-127));
286     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-128));
287     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-129));
288     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-255));
289     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-256));
290     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-32767));
291     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-32768));
292     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-32769));
293     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-65535));
294     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-65536));
295     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-2147483647ll));
296     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-2147483648ll));
297     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-2147483649ll));
298     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-4294967295ll));
299     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-4294967296ll));
300     NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-9223372036854775807ll));
301
302     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(0));
303     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(127));
304     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(128));
305     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(129));
306     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(255));
307     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(256));
308     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(32767));
309     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(32768));
310     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(32769));
311     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(65535));
312     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(65536));
313     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(2147483647ll));
314     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(2147483648ll));
315     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(2147483649ll));
316     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(4294967295ll));
317     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(4294967296ll));
318     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(9223372036854775807ull));
319     NL_TEST_ASSERT(inSuite, !CanCastTo<int64_t>(9223372036854775808ull));
320
321     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-1));
322     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-127));
323     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-128));
324     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-129));
325     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-255));
326     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-256));
327     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-32767));
328     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-32768));
329     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-32769));
330     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-65535));
331     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-65536));
332     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-2147483647ll));
333     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-2147483648ll));
334     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-2147483649ll));
335     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-4294967295ll));
336     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-4294967296ll));
337     NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-9223372036854775807ll));
338 }
339
340 static void TestCastToSigned(nlTestSuite * inSuite, void * inContext)
341 {
342     NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint8_t>(5)) == 5);
343     NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint8_t>(-5)) == -5);
344     NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint8_t>(254)) == -2);
345     NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint8_t>(65533)) == -3);
346     NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint16_t>(254)) == 254);
347     NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint16_t>(65533)) == -3);
348 }
349
350 #define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn)
351 /**
352  *   Test Suite. It lists all the test functions.
353  */
354 static const nlTest sTests[] = { NL_TEST_DEF_FN(TestCanCastTo_Int8),  NL_TEST_DEF_FN(TestCanCastTo_Int16),
355                                  NL_TEST_DEF_FN(TestCanCastTo_Int32), NL_TEST_DEF_FN(TestCanCastTo_Int64),
356                                  NL_TEST_DEF_FN(TestCastToSigned),    NL_TEST_SENTINEL() };
357
358 int TestSafeInt(void)
359 {
360     nlTestSuite theSuite = { "CHIP SafeInt tests", &sTests[0], nullptr, nullptr };
361
362     // Run test suit againt one context.
363     nlTestRunner(&theSuite, nullptr);
364     return nlTestRunnerStats(&theSuite);
365 }
366
367 CHIP_REGISTER_TEST_SUITE(TestSafeInt)