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