Wed, 10 Oct 2012 14:18:06 +0200
added autoextend feature to buffer
and we celebrate the 50th test case
universe@56 | 1 | /* |
universe@56 | 2 | * |
universe@56 | 3 | */ |
universe@56 | 4 | |
universe@60 | 5 | #include "buffer_tests.h" |
universe@56 | 6 | |
universe@60 | 7 | UCX_TEST_IMPLEMENT(test_ucx_buffer_seektell) { |
universe@56 | 8 | char *buffer = malloc(16); |
universe@56 | 9 | memset(buffer, 32, 7); |
universe@56 | 10 | buffer[7] = 0; |
universe@56 | 11 | |
universe@61 | 12 | UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); |
universe@56 | 13 | int r; |
universe@56 | 14 | |
universe@56 | 15 | UCX_TEST_BEGIN |
universe@56 | 16 | |
universe@60 | 17 | r = ucx_buffer_seek(b, 5, SEEK_SET); |
universe@56 | 18 | UCX_TEST_ASSERT(r == 0, "seek SET+5 failed"); |
universe@63 | 19 | UCX_TEST_ASSERT(b->pos == 5, "seek SET+5 set wrong position"); |
universe@56 | 20 | |
universe@60 | 21 | r = ucx_buffer_seek(b, 20, SEEK_SET); |
universe@56 | 22 | UCX_TEST_ASSERT(r != 0, "seek beyond bounds shall fail"); |
universe@63 | 23 | UCX_TEST_ASSERT(b->pos == 5, |
universe@56 | 24 | "failed seek shall leave pos unchanged"); |
universe@56 | 25 | |
universe@60 | 26 | r = ucx_buffer_seek(b, 5, SEEK_CUR); |
universe@56 | 27 | UCX_TEST_ASSERT(r == 0, "seek CUR+5 failed"); |
universe@63 | 28 | UCX_TEST_ASSERT(b->pos == 10, "seek CUR+5 set wrong position"); |
universe@56 | 29 | |
universe@60 | 30 | r = ucx_buffer_seek(b, 10, SEEK_CUR); |
universe@56 | 31 | UCX_TEST_ASSERT(r != 0, "seek CUR beyond bounds shall fail"); |
universe@63 | 32 | UCX_TEST_ASSERT(b->pos == 10, |
universe@56 | 33 | "failed seek shall leave pos unchanged"); |
universe@56 | 34 | |
universe@60 | 35 | r = ucx_buffer_seek(b, -5, SEEK_END); |
universe@56 | 36 | UCX_TEST_ASSERT(r == 0, "seek END-5 failed"); |
universe@63 | 37 | UCX_TEST_ASSERT(b->pos == 2, "seek END-5 set wrong position"); |
universe@56 | 38 | |
universe@60 | 39 | r = ucx_buffer_seek(b, -10, SEEK_END); |
universe@56 | 40 | UCX_TEST_ASSERT(r != 0, "seek END beyond bounds shall fail"); |
universe@63 | 41 | UCX_TEST_ASSERT(b->pos == 2, |
universe@56 | 42 | "failed seek shall leave pos unchanged"); |
universe@56 | 43 | |
universe@56 | 44 | UCX_TEST_END |
universe@56 | 45 | |
universe@60 | 46 | ucx_buffer_free(b); |
universe@56 | 47 | free(buffer); |
universe@56 | 48 | } |
universe@56 | 49 | |
universe@60 | 50 | UCX_TEST_IMPLEMENT(test_ucx_buffer_putc) { |
universe@56 | 51 | char *buffer = malloc(16); |
universe@56 | 52 | memset(buffer, 32, 16); |
universe@56 | 53 | |
universe@61 | 54 | UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); |
universe@56 | 55 | int r; |
universe@56 | 56 | |
universe@56 | 57 | UCX_TEST_BEGIN |
universe@56 | 58 | |
universe@60 | 59 | ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); |
universe@63 | 60 | UCX_TEST_ASSERT(b->pos == 3, "pos wrong after first 3 puts"); |
universe@60 | 61 | ucx_buffer_seek(b, 10, SEEK_CUR); |
universe@60 | 62 | ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); |
universe@63 | 63 | UCX_TEST_ASSERT(b->pos == 16, "pos wrong after last 3 puts"); |
universe@60 | 64 | UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof not set"); |
universe@62 | 65 | UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, |
universe@62 | 66 | "put shall return EOF when buffer is full"); |
universe@56 | 67 | UCX_TEST_ASSERT(memcmp(buffer, "000 000", 16) == 0, |
universe@56 | 68 | "buffer contains incorrect content"); |
universe@56 | 69 | |
universe@56 | 70 | UCX_TEST_END |
universe@56 | 71 | |
universe@60 | 72 | ucx_buffer_free(b); |
universe@56 | 73 | free(buffer); |
universe@56 | 74 | } |
universe@56 | 75 | |
universe@60 | 76 | UCX_TEST_IMPLEMENT(test_ucx_buffer_getc) { |
universe@56 | 77 | char *buffer = malloc(16); |
universe@56 | 78 | memset(buffer, 32, 8); |
universe@56 | 79 | for (int i = 8; i < 16 ; i++) { |
universe@56 | 80 | buffer[i] = 40+i; |
universe@56 | 81 | } |
universe@56 | 82 | |
universe@61 | 83 | UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); |
universe@56 | 84 | int r; |
universe@56 | 85 | |
universe@56 | 86 | UCX_TEST_BEGIN |
universe@56 | 87 | |
universe@56 | 88 | char rb[16]; |
universe@56 | 89 | for (int i = 0 ; i < 16 ; i++) { |
universe@63 | 90 | UCX_TEST_ASSERT(b->pos == i, "pos wrong during read loop"); |
universe@60 | 91 | UCX_TEST_ASSERT(!ucx_buffer_eof(b), |
universe@56 | 92 | "EOF shall not be set during read loop"); |
universe@60 | 93 | rb[i] = ucx_buffer_getc(b); |
universe@56 | 94 | } |
universe@63 | 95 | UCX_TEST_ASSERT(b->pos == 16, "pos wrong after read loop"); |
universe@60 | 96 | UCX_TEST_ASSERT(ucx_buffer_eof(b), "EOF not set"); |
universe@56 | 97 | UCX_TEST_ASSERT(memcmp(rb, " 01234567", 16) == 0, |
universe@56 | 98 | "read data incorrect"); |
universe@56 | 99 | |
universe@56 | 100 | UCX_TEST_END |
universe@56 | 101 | |
universe@60 | 102 | ucx_buffer_free(b); |
universe@56 | 103 | free(buffer); |
universe@56 | 104 | } |
universe@56 | 105 | |
universe@60 | 106 | UCX_TEST_IMPLEMENT(test_ucx_buffer_write) { |
universe@56 | 107 | char *buffer = malloc(16); |
universe@56 | 108 | memset(buffer, 32, 8); |
universe@56 | 109 | for (int i = 8; i < 16 ; i++) { |
universe@56 | 110 | buffer[i] = 40+i; |
universe@56 | 111 | } |
universe@56 | 112 | |
universe@61 | 113 | UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); |
universe@56 | 114 | int r; |
universe@56 | 115 | |
universe@56 | 116 | UCX_TEST_BEGIN |
universe@56 | 117 | |
universe@56 | 118 | char* teststring = "this is way too much"; |
universe@60 | 119 | r = ucx_buffer_write(teststring, 1, 20, b); |
universe@56 | 120 | UCX_TEST_ASSERT(r == 16, "string not correctly trimed"); |
universe@56 | 121 | UCX_TEST_ASSERT(memcmp(buffer, teststring, 16) == 0, |
universe@56 | 122 | "buffer data incorrect"); |
universe@60 | 123 | UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof shall be set"); |
universe@56 | 124 | |
universe@60 | 125 | ucx_buffer_seek(b, 8, SEEK_SET); |
universe@60 | 126 | r = ucx_buffer_write("not", 1, 3, b); |
universe@56 | 127 | UCX_TEST_ASSERT(r == 3, "three bytes should be replace"); |
universe@56 | 128 | UCX_TEST_ASSERT(memcmp(buffer, "this is not too much", 16) == 0, |
universe@56 | 129 | "modified buffer is incorrect"); |
universe@56 | 130 | |
universe@56 | 131 | char* threebytestring = " t h r e e "; |
universe@56 | 132 | memset(buffer, 49, 16); |
universe@60 | 133 | ucx_buffer_seek(b, 0, SEEK_SET); |
universe@60 | 134 | r = ucx_buffer_write(threebytestring, 3, 6, b); |
universe@56 | 135 | UCX_TEST_ASSERT(r == 15, "three byte string not correctly trimed"); |
universe@63 | 136 | UCX_TEST_ASSERT(b->pos == 15, |
universe@56 | 137 | "position after write of three byte string incorrect"); |
universe@60 | 138 | UCX_TEST_ASSERT(!ucx_buffer_eof(b), "eof shall not be set"); |
universe@56 | 139 | UCX_TEST_ASSERT(memcmp(buffer, " t h r e e1", 16) == 0, |
universe@56 | 140 | "bufer is incorrect after three byte string has been written"); |
universe@56 | 141 | |
universe@56 | 142 | UCX_TEST_END |
universe@56 | 143 | |
universe@60 | 144 | ucx_buffer_free(b); |
universe@56 | 145 | free(buffer); |
universe@56 | 146 | } |
universe@56 | 147 | |
universe@64 | 148 | UCX_TEST_IMPLEMENT(test_ucx_buffer_write_ax) { |
universe@64 | 149 | char *buffer = malloc(4); |
universe@64 | 150 | |
universe@64 | 151 | UcxBuffer *b = ucx_buffer_new(buffer, 16, |
universe@64 | 152 | UCX_BUFFER_AUTOEXTEND | UCX_BUFFER_AUTOFREE); |
universe@64 | 153 | int r; |
universe@64 | 154 | |
universe@64 | 155 | UCX_TEST_BEGIN |
universe@64 | 156 | |
universe@64 | 157 | char* teststring = "this is way too much"; |
universe@64 | 158 | r = ucx_buffer_write(teststring, 1, 20, b); |
universe@64 | 159 | buffer = b->space; /* autoextend is enabled, so we MUST retrieve pointer */ |
universe@64 | 160 | UCX_TEST_ASSERT(r == 20, "not all characters written"); |
universe@64 | 161 | UCX_TEST_ASSERT(b->size == 32, "buffer not properly extended"); |
universe@64 | 162 | UCX_TEST_ASSERT(b->pos == 20, "position incorrect"); |
universe@64 | 163 | UCX_TEST_ASSERT(memcmp(buffer, |
universe@64 | 164 | "this is way too much\0\0\0\0\0\0\0\0\0\0\0\0", 32) == 0, |
universe@64 | 165 | "incorrect buffer content"); |
universe@64 | 166 | |
universe@64 | 167 | UCX_TEST_END |
universe@64 | 168 | |
universe@64 | 169 | ucx_buffer_free(b); |
universe@64 | 170 | } |
universe@64 | 171 | |
universe@60 | 172 | UCX_TEST_IMPLEMENT(test_ucx_buffer_read) { |
universe@56 | 173 | char *buffer = malloc(16); |
universe@56 | 174 | memset(buffer, 56, 8); |
universe@56 | 175 | for (int i = 8; i < 16 ; i++) { |
universe@56 | 176 | buffer[i] = 40+i; |
universe@56 | 177 | } |
universe@56 | 178 | |
universe@61 | 179 | UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); |
universe@56 | 180 | int r; |
universe@56 | 181 | |
universe@56 | 182 | UCX_TEST_BEGIN |
universe@56 | 183 | |
universe@56 | 184 | char rb[16]; |
universe@56 | 185 | memset(rb, 32, 16); |
universe@56 | 186 | |
universe@60 | 187 | ucx_buffer_seek(b, 8, SEEK_SET); |
universe@60 | 188 | r = ucx_buffer_read(rb, 1, 16, b); |
universe@56 | 189 | UCX_TEST_ASSERT(r == 8, "read did not stop at buffer end"); |
universe@56 | 190 | UCX_TEST_ASSERT(memcmp(rb, "01234567 ", 16) == 0, |
universe@56 | 191 | "buffer incorrect after first read"); |
universe@60 | 192 | UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof shall be set"); |
universe@56 | 193 | |
universe@60 | 194 | ucx_buffer_seek(b, 0, SEEK_SET); |
universe@60 | 195 | r = ucx_buffer_read(rb+8, 1, 8, b); |
universe@56 | 196 | UCX_TEST_ASSERT(r == 8, "read did not read the specified amount of bytes"); |
universe@56 | 197 | UCX_TEST_ASSERT(memcmp(rb, "0123456788888888", 16) == 0, |
universe@56 | 198 | "buffer incorrect after second read"); |
universe@56 | 199 | |
universe@60 | 200 | ucx_buffer_seek(b, 0, SEEK_SET); |
universe@60 | 201 | r = ucx_buffer_read(rb, 3, 6, b); |
universe@56 | 202 | UCX_TEST_ASSERT(r == 15, |
universe@56 | 203 | "three byte read did not read the desired amount of bytes"); |
universe@56 | 204 | UCX_TEST_ASSERT(memcmp(rb, "8888888801234568", 16) == 0, |
universe@56 | 205 | "buffer incorrect after three byte read"); |
universe@56 | 206 | |
universe@56 | 207 | UCX_TEST_END |
universe@56 | 208 | |
universe@60 | 209 | ucx_buffer_free(b); |
universe@56 | 210 | free(buffer); |
universe@56 | 211 | } |
universe@62 | 212 | |
universe@62 | 213 | UCX_TEST_IMPLEMENT(test_ucx_buffer_extract) { |
universe@62 | 214 | char *buffer = malloc(16); |
universe@62 | 215 | strcpy(buffer, "this is a test!"); |
universe@62 | 216 | |
universe@62 | 217 | UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE), |
universe@62 | 218 | *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_DEFAULT); |
universe@62 | 219 | |
universe@62 | 220 | UCX_TEST_BEGIN |
universe@63 | 221 | UCX_TEST_ASSERT((dst->flags & UCX_BUFFER_AUTOFREE) == UCX_BUFFER_AUTOFREE, |
universe@62 | 222 | "autofree flag shall be enforced"); |
universe@63 | 223 | UCX_TEST_ASSERT(dst->size == 5, "wrong size for new buffer"); |
universe@62 | 224 | char rb[5]; |
universe@62 | 225 | ucx_buffer_read(rb, 1, 5, dst); |
universe@62 | 226 | UCX_TEST_ASSERT(memcmp(rb, "is a ", 5) == 0, |
universe@62 | 227 | "new buffer has incorrect content"); |
universe@62 | 228 | |
universe@62 | 229 | UCX_TEST_ASSERT(ucx_buffer_extract(dst, 3, 3, UCX_BUFFER_DEFAULT) == NULL, |
universe@62 | 230 | "extract shall fail on invalid bounds"); |
universe@62 | 231 | |
universe@62 | 232 | UCX_TEST_END |
universe@62 | 233 | |
universe@62 | 234 | ucx_buffer_free(dst); |
universe@62 | 235 | ucx_buffer_free(src); |
universe@62 | 236 | } |