1 #include "benchmark/benchmark.h"
2 
3 #include <cassert>
4 #include <cmath>
5 #include <cstdint>
6 #include <cstdlib>
7 
8 #include <iostream>
9 #include <limits>
10 #include <sstream>
11 #include <string>
12 
13 namespace {
14 
15 class TestReporter : public benchmark::ConsoleReporter {
16  public:
ReportContext(const Context & context)17   virtual bool ReportContext(const Context& context) {
18     return ConsoleReporter::ReportContext(context);
19   };
20 
ReportRuns(const std::vector<Run> & report)21   virtual void ReportRuns(const std::vector<Run>& report) {
22     ++count_;
23     ConsoleReporter::ReportRuns(report);
24   };
25 
TestReporter()26   TestReporter() : count_(0) {}
27 
~TestReporter()28   virtual ~TestReporter() {}
29 
GetCount() const30   size_t GetCount() const { return count_; }
31 
32  private:
33   mutable size_t count_;
34 };
35 
36 }  // end namespace
37 
NoPrefix(benchmark::State & state)38 static void NoPrefix(benchmark::State& state) {
39   for (auto _ : state) {
40   }
41 }
42 BENCHMARK(NoPrefix);
43 
BM_Foo(benchmark::State & state)44 static void BM_Foo(benchmark::State& state) {
45   for (auto _ : state) {
46   }
47 }
48 BENCHMARK(BM_Foo);
49 
BM_Bar(benchmark::State & state)50 static void BM_Bar(benchmark::State& state) {
51   for (auto _ : state) {
52   }
53 }
54 BENCHMARK(BM_Bar);
55 
BM_FooBar(benchmark::State & state)56 static void BM_FooBar(benchmark::State& state) {
57   for (auto _ : state) {
58   }
59 }
60 BENCHMARK(BM_FooBar);
61 
BM_FooBa(benchmark::State & state)62 static void BM_FooBa(benchmark::State& state) {
63   for (auto _ : state) {
64   }
65 }
66 BENCHMARK(BM_FooBa);
67 
main(int argc,char ** argv)68 int main(int argc, char **argv) {
69   bool list_only = false;
70   for (int i = 0; i < argc; ++i)
71     list_only |= std::string(argv[i]).find("--benchmark_list_tests") !=
72                  std::string::npos;
73 
74   benchmark::Initialize(&argc, argv);
75 
76   TestReporter test_reporter;
77   const size_t returned_count =
78       benchmark::RunSpecifiedBenchmarks(&test_reporter);
79 
80   if (argc == 2) {
81     // Make sure we ran all of the tests
82     std::stringstream ss(argv[1]);
83     size_t expected_return;
84     ss >> expected_return;
85 
86     if (returned_count != expected_return) {
87       std::cerr << "ERROR: Expected " << expected_return
88                 << " tests to match the filter but returned_count = "
89                 << returned_count << std::endl;
90       return -1;
91     }
92 
93     const size_t expected_reports = list_only ? 0 : expected_return;
94     const size_t reports_count = test_reporter.GetCount();
95     if (reports_count != expected_reports) {
96       std::cerr << "ERROR: Expected " << expected_reports
97                 << " tests to be run but reported_count = " << reports_count
98                 << std::endl;
99       return -1;
100     }
101   }
102 
103   return 0;
104 }
105