Refactor IO, add buffered IO
I wasn't happy with existing implementation of the IO, so I decided to change it - as a result there is no longer BH_IOOpen and BH_IOClose and many IO operations are now optional (behind BH_IOCtl). Finnally implemented buffered IO and fixed size memory buffer IO.
This commit is contained in:
153
test/src/TestBytes.c
Normal file
153
test/src/TestBytes.c
Normal file
@@ -0,0 +1,153 @@
|
||||
#include <BH/IO.h>
|
||||
#include <BH/Unit.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
BH_UNIT_TEST(Null)
|
||||
{
|
||||
char data;
|
||||
|
||||
BH_VERIFY(BH_BytesNew(NULL, 0, NULL) == NULL);
|
||||
BH_VERIFY(BH_BytesNew(&data, 0, NULL) == NULL);
|
||||
BH_VERIFY(BH_BytesNew(NULL, 1234, NULL) == NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
BH_UNIT_TEST(Read)
|
||||
{
|
||||
BH_IO *io;
|
||||
char buffer1[14] = "Hello, world!";
|
||||
char buffer2[14];
|
||||
size_t size;
|
||||
|
||||
BH_VERIFY((io = BH_BytesNew(buffer1, 14, NULL)) != NULL);
|
||||
BH_VERIFY(BH_IORead(io, buffer2, 14, &size) == BH_OK);
|
||||
BH_VERIFY(size == 14);
|
||||
BH_VERIFY(memcmp(buffer1, buffer2, 14) == 0);
|
||||
BH_VERIFY(BH_IOEndOfFile(io));
|
||||
|
||||
BH_VERIFY(BH_IORead(io, buffer2, 14, &size) == BH_OK);
|
||||
BH_VERIFY(size == 0);
|
||||
BH_VERIFY(BH_IOEndOfFile(io));
|
||||
BH_IOFree(io);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
BH_UNIT_TEST(Write)
|
||||
{
|
||||
BH_IO *io;
|
||||
char buffer[14];
|
||||
size_t size;
|
||||
|
||||
BH_VERIFY((io = BH_BytesNew(buffer, 14, NULL)) != NULL);
|
||||
BH_VERIFY(BH_IOWrite(io, "Hello, world!", 14, &size) == BH_OK);
|
||||
BH_VERIFY(size == 14);
|
||||
BH_VERIFY(memcmp(buffer, "Hello, world!", 14) == 0);
|
||||
|
||||
BH_VERIFY(BH_IOWrite(io, "Something", 10, &size) == BH_OK);
|
||||
BH_VERIFY(size == 0);
|
||||
BH_VERIFY(memcmp(buffer, "Hello, world!", 14) == 0);
|
||||
BH_IOFree(io);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
BH_UNIT_TEST(SeekTell)
|
||||
{
|
||||
BH_IO *io;
|
||||
char buffer[14] = "Hello, world!";
|
||||
char symbol;
|
||||
int64_t offset;
|
||||
size_t size;
|
||||
|
||||
BH_VERIFY((io = BH_BytesNew(buffer, 14, NULL)) != NULL);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(offset == 0);
|
||||
BH_VERIFY(BH_IORead(io, &symbol, 1, &size) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(size == 1);
|
||||
BH_VERIFY(symbol == 'H');
|
||||
BH_VERIFY(offset == 1);
|
||||
|
||||
BH_VERIFY(BH_IOSeek(io, 8, BH_IO_SEEK_SET) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(offset == 8);
|
||||
BH_VERIFY(BH_IORead(io, &symbol, 1, &size) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(size == 1);
|
||||
BH_VERIFY(symbol == 'o');
|
||||
BH_VERIFY(offset == 9);
|
||||
|
||||
BH_VERIFY(BH_IOSeek(io, -1, BH_IO_SEEK_CUR) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(offset == 8);
|
||||
BH_VERIFY(BH_IORead(io, &symbol, 1, &size) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(size == 1);
|
||||
BH_VERIFY(symbol == 'o');
|
||||
BH_VERIFY(offset == 9);
|
||||
|
||||
BH_VERIFY(BH_IOSeek(io, -123456, BH_IO_SEEK_CUR) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(offset == 0);
|
||||
BH_VERIFY(BH_IORead(io, &symbol, 1, &size) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(size == 1);
|
||||
BH_VERIFY(symbol == 'H');
|
||||
BH_VERIFY(offset == 1);
|
||||
|
||||
BH_VERIFY(BH_IOSeek(io, 123456, BH_IO_SEEK_CUR) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(offset == 14);
|
||||
BH_VERIFY(BH_IORead(io, &symbol, 1, &size) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(size == 0);
|
||||
BH_VERIFY(offset == 14);
|
||||
|
||||
BH_VERIFY(BH_IOSeek(io, -1, BH_IO_SEEK_SET) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(offset == 0);
|
||||
|
||||
BH_VERIFY(BH_IOSeek(io, 123456, BH_IO_SEEK_SET) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(offset == 14);
|
||||
|
||||
BH_VERIFY(BH_IOSeek(io, 123456, BH_IO_SEEK_END) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(offset == 14);
|
||||
|
||||
BH_VERIFY(BH_IOSeek(io, -123456, BH_IO_SEEK_END) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(offset == 0);
|
||||
|
||||
BH_VERIFY(BH_IOSeek(io, -2, BH_IO_SEEK_END) == BH_OK);
|
||||
BH_VERIFY(BH_IOTell(io, &offset) == BH_OK);
|
||||
BH_VERIFY(offset == 12);
|
||||
BH_VERIFY(BH_IORead(io, &symbol, 1, &size) == BH_OK);
|
||||
BH_VERIFY(size == 1);
|
||||
BH_VERIFY(symbol == '!');
|
||||
|
||||
BH_IOFree(io);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc,
|
||||
char **argv)
|
||||
{
|
||||
BH_UNUSED(argc);
|
||||
BH_UNUSED(argv);
|
||||
|
||||
BH_UNIT_ADD(Null);
|
||||
BH_UNIT_ADD(Write);
|
||||
BH_UNIT_ADD(Read);
|
||||
BH_UNIT_ADD(SeekTell);
|
||||
|
||||
|
||||
return BH_UnitRun();
|
||||
}
|
||||
Reference in New Issue
Block a user