| #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; |
| } |
| |