Wed, 10 Oct 2012 13:58:51 +0200
discarded fascism from buffer
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@60 | 148 | UCX_TEST_IMPLEMENT(test_ucx_buffer_read) { |
universe@56 | 149 | char *buffer = malloc(16); |
universe@56 | 150 | memset(buffer, 56, 8); |
universe@56 | 151 | for (int i = 8; i < 16 ; i++) { |
universe@56 | 152 | buffer[i] = 40+i; |
universe@56 | 153 | } |
universe@56 | 154 | |
universe@61 | 155 | UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT); |
universe@56 | 156 | int r; |
universe@56 | 157 | |
universe@56 | 158 | UCX_TEST_BEGIN |
universe@56 | 159 | |
universe@56 | 160 | char rb[16]; |
universe@56 | 161 | memset(rb, 32, 16); |
universe@56 | 162 | |
universe@60 | 163 | ucx_buffer_seek(b, 8, SEEK_SET); |
universe@60 | 164 | r = ucx_buffer_read(rb, 1, 16, b); |
universe@56 | 165 | UCX_TEST_ASSERT(r == 8, "read did not stop at buffer end"); |
universe@56 | 166 | UCX_TEST_ASSERT(memcmp(rb, "01234567 ", 16) == 0, |
universe@56 | 167 | "buffer incorrect after first read"); |
universe@60 | 168 | UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof shall be set"); |
universe@56 | 169 | |
universe@60 | 170 | ucx_buffer_seek(b, 0, SEEK_SET); |
universe@60 | 171 | r = ucx_buffer_read(rb+8, 1, 8, b); |
universe@56 | 172 | UCX_TEST_ASSERT(r == 8, "read did not read the specified amount of bytes"); |
universe@56 | 173 | UCX_TEST_ASSERT(memcmp(rb, "0123456788888888", 16) == 0, |
universe@56 | 174 | "buffer incorrect after second read"); |
universe@56 | 175 | |
universe@60 | 176 | ucx_buffer_seek(b, 0, SEEK_SET); |
universe@60 | 177 | r = ucx_buffer_read(rb, 3, 6, b); |
universe@56 | 178 | UCX_TEST_ASSERT(r == 15, |
universe@56 | 179 | "three byte read did not read the desired amount of bytes"); |
universe@56 | 180 | UCX_TEST_ASSERT(memcmp(rb, "8888888801234568", 16) == 0, |
universe@56 | 181 | "buffer incorrect after three byte read"); |
universe@56 | 182 | |
universe@56 | 183 | UCX_TEST_END |
universe@56 | 184 | |
universe@60 | 185 | ucx_buffer_free(b); |
universe@56 | 186 | free(buffer); |
universe@56 | 187 | } |
universe@62 | 188 | |
universe@62 | 189 | UCX_TEST_IMPLEMENT(test_ucx_buffer_extract) { |
universe@62 | 190 | char *buffer = malloc(16); |
universe@62 | 191 | strcpy(buffer, "this is a test!"); |
universe@62 | 192 | |
universe@62 | 193 | UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE), |
universe@62 | 194 | *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_DEFAULT); |
universe@62 | 195 | |
universe@62 | 196 | UCX_TEST_BEGIN |
universe@63 | 197 | UCX_TEST_ASSERT((dst->flags & UCX_BUFFER_AUTOFREE) == UCX_BUFFER_AUTOFREE, |
universe@62 | 198 | "autofree flag shall be enforced"); |
universe@63 | 199 | UCX_TEST_ASSERT(dst->size == 5, "wrong size for new buffer"); |
universe@62 | 200 | char rb[5]; |
universe@62 | 201 | ucx_buffer_read(rb, 1, 5, dst); |
universe@62 | 202 | UCX_TEST_ASSERT(memcmp(rb, "is a ", 5) == 0, |
universe@62 | 203 | "new buffer has incorrect content"); |
universe@62 | 204 | |
universe@62 | 205 | UCX_TEST_ASSERT(ucx_buffer_extract(dst, 3, 3, UCX_BUFFER_DEFAULT) == NULL, |
universe@62 | 206 | "extract shall fail on invalid bounds"); |
universe@62 | 207 | |
universe@62 | 208 | UCX_TEST_END |
universe@62 | 209 | |
universe@62 | 210 | ucx_buffer_free(dst); |
universe@62 | 211 | ucx_buffer_free(src); |
universe@62 | 212 | } |