1 | #ifndef BANDIT_PROGRESS_REPORTER_H |
---|---|
2 | #define BANDIT_PROGRESS_REPORTER_H |
3 | |
4 | #include <algorithm> |
5 | #include <list> |
6 | #include <sstream> |
7 | #include <bandit/failure_formatters/failure_formatter.h> |
8 | #include <bandit/listener.h> |
9 | |
10 | namespace bandit { |
11 | namespace detail { |
12 | struct progress_reporter : public listener { |
13 | progress_reporter(const detail::failure_formatter& failure_formatter) |
14 | : specs_run_(0), specs_succeeded_(0), specs_failed_(0), specs_skipped_(0), |
15 | failure_formatter_(failure_formatter) {} |
16 | |
17 | progress_reporter& operator=(const progress_reporter&) { |
18 | return *this; |
19 | } |
20 | |
21 | void test_run_starting() override { |
22 | specs_run_ = 0; |
23 | specs_succeeded_ = 0; |
24 | specs_failed_ = 0; |
25 | specs_skipped_ = 0; |
26 | failures_.clear(); |
27 | contexts_.clear(); |
28 | } |
29 | |
30 | void test_run_complete() override {} |
31 | |
32 | void context_starting(const std::string& desc) override { |
33 | contexts_.push_back(std::string(desc)); |
34 | } |
35 | |
36 | void context_ended(const std::string&) override { |
37 | contexts_.pop_back(); |
38 | } |
39 | |
40 | void test_run_error(const std::string&, const struct test_run_error&) override {} |
41 | |
42 | void it_starting(const std::string&) override { |
43 | specs_run_++; |
44 | } |
45 | |
46 | void it_succeeded(const std::string&) override { |
47 | specs_succeeded_++; |
48 | } |
49 | |
50 | void it_failed(const std::string& desc, const assertion_exception& ex) override { |
51 | specs_failed_++; |
52 | |
53 | std::stringstream ss; |
54 | ss << std::endl; |
55 | ss << current_context_name() << " "<< desc << ":"<< std::endl; |
56 | ss << failure_formatter_.format(ex); |
57 | |
58 | failures_.push_back(ss.str()); |
59 | } |
60 | |
61 | void it_unknown_error(const std::string& desc) override { |
62 | specs_failed_++; |
63 | |
64 | std::stringstream ss; |
65 | ss << std::endl; |
66 | ss << current_context_name() << " "<< desc << ":"<< std::endl; |
67 | ss << "Unknown exception"; |
68 | ss << std::endl; |
69 | |
70 | failures_.push_back(ss.str()); |
71 | } |
72 | |
73 | void it_skip(const std::string&) override { |
74 | specs_skipped_++; |
75 | } |
76 | |
77 | bool did_we_pass() const override final { |
78 | return specs_failed_ == 0 && test_run_errors_.size() == 0; |
79 | } |
80 | |
81 | protected: |
82 | std::string current_context_name() { |
83 | std::string name; |
84 | |
85 | for (const auto& context : contexts_) { |
86 | if (name.size() > 0) { |
87 | name += " "; |
88 | } |
89 | |
90 | name += context; |
91 | } |
92 | |
93 | return name; |
94 | } |
95 | |
96 | protected: |
97 | int specs_run_; |
98 | int specs_succeeded_; |
99 | int specs_failed_; |
100 | int specs_skipped_; |
101 | const detail::failure_formatter& failure_formatter_; |
102 | std::list<std::string> contexts_; |
103 | std::list<std::string> failures_; |
104 | std::list<std::string> test_run_errors_; |
105 | }; |
106 | } |
107 | } |
108 | #endif |
109 |