1a8c51b3fSopenharmony_ci#include <cassert>
2a8c51b3fSopenharmony_ci#include <cstdlib>
3a8c51b3fSopenharmony_ci#include <cstring>
4a8c51b3fSopenharmony_ci#include <iostream>
5a8c51b3fSopenharmony_ci#include <string>
6a8c51b3fSopenharmony_ci#include <vector>
7a8c51b3fSopenharmony_ci
8a8c51b3fSopenharmony_ci#include "benchmark/benchmark.h"
9a8c51b3fSopenharmony_ci
10a8c51b3fSopenharmony_ci// Tests that we can specify the number of iterations with
11a8c51b3fSopenharmony_ci// --benchmark_min_time=<NUM>x.
12a8c51b3fSopenharmony_cinamespace {
13a8c51b3fSopenharmony_ci
14a8c51b3fSopenharmony_ciclass TestReporter : public benchmark::ConsoleReporter {
15a8c51b3fSopenharmony_ci public:
16a8c51b3fSopenharmony_ci  virtual bool ReportContext(const Context& context) BENCHMARK_OVERRIDE {
17a8c51b3fSopenharmony_ci    return ConsoleReporter::ReportContext(context);
18a8c51b3fSopenharmony_ci  };
19a8c51b3fSopenharmony_ci
20a8c51b3fSopenharmony_ci  virtual void ReportRuns(const std::vector<Run>& report) BENCHMARK_OVERRIDE {
21a8c51b3fSopenharmony_ci    assert(report.size() == 1);
22a8c51b3fSopenharmony_ci    iter_nums_.push_back(report[0].iterations);
23a8c51b3fSopenharmony_ci    ConsoleReporter::ReportRuns(report);
24a8c51b3fSopenharmony_ci  };
25a8c51b3fSopenharmony_ci
26a8c51b3fSopenharmony_ci  TestReporter() {}
27a8c51b3fSopenharmony_ci
28a8c51b3fSopenharmony_ci  virtual ~TestReporter() {}
29a8c51b3fSopenharmony_ci
30a8c51b3fSopenharmony_ci  const std::vector<benchmark::IterationCount>& GetIters() const {
31a8c51b3fSopenharmony_ci    return iter_nums_;
32a8c51b3fSopenharmony_ci  }
33a8c51b3fSopenharmony_ci
34a8c51b3fSopenharmony_ci private:
35a8c51b3fSopenharmony_ci  std::vector<benchmark::IterationCount> iter_nums_;
36a8c51b3fSopenharmony_ci};
37a8c51b3fSopenharmony_ci
38a8c51b3fSopenharmony_ci}  // end namespace
39a8c51b3fSopenharmony_ci
40a8c51b3fSopenharmony_cistatic void BM_MyBench(benchmark::State& state) {
41a8c51b3fSopenharmony_ci  for (auto s : state) {
42a8c51b3fSopenharmony_ci  }
43a8c51b3fSopenharmony_ci}
44a8c51b3fSopenharmony_ciBENCHMARK(BM_MyBench);
45a8c51b3fSopenharmony_ci
46a8c51b3fSopenharmony_ciint main(int argc, char** argv) {
47a8c51b3fSopenharmony_ci  // Make a fake argv and append the new --benchmark_min_time=<foo> to it.
48a8c51b3fSopenharmony_ci  int fake_argc = argc + 1;
49a8c51b3fSopenharmony_ci  const char** fake_argv = new const char*[static_cast<size_t>(fake_argc)];
50a8c51b3fSopenharmony_ci  for (int i = 0; i < argc; ++i) fake_argv[i] = argv[i];
51a8c51b3fSopenharmony_ci  fake_argv[argc] = "--benchmark_min_time=4x";
52a8c51b3fSopenharmony_ci
53a8c51b3fSopenharmony_ci  benchmark::Initialize(&fake_argc, const_cast<char**>(fake_argv));
54a8c51b3fSopenharmony_ci
55a8c51b3fSopenharmony_ci  TestReporter test_reporter;
56a8c51b3fSopenharmony_ci  const size_t returned_count =
57a8c51b3fSopenharmony_ci      benchmark::RunSpecifiedBenchmarks(&test_reporter, "BM_MyBench");
58a8c51b3fSopenharmony_ci  assert(returned_count == 1);
59a8c51b3fSopenharmony_ci
60a8c51b3fSopenharmony_ci  // Check the executed iters.
61a8c51b3fSopenharmony_ci  const std::vector<benchmark::IterationCount> iters = test_reporter.GetIters();
62a8c51b3fSopenharmony_ci  assert(!iters.empty() && iters[0] == 4);
63a8c51b3fSopenharmony_ci
64a8c51b3fSopenharmony_ci  delete[] fake_argv;
65a8c51b3fSopenharmony_ci  return 0;
66a8c51b3fSopenharmony_ci}
67