From bb40c4cbc74fe48a04069e6efb78c94bd0cc0451 Mon Sep 17 00:00:00 2001 From: "martin@ashbysoft.com" Date: Sat, 11 Jun 2022 21:59:03 +0000 Subject: Add CuTest and test script. Update ex1-9 with unit tests using CuTest. --- ex1-9.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 7 deletions(-) (limited to 'ex1-9.c') diff --git a/ex1-9.c b/ex1-9.c index e7d4d25..07561d9 100644 --- a/ex1-9.c +++ b/ex1-9.c @@ -1,22 +1,76 @@ #include #include +#include + /* Copy stdin to stdout, replacing consecutive spaces with a single space Edge case: a leading space is retained if there are leading spaces. Edge case: an empty file just doesn't echo anything, but emits a warning on stderr */ -int main(void) { - int c = getchar(); +int remspace(FILE* fin, FILE* fout, FILE* ferr) { + int c = fgetc(fin); if (c == EOF) { - fprintf(stderr, "warning: no input\n"); + fprintf(ferr, "warning: no input\n"); goto exit; } - putchar(c); + fputc(c, fout); bool bl = (c == ' '); - while ((c = getchar()) != EOF) { + while ((c = fgetc(fin)) != EOF) { if ((!bl) || (c != ' ')) { - putchar(c); + fputc(c, fout); } bl = (c == ' '); } exit: + fflush(fout); + fflush(ferr); return 0; -} \ No newline at end of file +} + +#ifndef test + +int main(void) { + return remspace(stdin, stdout, stderr); +} + +#else + +#include "CuTest.h" + +void do_test(CuTest* tc, char* input, const char* expected, const char* err_expected) { + char buf[100] = {0}; + char err_buf[100] = {0}; + FILE* tin = fmemopen(input, strlen(input), "r"); + FILE* tout = fmemopen(buf, 100, "w"); + FILE* terr = fmemopen(err_buf, 100, "w"); + int res = remspace(tin, tout, terr); + CuAssertIntEquals(tc, 0, res); + CuAssertStrEquals(tc, expected, buf); + CuAssertStrEquals(tc, err_expected, err_buf); +} +void test_remspace_empty(CuTest* tc) { + do_test(tc, "", "", "warning: no input\n"); +} +void test_remspace_oneword(CuTest* tc) { + do_test(tc, "foobar", "foobar", ""); +} +void test_remspace_leadtrailspace(CuTest* tc) { + do_test(tc, " foo bar ", " foo bar ", ""); +} +CuSuite* remspace_suite() { + CuSuite* suite = CuSuiteNew(); + SUITE_ADD_TEST(suite, test_remspace_empty); + SUITE_ADD_TEST(suite, test_remspace_oneword); + SUITE_ADD_TEST(suite, test_remspace_leadtrailspace); + return suite; +} +int main(void) { + CuString* output = CuStringNew(); + CuSuite* suite = CuSuiteNew(); + CuSuiteAddSuite(suite, remspace_suite()); + CuSuiteRun(suite); + CuSuiteSummary(suite, output); + CuSuiteDetails(suite, output); + printf("%s\n", output->buffer); + return 0; +} + +#endif -- cgit v1.2.3-ZIG