1 #include <cgreen/text_reporter.h>
2 #include <cgreen/reporter.h>
3 #include <cgreen/breadcrumb.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6
7 static void text_reporter_start_suite(TestReporter *reporter, const char *name, const int number_of_tests);
8 static void text_reporter_start_test(TestReporter *reporter, const char *name);
9 static void text_reporter_finish(TestReporter *reporter, const char *name);
10 static void show_fail(TestReporter *reporter, const char *file, int line, const char *message, va_list arguments);
11 static void show_incomplete(TestReporter *reporter, const char *name);
12 static void show_breadcrumb(const char *name, void *memo);
13
create_text_reporter(void)14 TestReporter *create_text_reporter(void) {
15 TestReporter *reporter = create_reporter();
16 if (reporter == NULL) {
17 return NULL;
18 }
19 reporter->start_suite = &text_reporter_start_suite;
20 reporter->start_test = &text_reporter_start_test;
21 reporter->show_fail = &show_fail;
22 reporter->show_incomplete = &show_incomplete;
23 reporter->finish_test = &text_reporter_finish;
24 reporter->finish_suite = &text_reporter_finish;
25 return reporter;
26 }
27
text_reporter_start_suite(TestReporter * reporter,const char * name,const int number_of_tests)28 static void text_reporter_start_suite(TestReporter *reporter, const char *name, const int number_of_tests) {
29 reporter_start(reporter, name);
30 if (get_breadcrumb_depth((CgreenBreadcrumb *)reporter->breadcrumb) == 1) {
31 printf("Running \"%s\"...\n",
32 get_current_from_breadcrumb((CgreenBreadcrumb *)reporter->breadcrumb));
33 }
34 }
35
text_reporter_start_test(TestReporter * reporter,const char * name)36 static void text_reporter_start_test(TestReporter *reporter, const char *name) {
37 reporter_start(reporter, name);
38 }
39
text_reporter_finish(TestReporter * reporter,const char * name)40 static void text_reporter_finish(TestReporter *reporter, const char *name) {
41 reporter_finish(reporter, name);
42 if (get_breadcrumb_depth((CgreenBreadcrumb *)reporter->breadcrumb) == 0) {
43 printf(
44 "Completed \"%s\": %d pass%s, %d failure%s, %d exception%s.\n",
45 name,
46 reporter->passes,
47 reporter->passes == 1 ? "" : "es",
48 reporter->failures,
49 reporter->failures == 1 ? "" : "s",
50 reporter->exceptions,
51 reporter->exceptions == 1 ? "" : "s");
52 }
53 }
54
show_fail(TestReporter * reporter,const char * file,int line,const char * message,va_list arguments)55 static void show_fail(TestReporter *reporter, const char *file, int line, const char *message, va_list arguments) {
56 int i = 0;
57 printf("%s:%d: unit test failure: ", file, line);
58 walk_breadcrumb(
59 (CgreenBreadcrumb *)reporter->breadcrumb,
60 &show_breadcrumb,
61 (void *)&i);
62 vprintf((message == NULL ? "Problem" : message), arguments);
63 printf(" at [%s] line [%d]\n", file, line);
64 }
65
show_incomplete(TestReporter * reporter,const char * name)66 static void show_incomplete(TestReporter *reporter, const char *name) {
67 int i = 0;
68 printf("Exception!: ");
69 walk_breadcrumb(
70 (CgreenBreadcrumb *)reporter->breadcrumb,
71 &show_breadcrumb,
72 (void *)&i);
73 printf("Test \"%s\" failed to complete\n", name);
74 }
75
show_breadcrumb(const char * name,void * memo)76 static void show_breadcrumb(const char *name, void *memo) {
77 if (*(int *)memo > 0) {
78 printf("%s -> ", name);
79 }
80 (*(int *)memo)++;
81 }
82
83 /* vim: set ts=4 sw=4 et cindent: */
84