blob: 61322c9364d54e5c1616eda3d2bb17057cc56b75 [file] [log] [blame] [edit]
#include "Config.h"
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#include <time.h>
#include "Bootstrap.h"
#include "OutputStream.h"
#include "File.h"
#include "Str.h"
/**
* OutputStream.c unit tests.
*/
#define STDOUT 1
#define TIMEOUT 50
int main(void) {
OutputStream_T out = NULL;
Bootstrap(); // Need to initialize library
printf("============> Start OutputStream Tests\n\n");
printf("=> Test0: create/destroy the file input stream\n");
{
out = OutputStream_new(STDOUT);
assert(!OutputStream_isClosed(out));
OutputStream_free(&out);
assert(out == NULL);
}
printf("=> Test0: OK\n\n");
printf("=> Test1: get/set timeout\n");
{
out = OutputStream_new(STDOUT);
printf("\tCurrent timeout: %ldms\n", OutputStream_getTimeout(out));
OutputStream_setTimeout(out, TIMEOUT);
assert(OutputStream_getTimeout(out) == TIMEOUT);
printf("\tTimeout set to: %dms\n", TIMEOUT);
OutputStream_free(&out);
}
printf("=> Test1: OK\n\n");
printf("=> Test2: write buffer bytes, test flush and status\n");
{
int bytes = strlen("line1\nline2\nline3\n");
char data[] = "line1\nline2\nline3\n";
out = OutputStream_new(STDOUT);
assert(0 == OutputStream_buffered(out));
assert(bytes == OutputStream_write(out, data, (int)strlen(data)));
assert(bytes == OutputStream_buffered(out));
assert(0 == OutputStream_getBytesWritten(out));
OutputStream_flush(out);
assert(bytes == OutputStream_getBytesWritten(out));
// Test writing lower bytes
OutputStream_clear(out);
char b[] = {0,0,0,0};
assert(OutputStream_write(out, b, 4) == 4);
OutputStream_free(&out);
}
printf("=> Test2: OK\n\n");
printf("=> Test3: printf format\n");
{
out = OutputStream_new(STDOUT);
// Test supported format specifiers
assert(OutputStream_print(out, "%s", "hello") == 5);
assert(OutputStream_print(out, "%c", 'h') == 1);
assert(OutputStream_print(out, "%d", 12345) == 5);
assert(OutputStream_print(out, "%i", -12345) == 6);
assert(OutputStream_print(out, "%u", 12345) == 5);
assert(OutputStream_print(out, "%o", 8) == 2); //10
assert(OutputStream_print(out, "%x", 255) == 2); //ff
assert(OutputStream_print(out, "%e", 12.34) == 12); //1.234000e+01
assert(OutputStream_print(out, "%f", -12.34) == 10); //-12.340000
assert(OutputStream_print(out, "%g", 12.34) == 6); //012.34
OutputStream_print(out, "%p", out);
assert(OutputStream_print(out, "%%hello%%") == 7);
// Length modifier
assert(OutputStream_print(out, "%ld", 32767L) == 5);
assert(OutputStream_print(out, "%li", -32767L) == 6);
assert(OutputStream_print(out, "%lu", 32767L) == 5);
assert(OutputStream_print(out, "%lo", 32767L) == 5); //77777
assert(OutputStream_print(out, "%lx", 32767L) == 4); //7fff
// Test width and precision
assert(OutputStream_print(out, "%16.16s\n%16.16s\n", "hello", "world") == 34);
assert(OutputStream_print(out, "%-16.16s\n%-16.16s\n", "hello", "world") == 34);
assert(OutputStream_print(out, "%.2f", 12.3456789) == 5); //12.35
assert(OutputStream_print(out, "%02d", 3) == 2); // 03
OutputStream_clear(out);
OutputStream_free(&out);
}
printf("=> Test3: OK\n\n");
printf("=> Test4: write two concatenated lines\n");
{
int i = 0;
out = OutputStream_new(STDOUT);
while (i++ < 2) {
OutputStream_print(out, "line%d", i);
}
OutputStream_print(out, "\n");
OutputStream_flush(out);
OutputStream_free(&out);
}
printf("=> Test4: OK\n\n");
printf("=> Test5: output reset - just the line[5-9] should show\n");
{
int i = 0;
out = OutputStream_new(STDOUT);
while (i++ < 9) {
OutputStream_print(out, "line%d\n", i);
if (i == 4) {
OutputStream_clear(out);
}
}
OutputStream_flush(out);
OutputStream_free(&out);
}
printf("=> Test5: OK\n\n");
printf("=> Test6: wrong descriptor - expecting write fail\n");
{
out = OutputStream_new(999);
TRY
OutputStream_print(out, "Should not show");
assert(OutputStream_flush(out) != -1);
assert(false); // Should not come here
CATCH(AssertException)
// Passed
END_TRY;
OutputStream_free(&out);
}
printf("=> Test6: OK\n\n");
printf("=> Test7: printf large buffer\n");
{
// Note, test assume OutputStream buffer is 1500
char a[1024];
memset(a, 'x', 1024);
a[1023]= 0;
out = OutputStream_new(STDOUT);
// Test fit into buffer
assert(OutputStream_print(out, "data: %s\n", a) == 1030);
assert(OutputStream_flush(out) == 1030);
// Test when data is larger than OutputStream buffer
char b[2048];
memset(b, 'y', 2048);
b[2047] = 0;
assert(OutputStream_print(out, "data: %s\n", b) == 2054);
OutputStream_free(&out);
}
printf("=> Test7: OK\n\n");
printf("============> OutputStream Tests: OK\n\n");
return 0;
}