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
13namespace {
14
15class TestReporter : public benchmark::ConsoleReporter {
16 public:
17  virtual bool ReportContext(const Context& context) {
18    return ConsoleReporter::ReportContext(context);
19  };
20
21  virtual void ReportRuns(const std::vector<Run>& report) {
22    ++count_;
23    ConsoleReporter::ReportRuns(report);
24  };
25
26  TestReporter() : count_(0) {}
27
28  virtual ~TestReporter() {}
29
30  size_t GetCount() const {
31    return count_;
32  }
33
34 private:
35  mutable size_t count_;
36};
37
38}  // end namespace
39
40
41static void NoPrefix(benchmark::State& state) {
42  while (state.KeepRunning()) {}
43}
44BENCHMARK(NoPrefix);
45
46static void BM_Foo(benchmark::State& state) {
47  while (state.KeepRunning()) {}
48}
49BENCHMARK(BM_Foo);
50
51
52static void BM_Bar(benchmark::State& state) {
53  while (state.KeepRunning()) {}
54}
55BENCHMARK(BM_Bar);
56
57
58static void BM_FooBar(benchmark::State& state) {
59  while (state.KeepRunning()) {}
60}
61BENCHMARK(BM_FooBar);
62
63
64static void BM_FooBa(benchmark::State& state) {
65  while (state.KeepRunning()) {}
66}
67BENCHMARK(BM_FooBa);
68
69
70
71int main(int argc, char* argv[]) {
72  benchmark::Initialize(&argc, argv);
73
74  TestReporter test_reporter;
75  benchmark::RunSpecifiedBenchmarks(&test_reporter);
76
77  if (argc == 2) {
78    // Make sure we ran all of the tests
79    std::stringstream ss(argv[1]);
80    size_t expected;
81    ss >> expected;
82
83    const size_t count = test_reporter.GetCount();
84    if (count != expected) {
85      std::cerr << "ERROR: Expected " << expected << " tests to be ran but only "
86                << count << " completed" << std::endl;
87      return -1;
88    }
89  }
90  return 0;
91}
92