#include "benchmark/benchmark.h"

#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdlib>

#include <iostream>
#include <limits>
#include <sstream>
#include <string>

namespace {

class TestReporter : public benchmark::ConsoleReporter {
 public:
  virtual bool ReportContext(const Context& context) {
    return ConsoleReporter::ReportContext(context);
  };

  virtual void ReportRuns(const std::vector<Run>& report) {
    ++count_;
    ConsoleReporter::ReportRuns(report);
  };

  TestReporter() : count_(0) {}

  virtual ~TestReporter() {}

  size_t GetCount() const {
    return count_;
  }

 private:
  mutable size_t count_;
};

}  // end namespace


static void NoPrefix(benchmark::State& state) {
  while (state.KeepRunning()) {}
}
BENCHMARK(NoPrefix);

static void BM_Foo(benchmark::State& state) {
  while (state.KeepRunning()) {}
}
BENCHMARK(BM_Foo);


static void BM_Bar(benchmark::State& state) {
  while (state.KeepRunning()) {}
}
BENCHMARK(BM_Bar);


static void BM_FooBar(benchmark::State& state) {
  while (state.KeepRunning()) {}
}
BENCHMARK(BM_FooBar);


static void BM_FooBa(benchmark::State& state) {
  while (state.KeepRunning()) {}
}
BENCHMARK(BM_FooBa);



int main(int argc, char** argv) {
  bool list_only = false;
  for (int i=0; i < argc; ++i)
    list_only |= std::string(argv[i]).find("--benchmark_list_tests") != std::string::npos;

  benchmark::Initialize(&argc, argv);

  TestReporter test_reporter;
  const size_t returned_count = benchmark::RunSpecifiedBenchmarks(&test_reporter);

  if (argc == 2) {
    // Make sure we ran all of the tests
    std::stringstream ss(argv[1]);
    size_t expected_return;
    ss >> expected_return;

    if (returned_count != expected_return) {
      std::cerr << "ERROR: Expected " << expected_return
                << " tests to match the filter but returned_count = "
                << returned_count << std::endl;
      return -1;
    }

    const size_t expected_reports = list_only ? 0 : expected_return;
    const size_t reports_count = test_reporter.GetCount();
    if (reports_count != expected_reports) {
      std::cerr << "ERROR: Expected " << expected_reports
                << " tests to be run but reported_count = " << reports_count
                << std::endl;
      return -1;
    }
  }

  return 0;
}
