1//
2// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3//
4// Distributed under the Boost Software License, Version 1.0. (See accompanying
5// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6//
7// Official repository: https://github.com/boostorg/beast
8//
9
10#include <boost/beast/_experimental/unit_test/amount.hpp>
11#include <boost/beast/_experimental/unit_test/dstream.hpp>
12#include <boost/beast/_experimental/unit_test/global_suites.hpp>
13#include <boost/beast/_experimental/unit_test/match.hpp>
14#include <boost/beast/_experimental/unit_test/reporter.hpp>
15#include <boost/beast/_experimental/unit_test/suite.hpp>
16#include <boost/config.hpp>
17#include <cstdlib>
18#include <iostream>
19#include <vector>
20
21#ifdef BOOST_MSVC
22# ifndef WIN32_LEAN_AND_MEAN // VC_EXTRALEAN
23#  define WIN32_LEAN_AND_MEAN
24#  include <windows.h>
25#  undef WIN32_LEAN_AND_MEAN
26# else
27#  include <windows.h>
28# endif
29#endif
30
31// Simple main used to produce stand
32// alone executables that run unit tests.
33int main(int ac, char const* av[])
34{
35    using namespace std;
36    using namespace boost::beast::unit_test;
37
38    dstream log(std::cerr);
39    std::unitbuf(log);
40
41#ifdef BOOST_MSVC
42    {
43        int flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
44        flags |= _CRTDBG_LEAK_CHECK_DF;
45        _CrtSetDbgFlag(flags);
46    }
47#endif
48
49    if(ac == 2)
50    {
51        std::string const s{av[1]};
52        if(s == "-h" || s == "--help")
53        {
54            log <<
55                "Usage:\n"
56                "  " << av[0] << ": { <suite-name>... }" <<
57                std::endl;
58            return EXIT_SUCCESS;
59        }
60    }
61
62    reporter r(log);
63    bool failed;
64    if(ac > 1)
65    {
66        std::vector<selector> v;
67        v.reserve(ac - 1);
68        for(int i = 1; i < ac; ++i)
69            v.emplace_back(selector::automatch, av[i]);
70        auto pred =
71            [&v](suite_info const& si) mutable
72            {
73                for(auto& p : v)
74                    if(p(si))
75                        return true;
76                return false;
77            };
78        failed = r.run_each_if(global_suites(), pred);
79    }
80    else
81    {
82        failed = r.run_each(global_suites());
83    }
84    if(failed)
85        return EXIT_FAILURE;
86    return EXIT_SUCCESS;
87}
88