Thu, 04 Jan 2024 21:05:32 +0100
migrate remaining buffer tests - relates to #342
universe@789 | 1 | /* |
universe@789 | 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
universe@789 | 3 | * |
universe@789 | 4 | * Copyright 2023 Mike Becker, Olaf Wintermann All rights reserved. |
universe@789 | 5 | * |
universe@789 | 6 | * Redistribution and use in source and binary forms, with or without |
universe@789 | 7 | * modification, are permitted provided that the following conditions are met: |
universe@789 | 8 | * |
universe@789 | 9 | * 1. Redistributions of source code must retain the above copyright |
universe@789 | 10 | * notice, this list of conditions and the following disclaimer. |
universe@789 | 11 | * |
universe@789 | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
universe@789 | 13 | * notice, this list of conditions and the following disclaimer in the |
universe@789 | 14 | * documentation and/or other materials provided with the distribution. |
universe@789 | 15 | * |
universe@789 | 16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
universe@789 | 17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
universe@789 | 18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
universe@789 | 19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
universe@789 | 20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
universe@789 | 21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
universe@789 | 22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
universe@789 | 23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
universe@789 | 24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
universe@789 | 25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
universe@789 | 26 | * POSSIBILITY OF SUCH DAMAGE. |
universe@789 | 27 | */ |
universe@789 | 28 | |
universe@789 | 29 | #include "cx/test.h" |
universe@789 | 30 | #include "util_allocator.h" |
universe@789 | 31 | |
universe@789 | 32 | #include "cx/buffer.h" |
universe@789 | 33 | |
universe@789 | 34 | static CX_TEST_SUBROUTINE(expect_default_flush_config, CxBuffer *buf) { |
universe@789 | 35 | CX_TEST_ASSERT(buf->flush_blkmax == 0); |
universe@789 | 36 | CX_TEST_ASSERT(buf->flush_blksize == 4096); |
universe@789 | 37 | CX_TEST_ASSERT(buf->flush_threshold == SIZE_MAX); |
universe@789 | 38 | CX_TEST_ASSERT(buf->flush_func == NULL); |
universe@789 | 39 | CX_TEST_ASSERT(buf->flush_target == NULL); |
universe@789 | 40 | } |
universe@789 | 41 | |
universe@789 | 42 | CX_TEST(test_buffer_init_wrap_space) { |
universe@789 | 43 | CxTestingAllocator talloc; |
universe@789 | 44 | cx_testing_allocator_init(&talloc); |
universe@789 | 45 | CxAllocator *alloc = &talloc.base; |
universe@789 | 46 | CX_TEST_DO { |
universe@789 | 47 | CxBuffer buf; |
universe@789 | 48 | void *space = cxMalloc(alloc, 16); |
universe@789 | 49 | cxBufferInit(&buf, space, 16, alloc, CX_BUFFER_DEFAULT); |
universe@789 | 50 | CX_TEST_CALL_SUBROUTINE(expect_default_flush_config, &buf); |
universe@789 | 51 | CX_TEST_ASSERT(buf.space == space); |
universe@789 | 52 | CX_TEST_ASSERT((buf.flags & CX_BUFFER_AUTO_EXTEND) == 0); |
universe@789 | 53 | CX_TEST_ASSERT((buf.flags & CX_BUFFER_FREE_CONTENTS) == 0); |
universe@789 | 54 | CX_TEST_ASSERT(buf.pos == 0); |
universe@789 | 55 | CX_TEST_ASSERT(buf.size == 0); |
universe@789 | 56 | CX_TEST_ASSERT(buf.capacity == 16); |
universe@789 | 57 | CX_TEST_ASSERT(buf.allocator == alloc); |
universe@789 | 58 | cxBufferDestroy(&buf); |
universe@789 | 59 | CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
universe@789 | 60 | cxFree(alloc, space); |
universe@789 | 61 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
universe@789 | 62 | } |
universe@789 | 63 | cx_testing_allocator_destroy(&talloc); |
universe@789 | 64 | } |
universe@789 | 65 | |
universe@789 | 66 | CX_TEST(test_buffer_init_wrap_space_auto_extend) { |
universe@789 | 67 | CxTestingAllocator talloc; |
universe@789 | 68 | cx_testing_allocator_init(&talloc); |
universe@789 | 69 | CxAllocator *alloc = &talloc.base; |
universe@789 | 70 | CX_TEST_DO { |
universe@789 | 71 | CxBuffer buf; |
universe@789 | 72 | void *space = cxMalloc(alloc, 16); |
universe@789 | 73 | cxBufferInit(&buf, space, 16, alloc, CX_BUFFER_AUTO_EXTEND); |
universe@789 | 74 | CX_TEST_CALL_SUBROUTINE(expect_default_flush_config, &buf); |
universe@789 | 75 | CX_TEST_ASSERT(buf.space == space); |
universe@789 | 76 | CX_TEST_ASSERT((buf.flags & CX_BUFFER_AUTO_EXTEND) == CX_BUFFER_AUTO_EXTEND); |
universe@789 | 77 | CX_TEST_ASSERT((buf.flags & CX_BUFFER_FREE_CONTENTS) == 0); |
universe@789 | 78 | CX_TEST_ASSERT(buf.pos == 0); |
universe@789 | 79 | CX_TEST_ASSERT(buf.size == 0); |
universe@789 | 80 | CX_TEST_ASSERT(buf.capacity == 16); |
universe@789 | 81 | CX_TEST_ASSERT(buf.allocator == alloc); |
universe@789 | 82 | cxBufferDestroy(&buf); |
universe@789 | 83 | CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
universe@789 | 84 | cxFree(alloc, space); |
universe@789 | 85 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
universe@789 | 86 | } |
universe@789 | 87 | cx_testing_allocator_destroy(&talloc); |
universe@789 | 88 | } |
universe@789 | 89 | |
universe@789 | 90 | CX_TEST(test_buffer_init_wrap_space_auto_free) { |
universe@789 | 91 | CxTestingAllocator talloc; |
universe@789 | 92 | cx_testing_allocator_init(&talloc); |
universe@789 | 93 | CxAllocator *alloc = &talloc.base; |
universe@789 | 94 | CX_TEST_DO { |
universe@789 | 95 | CxBuffer buf; |
universe@789 | 96 | void *space = cxMalloc(alloc, 16); |
universe@789 | 97 | cxBufferInit(&buf, space, 16, alloc, CX_BUFFER_FREE_CONTENTS); |
universe@789 | 98 | CX_TEST_CALL_SUBROUTINE(expect_default_flush_config, &buf); |
universe@789 | 99 | CX_TEST_ASSERT(buf.space == space); |
universe@789 | 100 | CX_TEST_ASSERT((buf.flags & CX_BUFFER_AUTO_EXTEND) == 0); |
universe@789 | 101 | CX_TEST_ASSERT((buf.flags & CX_BUFFER_FREE_CONTENTS) == CX_BUFFER_FREE_CONTENTS); |
universe@789 | 102 | CX_TEST_ASSERT(buf.pos == 0); |
universe@789 | 103 | CX_TEST_ASSERT(buf.size == 0); |
universe@789 | 104 | CX_TEST_ASSERT(buf.capacity == 16); |
universe@789 | 105 | CX_TEST_ASSERT(buf.allocator == alloc); |
universe@789 | 106 | CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
universe@789 | 107 | cxBufferDestroy(&buf); |
universe@789 | 108 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
universe@789 | 109 | } |
universe@789 | 110 | cx_testing_allocator_destroy(&talloc); |
universe@789 | 111 | } |
universe@789 | 112 | |
universe@789 | 113 | CX_TEST(test_buffer_init_fresh_space) { |
universe@789 | 114 | CxTestingAllocator talloc; |
universe@789 | 115 | cx_testing_allocator_init(&talloc); |
universe@789 | 116 | CxAllocator *alloc = &talloc.base; |
universe@789 | 117 | CX_TEST_DO { |
universe@789 | 118 | CxBuffer buf; |
universe@789 | 119 | cxBufferInit(&buf, NULL, 8, alloc, CX_BUFFER_DEFAULT); |
universe@789 | 120 | CX_TEST_CALL_SUBROUTINE(expect_default_flush_config, &buf); |
universe@789 | 121 | CX_TEST_ASSERT(buf.space != NULL); |
universe@789 | 122 | CX_TEST_ASSERT((buf.flags & CX_BUFFER_AUTO_EXTEND) == 0); |
universe@789 | 123 | CX_TEST_ASSERT((buf.flags & CX_BUFFER_FREE_CONTENTS) == CX_BUFFER_FREE_CONTENTS); |
universe@789 | 124 | CX_TEST_ASSERT(buf.pos == 0); |
universe@789 | 125 | CX_TEST_ASSERT(buf.size == 0); |
universe@789 | 126 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@789 | 127 | CX_TEST_ASSERT(buf.allocator == alloc); |
universe@789 | 128 | CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); // space is still allocated |
universe@789 | 129 | cxBufferDestroy(&buf); |
universe@789 | 130 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
universe@789 | 131 | } |
universe@789 | 132 | cx_testing_allocator_destroy(&talloc); |
universe@789 | 133 | } |
universe@789 | 134 | |
universe@789 | 135 | CX_TEST(test_buffer_init_on_heap) { |
universe@789 | 136 | CxTestingAllocator talloc; |
universe@789 | 137 | cx_testing_allocator_init(&talloc); |
universe@789 | 138 | CxAllocator *alloc = &talloc.base; |
universe@789 | 139 | CX_TEST_DO { |
universe@789 | 140 | CxBuffer *buf; |
universe@789 | 141 | void *space = cxMalloc(alloc, 16); |
universe@789 | 142 | buf = cxBufferCreate(space, 16, alloc, CX_BUFFER_FREE_CONTENTS); |
universe@789 | 143 | CX_TEST_ASSERT(buf != NULL); |
universe@789 | 144 | CX_TEST_CALL_SUBROUTINE(expect_default_flush_config, buf); |
universe@789 | 145 | CX_TEST_ASSERT(buf->space == space); |
universe@789 | 146 | CX_TEST_ASSERT((buf->flags & CX_BUFFER_AUTO_EXTEND) == 0); |
universe@789 | 147 | CX_TEST_ASSERT((buf->flags & CX_BUFFER_FREE_CONTENTS) == CX_BUFFER_FREE_CONTENTS); |
universe@789 | 148 | CX_TEST_ASSERT(buf->pos == 0); |
universe@789 | 149 | CX_TEST_ASSERT(buf->size == 0); |
universe@789 | 150 | CX_TEST_ASSERT(buf->capacity == 16); |
universe@789 | 151 | CX_TEST_ASSERT(buf->allocator == alloc); |
universe@789 | 152 | cxBufferFree(buf); |
universe@789 | 153 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
universe@789 | 154 | } |
universe@789 | 155 | cx_testing_allocator_destroy(&talloc); |
universe@789 | 156 | } |
universe@789 | 157 | |
universe@789 | 158 | CX_TEST(test_buffer_minimum_capacity_sufficient) { |
universe@789 | 159 | CxTestingAllocator talloc; |
universe@789 | 160 | cx_testing_allocator_init(&talloc); |
universe@789 | 161 | CxAllocator *alloc = &talloc.base; |
universe@789 | 162 | CX_TEST_DO { |
universe@789 | 163 | void *space = cxMalloc(alloc, 8); |
universe@789 | 164 | CxBuffer buf; |
universe@789 | 165 | cxBufferInit(&buf, space, 8, alloc, CX_BUFFER_FREE_CONTENTS); |
universe@789 | 166 | memcpy(space, "Testing", 8); |
universe@789 | 167 | buf.size = 8; |
universe@789 | 168 | cxBufferMinimumCapacity(&buf, 6); |
universe@789 | 169 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@789 | 170 | CX_TEST_ASSERT(buf.size == 8); |
universe@789 | 171 | CX_TEST_ASSERT(memcmp(buf.space, "Testing", 8) == 0); |
universe@789 | 172 | cxBufferDestroy(&buf); |
universe@789 | 173 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
universe@789 | 174 | } |
universe@789 | 175 | cx_testing_allocator_destroy(&talloc); |
universe@789 | 176 | } |
universe@789 | 177 | |
universe@789 | 178 | CX_TEST(test_buffer_minimum_capacity_extend) { |
universe@789 | 179 | CxTestingAllocator talloc; |
universe@789 | 180 | cx_testing_allocator_init(&talloc); |
universe@789 | 181 | CxAllocator *alloc = &talloc.base; |
universe@789 | 182 | CX_TEST_DO { |
universe@789 | 183 | void *space = cxMalloc(alloc, 8); |
universe@789 | 184 | CxBuffer buf; |
universe@789 | 185 | cxBufferInit(&buf, space, 8, alloc, CX_BUFFER_FREE_CONTENTS); // NO auto extend! |
universe@789 | 186 | memcpy(space, "Testing", 8); |
universe@789 | 187 | buf.size = 8; |
universe@789 | 188 | cxBufferMinimumCapacity(&buf, 16); |
universe@789 | 189 | CX_TEST_ASSERT(buf.capacity == 16); |
universe@789 | 190 | CX_TEST_ASSERT(buf.size == 8); |
universe@789 | 191 | CX_TEST_ASSERT(memcmp(buf.space, "Testing", 8) == 0); |
universe@789 | 192 | cxBufferDestroy(&buf); |
universe@789 | 193 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
universe@789 | 194 | } |
universe@789 | 195 | cx_testing_allocator_destroy(&talloc); |
universe@789 | 196 | } |
universe@789 | 197 | |
universe@789 | 198 | CX_TEST(test_buffer_clear) { |
universe@789 | 199 | char space[16]; |
universe@789 | 200 | strcpy(space, "clear test"); |
universe@789 | 201 | CxBuffer buf; |
universe@789 | 202 | cxBufferInit(&buf, space, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 203 | CX_TEST_DO { |
universe@789 | 204 | CX_TEST_ASSERT(buf.size == 0); |
universe@789 | 205 | // only clear the used part of the buffer |
universe@789 | 206 | cxBufferClear(&buf); |
universe@789 | 207 | CX_TEST_ASSERT(0 == memcmp(space, "clear test", 10)); |
universe@789 | 208 | buf.size = 5; |
universe@789 | 209 | buf.pos = 3; |
universe@789 | 210 | cxBufferClear(&buf); |
universe@789 | 211 | CX_TEST_ASSERT(0 == memcmp(space, "\0\0\0\0\0 test", 10)); |
universe@789 | 212 | CX_TEST_ASSERT(buf.size == 0); |
universe@789 | 213 | CX_TEST_ASSERT(buf.pos == 0); |
universe@789 | 214 | } |
universe@789 | 215 | cxBufferDestroy(&buf); |
universe@789 | 216 | } |
universe@789 | 217 | |
universe@789 | 218 | CX_TEST(test_buffer_reset) { |
universe@789 | 219 | char space[16]; |
universe@789 | 220 | strcpy(space, "reset test"); |
universe@789 | 221 | CxBuffer buf; |
universe@789 | 222 | cxBufferInit(&buf, space, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 223 | CX_TEST_DO { |
universe@789 | 224 | buf.size = 5; |
universe@789 | 225 | buf.pos = 3; |
universe@789 | 226 | cxBufferReset(&buf); |
universe@789 | 227 | CX_TEST_ASSERT(0 == memcmp(space, "reset test", 10)); |
universe@789 | 228 | CX_TEST_ASSERT(buf.size == 0); |
universe@789 | 229 | CX_TEST_ASSERT(buf.pos == 0); |
universe@789 | 230 | } |
universe@789 | 231 | cxBufferDestroy(&buf); |
universe@789 | 232 | } |
universe@789 | 233 | |
universe@789 | 234 | CX_TEST(test_buffer_seek_set_zero) { |
universe@789 | 235 | CxBuffer buf; |
universe@789 | 236 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 237 | buf.size = 6; |
universe@789 | 238 | buf.pos = 3; |
universe@789 | 239 | CX_TEST_DO { |
universe@789 | 240 | int result = cxBufferSeek(&buf, 0, SEEK_SET); |
universe@789 | 241 | CX_TEST_ASSERT(result == 0); |
universe@789 | 242 | CX_TEST_ASSERT(buf.pos == 0); |
universe@789 | 243 | } |
universe@789 | 244 | cxBufferDestroy(&buf); |
universe@789 | 245 | } |
universe@789 | 246 | |
universe@789 | 247 | CX_TEST(test_buffer_seek_set_valid) { |
universe@789 | 248 | CxBuffer buf; |
universe@789 | 249 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 250 | buf.size = 6; |
universe@789 | 251 | buf.pos = 3; |
universe@789 | 252 | CX_TEST_DO { |
universe@789 | 253 | int result = cxBufferSeek(&buf, 5, SEEK_SET); |
universe@789 | 254 | CX_TEST_ASSERT(result == 0); |
universe@789 | 255 | CX_TEST_ASSERT(buf.pos == 5); |
universe@789 | 256 | } |
universe@789 | 257 | cxBufferDestroy(&buf); |
universe@789 | 258 | } |
universe@789 | 259 | |
universe@789 | 260 | CX_TEST(test_buffer_seek_set_invalid) { |
universe@789 | 261 | CxBuffer buf; |
universe@789 | 262 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 263 | buf.size = 6; |
universe@789 | 264 | buf.pos = 3; |
universe@789 | 265 | CX_TEST_DO { |
universe@789 | 266 | int result = cxBufferSeek(&buf, 6, SEEK_SET); |
universe@789 | 267 | CX_TEST_ASSERT(result != 0); |
universe@789 | 268 | CX_TEST_ASSERT(buf.pos == 3); |
universe@789 | 269 | } |
universe@789 | 270 | cxBufferDestroy(&buf); |
universe@789 | 271 | } |
universe@789 | 272 | |
universe@789 | 273 | CX_TEST(test_buffer_seek_cur_zero) { |
universe@789 | 274 | CxBuffer buf; |
universe@789 | 275 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 276 | buf.size = 6; |
universe@789 | 277 | buf.pos = 3; |
universe@789 | 278 | CX_TEST_DO { |
universe@789 | 279 | int result = cxBufferSeek(&buf, 0, SEEK_CUR); |
universe@789 | 280 | CX_TEST_ASSERT(result == 0); |
universe@789 | 281 | CX_TEST_ASSERT(buf.pos == 3); |
universe@789 | 282 | } |
universe@789 | 283 | cxBufferDestroy(&buf); |
universe@789 | 284 | } |
universe@789 | 285 | |
universe@789 | 286 | CX_TEST(test_buffer_seek_cur_valid_positive) { |
universe@789 | 287 | CxBuffer buf; |
universe@789 | 288 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 289 | buf.size = 6; |
universe@789 | 290 | buf.pos = 3; |
universe@789 | 291 | CX_TEST_DO { |
universe@789 | 292 | int result = cxBufferSeek(&buf, 2, SEEK_CUR); |
universe@789 | 293 | CX_TEST_ASSERT(result == 0); |
universe@789 | 294 | CX_TEST_ASSERT(buf.pos == 5); |
universe@789 | 295 | } |
universe@789 | 296 | cxBufferDestroy(&buf); |
universe@789 | 297 | } |
universe@789 | 298 | |
universe@789 | 299 | CX_TEST(test_buffer_seek_cur_valid_negative) { |
universe@789 | 300 | CxBuffer buf; |
universe@789 | 301 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 302 | buf.size = 6; |
universe@789 | 303 | buf.pos = 3; |
universe@789 | 304 | CX_TEST_DO { |
universe@789 | 305 | int result = cxBufferSeek(&buf, -3, SEEK_CUR); |
universe@789 | 306 | CX_TEST_ASSERT(result == 0); |
universe@789 | 307 | CX_TEST_ASSERT(buf.pos == 0); |
universe@789 | 308 | } |
universe@789 | 309 | cxBufferDestroy(&buf); |
universe@789 | 310 | } |
universe@789 | 311 | |
universe@789 | 312 | CX_TEST(test_buffer_seek_cur_invalid_positive) { |
universe@789 | 313 | CxBuffer buf; |
universe@789 | 314 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 315 | buf.size = 6; |
universe@789 | 316 | buf.pos = 3; |
universe@789 | 317 | CX_TEST_DO { |
universe@789 | 318 | int result = cxBufferSeek(&buf, 3, SEEK_CUR); |
universe@789 | 319 | CX_TEST_ASSERT(result != 0); |
universe@789 | 320 | CX_TEST_ASSERT(buf.pos == 3); |
universe@789 | 321 | } |
universe@789 | 322 | cxBufferDestroy(&buf); |
universe@789 | 323 | } |
universe@789 | 324 | |
universe@789 | 325 | CX_TEST(test_buffer_seek_cur_invalid_negative) { |
universe@789 | 326 | CxBuffer buf; |
universe@789 | 327 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 328 | buf.size = 6; |
universe@789 | 329 | buf.pos = 3; |
universe@789 | 330 | CX_TEST_DO { |
universe@789 | 331 | int result = cxBufferSeek(&buf, -4, SEEK_CUR); |
universe@789 | 332 | CX_TEST_ASSERT(result != 0); |
universe@789 | 333 | CX_TEST_ASSERT(buf.pos == 3); |
universe@789 | 334 | } |
universe@789 | 335 | cxBufferDestroy(&buf); |
universe@789 | 336 | } |
universe@789 | 337 | |
universe@789 | 338 | CX_TEST(test_buffer_seek_end_zero) { |
universe@789 | 339 | CxBuffer buf; |
universe@789 | 340 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 341 | buf.size = 6; |
universe@789 | 342 | buf.pos = 3; |
universe@789 | 343 | CX_TEST_DO { |
universe@789 | 344 | int result = cxBufferSeek(&buf, 0, SEEK_END); |
universe@789 | 345 | // the (past-the-)end position is always invalid |
universe@789 | 346 | CX_TEST_ASSERT(result != 0); |
universe@789 | 347 | CX_TEST_ASSERT(buf.pos == 3); |
universe@789 | 348 | } |
universe@789 | 349 | cxBufferDestroy(&buf); |
universe@789 | 350 | } |
universe@789 | 351 | |
universe@789 | 352 | CX_TEST(test_buffer_seek_end_valid) { |
universe@789 | 353 | CxBuffer buf; |
universe@789 | 354 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 355 | buf.size = 6; |
universe@789 | 356 | buf.pos = 3; |
universe@789 | 357 | CX_TEST_DO { |
universe@789 | 358 | int result = cxBufferSeek(&buf, -6, SEEK_END); |
universe@789 | 359 | CX_TEST_ASSERT(result == 0); |
universe@789 | 360 | CX_TEST_ASSERT(buf.pos == 0); |
universe@789 | 361 | } |
universe@789 | 362 | cxBufferDestroy(&buf); |
universe@789 | 363 | } |
universe@789 | 364 | |
universe@789 | 365 | CX_TEST(test_buffer_seek_end_invalid) { |
universe@789 | 366 | CxBuffer buf; |
universe@789 | 367 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 368 | buf.size = 6; |
universe@789 | 369 | buf.pos = 3; |
universe@789 | 370 | CX_TEST_DO { |
universe@789 | 371 | int result = cxBufferSeek(&buf, 1, SEEK_END); |
universe@789 | 372 | CX_TEST_ASSERT(result != 0); |
universe@789 | 373 | CX_TEST_ASSERT(buf.pos == 3); |
universe@789 | 374 | } |
universe@789 | 375 | cxBufferDestroy(&buf); |
universe@789 | 376 | } |
universe@789 | 377 | |
universe@789 | 378 | CX_TEST(test_buffer_seek_whence_invalid) { |
universe@789 | 379 | CxBuffer buf; |
universe@789 | 380 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@789 | 381 | buf.size = 6; |
universe@789 | 382 | buf.pos = 3; |
universe@789 | 383 | CX_TEST_DO { |
universe@789 | 384 | int result = cxBufferSeek(&buf, 2, 9000); |
universe@789 | 385 | CX_TEST_ASSERT(result != 0); |
universe@789 | 386 | CX_TEST_ASSERT(buf.size == 6); |
universe@789 | 387 | CX_TEST_ASSERT(buf.pos == 3); |
universe@789 | 388 | } |
universe@789 | 389 | cxBufferDestroy(&buf); |
universe@789 | 390 | } |
universe@789 | 391 | |
universe@792 | 392 | CX_TEST(test_buffer_eof_reached) { |
universe@792 | 393 | CxBuffer buf; |
universe@792 | 394 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@792 | 395 | buf.size = buf.pos = 3; |
universe@792 | 396 | CX_TEST_DO { |
universe@792 | 397 | CX_TEST_ASSERT(cxBufferEof(&buf)); |
universe@792 | 398 | buf.pos = buf.size - 1; |
universe@792 | 399 | CX_TEST_ASSERT(!cxBufferEof(&buf)); |
universe@792 | 400 | cxBufferPut(&buf, 'a'); |
universe@792 | 401 | CX_TEST_ASSERT(cxBufferEof(&buf)); |
universe@792 | 402 | } |
universe@792 | 403 | cxBufferDestroy(&buf); |
universe@792 | 404 | } |
universe@792 | 405 | |
universe@792 | 406 | CX_TEST(test_buffer_eof_not_reached) { |
universe@792 | 407 | CxBuffer buf; |
universe@792 | 408 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@792 | 409 | buf.size = 6; |
universe@792 | 410 | CX_TEST_DO { |
universe@792 | 411 | buf.pos = buf.size - 1; |
universe@792 | 412 | CX_TEST_ASSERT(!cxBufferEof(&buf)); |
universe@792 | 413 | buf.pos = 0; |
universe@792 | 414 | cxBufferWrite("test", 1, 5, &buf); |
universe@792 | 415 | CX_TEST_ASSERT(!cxBufferEof(&buf)); |
universe@792 | 416 | } |
universe@792 | 417 | cxBufferDestroy(&buf); |
universe@792 | 418 | } |
universe@792 | 419 | |
universe@792 | 420 | #define TEST_BUFFER_SHIFT_SETUP(buf) \ |
universe@792 | 421 | CxTestingAllocator talloc; \ |
universe@792 | 422 | cx_testing_allocator_init(&talloc); \ |
universe@792 | 423 | CxAllocator *alloc = &talloc.base; \ |
universe@792 | 424 | CxBuffer buf; \ |
universe@792 | 425 | cxBufferInit(&buf, NULL, 16, alloc, CX_BUFFER_DEFAULT); \ |
universe@792 | 426 | memcpy(buf.space, "test____XXXXXXXX", 16); \ |
universe@792 | 427 | buf.capacity = 8; \ |
universe@792 | 428 | buf.pos = 4; \ |
universe@792 | 429 | buf.size = 4 |
universe@792 | 430 | #define TEST_BUFFER_SHIFT_TEARDOWN(buf) \ |
universe@792 | 431 | cxBufferDestroy(&buf); \ |
universe@792 | 432 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); \ |
universe@793 | 433 | cx_testing_allocator_destroy(&talloc) |
universe@792 | 434 | |
universe@792 | 435 | |
universe@792 | 436 | CX_TEST(test_buffer_shift_left_zero) { |
universe@792 | 437 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 438 | CX_TEST_DO { |
universe@792 | 439 | int ret = cxBufferShiftLeft(&buf, 0); |
universe@792 | 440 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 441 | CX_TEST_ASSERT(buf.pos == 4); |
universe@792 | 442 | CX_TEST_ASSERT(buf.size == 4); |
universe@792 | 443 | CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); |
universe@792 | 444 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 445 | } |
universe@792 | 446 | } |
universe@792 | 447 | |
universe@792 | 448 | CX_TEST(test_buffer_shift_left_zero_offset_interface) { |
universe@792 | 449 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 450 | CX_TEST_DO { |
universe@792 | 451 | int ret = cxBufferShift(&buf, -0); |
universe@792 | 452 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 453 | CX_TEST_ASSERT(buf.pos == 4); |
universe@792 | 454 | CX_TEST_ASSERT(buf.size == 4); |
universe@792 | 455 | CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); |
universe@792 | 456 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 457 | } |
universe@792 | 458 | } |
universe@792 | 459 | |
universe@792 | 460 | CX_TEST(test_buffer_shift_left_standard) { |
universe@792 | 461 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 462 | CX_TEST_DO { |
universe@792 | 463 | int ret = cxBufferShiftLeft(&buf, 2); |
universe@792 | 464 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 465 | CX_TEST_ASSERT(buf.pos == 2); |
universe@792 | 466 | CX_TEST_ASSERT(buf.size == 2); |
universe@792 | 467 | CX_TEST_ASSERT(memcmp(buf.space, "stst____XXXXXXXX", 16) == 0); |
universe@792 | 468 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 469 | } |
universe@792 | 470 | } |
universe@792 | 471 | |
universe@792 | 472 | CX_TEST(test_buffer_shift_left_overshift) { |
universe@792 | 473 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 474 | CX_TEST_DO { |
universe@792 | 475 | int ret = cxBufferShiftLeft(&buf, 6); |
universe@792 | 476 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 477 | CX_TEST_ASSERT(buf.pos == 0); |
universe@792 | 478 | CX_TEST_ASSERT(buf.size == 0); |
universe@792 | 479 | CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); |
universe@792 | 480 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 481 | } |
universe@792 | 482 | } |
universe@792 | 483 | |
universe@792 | 484 | CX_TEST(test_buffer_shift_left_overshift_pos_only) { |
universe@792 | 485 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 486 | buf.pos = 2; |
universe@792 | 487 | CX_TEST_DO { |
universe@792 | 488 | int ret = cxBufferShiftLeft(&buf, 3); |
universe@792 | 489 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 490 | CX_TEST_ASSERT(buf.pos == 0); |
universe@792 | 491 | CX_TEST_ASSERT(buf.size == 1); |
universe@792 | 492 | CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); |
universe@792 | 493 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 494 | } |
universe@792 | 495 | } |
universe@792 | 496 | |
universe@792 | 497 | CX_TEST(test_buffer_shift_left_offset_interface) { |
universe@792 | 498 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 499 | buf.pos = 3; |
universe@792 | 500 | CX_TEST_DO { |
universe@792 | 501 | int ret = cxBufferShift(&buf, -2); |
universe@792 | 502 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 503 | CX_TEST_ASSERT(buf.pos == 1); |
universe@792 | 504 | CX_TEST_ASSERT(buf.size == 2); |
universe@792 | 505 | CX_TEST_ASSERT(memcmp(buf.space, "stst____XXXXXXXX", 16) == 0); |
universe@792 | 506 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 507 | } |
universe@792 | 508 | } |
universe@792 | 509 | |
universe@792 | 510 | CX_TEST(test_buffer_shift_right_zero) { |
universe@792 | 511 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 512 | CX_TEST_DO { |
universe@792 | 513 | int ret = cxBufferShiftRight(&buf, 0); |
universe@792 | 514 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 515 | CX_TEST_ASSERT(buf.pos == 4); |
universe@792 | 516 | CX_TEST_ASSERT(buf.size == 4); |
universe@792 | 517 | CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); |
universe@792 | 518 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 519 | } |
universe@792 | 520 | } |
universe@792 | 521 | |
universe@792 | 522 | CX_TEST(test_buffer_shift_right_zero_offset_interface) { |
universe@792 | 523 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 524 | CX_TEST_DO { |
universe@792 | 525 | int ret = cxBufferShift(&buf, +0); |
universe@792 | 526 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 527 | CX_TEST_ASSERT(buf.pos == 4); |
universe@792 | 528 | CX_TEST_ASSERT(buf.size == 4); |
universe@792 | 529 | CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); |
universe@792 | 530 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 531 | } |
universe@792 | 532 | } |
universe@792 | 533 | |
universe@792 | 534 | CX_TEST(test_buffer_shift_right_standard) { |
universe@792 | 535 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 536 | CX_TEST_DO { |
universe@792 | 537 | int ret = cxBufferShiftRight(&buf, 3); |
universe@792 | 538 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 539 | CX_TEST_ASSERT(buf.pos == 7); |
universe@792 | 540 | CX_TEST_ASSERT(buf.size == 7); |
universe@792 | 541 | CX_TEST_ASSERT(memcmp(buf.space, "testest_XXXXXXXX", 16) == 0); |
universe@792 | 542 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 543 | } |
universe@792 | 544 | } |
universe@792 | 545 | |
universe@792 | 546 | CX_TEST(test_buffer_shift_right_overshift_discard) { |
universe@792 | 547 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 548 | CX_TEST_DO { |
universe@792 | 549 | int ret = cxBufferShiftRight(&buf, 6); |
universe@792 | 550 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 551 | CX_TEST_ASSERT(buf.pos == 8); |
universe@792 | 552 | CX_TEST_ASSERT(buf.size == 8); |
universe@792 | 553 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@792 | 554 | CX_TEST_ASSERT(memcmp(buf.space, "test__teXXXXXXXX", 16) == 0); |
universe@792 | 555 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 556 | } |
universe@792 | 557 | } |
universe@792 | 558 | |
universe@792 | 559 | CX_TEST(test_buffer_shift_right_overshift_extend) { |
universe@792 | 560 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 561 | buf.flags |= CX_BUFFER_AUTO_EXTEND; |
universe@792 | 562 | CX_TEST_DO { |
universe@792 | 563 | int ret = cxBufferShiftRight(&buf, 6); |
universe@792 | 564 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 565 | CX_TEST_ASSERT(buf.pos == 10); |
universe@792 | 566 | CX_TEST_ASSERT(buf.size == 10); |
universe@792 | 567 | CX_TEST_ASSERT(buf.capacity >= 10); |
universe@792 | 568 | // cannot assert more than 10 bytes because |
universe@792 | 569 | // the buffer was required to reallocate the space |
universe@792 | 570 | CX_TEST_ASSERT(memcmp(buf.space, "test__test", 10) == 0); |
universe@792 | 571 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 572 | } |
universe@792 | 573 | } |
universe@792 | 574 | |
universe@792 | 575 | CX_TEST(test_buffer_shift_right_offset_interface) { |
universe@792 | 576 | TEST_BUFFER_SHIFT_SETUP(buf); |
universe@792 | 577 | buf.pos = 3; |
universe@792 | 578 | CX_TEST_DO { |
universe@792 | 579 | int ret = cxBufferShift(&buf, 2); |
universe@792 | 580 | CX_TEST_ASSERT(ret == 0); |
universe@792 | 581 | CX_TEST_ASSERT(buf.pos == 5); |
universe@792 | 582 | CX_TEST_ASSERT(buf.size == 6); |
universe@792 | 583 | CX_TEST_ASSERT(memcmp(buf.space, "tetest__XXXXXXXX", 16) == 0); |
universe@792 | 584 | TEST_BUFFER_SHIFT_TEARDOWN(buf); |
universe@792 | 585 | } |
universe@792 | 586 | } |
universe@792 | 587 | |
universe@793 | 588 | static size_t mock_write_limited_rate( |
universe@793 | 589 | void const *ptr, |
universe@793 | 590 | size_t size, |
universe@793 | 591 | __attribute__((unused)) size_t nitems, |
universe@793 | 592 | CxBuffer *buffer |
universe@793 | 593 | ) { |
universe@793 | 594 | // simulate limited target drain capacity |
universe@793 | 595 | static bool full = false; |
universe@793 | 596 | if (full) { |
universe@793 | 597 | full = false; |
universe@793 | 598 | return 0; |
universe@793 | 599 | } else { |
universe@793 | 600 | full = true; |
universe@793 | 601 | return cxBufferWrite(ptr, size, nitems > 2 ? 2 : nitems, buffer); |
universe@793 | 602 | } |
universe@793 | 603 | } |
universe@793 | 604 | |
universe@793 | 605 | CX_TEST(test_buffer_write_size_one_fit) { |
universe@793 | 606 | CxBuffer buf, target; |
universe@793 | 607 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 608 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 609 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 610 | buf.capacity = 8; |
universe@793 | 611 | buf.size = buf.pos = 4; |
universe@793 | 612 | const char *data = "test"; |
universe@793 | 613 | CX_TEST_DO { |
universe@793 | 614 | size_t written = cxBufferWrite(data, 1, 4, &buf); |
universe@793 | 615 | CX_TEST_ASSERT(written == 4); |
universe@793 | 616 | CX_TEST_ASSERT(buf.size == 8); |
universe@793 | 617 | CX_TEST_ASSERT(buf.pos == 8); |
universe@793 | 618 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 619 | CX_TEST_ASSERT(0 == memcmp(buf.space, "preptest", 8)); |
universe@793 | 620 | } |
universe@793 | 621 | |
universe@793 | 622 | cxBufferDestroy(&buf); |
universe@793 | 623 | cxBufferDestroy(&target); |
universe@793 | 624 | } |
universe@793 | 625 | |
universe@793 | 626 | CX_TEST(test_buffer_write_size_one_discard) { |
universe@793 | 627 | CxBuffer buf, target; |
universe@793 | 628 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 629 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 630 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 631 | buf.capacity = 8; |
universe@793 | 632 | buf.size = buf.pos = 4; |
universe@793 | 633 | const char *data = "testing"; |
universe@793 | 634 | CX_TEST_DO { |
universe@793 | 635 | size_t written = cxBufferWrite(data, 1, 7, &buf); |
universe@793 | 636 | CX_TEST_ASSERT(written == 4); |
universe@793 | 637 | CX_TEST_ASSERT(buf.size == 8); |
universe@793 | 638 | CX_TEST_ASSERT(buf.pos == 8); |
universe@793 | 639 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 640 | CX_TEST_ASSERT(0 == memcmp(buf.space, "preptest\0", 9)); |
universe@793 | 641 | } |
universe@793 | 642 | cxBufferDestroy(&buf); |
universe@793 | 643 | cxBufferDestroy(&target); |
universe@793 | 644 | } |
universe@793 | 645 | |
universe@793 | 646 | CX_TEST(test_buffer_write_size_one_extend) { |
universe@793 | 647 | CxBuffer buf, target; |
universe@793 | 648 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 649 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 650 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 651 | buf.capacity = 8; |
universe@793 | 652 | buf.size = buf.pos = 4; |
universe@793 | 653 | buf.flags |= CX_BUFFER_AUTO_EXTEND; |
universe@793 | 654 | const char *data = "testing"; |
universe@793 | 655 | CX_TEST_DO { |
universe@793 | 656 | size_t written = cxBufferWrite(data, 1, 7, &buf); |
universe@793 | 657 | CX_TEST_ASSERT(written == 7); |
universe@793 | 658 | CX_TEST_ASSERT(buf.size == 11); |
universe@793 | 659 | CX_TEST_ASSERT(buf.pos == 11); |
universe@793 | 660 | CX_TEST_ASSERT(buf.capacity >= 11); |
universe@793 | 661 | CX_TEST_ASSERT(0 == memcmp(buf.space, "preptesting", 11)); |
universe@793 | 662 | } |
universe@793 | 663 | cxBufferDestroy(&buf); |
universe@793 | 664 | cxBufferDestroy(&target); |
universe@793 | 665 | } |
universe@793 | 666 | |
universe@793 | 667 | CX_TEST(test_buffer_write_multibyte_fit) { |
universe@793 | 668 | CxBuffer buf, target; |
universe@793 | 669 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 670 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 671 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 672 | buf.capacity = 8; |
universe@793 | 673 | buf.size = buf.pos = 4; |
universe@793 | 674 | const char *data = "test"; |
universe@793 | 675 | CX_TEST_DO { |
universe@793 | 676 | size_t written = cxBufferWrite(data, 2, 2, &buf); |
universe@793 | 677 | CX_TEST_ASSERT(written == 2); |
universe@793 | 678 | CX_TEST_ASSERT(buf.size == 8); |
universe@793 | 679 | CX_TEST_ASSERT(buf.pos == 8); |
universe@793 | 680 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 681 | CX_TEST_ASSERT(0 == memcmp(buf.space, "preptest", 8)); |
universe@793 | 682 | } |
universe@793 | 683 | cxBufferDestroy(&buf); |
universe@793 | 684 | cxBufferDestroy(&target); |
universe@793 | 685 | } |
universe@793 | 686 | |
universe@793 | 687 | CX_TEST(test_buffer_write_multibyte_discard) { |
universe@793 | 688 | CxBuffer buf, target; |
universe@793 | 689 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 690 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 691 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 692 | buf.capacity = 8; |
universe@793 | 693 | buf.size = 4; |
universe@793 | 694 | buf.pos = 3; |
universe@793 | 695 | const char *data = "testing"; |
universe@793 | 696 | CX_TEST_DO { |
universe@793 | 697 | size_t written = cxBufferWrite(data, 2, 4, &buf); |
universe@793 | 698 | // remember: whole elements are discarded if they do not fit |
universe@793 | 699 | CX_TEST_ASSERT(written == 2); |
universe@793 | 700 | CX_TEST_ASSERT(buf.size == 7); |
universe@793 | 701 | CX_TEST_ASSERT(buf.pos == 7); |
universe@793 | 702 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 703 | CX_TEST_ASSERT(0 == memcmp(buf.space, "pretest\0", 8)); |
universe@793 | 704 | } |
universe@793 | 705 | cxBufferDestroy(&buf); |
universe@793 | 706 | cxBufferDestroy(&target); |
universe@793 | 707 | } |
universe@793 | 708 | |
universe@793 | 709 | CX_TEST(test_buffer_write_multibyte_extend) { |
universe@793 | 710 | CxBuffer buf, target; |
universe@793 | 711 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 712 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 713 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 714 | buf.capacity = 8; |
universe@793 | 715 | buf.size = 4; |
universe@793 | 716 | buf.pos = 3; |
universe@793 | 717 | buf.flags |= CX_BUFFER_AUTO_EXTEND; |
universe@793 | 718 | const char *data = "tester"; |
universe@793 | 719 | CX_TEST_DO { |
universe@793 | 720 | size_t written = cxBufferWrite(data, 2, 3, &buf); |
universe@793 | 721 | // remember: whole elements are discarded if they do not fit |
universe@793 | 722 | CX_TEST_ASSERT(written == 3); |
universe@793 | 723 | CX_TEST_ASSERT(buf.size == 9); |
universe@793 | 724 | CX_TEST_ASSERT(buf.pos == 9); |
universe@793 | 725 | CX_TEST_ASSERT(buf.capacity >= 9); |
universe@793 | 726 | CX_TEST_ASSERT(0 == memcmp(buf.space, "pretester", 9)); |
universe@793 | 727 | } |
universe@793 | 728 | cxBufferDestroy(&buf); |
universe@793 | 729 | cxBufferDestroy(&target); |
universe@793 | 730 | } |
universe@793 | 731 | |
universe@793 | 732 | CX_TEST(test_buffer_put_fit) { |
universe@793 | 733 | CxBuffer buf, target; |
universe@793 | 734 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 735 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 736 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 737 | buf.capacity = 8; |
universe@793 | 738 | buf.size = buf.pos = 4; |
universe@793 | 739 | CX_TEST_DO { |
universe@793 | 740 | int c = cxBufferPut(&buf, 0x200 | 'a'); |
universe@793 | 741 | CX_TEST_ASSERT(c == 'a'); |
universe@793 | 742 | CX_TEST_ASSERT(buf.size == 5); |
universe@793 | 743 | CX_TEST_ASSERT(buf.pos == 5); |
universe@793 | 744 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 745 | CX_TEST_ASSERT(0 == memcmp(buf.space, "prepa\0", 6)); |
universe@793 | 746 | } |
universe@793 | 747 | cxBufferDestroy(&buf); |
universe@793 | 748 | cxBufferDestroy(&target); |
universe@793 | 749 | } |
universe@793 | 750 | |
universe@793 | 751 | CX_TEST(test_buffer_put_discard) { |
universe@793 | 752 | CxBuffer buf, target; |
universe@793 | 753 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 754 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 755 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 756 | buf.capacity = 8; |
universe@793 | 757 | buf.size = 4; |
universe@793 | 758 | buf.pos = 8; |
universe@793 | 759 | CX_TEST_DO { |
universe@793 | 760 | int c = cxBufferPut(&buf, 0x200 | 'a'); |
universe@793 | 761 | CX_TEST_ASSERT(c == EOF); |
universe@793 | 762 | CX_TEST_ASSERT(buf.size == 4); |
universe@793 | 763 | CX_TEST_ASSERT(buf.pos == 8); |
universe@793 | 764 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 765 | CX_TEST_ASSERT(0 == memcmp(buf.space, "prep\0\0\0\0\0", 9)); |
universe@793 | 766 | } |
universe@793 | 767 | cxBufferDestroy(&buf); |
universe@793 | 768 | cxBufferDestroy(&target); |
universe@793 | 769 | } |
universe@793 | 770 | |
universe@793 | 771 | CX_TEST(test_buffer_put_extend) { |
universe@793 | 772 | CxBuffer buf, target; |
universe@793 | 773 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 774 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 775 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 776 | buf.capacity = 8; |
universe@793 | 777 | buf.size = 4; |
universe@793 | 778 | buf.pos = 8; |
universe@793 | 779 | buf.flags |= CX_BUFFER_AUTO_EXTEND; |
universe@793 | 780 | CX_TEST_DO { |
universe@793 | 781 | int c = cxBufferPut(&buf, 0x200 | 'a'); |
universe@793 | 782 | CX_TEST_ASSERT(c == 'a'); |
universe@793 | 783 | CX_TEST_ASSERT(buf.size == 9); |
universe@793 | 784 | CX_TEST_ASSERT(buf.pos == 9); |
universe@793 | 785 | CX_TEST_ASSERT(buf.capacity >= 9); |
universe@793 | 786 | CX_TEST_ASSERT(0 == memcmp(buf.space, "prep\0\0\0\0a", 9)); |
universe@793 | 787 | } |
universe@793 | 788 | cxBufferDestroy(&buf); |
universe@793 | 789 | cxBufferDestroy(&target); |
universe@793 | 790 | } |
universe@793 | 791 | |
universe@793 | 792 | CX_TEST(test_buffer_put_string_fit) { |
universe@793 | 793 | CxBuffer buf, target; |
universe@793 | 794 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 795 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 796 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 797 | buf.capacity = 8; |
universe@793 | 798 | buf.size = buf.pos = 4; |
universe@793 | 799 | const char *data = "test"; |
universe@793 | 800 | CX_TEST_DO { |
universe@793 | 801 | size_t written = cxBufferPutString(&buf, data); |
universe@793 | 802 | CX_TEST_ASSERT(written == 4); |
universe@793 | 803 | CX_TEST_ASSERT(buf.size == 8); |
universe@793 | 804 | CX_TEST_ASSERT(buf.pos == 8); |
universe@793 | 805 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 806 | CX_TEST_ASSERT(0 == memcmp(buf.space, "preptest", 8)); |
universe@793 | 807 | } |
universe@793 | 808 | cxBufferDestroy(&buf); |
universe@793 | 809 | cxBufferDestroy(&target); |
universe@793 | 810 | } |
universe@793 | 811 | |
universe@793 | 812 | CX_TEST(test_buffer_put_string_discard) { |
universe@793 | 813 | CxBuffer buf, target; |
universe@793 | 814 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 815 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 816 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 817 | buf.capacity = 8; |
universe@793 | 818 | buf.size = buf.pos = 4; |
universe@793 | 819 | const char *data = "testing"; |
universe@793 | 820 | CX_TEST_DO { |
universe@793 | 821 | size_t written = cxBufferPutString(&buf, data); |
universe@793 | 822 | CX_TEST_ASSERT(written == 4); |
universe@793 | 823 | CX_TEST_ASSERT(buf.size == 8); |
universe@793 | 824 | CX_TEST_ASSERT(buf.pos == 8); |
universe@793 | 825 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 826 | CX_TEST_ASSERT(0 == memcmp(buf.space, "preptest\0", 9)); |
universe@793 | 827 | } |
universe@793 | 828 | cxBufferDestroy(&buf); |
universe@793 | 829 | cxBufferDestroy(&target); |
universe@793 | 830 | } |
universe@793 | 831 | |
universe@793 | 832 | CX_TEST(test_buffer_put_string_extend) { |
universe@793 | 833 | CxBuffer buf, target; |
universe@793 | 834 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 835 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 836 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 837 | buf.capacity = 8; |
universe@793 | 838 | buf.size = buf.pos = 4; |
universe@793 | 839 | buf.flags |= CX_BUFFER_AUTO_EXTEND; |
universe@793 | 840 | const char *data = "testing"; |
universe@793 | 841 | CX_TEST_DO { |
universe@793 | 842 | size_t written = cxBufferPutString(&buf, data); |
universe@793 | 843 | CX_TEST_ASSERT(written == 7); |
universe@793 | 844 | CX_TEST_ASSERT(buf.size == 11); |
universe@793 | 845 | CX_TEST_ASSERT(buf.pos == 11); |
universe@793 | 846 | CX_TEST_ASSERT(buf.capacity >= 11); |
universe@793 | 847 | CX_TEST_ASSERT(0 == memcmp(buf.space, "preptesting", 11)); |
universe@793 | 848 | } |
universe@793 | 849 | cxBufferDestroy(&buf); |
universe@793 | 850 | cxBufferDestroy(&target); |
universe@793 | 851 | } |
universe@793 | 852 | |
universe@793 | 853 | CX_TEST(test_buffer_write_size_overflow) { |
universe@793 | 854 | CxBuffer buf, target; |
universe@793 | 855 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 856 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 857 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 858 | buf.capacity = 8; |
universe@793 | 859 | buf.size = buf.pos = 4; |
universe@793 | 860 | const char *data = "testing"; |
universe@793 | 861 | CX_TEST_DO { |
universe@793 | 862 | size_t written = cxBufferWrite(data, 8, SIZE_MAX / 4, &buf); |
universe@793 | 863 | CX_TEST_ASSERT(written == 0); |
universe@793 | 864 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 865 | CX_TEST_ASSERT(buf.pos == 4); |
universe@793 | 866 | CX_TEST_ASSERT(buf.size == 4); |
universe@793 | 867 | CX_TEST_ASSERT(0 == memcmp(buf.space, "prep\0", 5)); |
universe@793 | 868 | } |
universe@793 | 869 | cxBufferDestroy(&buf); |
universe@793 | 870 | cxBufferDestroy(&target); |
universe@793 | 871 | } |
universe@793 | 872 | |
universe@793 | 873 | CX_TEST(test_buffer_write_capacity_overflow) { |
universe@793 | 874 | CxBuffer buf, target; |
universe@793 | 875 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 876 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 877 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 878 | buf.capacity = 8; |
universe@793 | 879 | buf.size = buf.pos = 4; |
universe@793 | 880 | buf.flags |= CX_BUFFER_AUTO_EXTEND; |
universe@793 | 881 | const char *data = "testing"; |
universe@793 | 882 | CX_TEST_DO { |
universe@793 | 883 | size_t written = cxBufferWrite(data, 1, SIZE_MAX - 2, &buf); |
universe@793 | 884 | CX_TEST_ASSERT(written == 0); |
universe@793 | 885 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 886 | CX_TEST_ASSERT(buf.pos == 4); |
universe@793 | 887 | CX_TEST_ASSERT(buf.size == 4); |
universe@793 | 888 | CX_TEST_ASSERT(0 == memcmp(buf.space, "prep\0", 5)); |
universe@793 | 889 | } |
universe@793 | 890 | cxBufferDestroy(&buf); |
universe@793 | 891 | cxBufferDestroy(&target); |
universe@793 | 892 | } |
universe@793 | 893 | |
universe@793 | 894 | CX_TEST(test_buffer_write_only_overwrite) { |
universe@793 | 895 | CxBuffer buf, target; |
universe@793 | 896 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 897 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 898 | memcpy(buf.space, "preptest\0\0\0\0\0\0\0\0", 16); |
universe@793 | 899 | buf.capacity = 8; |
universe@793 | 900 | buf.pos = 3; |
universe@793 | 901 | buf.size = 8; |
universe@793 | 902 | buf.flags |= CX_BUFFER_AUTO_EXTEND; |
universe@793 | 903 | CX_TEST_DO { |
universe@793 | 904 | size_t written = cxBufferWrite("XXX", 2, 2, &buf); |
universe@793 | 905 | CX_TEST_ASSERT(written == 2); |
universe@793 | 906 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 907 | CX_TEST_ASSERT(buf.size == 8); |
universe@793 | 908 | CX_TEST_ASSERT(buf.pos == 7); |
universe@793 | 909 | CX_TEST_ASSERT(0 == memcmp(buf.space, "preXXX\0t", 8)); |
universe@793 | 910 | } |
universe@793 | 911 | cxBufferDestroy(&buf); |
universe@793 | 912 | cxBufferDestroy(&target); |
universe@793 | 913 | } |
universe@793 | 914 | |
universe@793 | 915 | CX_TEST(test_buffer_write_flush_at_capacity) { |
universe@793 | 916 | CxBuffer buf, target; |
universe@793 | 917 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 918 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 919 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 920 | buf.capacity = 8; |
universe@793 | 921 | buf.size = buf.pos = 4; |
universe@793 | 922 | buf.flush_target = ⌖ |
universe@793 | 923 | buf.flush_func = (cx_write_func)cxBufferWrite; |
universe@793 | 924 | buf.flush_blkmax = 1; |
universe@793 | 925 | CX_TEST_DO { |
universe@793 | 926 | size_t written = cxBufferWrite("foo", 1, 3, &buf); |
universe@793 | 927 | CX_TEST_ASSERT(written == 3); |
universe@793 | 928 | CX_TEST_ASSERT(buf.pos == 7); |
universe@793 | 929 | CX_TEST_ASSERT(buf.size == 7); |
universe@793 | 930 | CX_TEST_ASSERT(target.pos == 0); |
universe@793 | 931 | CX_TEST_ASSERT(target.size == 0); |
universe@793 | 932 | written = cxBufferWrite("hello", 1, 5, &buf); |
universe@793 | 933 | CX_TEST_ASSERT(written == 5); |
universe@793 | 934 | CX_TEST_ASSERT(buf.pos == 0); |
universe@793 | 935 | CX_TEST_ASSERT(buf.size == 0); |
universe@793 | 936 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 937 | CX_TEST_ASSERT(target.pos == 12); |
universe@793 | 938 | CX_TEST_ASSERT(target.size == 12); |
universe@793 | 939 | CX_TEST_ASSERT(0 == memcmp(target.space, "prepfoohello", 12)); |
universe@793 | 940 | } |
universe@793 | 941 | cxBufferDestroy(&buf); |
universe@793 | 942 | cxBufferDestroy(&target); |
universe@793 | 943 | } |
universe@793 | 944 | |
universe@793 | 945 | CX_TEST(test_buffer_write_flush_at_threshold) { |
universe@793 | 946 | CxBuffer buf, target; |
universe@793 | 947 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 948 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 949 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 950 | buf.capacity = 8; |
universe@793 | 951 | buf.size = buf.pos = 4; |
universe@793 | 952 | buf.flush_target = ⌖ |
universe@793 | 953 | buf.flush_func = (cx_write_func)cxBufferWrite; |
universe@793 | 954 | buf.flush_blkmax = 1; |
universe@793 | 955 | buf.flush_threshold = 12; |
universe@793 | 956 | buf.flags |= CX_BUFFER_AUTO_EXTEND; |
universe@793 | 957 | CX_TEST_DO { |
universe@793 | 958 | size_t written = cxBufferWrite("foobar", 1, 6, &buf); |
universe@793 | 959 | CX_TEST_ASSERT(written == 6); |
universe@793 | 960 | CX_TEST_ASSERT(buf.pos == 10); |
universe@793 | 961 | CX_TEST_ASSERT(buf.size == 10); |
universe@793 | 962 | CX_TEST_ASSERT(buf.capacity >= 10); |
universe@793 | 963 | CX_TEST_ASSERT(buf.capacity <= 12); |
universe@793 | 964 | CX_TEST_ASSERT(target.pos == 0); |
universe@793 | 965 | CX_TEST_ASSERT(target.size == 0); |
universe@793 | 966 | written = cxBufferWrite("hello", 1, 5, &buf); |
universe@793 | 967 | CX_TEST_ASSERT(written == 5); |
universe@793 | 968 | CX_TEST_ASSERT(buf.pos == 0); |
universe@793 | 969 | CX_TEST_ASSERT(buf.size == 0); |
universe@793 | 970 | CX_TEST_ASSERT(buf.capacity <= 12); |
universe@793 | 971 | CX_TEST_ASSERT(target.pos == 15); |
universe@793 | 972 | CX_TEST_ASSERT(target.size == 15); |
universe@793 | 973 | CX_TEST_ASSERT(0 == memcmp(target.space, "prepfoobarhello", 15)); |
universe@793 | 974 | } |
universe@793 | 975 | cxBufferDestroy(&buf); |
universe@793 | 976 | cxBufferDestroy(&target); |
universe@793 | 977 | } |
universe@793 | 978 | |
universe@793 | 979 | CX_TEST(test_buffer_write_flush_rate_limited) { |
universe@793 | 980 | CxBuffer buf, target; |
universe@793 | 981 | cxBufferInit(&target, NULL, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND); |
universe@793 | 982 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 983 | memcpy(buf.space, "prep\0\0\0\0\0\0\0\0\0\0\0\0", 16); |
universe@793 | 984 | buf.capacity = 8; |
universe@793 | 985 | buf.size = buf.pos = 4; |
universe@793 | 986 | buf.flush_target = ⌖ |
universe@793 | 987 | buf.flush_blkmax = 1; |
universe@793 | 988 | // limit the rate of the flush function and the capacity of the target |
universe@793 | 989 | buf.flush_func = (cx_write_func) mock_write_limited_rate; |
universe@793 | 990 | target.capacity = 16; |
universe@793 | 991 | target.flags &= ~CX_BUFFER_AUTO_EXTEND; |
universe@793 | 992 | CX_TEST_DO { |
universe@793 | 993 | size_t written = cxBufferWrite("foo", 1, 3, &buf); |
universe@793 | 994 | CX_TEST_ASSERT(written == 3); |
universe@793 | 995 | CX_TEST_ASSERT(buf.pos == 7); |
universe@793 | 996 | CX_TEST_ASSERT(buf.size == 7); |
universe@793 | 997 | CX_TEST_ASSERT(target.pos == 0); |
universe@793 | 998 | CX_TEST_ASSERT(target.size == 0); |
universe@793 | 999 | written = cxBufferWrite("hello, world!", 1, 13, &buf); |
universe@793 | 1000 | // " world!" fits into this buffer, the remaining stuff is flushed out |
universe@793 | 1001 | CX_TEST_ASSERT(written == 13); |
universe@793 | 1002 | CX_TEST_ASSERT(buf.pos == 7); |
universe@793 | 1003 | CX_TEST_ASSERT(buf.size == 7); |
universe@793 | 1004 | CX_TEST_ASSERT(buf.capacity == 8); |
universe@793 | 1005 | CX_TEST_ASSERT(0 == memcmp(buf.space, " world!", 7)); |
universe@793 | 1006 | CX_TEST_ASSERT(target.pos == 13); |
universe@793 | 1007 | CX_TEST_ASSERT(target.size == 13); |
universe@793 | 1008 | CX_TEST_ASSERT(target.capacity == 16); |
universe@793 | 1009 | CX_TEST_ASSERT(0 == memcmp(target.space, "prepfoohello,", 13)); |
universe@793 | 1010 | } |
universe@793 | 1011 | cxBufferDestroy(&buf); |
universe@793 | 1012 | cxBufferDestroy(&target); |
universe@793 | 1013 | } |
universe@793 | 1014 | |
universe@793 | 1015 | CX_TEST(test_buffer_get) { |
universe@793 | 1016 | CxBuffer buf; |
universe@793 | 1017 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 1018 | memcpy(buf.space, "some data\0\0\0\0\0\0\0", 16); |
universe@793 | 1019 | buf.capacity = 12; |
universe@793 | 1020 | buf.size = 9; |
universe@793 | 1021 | buf.pos = 2; |
universe@793 | 1022 | CX_TEST_DO { |
universe@793 | 1023 | CX_TEST_ASSERT(cxBufferGet(&buf) == 'm'); |
universe@793 | 1024 | CX_TEST_ASSERT(cxBufferGet(&buf) == 'e'); |
universe@793 | 1025 | CX_TEST_ASSERT(cxBufferGet(&buf) == ' '); |
universe@793 | 1026 | CX_TEST_ASSERT(cxBufferGet(&buf) == 'd'); |
universe@793 | 1027 | CX_TEST_ASSERT(buf.pos == 6); |
universe@793 | 1028 | } |
universe@793 | 1029 | cxBufferDestroy(&buf); |
universe@793 | 1030 | } |
universe@793 | 1031 | |
universe@793 | 1032 | CX_TEST(test_buffer_get_eof) { |
universe@793 | 1033 | CxBuffer buf; |
universe@793 | 1034 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 1035 | memcpy(buf.space, "some data\0\0\0\0\0\0\0", 16); |
universe@793 | 1036 | buf.capacity = 12; |
universe@793 | 1037 | buf.pos = buf.size = 9; |
universe@793 | 1038 | CX_TEST_DO { |
universe@793 | 1039 | CX_TEST_ASSERT(cxBufferGet(&buf) == EOF); |
universe@793 | 1040 | } |
universe@793 | 1041 | cxBufferDestroy(&buf); |
universe@793 | 1042 | } |
universe@793 | 1043 | |
universe@793 | 1044 | CX_TEST(test_buffer_read) { |
universe@793 | 1045 | CxBuffer buf; |
universe@793 | 1046 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 1047 | memcpy(buf.space, "some data\0\0\0\0\0\0\0", 16); |
universe@793 | 1048 | buf.capacity = 12; |
universe@793 | 1049 | buf.size = 9; |
universe@793 | 1050 | buf.pos = 2; |
universe@793 | 1051 | CX_TEST_DO { |
universe@793 | 1052 | char target[4]; |
universe@793 | 1053 | size_t read = cxBufferRead(&target, 1, 4, &buf); |
universe@793 | 1054 | CX_TEST_ASSERT(read == 4); |
universe@793 | 1055 | CX_TEST_ASSERT(0 == memcmp(&target, "me d", 4)); |
universe@793 | 1056 | CX_TEST_ASSERT(buf.pos == 6); |
universe@793 | 1057 | } |
universe@793 | 1058 | cxBufferDestroy(&buf); |
universe@793 | 1059 | } |
universe@793 | 1060 | |
universe@793 | 1061 | CX_TEST(test_buffer_read_oob) { |
universe@793 | 1062 | CxBuffer buf; |
universe@793 | 1063 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 1064 | memcpy(buf.space, "some data\0\0\0\0\0\0\0", 16); |
universe@793 | 1065 | buf.capacity = 12; |
universe@793 | 1066 | buf.size = 9; |
universe@793 | 1067 | buf.pos = 6; |
universe@793 | 1068 | CX_TEST_DO { |
universe@793 | 1069 | char target[4]; |
universe@793 | 1070 | size_t read = cxBufferRead(&target, 1, 4, &buf); |
universe@793 | 1071 | CX_TEST_ASSERT(read == 3); |
universe@793 | 1072 | CX_TEST_ASSERT(0 == memcmp(&target, "ata", 3)); |
universe@793 | 1073 | CX_TEST_ASSERT(buf.pos == 9); |
universe@793 | 1074 | } |
universe@793 | 1075 | cxBufferDestroy(&buf); |
universe@793 | 1076 | } |
universe@793 | 1077 | |
universe@793 | 1078 | CX_TEST(test_buffer_read_oob_multibyte) { |
universe@793 | 1079 | CxBuffer buf; |
universe@793 | 1080 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 1081 | memcpy(buf.space, "some data\0\0\0\0\0\0\0", 16); |
universe@793 | 1082 | buf.capacity = 12; |
universe@793 | 1083 | buf.size = 9; |
universe@793 | 1084 | buf.pos = 6; |
universe@793 | 1085 | CX_TEST_DO { |
universe@793 | 1086 | char target[4]; |
universe@793 | 1087 | target[2] = '\0'; |
universe@793 | 1088 | size_t read = cxBufferRead(&target, 2, 2, &buf); |
universe@793 | 1089 | CX_TEST_ASSERT(read == 1); |
universe@793 | 1090 | CX_TEST_ASSERT(0 == memcmp(&target, "at\0", 3)); |
universe@793 | 1091 | CX_TEST_ASSERT(buf.pos == 8); |
universe@793 | 1092 | } |
universe@793 | 1093 | cxBufferDestroy(&buf); |
universe@793 | 1094 | } |
universe@793 | 1095 | |
universe@793 | 1096 | CX_TEST(test_buffer_read_eof) { |
universe@793 | 1097 | CxBuffer buf; |
universe@793 | 1098 | cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); |
universe@793 | 1099 | memcpy(buf.space, "some data\0\0\0\0\0\0\0", 16); |
universe@793 | 1100 | buf.capacity = 12; |
universe@793 | 1101 | buf.size = buf.pos = 9; |
universe@793 | 1102 | CX_TEST_DO { |
universe@793 | 1103 | char target[4]; |
universe@793 | 1104 | size_t read = cxBufferRead(&target, 1, 1, &buf); |
universe@793 | 1105 | CX_TEST_ASSERT(read == 0); |
universe@793 | 1106 | CX_TEST_ASSERT(buf.pos == 9); |
universe@793 | 1107 | } |
universe@793 | 1108 | cxBufferDestroy(&buf); |
universe@793 | 1109 | } |
universe@793 | 1110 | |
universe@789 | 1111 | CxTestSuite *cx_test_suite_buffer(void) { |
universe@789 | 1112 | CxTestSuite *suite = cx_test_suite_new("buffer"); |
universe@789 | 1113 | |
universe@789 | 1114 | cx_test_register(suite, test_buffer_init_wrap_space); |
universe@789 | 1115 | cx_test_register(suite, test_buffer_init_wrap_space_auto_extend); |
universe@789 | 1116 | cx_test_register(suite, test_buffer_init_wrap_space_auto_free); |
universe@789 | 1117 | cx_test_register(suite, test_buffer_init_fresh_space); |
universe@789 | 1118 | cx_test_register(suite, test_buffer_init_on_heap); |
universe@789 | 1119 | cx_test_register(suite, test_buffer_minimum_capacity_sufficient); |
universe@789 | 1120 | cx_test_register(suite, test_buffer_minimum_capacity_extend); |
universe@789 | 1121 | cx_test_register(suite, test_buffer_clear); |
universe@789 | 1122 | cx_test_register(suite, test_buffer_reset); |
universe@789 | 1123 | cx_test_register(suite, test_buffer_seek_set_zero); |
universe@789 | 1124 | cx_test_register(suite, test_buffer_seek_set_valid); |
universe@789 | 1125 | cx_test_register(suite, test_buffer_seek_set_invalid); |
universe@789 | 1126 | cx_test_register(suite, test_buffer_seek_cur_zero); |
universe@789 | 1127 | cx_test_register(suite, test_buffer_seek_cur_valid_positive); |
universe@789 | 1128 | cx_test_register(suite, test_buffer_seek_cur_valid_negative); |
universe@789 | 1129 | cx_test_register(suite, test_buffer_seek_cur_invalid_positive); |
universe@789 | 1130 | cx_test_register(suite, test_buffer_seek_cur_invalid_negative); |
universe@789 | 1131 | cx_test_register(suite, test_buffer_seek_end_zero); |
universe@789 | 1132 | cx_test_register(suite, test_buffer_seek_end_valid); |
universe@789 | 1133 | cx_test_register(suite, test_buffer_seek_end_invalid); |
universe@789 | 1134 | cx_test_register(suite, test_buffer_seek_whence_invalid); |
universe@792 | 1135 | cx_test_register(suite, test_buffer_eof_reached); |
universe@792 | 1136 | cx_test_register(suite, test_buffer_eof_not_reached); |
universe@792 | 1137 | cx_test_register(suite, test_buffer_shift_left_zero); |
universe@792 | 1138 | cx_test_register(suite, test_buffer_shift_left_zero_offset_interface); |
universe@792 | 1139 | cx_test_register(suite, test_buffer_shift_left_standard); |
universe@792 | 1140 | cx_test_register(suite, test_buffer_shift_left_overshift); |
universe@792 | 1141 | cx_test_register(suite, test_buffer_shift_left_overshift_pos_only); |
universe@792 | 1142 | cx_test_register(suite, test_buffer_shift_left_offset_interface); |
universe@792 | 1143 | cx_test_register(suite, test_buffer_shift_right_zero); |
universe@792 | 1144 | cx_test_register(suite, test_buffer_shift_right_zero_offset_interface); |
universe@792 | 1145 | cx_test_register(suite, test_buffer_shift_right_standard); |
universe@792 | 1146 | cx_test_register(suite, test_buffer_shift_right_overshift_discard); |
universe@792 | 1147 | cx_test_register(suite, test_buffer_shift_right_overshift_extend); |
universe@792 | 1148 | cx_test_register(suite, test_buffer_shift_right_offset_interface); |
universe@793 | 1149 | cx_test_register(suite, test_buffer_write_size_one_fit); |
universe@793 | 1150 | cx_test_register(suite, test_buffer_write_size_one_discard); |
universe@793 | 1151 | cx_test_register(suite, test_buffer_write_size_one_extend); |
universe@793 | 1152 | cx_test_register(suite, test_buffer_write_multibyte_fit); |
universe@793 | 1153 | cx_test_register(suite, test_buffer_write_multibyte_discard); |
universe@793 | 1154 | cx_test_register(suite, test_buffer_write_multibyte_extend); |
universe@793 | 1155 | cx_test_register(suite, test_buffer_put_fit); |
universe@793 | 1156 | cx_test_register(suite, test_buffer_put_discard); |
universe@793 | 1157 | cx_test_register(suite, test_buffer_put_extend); |
universe@793 | 1158 | cx_test_register(suite, test_buffer_put_string_fit); |
universe@793 | 1159 | cx_test_register(suite, test_buffer_put_string_discard); |
universe@793 | 1160 | cx_test_register(suite, test_buffer_put_string_extend); |
universe@793 | 1161 | cx_test_register(suite, test_buffer_write_size_overflow); |
universe@793 | 1162 | cx_test_register(suite, test_buffer_write_capacity_overflow); |
universe@793 | 1163 | cx_test_register(suite, test_buffer_write_only_overwrite); |
universe@793 | 1164 | cx_test_register(suite, test_buffer_write_flush_at_capacity); |
universe@793 | 1165 | cx_test_register(suite, test_buffer_write_flush_at_threshold); |
universe@793 | 1166 | cx_test_register(suite, test_buffer_write_flush_rate_limited); |
universe@793 | 1167 | cx_test_register(suite, test_buffer_get); |
universe@793 | 1168 | cx_test_register(suite, test_buffer_get_eof); |
universe@793 | 1169 | cx_test_register(suite, test_buffer_read); |
universe@793 | 1170 | cx_test_register(suite, test_buffer_read_oob); |
universe@793 | 1171 | cx_test_register(suite, test_buffer_read_oob_multibyte); |
universe@793 | 1172 | cx_test_register(suite, test_buffer_read_eof); |
universe@793 | 1173 | |
universe@789 | 1174 | return suite; |
universe@789 | 1175 | } |