test/test_buffer.cpp

Mon, 16 May 2022 19:15:44 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 16 May 2022 19:15:44 +0200
changeset 547
9e933920dcf9
parent 546
900795d59d03
child 548
459bca1cdf8d
permissions
-rw-r--r--

#170 test buffer seek

universe@530 1 /*
universe@530 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@530 3 *
universe@530 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
universe@530 5 *
universe@530 6 * Redistribution and use in source and binary forms, with or without
universe@530 7 * modification, are permitted provided that the following conditions are met:
universe@530 8 *
universe@530 9 * 1. Redistributions of source code must retain the above copyright
universe@530 10 * notice, this list of conditions and the following disclaimer.
universe@530 11 *
universe@530 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@530 13 * notice, this list of conditions and the following disclaimer in the
universe@530 14 * documentation and/or other materials provided with the distribution.
universe@530 15 *
universe@530 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@530 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@530 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@530 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@530 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@530 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@530 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@530 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@530 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@530 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@530 26 * POSSIBILITY OF SUCH DAMAGE.
universe@530 27 */
universe@530 28
universe@530 29 #include "cx/buffer.h"
universe@530 30
universe@530 31 #include <gtest/gtest.h>
universe@530 32 #include "util_allocator.h"
universe@530 33
universe@539 34 static void expect_default_flush_config(CxBuffer *buf) {
universe@539 35 EXPECT_EQ(buf->flush_blkmax, 0);
universe@539 36 EXPECT_EQ(buf->flush_blksize, 4096);
universe@539 37 EXPECT_EQ(buf->flush_threshold, SIZE_MAX);
universe@539 38 EXPECT_EQ(buf->flush_func, nullptr);
universe@541 39 EXPECT_EQ(buf->flush_target, nullptr);
universe@539 40 }
universe@539 41
universe@535 42 TEST(BufferInit, WrapSpace) {
universe@535 43 CxTestingAllocator alloc;
universe@530 44 CxBuffer buf;
universe@535 45 void *space = cxMalloc(&alloc, 16);
universe@535 46 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_DEFAULT);
universe@539 47 expect_default_flush_config(&buf);
universe@530 48 EXPECT_EQ(buf.space, space);
universe@530 49 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@530 50 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, 0);
universe@530 51 EXPECT_EQ(buf.pos, 0);
universe@530 52 EXPECT_EQ(buf.size, 0);
universe@530 53 EXPECT_EQ(buf.capacity, 16);
universe@535 54 EXPECT_EQ(buf.allocator, &alloc);
universe@530 55 cxBufferDestroy(&buf);
universe@535 56 EXPECT_FALSE(alloc.verify());
universe@535 57 cxFree(&alloc, space);
universe@535 58 EXPECT_TRUE(alloc.verify());
universe@530 59 }
universe@530 60
universe@539 61 TEST(BufferInit, WrapSpaceAutoExtend) {
universe@539 62 CxTestingAllocator alloc;
universe@539 63 CxBuffer buf;
universe@539 64 void *space = cxMalloc(&alloc, 16);
universe@539 65 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_AUTO_EXTEND);
universe@539 66 expect_default_flush_config(&buf);
universe@539 67 EXPECT_EQ(buf.space, space);
universe@539 68 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, CX_BUFFER_AUTO_EXTEND);
universe@539 69 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, 0);
universe@539 70 EXPECT_EQ(buf.pos, 0);
universe@539 71 EXPECT_EQ(buf.size, 0);
universe@539 72 EXPECT_EQ(buf.capacity, 16);
universe@539 73 EXPECT_EQ(buf.allocator, &alloc);
universe@539 74 cxBufferDestroy(&buf);
universe@539 75 EXPECT_FALSE(alloc.verify());
universe@539 76 cxFree(&alloc, space);
universe@539 77 EXPECT_TRUE(alloc.verify());
universe@539 78 }
universe@539 79
universe@535 80 TEST(BufferInit, WrapSpaceAutoFree) {
universe@535 81 CxTestingAllocator alloc;
universe@530 82 CxBuffer buf;
universe@535 83 void *space = cxMalloc(&alloc, 16);
universe@535 84 cxBufferInit(&buf, space, 16, &alloc, CX_BUFFER_FREE_CONTENTS);
universe@539 85 expect_default_flush_config(&buf);
universe@530 86 EXPECT_EQ(buf.space, space);
universe@530 87 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@530 88 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, CX_BUFFER_FREE_CONTENTS);
universe@530 89 EXPECT_EQ(buf.pos, 0);
universe@530 90 EXPECT_EQ(buf.size, 0);
universe@530 91 EXPECT_EQ(buf.capacity, 16);
universe@535 92 EXPECT_EQ(buf.allocator, &alloc);
universe@535 93 EXPECT_FALSE(alloc.verify());
universe@530 94 cxBufferDestroy(&buf);
universe@535 95 EXPECT_TRUE(alloc.verify());
universe@530 96 }
universe@535 97
universe@535 98 TEST(BufferInit, FreshSpace) {
universe@535 99 CxTestingAllocator alloc;
universe@535 100 CxBuffer buf;
universe@535 101 cxBufferInit(&buf, nullptr, 8, &alloc, CX_BUFFER_DEFAULT);
universe@539 102 expect_default_flush_config(&buf);
universe@535 103 EXPECT_NE(buf.space, nullptr);
universe@535 104 EXPECT_EQ(buf.flags & CX_BUFFER_AUTO_EXTEND, 0);
universe@535 105 EXPECT_EQ(buf.flags & CX_BUFFER_FREE_CONTENTS, CX_BUFFER_FREE_CONTENTS);
universe@535 106 EXPECT_EQ(buf.pos, 0);
universe@535 107 EXPECT_EQ(buf.size, 0);
universe@535 108 EXPECT_EQ(buf.capacity, 8);
universe@535 109 EXPECT_EQ(buf.allocator, &alloc);
universe@535 110 EXPECT_FALSE(alloc.verify()); // space is still allocated
universe@535 111 cxBufferDestroy(&buf);
universe@535 112 EXPECT_TRUE(alloc.verify());
universe@535 113 }
universe@535 114
universe@535 115 class BufferShiftFixture : public ::testing::Test {
universe@535 116 protected:
universe@535 117 void SetUp() override {
universe@535 118 ASSERT_TRUE(alloc.verify());
universe@535 119 cxBufferInit(&buf, nullptr, 16, &alloc, CX_BUFFER_DEFAULT);
universe@535 120 memcpy(buf.space, "test____________", 16);
universe@535 121 buf.capacity = 8; // purposely pretend that the buffer has less capacity s.t. we can test beyond the range
universe@535 122 buf.pos = 4;
universe@535 123 buf.size = 4;
universe@535 124 }
universe@535 125
universe@535 126 void TearDown() override {
universe@535 127 cxBufferDestroy(&buf);
universe@535 128 EXPECT_TRUE(alloc.verify());
universe@535 129 }
universe@535 130
universe@535 131 CxTestingAllocator alloc;
universe@535 132 CxBuffer buf{};
universe@535 133 };
universe@535 134
universe@535 135 class BufferShiftLeft : public BufferShiftFixture {
universe@535 136 };
universe@535 137
universe@535 138 TEST_F(BufferShiftLeft, Zero) {
universe@535 139 ASSERT_EQ(buf.pos, 4);
universe@535 140 ASSERT_EQ(buf.size, 4);
universe@535 141 int ret = cxBufferShiftLeft(&buf, 0);
universe@535 142 EXPECT_EQ(ret, 0);
universe@535 143 EXPECT_EQ(buf.pos, 4);
universe@535 144 EXPECT_EQ(buf.size, 4);
universe@535 145 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 146 }
universe@535 147
universe@547 148 TEST_F(BufferShiftLeft, ZeroOffsetInterface) {
universe@547 149 ASSERT_EQ(buf.pos, 4);
universe@547 150 ASSERT_EQ(buf.size, 4);
universe@547 151 int ret = cxBufferShift(&buf, -0);
universe@547 152 EXPECT_EQ(ret, 0);
universe@547 153 EXPECT_EQ(buf.pos, 4);
universe@547 154 EXPECT_EQ(buf.size, 4);
universe@547 155 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@547 156 }
universe@547 157
universe@535 158 TEST_F(BufferShiftLeft, Standard) {
universe@535 159 ASSERT_EQ(buf.pos, 4);
universe@535 160 ASSERT_EQ(buf.size, 4);
universe@535 161 int ret = cxBufferShiftLeft(&buf, 2);
universe@535 162 EXPECT_EQ(ret, 0);
universe@535 163 EXPECT_EQ(buf.pos, 2);
universe@535 164 EXPECT_EQ(buf.size, 2);
universe@535 165 EXPECT_TRUE(memcmp(buf.space, "stst________", 8) == 0);
universe@535 166 }
universe@535 167
universe@535 168 TEST_F(BufferShiftLeft, Overshift) {
universe@535 169 ASSERT_LT(buf.pos, 6);
universe@535 170 ASSERT_LT(buf.size, 6);
universe@535 171 int ret = cxBufferShiftLeft(&buf, 6);
universe@535 172 EXPECT_EQ(ret, 0);
universe@535 173 EXPECT_EQ(buf.pos, 0);
universe@535 174 EXPECT_EQ(buf.size, 0);
universe@535 175 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 176 }
universe@535 177
universe@535 178 TEST_F(BufferShiftLeft, OvershiftPosOnly) {
universe@535 179 buf.pos = 2;
universe@535 180 ASSERT_EQ(buf.size, 4);
universe@535 181 int ret = cxBufferShiftLeft(&buf, 3);
universe@535 182 EXPECT_EQ(ret, 0);
universe@535 183 EXPECT_EQ(buf.pos, 0);
universe@535 184 EXPECT_EQ(buf.size, 1);
universe@535 185 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 186 }
universe@535 187
universe@535 188 TEST_F(BufferShiftLeft, OffsetInterface) {
universe@535 189 buf.pos = 3;
universe@535 190 ASSERT_EQ(buf.size, 4);
universe@535 191 int ret = cxBufferShift(&buf, -2);
universe@535 192 EXPECT_EQ(ret, 0);
universe@535 193 EXPECT_EQ(buf.pos, 1);
universe@535 194 EXPECT_EQ(buf.size, 2);
universe@535 195 EXPECT_TRUE(memcmp(buf.space, "stst________", 8) == 0);
universe@535 196 }
universe@535 197
universe@535 198 class BufferShiftRight : public BufferShiftFixture {
universe@535 199 };
universe@535 200
universe@535 201 TEST_F(BufferShiftRight, Zero) {
universe@535 202 ASSERT_EQ(buf.pos, 4);
universe@535 203 ASSERT_EQ(buf.size, 4);
universe@535 204 int ret = cxBufferShiftRight(&buf, 0);
universe@535 205 EXPECT_EQ(ret, 0);
universe@535 206 EXPECT_EQ(buf.pos, 4);
universe@535 207 EXPECT_EQ(buf.size, 4);
universe@535 208 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@535 209 }
universe@535 210
universe@547 211 TEST_F(BufferShiftRight, ZeroOffsetInterface) {
universe@547 212 ASSERT_EQ(buf.pos, 4);
universe@547 213 ASSERT_EQ(buf.size, 4);
universe@547 214 int ret = cxBufferShift(&buf, +0);
universe@547 215 EXPECT_EQ(ret, 0);
universe@547 216 EXPECT_EQ(buf.pos, 4);
universe@547 217 EXPECT_EQ(buf.size, 4);
universe@547 218 EXPECT_TRUE(memcmp(buf.space, "test________", 8) == 0);
universe@547 219 }
universe@547 220
universe@535 221 TEST_F(BufferShiftRight, Standard) {
universe@535 222 ASSERT_EQ(buf.pos, 4);
universe@535 223 ASSERT_EQ(buf.size, 4);
universe@535 224 int ret = cxBufferShiftRight(&buf, 3);
universe@535 225 EXPECT_EQ(ret, 0);
universe@535 226 EXPECT_EQ(buf.pos, 7);
universe@535 227 EXPECT_EQ(buf.size, 7);
universe@535 228 EXPECT_TRUE(memcmp(buf.space, "testest_____", 8) == 0);
universe@535 229 }
universe@535 230
universe@535 231 TEST_F(BufferShiftRight, OvershiftDiscard) {
universe@535 232 ASSERT_EQ(buf.pos, 4);
universe@535 233 ASSERT_EQ(buf.size, 4);
universe@535 234 ASSERT_EQ(buf.capacity, 8);
universe@535 235 int ret = cxBufferShiftRight(&buf, 6);
universe@535 236 EXPECT_EQ(ret, 0);
universe@535 237 EXPECT_EQ(buf.pos, 8);
universe@535 238 EXPECT_EQ(buf.size, 8);
universe@535 239 EXPECT_EQ(buf.capacity, 8);
universe@535 240 EXPECT_TRUE(memcmp(buf.space, "test__te____", 8) == 0);
universe@535 241 }
universe@535 242
universe@535 243 TEST_F(BufferShiftRight, OvershiftExtend) {
universe@535 244 ASSERT_EQ(buf.pos, 4);
universe@535 245 ASSERT_EQ(buf.size, 4);
universe@535 246 ASSERT_EQ(buf.capacity, 8);
universe@535 247 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@535 248 int ret = cxBufferShiftRight(&buf, 6);
universe@535 249 EXPECT_EQ(ret, 0);
universe@535 250 EXPECT_EQ(buf.pos, 10);
universe@535 251 EXPECT_EQ(buf.size, 10);
universe@535 252 EXPECT_GE(buf.capacity, 10);
universe@535 253 EXPECT_TRUE(memcmp(buf.space, "test__test__", 8) == 0);
universe@535 254 }
universe@535 255
universe@535 256 TEST_F(BufferShiftRight, OffsetInterface) {
universe@535 257 buf.pos = 3;
universe@535 258 ASSERT_EQ(buf.size, 4);
universe@535 259 int ret = cxBufferShift(&buf, 2);
universe@535 260 EXPECT_EQ(ret, 0);
universe@535 261 EXPECT_EQ(buf.pos, 5);
universe@535 262 EXPECT_EQ(buf.size, 6);
universe@535 263 EXPECT_TRUE(memcmp(buf.space, "tetest______", 8) == 0);
universe@535 264 }
universe@535 265
universe@535 266 TEST(BufferMinimumCapacity, Sufficient) {
universe@535 267 CxTestingAllocator alloc;
universe@535 268 auto space = cxMalloc(&alloc, 8);
universe@535 269 CxBuffer buf;
universe@535 270 cxBufferInit(&buf, space, 8, &alloc, CX_BUFFER_FREE_CONTENTS);
universe@535 271 memcpy(space, "Testing", 8);
universe@535 272 buf.size = 8;
universe@535 273 cxBufferMinimumCapacity(&buf, 6);
universe@535 274 EXPECT_EQ(buf.capacity, 8);
universe@535 275 EXPECT_EQ(buf.size, 8);
universe@535 276 EXPECT_TRUE(memcmp(buf.space, "Testing", 8) == 0);
universe@535 277 cxBufferDestroy(&buf);
universe@535 278 EXPECT_TRUE(alloc.verify());
universe@535 279 }
universe@535 280
universe@535 281 TEST(BufferMinimumCapacity, Extend) {
universe@535 282 CxTestingAllocator alloc;
universe@535 283 auto space = cxMalloc(&alloc, 8);
universe@535 284 CxBuffer buf;
universe@535 285 cxBufferInit(&buf, space, 8, &alloc, CX_BUFFER_FREE_CONTENTS); // NO auto extend!
universe@535 286 memcpy(space, "Testing", 8);
universe@535 287 buf.size = 8;
universe@535 288 cxBufferMinimumCapacity(&buf, 16);
universe@535 289 EXPECT_EQ(buf.capacity, 16);
universe@535 290 EXPECT_EQ(buf.size, 8);
universe@535 291 EXPECT_TRUE(memcmp(buf.space, "Testing", 8) == 0);
universe@535 292 cxBufferDestroy(&buf);
universe@535 293 EXPECT_TRUE(alloc.verify());
universe@535 294 }
universe@536 295
universe@536 296 TEST(BufferClear, Test) {
universe@536 297 char space[16];
universe@536 298 strcpy(space, "clear test");
universe@536 299 CxBuffer buf;
universe@536 300 cxBufferInit(&buf, space, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@536 301 ASSERT_EQ(buf.size, 0);
universe@536 302 // only clear the used part of the buffer
universe@536 303 cxBufferClear(&buf);
universe@536 304 EXPECT_EQ(memcmp(space, "clear test", 10), 0);
universe@536 305 buf.size = 5;
universe@536 306 buf.pos = 3;
universe@536 307 cxBufferClear(&buf);
universe@536 308 EXPECT_EQ(memcmp(space, "\0\0\0\0\0 test", 10), 0);
universe@536 309 EXPECT_EQ(buf.size, 0);
universe@536 310 EXPECT_EQ(buf.pos, 0);
universe@538 311 cxBufferDestroy(&buf);
universe@536 312 }
universe@538 313
universe@538 314 class BufferWrite : public ::testing::Test {
universe@538 315 protected:
universe@545 316 CxBuffer buf{}, target{};
universe@538 317
universe@538 318 void SetUp() override {
universe@545 319 cxBufferInit(&target, nullptr, 16, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND);
universe@538 320 cxBufferInit(&buf, nullptr, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@538 321 buf.capacity = 8; // artificially reduce capacity to check OOB writes
universe@538 322 memset(buf.space, 0, 16);
universe@538 323 memcpy(buf.space, "prep", 4);
universe@538 324 buf.size = buf.pos = 4;
universe@538 325 }
universe@538 326
universe@538 327 void TearDown() override {
universe@538 328 cxBufferDestroy(&buf);
universe@545 329 cxBufferDestroy(&target);
universe@545 330 }
universe@545 331
universe@545 332 void enableFlushing() {
universe@545 333 buf.flush_target = &target;
universe@545 334 buf.flush_func = reinterpret_cast<cx_write_func>(cxBufferWrite);
universe@545 335 buf.flush_blkmax = 1;
universe@538 336 }
universe@538 337 };
universe@538 338
universe@538 339 TEST_F(BufferWrite, SizeOneFit) {
universe@538 340 const char *data = "test";
universe@538 341 ASSERT_EQ(buf.capacity, 8);
universe@538 342 ASSERT_EQ(buf.pos, 4);
universe@541 343 ASSERT_EQ(buf.size, 4);
universe@538 344 size_t written = cxBufferWrite(data, 1, 4, &buf);
universe@538 345 EXPECT_EQ(written, 4);
universe@538 346 EXPECT_EQ(buf.size, 8);
universe@538 347 EXPECT_EQ(buf.pos, 8);
universe@538 348 EXPECT_EQ(buf.capacity, 8);
universe@538 349 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 350 }
universe@538 351
universe@538 352 TEST_F(BufferWrite, SizeOneDiscard) {
universe@538 353 const char *data = "testing";
universe@538 354 ASSERT_EQ(buf.capacity, 8);
universe@538 355 ASSERT_EQ(buf.pos, 4);
universe@541 356 ASSERT_EQ(buf.size, 4);
universe@538 357 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@538 358 EXPECT_EQ(written, 4);
universe@538 359 EXPECT_EQ(buf.size, 8);
universe@538 360 EXPECT_EQ(buf.pos, 8);
universe@538 361 EXPECT_EQ(buf.capacity, 8);
universe@538 362 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 363 }
universe@538 364
universe@538 365 TEST_F(BufferWrite, SizeOneExtend) {
universe@538 366 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@538 367 const char *data = "testing";
universe@538 368 ASSERT_EQ(buf.capacity, 8);
universe@538 369 ASSERT_EQ(buf.pos, 4);
universe@541 370 ASSERT_EQ(buf.size, 4);
universe@538 371 size_t written = cxBufferWrite(data, 1, 7, &buf);
universe@538 372 EXPECT_EQ(written, 7);
universe@538 373 EXPECT_EQ(buf.size, 11);
universe@538 374 EXPECT_EQ(buf.pos, 11);
universe@538 375 EXPECT_GE(buf.capacity, 11);
universe@538 376 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@538 377 }
universe@538 378
universe@538 379 TEST_F(BufferWrite, MultibyteFit) {
universe@541 380 const char *data = "test";
universe@541 381 ASSERT_EQ(buf.capacity, 8);
universe@541 382 ASSERT_EQ(buf.pos, 4);
universe@541 383 ASSERT_EQ(buf.size, 4);
universe@541 384 size_t written = cxBufferWrite(data, 2, 2, &buf);
universe@541 385 EXPECT_EQ(written, 2);
universe@541 386 EXPECT_EQ(buf.size, 8);
universe@541 387 EXPECT_EQ(buf.pos, 8);
universe@541 388 EXPECT_EQ(buf.capacity, 8);
universe@541 389 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 390 }
universe@538 391
universe@538 392 TEST_F(BufferWrite, MultibyteDiscard) {
universe@542 393 const char *data = "testing";
universe@541 394 ASSERT_EQ(buf.capacity, 8);
universe@541 395 ASSERT_EQ(buf.size, 4);
universe@541 396 buf.pos = 3;
universe@542 397 size_t written = cxBufferWrite(data, 2, 4, &buf);
universe@538 398 // remember: whole elements are discarded if they do not fit
universe@541 399 EXPECT_EQ(written, 2);
universe@541 400 EXPECT_EQ(buf.size, 7);
universe@541 401 EXPECT_EQ(buf.pos, 7);
universe@541 402 EXPECT_EQ(buf.capacity, 8);
universe@541 403 EXPECT_EQ(memcmp(buf.space, "pretest\0", 8), 0);
universe@538 404 }
universe@538 405
universe@538 406 TEST_F(BufferWrite, MultibyteExtend) {
universe@541 407 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 408 const char *data = "tester";
universe@541 409 ASSERT_EQ(buf.capacity, 8);
universe@541 410 ASSERT_EQ(buf.size, 4);
universe@541 411 buf.pos = 3;
universe@541 412 size_t written = cxBufferWrite(data, 2, 3, &buf);
universe@541 413 // remember: whole elements are discarded if they do not fit
universe@541 414 EXPECT_EQ(written, 3);
universe@541 415 EXPECT_EQ(buf.size, 9);
universe@541 416 EXPECT_EQ(buf.pos, 9);
universe@541 417 EXPECT_GE(buf.capacity, 9);
universe@541 418 EXPECT_EQ(memcmp(buf.space, "pretester\0", 10), 0);
universe@538 419 }
universe@538 420
universe@538 421 TEST_F(BufferWrite, PutcWrapperFit) {
universe@541 422 ASSERT_EQ(buf.capacity, 8);
universe@541 423 ASSERT_EQ(buf.pos, 4);
universe@541 424 ASSERT_EQ(buf.size, 4);
universe@541 425 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 426 EXPECT_EQ(c, 'a');
universe@541 427 EXPECT_EQ(buf.size, 5);
universe@541 428 EXPECT_EQ(buf.pos, 5);
universe@541 429 EXPECT_EQ(buf.capacity, 8);
universe@541 430 EXPECT_EQ(memcmp(buf.space, "prepa\0", 6), 0);
universe@538 431 }
universe@538 432
universe@538 433 TEST_F(BufferWrite, PutcWrapperDiscard) {
universe@541 434 ASSERT_EQ(buf.capacity, 8);
universe@541 435 ASSERT_EQ(buf.size, 4);
universe@541 436 buf.pos = 8;
universe@541 437 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 438 EXPECT_EQ(c, EOF);
universe@541 439 EXPECT_EQ(buf.size, 4);
universe@541 440 EXPECT_EQ(buf.pos, 8);
universe@541 441 EXPECT_EQ(buf.capacity, 8);
universe@541 442 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0\0", 9), 0);
universe@538 443 }
universe@538 444
universe@538 445 TEST_F(BufferWrite, PutcWrapperExtend) {
universe@541 446 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 447 ASSERT_EQ(buf.capacity, 8);
universe@541 448 ASSERT_EQ(buf.size, 4);
universe@541 449 buf.pos = 8;
universe@541 450 int c = cxBufferPut(&buf, 0x20 | 'a');
universe@541 451 EXPECT_EQ(c, 'a');
universe@541 452 EXPECT_EQ(buf.size, 9);
universe@541 453 EXPECT_EQ(buf.pos, 9);
universe@541 454 EXPECT_GE(buf.capacity, 9);
universe@541 455 EXPECT_EQ(memcmp(buf.space, "prep\0\0\0\0a\0", 10), 0);
universe@538 456 }
universe@538 457
universe@538 458 TEST_F(BufferWrite, PutStringWrapperFit) {
universe@541 459 const char *data = "test";
universe@541 460 ASSERT_EQ(buf.capacity, 8);
universe@541 461 ASSERT_EQ(buf.pos, 4);
universe@541 462 ASSERT_EQ(buf.size, 4);
universe@541 463 size_t written = cxBufferPutString(&buf, data);
universe@541 464 EXPECT_EQ(written, 4);
universe@541 465 EXPECT_EQ(buf.size, 8);
universe@541 466 EXPECT_EQ(buf.pos, 8);
universe@541 467 EXPECT_EQ(buf.capacity, 8);
universe@541 468 EXPECT_EQ(memcmp(buf.space, "preptest", 8), 0);
universe@538 469 }
universe@538 470
universe@538 471 TEST_F(BufferWrite, PutStringWrapperDiscard) {
universe@541 472 const char *data = "testing";
universe@541 473 ASSERT_EQ(buf.capacity, 8);
universe@541 474 ASSERT_EQ(buf.pos, 4);
universe@541 475 ASSERT_EQ(buf.size, 4);
universe@541 476 size_t written = cxBufferPutString(&buf, data);
universe@541 477 EXPECT_EQ(written, 4);
universe@541 478 EXPECT_EQ(buf.size, 8);
universe@541 479 EXPECT_EQ(buf.pos, 8);
universe@541 480 EXPECT_EQ(buf.capacity, 8);
universe@541 481 EXPECT_EQ(memcmp(buf.space, "preptest\0", 9), 0);
universe@538 482 }
universe@538 483
universe@538 484 TEST_F(BufferWrite, PutStringWrapperExtend) {
universe@541 485 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 486 const char *data = "testing";
universe@541 487 ASSERT_EQ(buf.capacity, 8);
universe@541 488 ASSERT_EQ(buf.pos, 4);
universe@541 489 ASSERT_EQ(buf.size, 4);
universe@541 490 size_t written = cxBufferPutString(&buf, data);
universe@541 491 EXPECT_EQ(written, 7);
universe@541 492 EXPECT_EQ(buf.size, 11);
universe@541 493 EXPECT_EQ(buf.pos, 11);
universe@541 494 EXPECT_GE(buf.capacity, 11);
universe@541 495 EXPECT_EQ(memcmp(buf.space, "preptesting", 11), 0);
universe@541 496 }
universe@538 497
universe@541 498 TEST_F(BufferWrite, MultOverflow) {
universe@541 499 const char *data = "testing";
universe@541 500 ASSERT_EQ(buf.capacity, 8);
universe@541 501 ASSERT_EQ(buf.pos, 4);
universe@541 502 ASSERT_EQ(buf.size, 4);
universe@541 503 size_t written = cxBufferWrite(data, 8, SIZE_MAX / 4, &buf);
universe@541 504 EXPECT_EQ(written, 0);
universe@541 505 EXPECT_EQ(buf.capacity, 8);
universe@541 506 EXPECT_EQ(buf.pos, 4);
universe@541 507 EXPECT_EQ(buf.size, 4);
universe@541 508 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@538 509 }
universe@541 510
universe@541 511 TEST_F(BufferWrite, MaxCapaOverflow) {
universe@541 512 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 513 const char *data = "testing";
universe@541 514 ASSERT_EQ(buf.capacity, 8);
universe@541 515 ASSERT_EQ(buf.pos, 4);
universe@541 516 ASSERT_EQ(buf.size, 4);
universe@541 517 size_t written = cxBufferWrite(data, 1, SIZE_MAX - 2, &buf);
universe@541 518 EXPECT_EQ(written, 0);
universe@541 519 EXPECT_EQ(buf.capacity, 8);
universe@541 520 EXPECT_EQ(buf.pos, 4);
universe@541 521 EXPECT_EQ(buf.size, 4);
universe@541 522 EXPECT_EQ(memcmp(buf.space, "prep\0", 5), 0);
universe@541 523 }
universe@541 524
universe@541 525 TEST_F(BufferWrite, OnlyOverwrite) {
universe@541 526 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@541 527 ASSERT_EQ(buf.capacity, 8);
universe@541 528 memcpy(buf.space, "preptest", 8);
universe@541 529 buf.pos = 3;
universe@541 530 buf.size = 8;
universe@541 531 size_t written = cxBufferWrite("XXX", 2, 2, &buf);
universe@541 532 EXPECT_EQ(written, 2);
universe@541 533 EXPECT_EQ(buf.capacity, 8);
universe@541 534 EXPECT_EQ(buf.size, 8);
universe@541 535 EXPECT_EQ(buf.pos, 7);
universe@541 536 EXPECT_EQ(memcmp(buf.space, "preXXX\0t", 8), 0);
universe@541 537 }
universe@545 538
universe@545 539 TEST_F(BufferWrite, FlushAtCapacity) {
universe@545 540 enableFlushing();
universe@545 541 ASSERT_EQ(buf.capacity, 8);
universe@545 542 ASSERT_EQ(buf.pos, 4);
universe@545 543 size_t written = cxBufferWrite("foo", 1, 3, &buf);
universe@545 544 EXPECT_EQ(written, 3);
universe@545 545 ASSERT_EQ(buf.pos, 7);
universe@545 546 ASSERT_EQ(buf.size, 7);
universe@545 547 ASSERT_EQ(target.pos, 0);
universe@545 548 ASSERT_EQ(target.size, 0);
universe@545 549 written = cxBufferWrite("hello", 1, 5, &buf);
universe@545 550 EXPECT_EQ(written, 5);
universe@545 551 EXPECT_EQ(buf.pos, 0);
universe@545 552 EXPECT_EQ(buf.size, 0);
universe@545 553 EXPECT_EQ(buf.capacity, 8);
universe@545 554 EXPECT_EQ(target.pos, 12);
universe@545 555 ASSERT_EQ(target.size, 12);
universe@545 556 EXPECT_EQ(memcmp(target.space, "prepfoohello", 12), 0);
universe@545 557 }
universe@546 558
universe@546 559 TEST_F(BufferWrite, FlushAtThreshold) {
universe@546 560 enableFlushing();
universe@546 561 buf.flush_threshold = 12;
universe@546 562 buf.flags |= CX_BUFFER_AUTO_EXTEND;
universe@546 563 ASSERT_EQ(buf.capacity, 8);
universe@546 564 ASSERT_EQ(buf.pos, 4);
universe@546 565 size_t written = cxBufferWrite("foobar", 1, 6, &buf);
universe@546 566 EXPECT_EQ(written, 6);
universe@546 567 ASSERT_EQ(buf.pos, 10);
universe@546 568 ASSERT_EQ(buf.size, 10);
universe@546 569 ASSERT_GE(buf.capacity, 10);
universe@546 570 ASSERT_LE(buf.capacity, 12);
universe@546 571 ASSERT_EQ(target.pos, 0);
universe@546 572 ASSERT_EQ(target.size, 0);
universe@546 573 written = cxBufferWrite("hello", 1, 5, &buf);
universe@546 574 EXPECT_EQ(written, 5);
universe@546 575 EXPECT_EQ(buf.pos, 0);
universe@546 576 EXPECT_EQ(buf.size, 0);
universe@546 577 EXPECT_LE(buf.capacity, 12);
universe@546 578 EXPECT_EQ(target.pos, 15);
universe@546 579 ASSERT_EQ(target.size, 15);
universe@546 580 EXPECT_EQ(memcmp(target.space, "prepfoobarhello", 15), 0);
universe@546 581 }
universe@547 582
universe@547 583 class BufferSeek : public ::testing::Test {
universe@547 584 protected:
universe@547 585 void SetUp() override {
universe@547 586 cxBufferInit(&buf, nullptr, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT);
universe@547 587 buf.size = 6;
universe@547 588 buf.pos = 3;
universe@547 589 }
universe@547 590
universe@547 591 void TearDown() override {
universe@547 592 cxBufferDestroy(&buf);
universe@547 593 }
universe@547 594
universe@547 595 CxBuffer buf{};
universe@547 596 };
universe@547 597
universe@547 598 TEST_F(BufferSeek, SetZero) {
universe@547 599 int result = cxBufferSeek(&buf, 0, SEEK_SET);
universe@547 600 EXPECT_EQ(result, 0);
universe@547 601 EXPECT_EQ(buf.pos, 0);
universe@547 602 }
universe@547 603
universe@547 604 TEST_F(BufferSeek, SetValid) {
universe@547 605 int result = cxBufferSeek(&buf, 5, SEEK_SET);
universe@547 606 EXPECT_EQ(result, 0);
universe@547 607 EXPECT_EQ(buf.pos, 5);
universe@547 608 }
universe@547 609
universe@547 610 TEST_F(BufferSeek, SetInvalid) {
universe@547 611 ASSERT_EQ(buf.pos, 3);
universe@547 612 int result = cxBufferSeek(&buf, 6, SEEK_SET);
universe@547 613 EXPECT_NE(result, 0);
universe@547 614 EXPECT_EQ(buf.pos, 3);
universe@547 615 }
universe@547 616
universe@547 617 TEST_F(BufferSeek, CurZero) {
universe@547 618 ASSERT_EQ(buf.pos, 3);
universe@547 619 int result = cxBufferSeek(&buf, 0, SEEK_CUR);
universe@547 620 EXPECT_EQ(result, 0);
universe@547 621 EXPECT_EQ(buf.pos, 3);
universe@547 622 }
universe@547 623
universe@547 624 TEST_F(BufferSeek, CurValidPositive) {
universe@547 625 ASSERT_EQ(buf.pos, 3);
universe@547 626 int result = cxBufferSeek(&buf, 2, SEEK_CUR);
universe@547 627 EXPECT_EQ(result, 0);
universe@547 628 EXPECT_EQ(buf.pos, 5);
universe@547 629 }
universe@547 630
universe@547 631 TEST_F(BufferSeek, CurValidNegative) {
universe@547 632 ASSERT_EQ(buf.pos, 3);
universe@547 633 int result = cxBufferSeek(&buf, -3, SEEK_CUR);
universe@547 634 EXPECT_EQ(result, 0);
universe@547 635 EXPECT_EQ(buf.pos, 0);
universe@547 636 }
universe@547 637
universe@547 638 TEST_F(BufferSeek, CurInvalidPositive) {
universe@547 639 ASSERT_EQ(buf.pos, 3);
universe@547 640 int result = cxBufferSeek(&buf, 3, SEEK_CUR);
universe@547 641 EXPECT_NE(result, 0);
universe@547 642 EXPECT_EQ(buf.pos, 3);
universe@547 643 }
universe@547 644
universe@547 645 TEST_F(BufferSeek, CurInvalidNegative) {
universe@547 646 ASSERT_EQ(buf.pos, 3);
universe@547 647 int result = cxBufferSeek(&buf, -4, SEEK_CUR);
universe@547 648 EXPECT_NE(result, 0);
universe@547 649 EXPECT_EQ(buf.pos, 3);
universe@547 650 }
universe@547 651
universe@547 652 TEST_F(BufferSeek, EndZero) {
universe@547 653 ASSERT_EQ(buf.size, 6);
universe@547 654 int result = cxBufferSeek(&buf, 0, SEEK_END);
universe@547 655 // the (past-the-)end position is always invalid
universe@547 656 EXPECT_NE(result, 0);
universe@547 657 EXPECT_EQ(buf.pos, 3);
universe@547 658 }
universe@547 659
universe@547 660 TEST_F(BufferSeek, EndValid) {
universe@547 661 ASSERT_EQ(buf.size, 6);
universe@547 662 int result = cxBufferSeek(&buf, -6, SEEK_END);
universe@547 663 EXPECT_EQ(result, 0);
universe@547 664 EXPECT_EQ(buf.pos, 0);
universe@547 665 }
universe@547 666
universe@547 667 TEST_F(BufferSeek, EndInvalid) {
universe@547 668 ASSERT_EQ(buf.size, 6);
universe@547 669 int result = cxBufferSeek(&buf, 1, SEEK_END);
universe@547 670 EXPECT_NE(result, 0);
universe@547 671 EXPECT_EQ(buf.pos, 3);
universe@547 672 }
universe@547 673
universe@547 674 TEST_F(BufferSeek, WhenceInvalid) {
universe@547 675 ASSERT_EQ(buf.size, 6);
universe@547 676 ASSERT_EQ(buf.pos, 3);
universe@547 677 int result = cxBufferSeek(&buf, 2, 9000);
universe@547 678 EXPECT_NE(result, 0);
universe@547 679 EXPECT_EQ(buf.size, 6);
universe@547 680 EXPECT_EQ(buf.pos, 3);
universe@547 681 }

mercurial