| Index: third_party/google_benchmark/test/register_benchmark_test.cc
|
| diff --git a/third_party/google_benchmark/test/register_benchmark_test.cc b/third_party/google_benchmark/test/register_benchmark_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c0ecad7d20475d02093a95f9ee2873a9b76d5888
|
| --- /dev/null
|
| +++ b/third_party/google_benchmark/test/register_benchmark_test.cc
|
| @@ -0,0 +1,148 @@
|
| +
|
| +#undef NDEBUG
|
| +#include <cassert>
|
| +#include <vector>
|
| +
|
| +#include "../src/check.h" // NOTE: check.h is for internal use only!
|
| +#include "benchmark/benchmark.h"
|
| +
|
| +namespace {
|
| +
|
| +class TestReporter : public benchmark::ConsoleReporter {
|
| + public:
|
| + virtual void ReportRuns(const std::vector<Run>& report) {
|
| + all_runs_.insert(all_runs_.end(), begin(report), end(report));
|
| + ConsoleReporter::ReportRuns(report);
|
| + }
|
| +
|
| + std::vector<Run> all_runs_;
|
| +};
|
| +
|
| +struct TestCase {
|
| + std::string name;
|
| + const char* label;
|
| + // Note: not explicit as we rely on it being converted through ADD_CASES.
|
| + TestCase(const char* xname) : TestCase(xname, nullptr) {}
|
| + TestCase(const char* xname, const char* xlabel)
|
| + : name(xname), label(xlabel) {}
|
| +
|
| + typedef benchmark::BenchmarkReporter::Run Run;
|
| +
|
| + void CheckRun(Run const& run) const {
|
| + CHECK(name == run.benchmark_name) << "expected " << name << " got "
|
| + << run.benchmark_name;
|
| + if (label) {
|
| + CHECK(run.report_label == label) << "expected " << label << " got "
|
| + << run.report_label;
|
| + } else {
|
| + CHECK(run.report_label == "");
|
| + }
|
| + }
|
| +};
|
| +
|
| +std::vector<TestCase> ExpectedResults;
|
| +
|
| +int AddCases(std::initializer_list<TestCase> const& v) {
|
| + for (auto N : v) {
|
| + ExpectedResults.push_back(N);
|
| + }
|
| + return 0;
|
| +}
|
| +
|
| +#define CONCAT(x, y) CONCAT2(x, y)
|
| +#define CONCAT2(x, y) x##y
|
| +#define ADD_CASES(...) int CONCAT(dummy, __LINE__) = AddCases({__VA_ARGS__})
|
| +
|
| +} // end namespace
|
| +
|
| +typedef benchmark::internal::Benchmark* ReturnVal;
|
| +
|
| +//----------------------------------------------------------------------------//
|
| +// Test RegisterBenchmark with no additional arguments
|
| +//----------------------------------------------------------------------------//
|
| +void BM_function(benchmark::State& state) {
|
| + while (state.KeepRunning()) {
|
| + }
|
| +}
|
| +BENCHMARK(BM_function);
|
| +ReturnVal dummy = benchmark::RegisterBenchmark(
|
| + "BM_function_manual_registration", BM_function);
|
| +ADD_CASES({"BM_function"}, {"BM_function_manual_registration"});
|
| +
|
| +//----------------------------------------------------------------------------//
|
| +// Test RegisterBenchmark with additional arguments
|
| +// Note: GCC <= 4.8 do not support this form of RegisterBenchmark because they
|
| +// reject the variadic pack expansion of lambda captures.
|
| +//----------------------------------------------------------------------------//
|
| +#ifndef BENCHMARK_HAS_NO_VARIADIC_REGISTER_BENCHMARK
|
| +
|
| +void BM_extra_args(benchmark::State& st, const char* label) {
|
| + while (st.KeepRunning()) {
|
| + }
|
| + st.SetLabel(label);
|
| +}
|
| +int RegisterFromFunction() {
|
| + std::pair<const char*, const char*> cases[] = {
|
| + {"test1", "One"}, {"test2", "Two"}, {"test3", "Three"}};
|
| + for (auto const& c : cases)
|
| + benchmark::RegisterBenchmark(c.first, &BM_extra_args, c.second);
|
| + return 0;
|
| +}
|
| +int dummy2 = RegisterFromFunction();
|
| +ADD_CASES({"test1", "One"}, {"test2", "Two"}, {"test3", "Three"});
|
| +
|
| +#endif // BENCHMARK_HAS_NO_VARIADIC_REGISTER_BENCHMARK
|
| +
|
| +//----------------------------------------------------------------------------//
|
| +// Test RegisterBenchmark with different callable types
|
| +//----------------------------------------------------------------------------//
|
| +
|
| +struct CustomFixture {
|
| + void operator()(benchmark::State& st) {
|
| + while (st.KeepRunning()) {
|
| + }
|
| + }
|
| +};
|
| +
|
| +void TestRegistrationAtRuntime() {
|
| +#ifdef BENCHMARK_HAS_CXX11
|
| + {
|
| + CustomFixture fx;
|
| + benchmark::RegisterBenchmark("custom_fixture", fx);
|
| + AddCases({"custom_fixture"});
|
| + }
|
| +#endif
|
| +#ifndef BENCHMARK_HAS_NO_VARIADIC_REGISTER_BENCHMARK
|
| + {
|
| + const char* x = "42";
|
| + auto capturing_lam = [=](benchmark::State& st) {
|
| + while (st.KeepRunning()) {
|
| + }
|
| + st.SetLabel(x);
|
| + };
|
| + benchmark::RegisterBenchmark("lambda_benchmark", capturing_lam);
|
| + AddCases({{"lambda_benchmark", x}});
|
| + }
|
| +#endif
|
| +}
|
| +
|
| +int main(int argc, char* argv[]) {
|
| + TestRegistrationAtRuntime();
|
| +
|
| + benchmark::Initialize(&argc, argv);
|
| +
|
| + TestReporter test_reporter;
|
| + benchmark::RunSpecifiedBenchmarks(&test_reporter);
|
| +
|
| + typedef benchmark::BenchmarkReporter::Run Run;
|
| + auto EB = ExpectedResults.begin();
|
| +
|
| + for (Run const& run : test_reporter.all_runs_) {
|
| + assert(EB != ExpectedResults.end());
|
| + EB->CheckRun(run);
|
| + ++EB;
|
| + }
|
| + assert(EB == ExpectedResults.end());
|
| +
|
| + return 0;
|
| +}
|
|
|