// // Copyright (c) 2013-2016 Vinnie Falco (vinnie dot falco at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include #ifdef _MSC_VER # ifndef WIN32_LEAN_AND_MEAN // VC_EXTRALEAN # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN # else # include # endif #endif namespace beast { namespace unit_test { static std::string prefix(suite_info const& s) { if (s.manual()) return "|M| "; return " "; } static void print(std::ostream& os, suite_list const& c) { std::size_t manual = 0; for(auto const& s : c) { os << prefix (s) << s.full_name() << '\n'; if(s.manual()) ++manual; } os << amount(c.size(), "suite") << " total, " << amount(manual, "manual suite") << '\n' ; } // Print the list of suites // Used with the --print command line option static void print(std::ostream& os) { os << "------------------------------------------\n"; print(os, global_suites()); os << "------------------------------------------" << std::endl; } } // unit_test } // beast // Simple main used to produce stand // alone executables that run unit tests. int main(int ac, char const* av[]) { using namespace std; using namespace beast::unit_test; #ifdef _MSC_VER { int flags = _CrtSetDbgFlag (_CRTDBG_REPORT_FLAG); flags |= _CRTDBG_LEAK_CHECK_DF; _CrtSetDbgFlag (flags); } #endif namespace po = boost::program_options; po::options_description desc("Options"); desc.add_options() ("help,h", "Produce a help message") ("print,r", "Print the list of available test suites") ("suites,s", po::value(), "suites to run") ; po::positional_options_description p; po::variables_map vm; po::store(po::parse_command_line(ac, av, desc), vm); po::notify(vm); dstream log; if(vm.count("help")) { log << desc << std::endl; } else if(vm.count("print")) { print(log); } else { std::string suites; if(vm.count("suites") > 0) suites = vm["suites"].as(); reporter r(log); bool failed; if(! suites.empty()) failed = r.run_each_if(global_suites(), match_auto(suites)); else failed = r.run_each(global_suites()); if (failed) return EXIT_FAILURE; return EXIT_SUCCESS; } }