test/buffer_tests.c

changeset 76
655020a30e77
parent 71
303dabadff1c
child 83
3b552d7a9610
--- a/test/buffer_tests.c	Sun Nov 04 20:50:12 2012 +0100
+++ b/test/buffer_tests.c	Fri Nov 30 13:10:58 2012 +0100
@@ -5,11 +5,8 @@
 #include "buffer_tests.h"
 
 UCX_TEST_IMPLEMENT(test_ucx_buffer_seektell) {
-    char *buffer = (char*) malloc(16);
-    memset(buffer, 32, 7);
-    buffer[7] = 0;
-
-    UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
+    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
+    b->size = 16; // less than capacity
     int r;
 
     UCX_TEST_BEGIN
@@ -34,17 +31,16 @@
 
     r = ucx_buffer_seek(b, -5, SEEK_END);
     UCX_TEST_ASSERT(r == 0, "seek END-5 failed");
-    UCX_TEST_ASSERT(b->pos == 2, "seek END-5 set wrong position");
+    UCX_TEST_ASSERT(b->pos == 11, "seek END-5 set wrong position");
 
-    r = ucx_buffer_seek(b, -10, SEEK_END);
+    r = ucx_buffer_seek(b, -20, SEEK_END);
     UCX_TEST_ASSERT(r != 0, "seek END beyond bounds shall fail");
-    UCX_TEST_ASSERT(b->pos == 2,
+    UCX_TEST_ASSERT(b->pos == 11,
             "failed seek shall leave pos unchanged");
 
     UCX_TEST_END
 
     ucx_buffer_free(b);
-    free(buffer);
 }
 
 UCX_TEST_IMPLEMENT(test_ucx_buffer_putc) {
@@ -52,19 +48,34 @@
     memset(buffer, 32, 16);
 
     UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
+    b->size = b->capacity;
     int r;
 
     UCX_TEST_BEGIN
 
-    ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48);
+    ucx_buffer_putc(b, '0');
+    ucx_buffer_putc(b, '0');
+    ucx_buffer_putc(b, '0');
+    
     UCX_TEST_ASSERT(b->pos == 3, "pos wrong after first 3 puts");
     ucx_buffer_seek(b, 10, SEEK_CUR);
-    ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48);
+    
+    ucx_buffer_putc(b, '0');
+    ucx_buffer_putc(b, '0');
+    ucx_buffer_putc(b, '0');
+    
     UCX_TEST_ASSERT(b->pos == 16, "pos wrong after last 3 puts");
     UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof not set");
     UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF,
             "put shall return EOF when buffer is full");
-    UCX_TEST_ASSERT(memcmp(buffer, "000          000", 16) == 0,
+    
+    ucx_buffer_seek(b, 3, SEEK_SET);
+    ucx_buffer_putc(b, 'a');
+    ucx_buffer_putc(b, 'b');
+    ucx_buffer_putc(b, 'c');
+    
+    UCX_TEST_ASSERT(b->size == 16, "wrong size after seek and puts");
+    UCX_TEST_ASSERT(memcmp(buffer, "000abc       000", 16) == 0,
             "buffer contains incorrect content");
 
     UCX_TEST_END
@@ -73,6 +84,30 @@
     free(buffer);
 }
 
+UCX_TEST_IMPLEMENT(test_ucx_buffer_putc_ax) {
+    UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
+    
+    UCX_TEST_BEGIN
+    
+    ucx_buffer_putc(b, '0');
+    ucx_buffer_putc(b, '1');
+    
+    UCX_TEST_ASSERT(b->pos == 2, "pos wrong after first 2 puts");
+    UCX_TEST_ASSERT(b->capacity == 2, "buffer erroneously extended");
+    
+    ucx_buffer_putc(b, 'a');
+    
+    UCX_TEST_ASSERT(b->pos == 3, "pos wrong after 1 put");
+    UCX_TEST_ASSERT(b->capacity == 4, "buffer not properly extended");
+    UCX_TEST_ASSERT(b->size == 3, "wrong buffer size");
+    
+    UCX_TEST_ASSERT(b->space[2] == 'a', "wrong content");
+    
+    UCX_TEST_END
+    
+    
+}
+
 UCX_TEST_IMPLEMENT(test_ucx_buffer_getc) {
     char *buffer = (char*) malloc(16);
     memset(buffer, 32, 8);
@@ -81,6 +116,7 @@
     }
 
     UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
+    b->size = b->capacity;
     int r;
 
     UCX_TEST_BEGIN
@@ -132,7 +168,7 @@
     memset(buffer, 49, 16);
     ucx_buffer_seek(b, 0, SEEK_SET);
     r = ucx_buffer_write((void*)threebytestring, 3, 6, b);
-    UCX_TEST_ASSERT(r == 15, "three byte string not correctly trimed");
+    UCX_TEST_ASSERT(r == 5, "three byte string not correctly trimed");
     UCX_TEST_ASSERT(b->pos == 15,
             "position after write of three byte string incorrect");
     UCX_TEST_ASSERT(!ucx_buffer_eof(b), "eof shall not be set");
@@ -146,7 +182,7 @@
 }
 
 UCX_TEST_IMPLEMENT(test_ucx_buffer_write_ax) {
-    char *buffer = (char*) malloc(4);
+    char *buffer = (char*) malloc(16);
 
     UcxBuffer *b = ucx_buffer_new(buffer, 16,
             UCX_BUFFER_AUTOEXTEND | UCX_BUFFER_AUTOFREE);
@@ -158,7 +194,7 @@
     r = ucx_buffer_write((void*)teststring, 1, 20, b);
     buffer = (char*) b->space; /*autoextend enabled, we MUST retrieve pointer*/
     UCX_TEST_ASSERT(r == 20, "not all characters written");
-    UCX_TEST_ASSERT(b->size == 32, "buffer not properly extended");
+    UCX_TEST_ASSERT(b->capacity == 32, "buffer not properly extended");
     UCX_TEST_ASSERT(b->pos == 20, "position incorrect");
     UCX_TEST_ASSERT(memcmp(buffer,
             "this is way too much\0\0\0\0\0\0\0\0\0\0\0\0", 32) == 0,
@@ -170,54 +206,53 @@
 }
 
 UCX_TEST_IMPLEMENT(test_ucx_buffer_read) {
-    char *buffer = (char*) malloc(16);
-    memset(buffer, 56, 8);
-    for (int i = 8; i < 16 ; i++) {
-        buffer[i] = 40+i;
-    }
-
-    UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
+    UcxBuffer *b = ucx_buffer_new(NULL, 8, UCX_BUFFER_AUTOFREE);
+    
+    char buf[32];
+    memset(buf, 'X', 32);
     int r;
-
+    
     UCX_TEST_BEGIN
-
-    char rb[16];
-    memset(rb, 32, 16);
-
-    ucx_buffer_seek(b, 8, SEEK_SET);
-    r = ucx_buffer_read(rb, 1, 16, b);
-    UCX_TEST_ASSERT(r == 8, "read did not stop at buffer end");
-    UCX_TEST_ASSERT(memcmp(rb, "01234567        ", 16) == 0,
+    
+    ucx_buffer_write("01234567", 1, 8, b);
+    UCX_TEST_ASSERT(b->pos == 8, "buffer not correctly filled");
+    b->pos = 0;
+    
+    r = ucx_buffer_read(buf, 1, 2, b);
+    UCX_TEST_ASSERT(r == 2, "wrong number of bytes read");
+    UCX_TEST_ASSERT(buf[0] == '0' && buf[1] == '1' && buf[2] == 'X',
             "buffer incorrect after first read");
-    UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof shall be set");
-
-    ucx_buffer_seek(b, 0, SEEK_SET);
-    r = ucx_buffer_read(rb+8, 1, 8, b);
-    UCX_TEST_ASSERT(r == 8, "read did not read the specified amount of bytes");
-    UCX_TEST_ASSERT(memcmp(rb, "0123456788888888", 16) == 0,
-                "buffer incorrect after second read");
-
+    
+    r = ucx_buffer_read(buf + 2, 1, 8, b);
+    UCX_TEST_ASSERT(r == 6, "wrong number of bytes read(2)");
+    UCX_TEST_ASSERT(memcmp(buf, "01234567XX", 10) == 0,
+            "buffer incorrect after second read");
+    
+    memset(buf, 'X', 32);
     ucx_buffer_seek(b, 0, SEEK_SET);
-    r = ucx_buffer_read(rb, 3, 6, b);
-    UCX_TEST_ASSERT(r == 15,
-            "three byte read did not read the desired amount of bytes");
-    UCX_TEST_ASSERT(memcmp(rb, "8888888801234568", 16) == 0,
-                    "buffer incorrect after three byte read");
-
+    r = ucx_buffer_read(buf, 3, 3, b);
+    
+    UCX_TEST_ASSERT(r == 2, "wrong number of blocks read");
+    UCX_TEST_ASSERT(memcmp(buf, "012345XX", 8) == 0,
+            "buffer incorrect after three byte read");
+    
+    
     UCX_TEST_END
-
-    ucx_buffer_free(b);
-    free(buffer);
+    
+    
 }
 
 UCX_TEST_IMPLEMENT(test_ucx_buffer_extract) {
     char *buffer = (char*) malloc(16);
     strcpy(buffer, "this is a test!");
 
-    UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE),
-            *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_DEFAULT);
+    UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
+    src->size = 15;
+    UcxBuffer *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_DEFAULT);
 
     UCX_TEST_BEGIN
+    UCX_TEST_ASSERT(dst != NULL, "ucx_buffer_extract returned NULL");
+            
     UCX_TEST_ASSERT((dst->flags & UCX_BUFFER_AUTOFREE) == UCX_BUFFER_AUTOFREE,
             "autofree flag shall be enforced");
     UCX_TEST_ASSERT(dst->size == 5, "wrong size for new buffer");
@@ -234,3 +269,48 @@
     ucx_buffer_free(dst);
     ucx_buffer_free(src);
 }
+
+UCX_TEST_IMPLEMENT(test_ucx_buffer_generic_copy) {
+    UcxBuffer *b1 = ucx_buffer_new(NULL, 64, UCX_BUFFER_DEFAULT);
+    UcxBuffer *b2 = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
+    
+    UCX_TEST_BEGIN
+    
+    ucx_buffer_write("01234567", 1, 8, b1);
+    ucx_buffer_write("abcdefgh", 1, 8, b1);
+    UCX_TEST_ASSERT(b1->size == 16, "failed to fill buffer b1");
+    ucx_buffer_seek(b1, 0, SEEK_SET);
+    
+    size_t ncp = ucx_buffer_copy(b1, b2, ucx_buffer_read, ucx_buffer_write);
+    UCX_TEST_ASSERT(ncp == 16, "wrong number of copied bytes");
+    UCX_TEST_ASSERT(b2->size == 16, "b2 has wrong size");
+    UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
+            "b1 and b2 have not the same content");
+    
+    memset(b2->space, 0, b2->capacity);
+    b2->pos = 0;
+    b2->size = 0;
+    ucx_buffer_seek(b1, 0, SEEK_SET);
+    
+    FILE *file = tmpfile();
+    UCX_TEST_ASSERT(file, "test file cannot be opened, test aborted");
+    
+    ncp = ucx_buffer_copy(b1, file, ucx_buffer_read, fwrite);
+    UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes to file");
+    
+    fseek(file, 0, SEEK_SET);
+    
+    ncp = ucx_buffer_copy(file, b2, fread, ucx_buffer_write);
+    UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes from file");
+    
+    UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
+            "b1 and b2 content mismatch");
+    
+    fclose(file);
+    
+    
+    UCX_TEST_END
+    
+    ucx_buffer_free(b1);
+    ucx_buffer_free(b2);
+}

mercurial