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