1 #ifndef BANDIT_RUNNER_H 2 #define BANDIT_RUNNER_H 3 4 #include <bandit/options.h> 5 #include <bandit/registration/registrar.h> 6 #include <bandit/reporters/reporters.h> 7 #include <bandit/failure_formatters/failure_formatters.h> 8 #include <bandit/run_policies/run_policies.h> 9 #include <bandit/version.h> 10 11 namespace bandit { 12 namespace detail { create_run_policy(const options & opt)13 inline run_policy_ptr create_run_policy(const options& opt) { 14 return run_policy_ptr(new bandit_run_policy(opt.filter_chain(), opt.break_on_failure(), opt.dry_run())); 15 } 16 create_reporter(const options & opt,const failure_formatter * formatter,const colorizer & colorizer)17 inline listener_ptr create_reporter(const options& opt, 18 const failure_formatter* formatter, const colorizer& colorizer) { 19 switch (opt.reporter()) { 20 case options::reporters::SINGLELINE: 21 return listener_ptr(new single_line_reporter(*formatter, colorizer)); 22 case options::reporters::XUNIT: 23 return listener_ptr(new xunit_reporter(*formatter)); 24 case options::reporters::SPEC: 25 return listener_ptr(new spec_reporter(*formatter, colorizer)); 26 case options::reporters::CRASH: 27 return listener_ptr(new crash_reporter(*formatter)); 28 case options::reporters::DOTS: 29 return listener_ptr(new dots_reporter(*formatter, colorizer)); 30 case options::reporters::INFO: 31 default: 32 return listener_ptr(new info_reporter(*formatter, colorizer)); 33 } 34 } 35 36 typedef std::function<listener_ptr(const std::string&, const failure_formatter*)> reporter_factory_fn; 37 typedef std::function<detail::listener*(detail::listener*)> register_reporter_fn; 38 create_formatter(const options & opt)39 inline failure_formatter_ptr create_formatter(const options& opt) { 40 switch (opt.formatter()) { 41 case options::formatters::VS: 42 return failure_formatter_ptr(new visual_studio_failure_formatter()); 43 case options::formatters::DEFAULT: 44 default: 45 return failure_formatter_ptr(new default_failure_formatter()); 46 } 47 } 48 } 49 run(const detail::options & opt,const detail::spec_registry & specs,detail::contextstack_t & context_stack,detail::listener & listener)50 inline int run(const detail::options& opt, const detail::spec_registry& specs, 51 detail::contextstack_t& context_stack, detail::listener& listener) { 52 if (opt.help() || !opt.parsed_ok()) { 53 opt.print_usage(); 54 return !opt.parsed_ok(); 55 } 56 57 if (opt.version()) { 58 std::cout << "bandit version " << BANDIT_VERSION << std::endl; 59 return 0; 60 } 61 62 listener.test_run_starting(); 63 64 bool hard_skip = false; 65 detail::bandit_context global_context("", hard_skip); 66 context_stack.push_back(&global_context); 67 68 for (auto func : specs) { 69 func(); 70 }; 71 72 listener.test_run_complete(); 73 74 return listener.did_we_pass() ? 0 : 1; 75 } 76 77 inline int run(int argc, char* argv[], bool allow_further = true) { 78 detail::options opt(argc, argv); 79 if (!allow_further && 80 (opt.has_further_arguments() || opt.has_unknown_options())) { 81 opt.print_usage(); 82 return 1; 83 } 84 detail::failure_formatter_ptr formatter(create_formatter(opt)); 85 bandit::detail::colorizer colorizer(!opt.no_color()); 86 detail::listener_ptr reporter(create_reporter(opt, formatter.get(), colorizer)); 87 88 detail::register_listener(reporter.get()); 89 90 detail::run_policy_ptr run_policy = create_run_policy(opt); 91 register_run_policy(run_policy.get()); 92 93 return run(opt, detail::specs(), detail::context_stack(), *reporter); 94 } 95 } 96 #endif 97