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)38static void NoPrefix(benchmark::State& state) { 39 for (auto _ : state) { 40 } 41 } 42 BENCHMARK(NoPrefix); 43 BM_Foo(benchmark::State & state)44static void BM_Foo(benchmark::State& state) { 45 for (auto _ : state) { 46 } 47 } 48 BENCHMARK(BM_Foo); 49 BM_Bar(benchmark::State & state)50static void BM_Bar(benchmark::State& state) { 51 for (auto _ : state) { 52 } 53 } 54 BENCHMARK(BM_Bar); 55 BM_FooBar(benchmark::State & state)56static void BM_FooBar(benchmark::State& state) { 57 for (auto _ : state) { 58 } 59 } 60 BENCHMARK(BM_FooBar); 61 BM_FooBa(benchmark::State & state)62static void BM_FooBa(benchmark::State& state) { 63 for (auto _ : state) { 64 } 65 } 66 BENCHMARK(BM_FooBa); 67 main(int argc,char ** argv)68int 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