blob: 6e47f3cc04133d6848f7aa0efad27feb93830b6c [file] [log] [blame]
Laurence Lundblade52aefa62024-06-13 13:23:17 -07001/* ==========================================================================
2 * Copyright (c) 2016-2018, The Linux Foundation.
3 * Copyright (c) 2018-2024, Laurence Lundblade.
4 * Copyright (c) 2021, Arm Limited.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials provided
15 * with the distribution.
16 * * Neither the name of The Linux Foundation nor the names of its
17 * contributors, nor the name "Laurence Lundblade" may be used to
18 * endorse or promote products derived from this software without
19 * specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
30 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
31 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 * ========================================================================= */
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053033
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080034#include "UsefulBuf.h"
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080035
36
Laurence Lundblade8ece3732021-09-21 21:47:23 -070037/* This calls the main methods to add stuff to a UsefulOutBuf.
Paul Liétarc6cfa332022-07-26 19:24:01 +010038 * The result in the UsefulOutBuf is "heffalump unbounce bluster hunny bear"
Laurence Lundblade8ece3732021-09-21 21:47:23 -070039 */
40const char *AddStuffToUOB(UsefulOutBuf *pUOB)
41{
42 const char *szReturn = NULL;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080043
Laurence Lundblade8ece3732021-09-21 21:47:23 -070044 if(!UsefulOutBuf_AtStart(pUOB)) {
45 szReturn = "Not at start";
46 goto Done;
47 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080048
Laurence Lundblade8ece3732021-09-21 21:47:23 -070049 /* Put 7 bytes at beginning of buf */
50 UsefulOutBuf_AppendData(pUOB, "bluster", 7);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080051
Laurence Lundblade8ece3732021-09-21 21:47:23 -070052 if(UsefulOutBuf_AtStart(pUOB)) {
53 szReturn = "At start";
54 goto Done;
55 }
56
57 /* add a space to end */
58 UsefulOutBuf_AppendByte(pUOB, ' ');
59
Laurence Lundblade5a6fec52022-12-25 11:28:43 -070060 /* Add an empty string */
61 UsefulOutBuf_AppendUsefulBuf(pUOB, NULLUsefulBufC);
62
63 /* Add a zero length string (valid pointer, 0 length) */
64 UsefulOutBuf_AppendData(pUOB, "xxx", 0);
65
Paul Liétarc6cfa332022-07-26 19:24:01 +010066 /* Add 6 bytes to the end */
67 UsefulBufC UBC = {"hunny ", 6};
Laurence Lundblade8ece3732021-09-21 21:47:23 -070068 UsefulOutBuf_AppendUsefulBuf(pUOB, UBC);
69
70 /* Insert 9 bytes at the beginning, slide the previous stuff right */
71 UsefulOutBuf_InsertData(pUOB, "heffalump", 9, 0);
72 UsefulOutBuf_InsertByte(pUOB, ' ', 9);
73
74 /* Put 9 bytes in at position 10 -- just after "heffalump " */
75 UsefulBufC UBC2 = {"unbounce ", 9};
76 UsefulOutBuf_InsertUsefulBuf(pUOB, UBC2, 10);
77
Paul Liétarc6cfa332022-07-26 19:24:01 +010078 /* Add 4 bytes to the end, by accessing the buffer directly and then advancing it */
79 UsefulBuf UB = UsefulOutBuf_GetOutPlace(pUOB);
80 if (!UsefulBuf_IsNULL(UB)) {
81 memcpy(UB.ptr, "bear", UB.len < 4 ? UB.len : 4);
82 }
83 UsefulOutBuf_Advance(pUOB, 4);
84
Laurence Lundblade8ece3732021-09-21 21:47:23 -070085Done:
86 return szReturn;
87}
88
89
90/* Basic exercise of a UsefulOutBuf
91 *
92 * Call all the main public functions.
93 *
94 * Binary compare the result to the expected.
95 *
96 * There is nothing adversarial in this test
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080097 */
Laurence Lundbladeb9702452021-03-08 21:02:57 -080098const char * UOBTest_NonAdversarial(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080099{
100 const char *szReturn = NULL;
101
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700102 UsefulBuf_MAKE_STACK_UB(outbuf, 50);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800103
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800104 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800105
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530106 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800107
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700108 szReturn = AddStuffToUOB(&UOB);
109 if(szReturn) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800110 goto Done;
111 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800112
Paul Liétarc6cfa332022-07-26 19:24:01 +0100113 const UsefulBufC Expected = UsefulBuf_FROM_SZ_LITERAL("heffalump unbounce bluster hunny bear");
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800114
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530115 UsefulBufC U = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700116 if(UsefulBuf_IsNULLC(U) ||
117 UsefulBuf_Compare(Expected, U) ||
118 UsefulOutBuf_GetError(&UOB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800119 szReturn = "OutUBuf";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700120 goto Done;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800121 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800122
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530123 UsefulBuf_MAKE_STACK_UB(buf, 50);
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700124 UsefulBufC Out = UsefulOutBuf_CopyOut(&UOB, buf);
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800125 if(UsefulBuf_IsNULLC(Out) || UsefulBuf_Compare(Expected, Out)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800126 szReturn = "CopyOut";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700127 goto Done;
128 }
129
130 /* Now test the size calculation mode */
131 UsefulOutBuf_Init(&UOB, SizeCalculateUsefulBuf);
132
133 szReturn = AddStuffToUOB(&UOB);
134 if(szReturn) {
135 goto Done;
136 }
137
138 U = UsefulOutBuf_OutUBuf(&UOB);
139 if(U.len != Expected.len || U.ptr != NULL) {
140 szReturn = "size calculation failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800141 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800142
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800143Done:
144 return szReturn;
145}
146
147
148/*
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700149 * Append test utility.
150 * pUOB is the buffer to append too
151 * num is the amount to append
152 * expected is the expected return code, 0 or 1
153 *
154 * returns 0 if test passed
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800155 */
156static int AppendTest(UsefulOutBuf *pUOB, size_t num, int expected)
157{
158 //reset
159 UsefulOutBuf_Reset(pUOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800160
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800161 // check status first
162 if(UsefulOutBuf_GetError(pUOB))
163 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800164
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800165 // append the bytes
166 UsefulOutBuf_AppendData(pUOB, (const uint8_t *)"bluster", num);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800167
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800168 // check error status after
169 if(UsefulOutBuf_GetError(pUOB) != expected)
170 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800171
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800172 return 0;
173}
174
175
176/*
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700177 * Same as append, but takes a position param too
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800178 */
179static int InsertTest(UsefulOutBuf *pUOB, size_t num, size_t pos, int expected)
180{
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530181 // reset
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800182 UsefulOutBuf_Reset(pUOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800183
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800184 // check
185 if(UsefulOutBuf_GetError(pUOB))
186 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800187
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800188 UsefulOutBuf_InsertData(pUOB, (const uint8_t *)"bluster", num, pos);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800189
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800190 if(UsefulOutBuf_GetError(pUOB) != expected)
191 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800192
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800193 return 0;
194}
195
196
197/*
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700198 * Boundary conditions to test
199 * - around 0
200 * - around the buffer size
201 * - around MAX size_t
202 *
203 *
204 * Test these for the buffer size and the cursor, the insert amount, the
205 * append amount and the insert position
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800206 */
207
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800208const char *UOBTest_BoundaryConditionsTest(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800209{
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700210 UsefulBuf_MAKE_STACK_UB(outbuf, 2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800211
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800212 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800213
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530214 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800215
216 // append 0 byte to a 2 byte buffer --> success
217 if(AppendTest(&UOB, 0, 0))
218 return "Append 0 bytes failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800219
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800220 // append 1 byte to a 2 byte buffer --> success
221 if(AppendTest(&UOB, 1, 0))
222 return "Append of 1 byte failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800223
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800224 // append 2 byte to a 2 byte buffer --> success
225 if(AppendTest(&UOB, 2, 0))
226 return "Append to fill buffer failed";
227
228 // append 3 bytes to a 2 byte buffer --> failure
229 if(AppendTest(&UOB, 3, 1))
230 return "Overflow of buffer not caught";
231
232 // append max size_t to a 2 byte buffer --> failure
233 if(AppendTest(&UOB, SIZE_MAX, 1))
234 return "Append of SIZE_MAX error not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800235
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800236 if(InsertTest(&UOB, 1, 0, 0))
237 return "Insert 1 byte at start failed";
238
239 if(InsertTest(&UOB, 2, 0, 0))
240 return "Insert 2 bytes at start failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800241
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800242 if(InsertTest(&UOB, 3, 0, 1))
243 return "Insert overflow not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800244
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800245 if(InsertTest(&UOB, 1, 1, 1))
246 return "Bad insertion point not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800247
248
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530249 UsefulBuf_MAKE_STACK_UB(outBuf2,10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800250
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530251 UsefulOutBuf_Init(&UOB, outBuf2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800252
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800253 UsefulOutBuf_Reset(&UOB);
254 // put data in the buffer
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800255 UsefulOutBuf_AppendString(&UOB, "abc123");
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800256
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800257 UsefulOutBuf_InsertString(&UOB, "xyz*&^", 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800258
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800259 if(!UsefulOutBuf_GetError(&UOB)) {
260 return "insert with data should have failed";
261 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800262
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800263
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530264 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800265 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -6);
266 if(UsefulOutBuf_GetError(&UOB)) {
267 return "insert in huge should have succeeded";
268 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800269
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530270 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800271 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -5);
272 if(UsefulOutBuf_GetError(&UOB)) {
273 return "insert in huge should have succeeded";
274 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800275
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530276 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800277 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX - 4);
278 if(!UsefulOutBuf_GetError(&UOB)) {
279 return "lengths near max size";
280 }
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700281 UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
282 if(!UsefulBuf_IsNULLC(O)) {
283 return "OutUBuf in error should have returned NULL";
284 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800285
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +0300286 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, 100});
287 if(!UsefulOutBuf_IsBufferNULL(&UOB)) {
288 return "NULL check failed";
289 }
290
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700291 UsefulOutBuf_Init(&UOB, outbuf);
292 UOB.magic = 99; // corrupt the UOB
293 O = UsefulOutBuf_OutUBuf(&UOB);
294 if(!UsefulBuf_IsNULLC(O)) {
295 return "OutUBuf on corrupted should have returned NULL";
296 }
297
298 MakeUsefulBufOnStack(Tmp, 20);
299 O = UsefulOutBuf_CopyOut(&UOB, Tmp);
300 if(!UsefulBuf_IsNULLC(O)) {
301 return "CopyOut on corrupted should have returned NULL";
302 }
303
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800304 return NULL;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800305}
306
307
308
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800309// Test function to get size and magic number check
310
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800311const char *TestBasicSanity(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800312{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530313 UsefulBuf_MAKE_STACK_UB(outbuf,10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800314
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800315 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800316
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800317 // First -- make sure that the room left function returns the right amount
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530318 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800319
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530320 if(UsefulOutBuf_RoomLeft(&UOB) != 10)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800321 return "room left failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800322
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800323 if(!UsefulOutBuf_WillItFit(&UOB, 9)) {
324 return "it did not fit";
325 }
326
327 if(UsefulOutBuf_WillItFit(&UOB, 11)) {
328 return "it should have not fit";
329 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800330
331
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800332 // Next -- make sure that the magic number checking is working right
333 UOB.magic = 8888; // make magic bogus
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800334
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800335 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800336
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700337 if(!UsefulOutBuf_GetError(&UOB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800338 return "magic corruption check failed";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700339 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800340
341
342
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800343 // Next make sure that the valid data length check is working right
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530344 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800345
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530346 UOB.data_len = UOB.UB.len+1; // make size bogus
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800347
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800348 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
349 if(!UsefulOutBuf_GetError(&UOB))
350 return "valid data check failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800351
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800352 return NULL;
353}
354
355
356
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800357const char *UBMacroConversionsTest(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800358{
359 char *szFoo = "foo";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800360
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530361 UsefulBufC Foo = UsefulBuf_FromSZ(szFoo);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800362 if(Foo.len != 3 || strncmp(Foo.ptr, szFoo, 3))
363 return "SZToUsefulBufC failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800364
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530365 UsefulBufC Too = UsefulBuf_FROM_SZ_LITERAL("Toooo");
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800366 if(Too.len != 5 || strncmp(Too.ptr, "Toooo", 5))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530367 return "UsefulBuf_FROM_SZ_LITERAL failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800368
369 uint8_t pB[] = {0x42, 0x6f, 0x6f};
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530370 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800371 if(Boo.len != 3 || strncmp(Boo.ptr, "Boo", 3))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530372 return "UsefulBuf_FROM_BYTE_ARRAY_LITERAL failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800373
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800374 char *String = "string"; // Intentionally not const
375 UsefulBuf B = (UsefulBuf){(void *)String, strlen(String)};
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530376 UsefulBufC BC = UsefulBuf_Const(B);
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800377 if(BC.len != strlen(String) || BC.ptr != String)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800378 return "UsefulBufConst failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800379
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800380 return NULL;
381}
382
383
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800384const char *UBUtilTests(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800385{
386 UsefulBuf UB = NULLUsefulBuf;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800387
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800388 if(!UsefulBuf_IsNULL(UB)){
389 return "IsNull failed";
390 }
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530391
392 if(!UsefulBuf_IsEmpty(UB)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800393 return "IsEmpty failed";
394 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800395
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530396 if(!UsefulBuf_IsNULLOrEmpty(UB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800397 return "IsNULLOrEmpty failed";
398 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800399
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800400 const UsefulBufC UBC = UsefulBuf_Const(UB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800401
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530402 if(!UsefulBuf_IsNULLC(UBC)){
403 return "IsNull const failed";
404 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800405
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530406 if(!UsefulBuf_IsEmptyC(UBC)){
407 return "IsEmptyC failed";
408 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800409
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530410 if(!UsefulBuf_IsNULLOrEmptyC(UBC)){
411 return "IsNULLOrEmptyC failed";
412 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800413
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800414 const UsefulBuf UB2 = UsefulBuf_Unconst(UBC);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530415 if(!UsefulBuf_IsEmpty(UB2)) {
416 return "Back to UB is Empty failed";
417 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800418
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800419 UB.ptr = "x"; // just some valid pointer
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800420
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800421 if(UsefulBuf_IsNULL(UB)){
422 return "IsNull failed";
423 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800424
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530425 if(!UsefulBuf_IsEmptyC(UBC)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800426 return "IsEmpty failed";
427 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800428
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800429 // test the Unconst.
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530430 if(UsefulBuf_Unconst(UBC).ptr != NULL) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800431 return "Unconst failed";
432 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800433
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800434 // Set 100 bytes of '+'; validated a few tests later
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530435 UsefulBuf_MAKE_STACK_UB(Temp, 100);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800436 const UsefulBufC TempC = UsefulBuf_Set(Temp, '+');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800437
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800438 // Try to copy into a buf that is too small and see failure
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530439 UsefulBuf_MAKE_STACK_UB(Temp2, 99);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530440 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp2, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800441 return "Copy should have failed";
442 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800443
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800444 if(UsefulBuf_IsNULLC(UsefulBuf_CopyPtr(Temp2, "xx", 2))) {
445 return "CopyPtr failed";
446 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800447
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530448 UsefulBufC xxyy = UsefulBuf_CopyOffset(Temp2, 2, UsefulBuf_FROM_SZ_LITERAL("yy"));
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800449 if(UsefulBuf_IsNULLC(xxyy)) {
450 return "CopyOffset Failed";
451 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800452
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530453 if(UsefulBuf_Compare(UsefulBuf_Head(xxyy, 3), UsefulBuf_FROM_SZ_LITERAL("xxy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800454 return "head failed";
455 }
456
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530457 if(UsefulBuf_Compare(UsefulBuf_Tail(xxyy, 1), UsefulBuf_FROM_SZ_LITERAL("xyy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800458 return "tail failed";
459 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800460
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800461 if(!UsefulBuf_IsNULLC(UsefulBuf_Head(xxyy, 5))) {
462 return "head should have failed";
463 }
464
465 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(xxyy, 5))) {
466 return "tail should have failed";
467 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800468
Laurence Lundblade7412f812019-01-01 18:49:36 -0800469 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(NULLUsefulBufC, 0))) {
470 return "tail of NULLUsefulBufC is not NULLUsefulBufC";
471 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800472
Laurence Lundblade7412f812019-01-01 18:49:36 -0800473 const UsefulBufC TailResult = UsefulBuf_Tail((UsefulBufC){NULL, 100}, 99);
474 if(TailResult.ptr != NULL || TailResult.len != 1) {
475 return "tail of NULL and length incorrect";
476 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800477
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530478 if(!UsefulBuf_IsNULLC(UsefulBuf_CopyOffset(Temp2, 100, UsefulBuf_FROM_SZ_LITERAL("yy")))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800479 return "Copy Offset should have failed";
480 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800481
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800482 // Try to copy into a NULL/empty buf and see failure
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800483 const UsefulBuf UBNull = NULLUsefulBuf;
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530484 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(UBNull, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800485 return "Copy to NULL should have failed";
486 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800487
488
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800489 // Try to set a NULL/empty buf; nothing should happen
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530490 UsefulBuf_Set(UBNull, '+'); // This will crash on failure
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800491
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800492 // Copy successfully to a buffer
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530493 UsefulBuf_MAKE_STACK_UB(Temp3, 101);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530494 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp3, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800495 return "Copy should not have failed";
496 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800497
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800498 static const uint8_t pExpected[] = {
499 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
500 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
501 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
502 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
503 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
504 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
505 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
506 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
507 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
508 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
509 };
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530510 UsefulBufC Expected = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpected);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800511 // This validates comparison for equality and the UsefulBuf_Set
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530512 if(UsefulBuf_Compare(Expected, TempC)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800513 return "Set / Copy / Compare failed";
514 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800515
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800516 // Compare two empties and expect success
517 if(UsefulBuf_Compare(NULLUsefulBufC, NULLUsefulBufC)){
518 return "Compare Empties failed";
519 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800520
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800521 // Compare with empty and expect the first to be larger
522 if(UsefulBuf_Compare(Expected, NULLUsefulBufC) <= 0){
523 return "Compare with empty failed";
524 }
525
526
527 static const uint8_t pExpectedBigger[] = {
528 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
529 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
530 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
531 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
532 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
533 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
534 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
535 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
536 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
537 '+', '+', '+', '+', '+', '+', '+', '+', '+', ',',
538 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800539 const UsefulBufC ExpectedBigger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedBigger);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800540
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530541 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800542 if(UsefulBuf_Compare(Expected, ExpectedBigger) >= 0){
543 return "Compare with bigger";
544 }
545
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800546
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800547 static const uint8_t pExpectedSmaller[] = {
548 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
549 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
550 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
551 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
552 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
553 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
554 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
555 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
556 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
557 '+', '+', '+', '+', '+', '+', '+', '+', '+', '*',
558 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800559 const UsefulBufC ExpectedSmaller = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedSmaller);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530560 // Expect +1 when the first arg is larger
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800561 if(UsefulBuf_Compare(Expected, ExpectedSmaller) <= 0){
562 return "Compare with smaller";
563 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800564
565
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800566 static const uint8_t pExpectedLonger[] = {
567 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
568 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
569 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
570 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
571 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
572 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
573 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
574 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
575 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
576 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+'
577 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800578 const UsefulBufC ExpectedLonger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedLonger);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800579
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530580 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800581 if(UsefulBuf_Compare(Expected, ExpectedLonger) >= 0){
582 return "Compare with longer";
583 }
584
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800585
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800586 static const uint8_t pExpectedShorter[] = {
587 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
588 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
589 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
590 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
591 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
592 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
593 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
594 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
595 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
596 '+', '+', '+', '+', '+', '+', '+', '+', '+',
597 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800598 const UsefulBufC ExpectedShorter = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedShorter);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800599 // Expect +1 with the first arg is larger
600 if(UsefulBuf_Compare(Expected, ExpectedShorter) <= 0){
601 return "Compare with shorter";
602 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800603
604
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530605 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp, NULLUsefulBufC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800606 return "Copy null/empty failed";
607 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800608
Laurence Lundbladed5e101e2019-03-06 17:23:18 -0800609 if(UsefulBuf_IsValue(ExpectedShorter, '+') != SIZE_MAX) {
610 return "IsValue failed to match all";
611 }
612
613 if(UsefulBuf_IsValue(ExpectedShorter, '-') != 0) {
614 return "IsValue should have failed right away";
615 }
616
617 if(UsefulBuf_IsValue(NULLUsefulBufC, 0x00) != 0) {
618 return "IsValue failed on NULLUsefulBufC";
619 }
620
621 if(UsefulBuf_IsValue((UsefulBufC){(uint8_t[]){0x00}, 1}, 0x00) != SIZE_MAX) {
622 return "IsValue failed finding 0 in one byte of 0";
623 }
624
625 if(UsefulBuf_IsValue((UsefulBufC){(uint8_t[]){0x00}, 1}, 0x01) != 0) {
626 return "IsValue failed not finding 1 in one byte of 0";
627 }
628
629 if(UsefulBuf_IsValue(ExpectedSmaller, '+') != ExpectedSmaller.len -1) {
630 return "IsValue failed to find final *";
631 }
632
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800633 // Look for +++++... in +++++... and find it at the beginning
634 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedShorter)){
635 return "Failed to find";
636 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800637
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800638 // look for ++* in ....++* and find it at the end
639 static const uint8_t pToFind[] = {'+', '+', '*'};
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800640 const UsefulBufC ToBeFound = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pToFind);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800641
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800642 if(97 != UsefulBuf_FindBytes(ExpectedSmaller, ToBeFound)){
643 return "Failed to find 2";
644 }
645
646 // look for ++* in ....++, and find it near the end
647 if(SIZE_MAX != UsefulBuf_FindBytes(ExpectedBigger, ToBeFound)){
648 return "Failed to not find";
649 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800650
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800651 // Look for the whole buffer in itself and succeed.
652 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedLonger)){
653 return "Failed to find 3";
654 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800655
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700656 if(SIZE_MAX != UsefulBuf_FindBytes(Expected, ExpectedLonger)) {
657 return "Failed to find 4";
658 }
659
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700660
661 const uint8_t pB[] = {0x01, 0x02, 0x03};
662 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
663 // Try to map a pointer before
664 if(UsefulBuf_PointerToOffset(Boo, pB-1) != SIZE_MAX) {
665 return "Didn't error on pointer before";
666 }
667
668 // Try to map a pointer after
669 if(UsefulBuf_PointerToOffset(Boo, pB+sizeof(pB)) != SIZE_MAX) {
670 return "Didn't error on pointer after";
671 }
672
673 // Try to map a pointer inside
674 if(UsefulBuf_PointerToOffset(Boo, pB+1) != 1) {
675 return "Incorrect pointer offset";
676 }
677
678 // Try to map a pointer at the start
679 if(UsefulBuf_PointerToOffset(Boo, pB) != 0) {
680 return "Incorrect pointer offset for start";
681 }
682
683 // Try to map a pointer at the end
684 if(UsefulBuf_PointerToOffset(Boo, pB + sizeof(pB)-1) != 2) {
685 return "Incorrect pointer offset for end";
686 }
687
688 // Try to map a pointer on a NULL UB
689 if(UsefulBuf_PointerToOffset(NULLUsefulBufC, pB ) != SIZE_MAX) {
690 return "Incorrect pointer offset for start";
691 }
692
Laurence Lundbladea29f45a2024-05-14 15:55:19 -0700693 if(UsefulBuf_OffsetToPointer(Boo, 0) != &pB[0]) {
694 return "Wrong OffsetToPointer";
695 }
696
697 if(UsefulBuf_OffsetToPointer(Boo, 3) != NULL) {
698 return "Didn't validate offset correctly";
699 }
700
701 if(UsefulBuf_OffsetToPointer(Boo, 2) != &pB[2]) {
702 return "Wrong OffsetToPointer 2";
703 }
704
705 if(UsefulBuf_OffsetToPointer(NULLUsefulBufC, 2) != NULL) {
706 return "Failed OffsetToPtr on NULLUsefulBufC";
707 }
708
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800709 return NULL;
710}
711
712
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800713const char * UIBTest_IntegerFormat(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800714{
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700715 UsefulOutBuf_MakeOnStack(UOB, 100);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800716
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800717 const uint32_t u32 = 0x0A0B0C0D; // from https://en.wikipedia.org/wiki/Endianness
718 const uint64_t u64 = 1984738472938472;
719 const uint16_t u16 = 40000;
720 const uint8_t u8 = 9;
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200721#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800722 const float f = (float)314.15;
723 const double d = 2.1e10;
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700724#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800725
726
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530727 UsefulOutBuf_AppendUint32(&UOB, u32); // Also tests UsefulOutBuf_InsertUint64 and UsefulOutBuf_GetEndPosition
728 UsefulOutBuf_AppendUint64(&UOB, u64); // Also tests UsefulOutBuf_InsertUint32
729 UsefulOutBuf_AppendUint16(&UOB, u16); // Also tests UsefulOutBuf_InsertUint16
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800730 UsefulOutBuf_AppendByte(&UOB, u8);
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200731#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530732 UsefulOutBuf_AppendFloat(&UOB, f); // Also tests UsefulOutBuf_InsertFloat
733 UsefulOutBuf_AppendDouble(&UOB, d); // Also tests UsefulOutBuf_InsertDouble
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700734#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800735
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800736 const UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530737 if(UsefulBuf_IsNULLC(O))
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800738 return "Couldn't output integers";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800739
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800740 // from https://en.wikipedia.org/wiki/Endianness
741 const uint8_t pExpectedNetworkOrder[4] = {0x0A, 0x0B, 0x0C, 0x0D};
742 if(memcmp(O.ptr, pExpectedNetworkOrder, 4)) {
743 return "not in network order";
744 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800745
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800746 UsefulInputBuf UIB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800747
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530748 UsefulInputBuf_Init(&UIB, O);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800749
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530750 if(UsefulInputBuf_Tell(&UIB) != 0) {
751 return "UsefulInputBuf_Tell failed";
752 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800753
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800754 if(UsefulInputBuf_GetUint32(&UIB) != u32) {
755 return "u32 out then in failed";
756 }
757 if(UsefulInputBuf_GetUint64(&UIB) != u64) {
758 return "u64 out then in failed";
759 }
760 if(UsefulInputBuf_GetUint16(&UIB) != u16) {
761 return "u16 out then in failed";
762 }
763 if(UsefulInputBuf_GetByte(&UIB) != u8) {
764 return "u8 out then in failed";
765 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200766#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800767 if(UsefulInputBuf_GetFloat(&UIB) != f) {
768 return "float out then in failed";
769 }
770 if(UsefulInputBuf_GetDouble(&UIB) != d) {
771 return "double out then in failed";
772 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200773#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800774
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700775 if(UsefulInputBuf_GetUint16(&UIB) != 0) {
776 return "Didn't catch off end with GetUint16";
777 }
778 if(UsefulInputBuf_GetUint32(&UIB) !=0 ) {
779 return "Didn't catch off end with GetUint32";
780 }
781 if(UsefulInputBuf_GetUint64(&UIB) !=0 ) {
782 return "Didn't catch off end with GetUint64";
783 }
784
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800785 // Reset and go again for a few more tests
786 UsefulInputBuf_Init(&UIB, O);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800787
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800788 const UsefulBufC Four = UsefulInputBuf_GetUsefulBuf(&UIB, 4);
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800789 if(UsefulBuf_IsNULLC(Four)) {
790 return "Four is NULL";
791 }
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530792 if(UsefulBuf_Compare(Four, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedNetworkOrder))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800793 return "Four compare failed";
794 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800795
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200796#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800797 if(UsefulInputBuf_BytesUnconsumed(&UIB) != 23){
798 return "Wrong number of unconsumed bytes";
799 }
800
801 if(!UsefulInputBuf_BytesAvailable(&UIB, 23)){
802 return "Wrong number of bytes available I";
803 }
804
805 if(UsefulInputBuf_BytesAvailable(&UIB, 24)){
806 return "Wrong number of bytes available II";
807 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200808#else /* USEFULBUF_DISABLE_ALL_FLOAT */
809 if(UsefulInputBuf_BytesUnconsumed(&UIB) != 11){
810 return "Wrong number of unconsumed bytes";
811 }
812 if(!UsefulInputBuf_BytesAvailable(&UIB, 11)){
813 return "Wrong number of bytes available I";
814 }
815
816 if(UsefulInputBuf_BytesAvailable(&UIB, 12)){
817 return "Wrong number of bytes available II";
818 }
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700819#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800820
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800821 UsefulInputBuf_Seek(&UIB, 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800822
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800823 if(UsefulInputBuf_GetError(&UIB)) {
824 return "unexpected error after seek";
825 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800826
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800827 const uint8_t *pGetBytes = (const uint8_t *)UsefulInputBuf_GetBytes(&UIB, 4);
828 if(pGetBytes == NULL) {
829 return "GetBytes returns NULL";
830 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800831
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800832 if(memcmp(pGetBytes, pExpectedNetworkOrder, 4)) {
833 return "Got wrong bytes";
834 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800835
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800836 UsefulInputBuf_Seek(&UIB, 28);
837
838 if(!UsefulInputBuf_GetError(&UIB)) {
839 return "expected error after seek";
840 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800841
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700842 if(UsefulInputBuf_PointerToOffset(&UIB, O.ptr) != 0) {
843 return "PointerToOffset not working";
844 }
845
Laurence Lundbladea29f45a2024-05-14 15:55:19 -0700846
847 const uint8_t pB[] = {0x01, 0x02, 0x03};
848 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
849
850 UsefulInputBuf_Init(&UIB, Boo);
851
852 if(UsefulInputBuf_OffsetToPointer(&UIB, 0) != &pB[0]) {
853 return "OffsetToPointer fail";
854 }
855
856 if(UsefulInputBuf_OffsetToPointer(&UIB, SIZE_MAX) != NULL) {
857 return "OffsetToPointer SIZE_MAX fail";
858 }
859
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700860 UsefulInputBuf_Init(&UIB, Boo);
861 UIB.magic = 88;
862 size_t uUnc = UsefulInputBuf_BytesUnconsumed(&UIB);
863 if(uUnc != 0) {
864 return "Didn't detect corrupted UsefulInputBuf";
865 }
866
867 UsefulInputBuf_Init(&UIB, Boo);
868 UIB.cursor = 500;
869 uUnc = UsefulInputBuf_BytesUnconsumed(&UIB);
870 if(uUnc != 0) {
871 return "Didn't detect bad UsefulInputBuf cursor";
872 }
873
874 if(!UsefulBuf_IsNULLC(UsefulInputBuf_GetUsefulBuf(&UIB, 5000))) {
875 return "Didn't detect off-end request of UsefulInputBuf";
876 }
877
878 if(!UsefulInputBuf_GetError(&UIB)) {
879 return "UIB Error state not reported";
880 }
881
882 UsefulInputBuf_Init(&UIB, Boo);
883 if(UsefulInputBuf_GetBufferLength(&UIB) != Boo.len) {
884 return "UIB length wrong";
885 }
886 UsefulInputBuf_SetBufferLength(&UIB, 1);
887 if(UsefulInputBuf_GetBufferLength(&UIB) != 1) {
888 return "UIB SetBufferLength failed";
889 }
890
Laurence Lundblade1f2ad9f2024-07-01 20:36:20 -0700891 UsefulBufC CompCheck = UsefulBuf_FROM_SZ_LITERAL("abcd");
892 UsefulInputBuf_Init(&UIB, CompCheck);
893
Laurence Lundblade1f2ad9f2024-07-01 20:36:20 -0700894 if(UsefulInputBuf_Compare(&UIB, 0, 2, 2, 2) >= 0) {
895 return "UB 1 compared greater than UB2";
896 }
897 if(UsefulInputBuf_Compare(&UIB, 0, 2, 0, 2) != 0) {
898 return "UB1 and UB2 didn't compare equally";
899 }
900 if(UsefulInputBuf_Compare(&UIB, 2, 2, 0, 2) <= 0) {
901 return "UB2 compared less than UB1";
902 }
903 if(UsefulInputBuf_Compare(&UIB, 4, 1, 2, 2) <= 0) {
904 return "Off-the-end UB1 compared as less than UB2";
905 }
906 if(UsefulInputBuf_Compare(&UIB, 0, 5, 2, 2) <= 0) {
907 return "Off-the-end UB1 compared as less than UB2 (second)";
908 }
909 if(UsefulInputBuf_Compare(&UIB, 0, 2, 5, 1) >= 0) {
910 return "Off-the-end UB2 compared as less than UB2";
911 }
912 if(UsefulInputBuf_Compare(&UIB, 0, 2, 2, 3) >= 0) {
913 return "Off-the-end UB2 compared as less than UB2 (second)";
914 }
915
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530916 return NULL;
917}
918
919
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200920#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800921const char *UBUTest_CopyUtil(void)
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530922{
923 if(UsefulBufUtil_CopyFloatToUint32(65536.0F) != 0x47800000) {
924 return "CopyFloatToUint32 failed";
925 }
926
927 if(UsefulBufUtil_CopyDoubleToUint64(4e-40F) != 0X37C16C2800000000ULL) {
928 return "CopyDoubleToUint64 failed";
929 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800930
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530931 if(UsefulBufUtil_CopyUint64ToDouble(0X37C16C2800000000ULL) != 4e-40F) {
932 return "CopyUint64ToDouble failed";
933 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800934
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530935 if(UsefulBufUtil_CopyUint32ToFloat(0x47800000) != 65536.0F) {
936 return "CopyUint32ToFloat failed";
937 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800938
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800939 return NULL;
940}
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700941#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800942
943
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600944const char *UBAdvanceTest(void)
945{
946 #define ADVANCE_TEST_SIZE 10
947 UsefulOutBuf_MakeOnStack(UOB, ADVANCE_TEST_SIZE);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800948
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600949 UsefulBuf Place = UsefulOutBuf_GetOutPlace(&UOB);
950 if(Place.len != 10) {
951 return "GetOutPlace wrong size";
952 }
953
954 memset(Place.ptr, 'x', Place.len/2);
955
956 UsefulOutBuf_Advance(&UOB, Place.len/2);
957
958 UsefulOutBuf_AppendByte(&UOB, 'y');
959
960 Place = UsefulOutBuf_GetOutPlace(&UOB);
961 if(Place.len != ADVANCE_TEST_SIZE/2 -1 ) {
962 return "GetOutPlace wrong size 2";
963 }
964
965 memset(Place.ptr, 'z', Place.len);
966
967 UsefulOutBuf_Advance(&UOB, Place.len);
968
969 UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
970
971 UsefulBuf_Compare(O, UsefulBuf_FROM_SZ_LITERAL("xxxxxyzzzz"));
972
973 Place = UsefulOutBuf_GetOutPlace(&UOB);
974 if(Place.len != 0 || Place.ptr != NULL) {
975 return "GetOutPlace not null";
976 }
977
978 if(UsefulOutBuf_GetError(&UOB)) {
979 return "GetOutPlace error set";
980 }
981
982 UsefulOutBuf_Advance(&UOB, 1);
983 if(!UsefulOutBuf_GetError(&UOB)) {
984 return "Advance off end didn't set error";
985 }
986
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700987 // Try to advance in error state
988 UsefulOutBuf_Reset(&UOB);
989 UsefulOutBuf_Advance(&UOB, 1);
990 Place = UsefulOutBuf_GetOutPlace(&UOB);
991 UsefulOutBuf_Advance(&UOB, 1000);
992 UsefulOutBuf_Advance(&UOB, 1);
993 UsefulBuf Place2;
994 Place2 = UsefulOutBuf_GetOutPlace(&UOB);
995 if(memcmp(&Place, &Place2, sizeof(Place))) {
996 return "Advance didn't noop in error state";
997 }
998
999 UsefulOutBuf_Reset(&UOB);
1000 UOB.data_len = UOB.UB.len + 1; // React in and corrupt
1001 UsefulOutBuf_Advance(&UOB, 1);
1002 if(!UsefulOutBuf_GetError(&UOB)) {
1003 return "didn't detect corrupted UOB";
1004 }
1005
1006 UsefulOutBuf BadUOB;
1007 memset(&BadUOB, 'x', sizeof(BadUOB));
1008 BadUOB.err = 0;
1009 UsefulOutBuf_Advance(&BadUOB, 1);
1010 if(!UsefulOutBuf_GetError(&BadUOB)) {
1011 return "didn't detect bad UOB";
1012 }
1013
1014
Laurence Lundbladeb24faef2022-04-26 11:03:08 -06001015 return NULL;
1016}
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001017
1018
1019const char * UOBExtraTests(void)
1020{
1021 #define COMPARE_TEST_SIZE 10
1022 UsefulOutBuf_MakeOnStack( UOB, COMPARE_TEST_SIZE);
1023 int nCompare;
1024 UsefulBufC Out;
1025
1026 /* Test UsefulOutBuf_Compare() */
1027 UsefulOutBuf_AppendString(&UOB, "abcabdefab");
1028
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001029 nCompare = UsefulOutBuf_Compare(&UOB, 0, 2, 8, 2);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001030 if(nCompare != 0) {
1031 return "ab should compare equal";
1032 }
1033
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001034 nCompare = UsefulOutBuf_Compare(&UOB, 0, 3, 3, 3);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001035 if(nCompare != 'd' - 'c') {
1036 return "abc should not equal abd";
1037 }
1038
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001039 nCompare = UsefulOutBuf_Compare(&UOB, 3, 2, 8, 2);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001040 if(nCompare != 0) {
1041 return "ab should compare equal";
1042 }
1043
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001044 nCompare = UsefulOutBuf_Compare(&UOB, 2, 4, 5, 4);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001045 if(nCompare != 'd' - 'c') {
1046 return "ca should not equal de";
1047 }
1048
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001049 nCompare = UsefulOutBuf_Compare(&UOB, 5, 1, 2, 1);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001050 if(nCompare != 'c' - 'd') {
1051 return "de should not equal ca";
1052 }
1053
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001054 nCompare = UsefulOutBuf_Compare(&UOB, 7, 2, 8, 2);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001055 if(nCompare != 'a' - 'f') {
1056 return "fa should not equal ab";
1057 }
1058
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001059 nCompare = UsefulOutBuf_Compare(&UOB, 0, 10, 0, 10);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001060 if(nCompare != 0) {
1061 return "comparison to self failed";
1062 }
1063
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001064 nCompare = UsefulOutBuf_Compare(&UOB, 9, 1, 9, 1);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001065 if(nCompare != 0) {
1066 return "b should compare equal to b";
1067 }
1068
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001069 nCompare = UsefulOutBuf_Compare(&UOB, 10, 1, 10, 1);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001070 if(nCompare != 0) {
1071 return "Comparison off the end is equal";
1072 }
1073
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001074 nCompare = UsefulOutBuf_Compare(&UOB, 0, 1, 100, 1);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001075 if(nCompare != 0) {
1076 return "Comparison off the end is equal";
1077 }
1078
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001079 nCompare = UsefulOutBuf_Compare(&UOB, 100, 1, 0, 1);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001080 if(nCompare != 0) {
1081 return "Comparison off the end is equal";
1082 }
1083
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001084 nCompare = UsefulOutBuf_Compare(&UOB, 0, 3, 3, 2);
1085 if(nCompare > 0) {
1086 return "Comparison of unequal lengths incorrect";
1087 }
1088
1089 nCompare = UsefulOutBuf_Compare(&UOB, 8, 2, 0, 3);
1090 if(nCompare < 0) {
1091 return "Comparison of unequal lengths incorrect 2";
1092 }
1093
1094 nCompare = UsefulOutBuf_Compare(&UOB, 0, 2, 2, 3);
1095 if(nCompare != 'c' - 'a') {
1096 return "Inequal lengths, but inequal strings";
1097 }
1098
1099 nCompare = UsefulOutBuf_Compare(&UOB, 1, 3, 4, 2);
1100 if(nCompare != 'd' - 'c') {
1101 return "Inequal lengths, but inequal strings";
1102 }
1103
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001104 /* Test UsefulOutBuf_Swap() */
1105
1106 UsefulOutBuf_Reset(&UOB);
1107 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1108 UsefulOutBuf_Swap(&UOB, 0, 4, 8);
1109 Out = UsefulOutBuf_OutUBuf(&UOB);
1110 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("efghabcd"))) {
1111 return "swap fail 1";
1112 }
1113
1114 UsefulOutBuf_Reset(&UOB);
1115 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1116 UsefulOutBuf_Swap(&UOB, 0, 1, 2);
1117 Out = UsefulOutBuf_OutUBuf(&UOB);
1118 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("bacdefgh"))) {
1119 return "swap fail 2";
1120 }
1121
1122 UsefulOutBuf_Reset(&UOB);
1123 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1124 UsefulOutBuf_Swap(&UOB, 0, 1, 8);
1125 Out = UsefulOutBuf_OutUBuf(&UOB);
1126 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("bcdefgha"))) {
1127 return "swap fail 3";
1128 }
1129
1130 UsefulOutBuf_Reset(&UOB);
1131 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1132 UsefulOutBuf_Swap(&UOB, 0, 3, 4);
1133 Out = UsefulOutBuf_OutUBuf(&UOB);
1134 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("dabcefgh"))) {
1135 return "swap fail 4";
1136 }
1137
1138 UsefulOutBuf_Reset(&UOB);
1139 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1140 UsefulOutBuf_Swap(&UOB, 9, 10, 11);
1141 Out = UsefulOutBuf_OutUBuf(&UOB);
1142 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1143 return "swap fail 5";
1144 }
1145
1146 UsefulOutBuf_Reset(&UOB);
1147 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1148 UsefulOutBuf_Swap(&UOB, 0, 4, 11);
1149 Out = UsefulOutBuf_OutUBuf(&UOB);
1150 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1151 return "swap fail 6";
1152 }
1153
1154 UsefulOutBuf_Reset(&UOB);
1155 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1156 UsefulOutBuf_Swap(&UOB, 9, 0, 0);
1157 Out = UsefulOutBuf_OutUBuf(&UOB);
1158 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1159 return "swap fail 7";
1160 }
1161
1162 UsefulOutBuf_Reset(&UOB);
1163 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1164 UsefulOutBuf_Swap(&UOB, 0, 0, 0);
1165 Out = UsefulOutBuf_OutUBuf(&UOB);
1166 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1167 return "swap fail 8";
1168 }
1169
1170 UsefulOutBuf_Reset(&UOB);
1171 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1172 UsefulOutBuf_Swap(&UOB, 8, 4, 0);
1173 Out = UsefulOutBuf_OutUBuf(&UOB);
1174 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1175 return "swap fail 9";
1176 }
1177
1178 UsefulOutBuf_Reset(&UOB);
1179 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1180 UsefulOutBuf_Swap(&UOB, 0, 8, 4);
1181 Out = UsefulOutBuf_OutUBuf(&UOB);
1182 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1183 return "swap fail 10";
1184 }
1185
1186
1187 /* Test for UsefulOutBuf_GetOutput() */
1188 UsefulOutBuf_Reset(&UOB);
1189 UsefulOutBuf_AppendString(&UOB, "abc");
1190 UsefulOutBuf_AppendString(&UOB, "xyz");
1191
1192 Out = UsefulOutBuf_OutUBufOffset(&UOB, 0);
1193 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcxyz"))) {
1194 return "GetOutput fail 1";
1195 }
1196
1197 Out = UsefulOutBuf_OutUBufOffset(&UOB, 5);
1198 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("z"))) {
1199 return "GetOutput fail 2";
1200 }
1201
1202 Out = UsefulOutBuf_OutUBufOffset(&UOB, 1);
1203 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("bcxyz"))) {
1204 return "GetOutput fail 3";
1205 }
1206
1207 Out = UsefulOutBuf_OutUBufOffset(&UOB, 6);
1208 if(!UsefulBuf_IsNULLC(Out)) {
1209 return "GetOutput fail 4";
1210 }
1211
1212 Out = UsefulOutBuf_OutUBufOffset(&UOB, 7);
1213 if(!UsefulBuf_IsNULLC(Out)) {
1214 return "GetOutput fail 5";
1215 }
1216
1217 return NULL;
1218}