1a8c51b3fSopenharmony_ci#include <cassert>
2a8c51b3fSopenharmony_ci#include <climits>
3a8c51b3fSopenharmony_ci#include <cmath>
4a8c51b3fSopenharmony_ci#include <cstdlib>
5a8c51b3fSopenharmony_ci#include <cstring>
6a8c51b3fSopenharmony_ci#include <iostream>
7a8c51b3fSopenharmony_ci#include <string>
8a8c51b3fSopenharmony_ci#include <vector>
9a8c51b3fSopenharmony_ci
10a8c51b3fSopenharmony_ci#include "benchmark/benchmark.h"
11a8c51b3fSopenharmony_ci
12a8c51b3fSopenharmony_ci// Tests that we can specify the min time with
13a8c51b3fSopenharmony_ci// --benchmark_min_time=<NUM> (no suffix needed) OR
14a8c51b3fSopenharmony_ci// --benchmark_min_time=<NUM>s
15a8c51b3fSopenharmony_cinamespace {
16a8c51b3fSopenharmony_ci
17a8c51b3fSopenharmony_ci// This is from benchmark.h
18a8c51b3fSopenharmony_citypedef int64_t IterationCount;
19a8c51b3fSopenharmony_ci
20a8c51b3fSopenharmony_ciclass TestReporter : public benchmark::ConsoleReporter {
21a8c51b3fSopenharmony_ci public:
22a8c51b3fSopenharmony_ci  virtual bool ReportContext(const Context& context) BENCHMARK_OVERRIDE {
23a8c51b3fSopenharmony_ci    return ConsoleReporter::ReportContext(context);
24a8c51b3fSopenharmony_ci  };
25a8c51b3fSopenharmony_ci
26a8c51b3fSopenharmony_ci  virtual void ReportRuns(const std::vector<Run>& report) BENCHMARK_OVERRIDE {
27a8c51b3fSopenharmony_ci    assert(report.size() == 1);
28a8c51b3fSopenharmony_ci    ConsoleReporter::ReportRuns(report);
29a8c51b3fSopenharmony_ci  };
30a8c51b3fSopenharmony_ci
31a8c51b3fSopenharmony_ci  virtual void ReportRunsConfig(double min_time, bool /* has_explicit_iters */,
32a8c51b3fSopenharmony_ci                                IterationCount /* iters */) BENCHMARK_OVERRIDE {
33a8c51b3fSopenharmony_ci    min_times_.push_back(min_time);
34a8c51b3fSopenharmony_ci  }
35a8c51b3fSopenharmony_ci
36a8c51b3fSopenharmony_ci  TestReporter() {}
37a8c51b3fSopenharmony_ci
38a8c51b3fSopenharmony_ci  virtual ~TestReporter() {}
39a8c51b3fSopenharmony_ci
40a8c51b3fSopenharmony_ci  const std::vector<double>& GetMinTimes() const { return min_times_; }
41a8c51b3fSopenharmony_ci
42a8c51b3fSopenharmony_ci private:
43a8c51b3fSopenharmony_ci  std::vector<double> min_times_;
44a8c51b3fSopenharmony_ci};
45a8c51b3fSopenharmony_ci
46a8c51b3fSopenharmony_cibool AlmostEqual(double a, double b) {
47a8c51b3fSopenharmony_ci  return std::fabs(a - b) < std::numeric_limits<double>::epsilon();
48a8c51b3fSopenharmony_ci}
49a8c51b3fSopenharmony_ci
50a8c51b3fSopenharmony_civoid DoTestHelper(int* argc, const char** argv, double expected) {
51a8c51b3fSopenharmony_ci  benchmark::Initialize(argc, const_cast<char**>(argv));
52a8c51b3fSopenharmony_ci
53a8c51b3fSopenharmony_ci  TestReporter test_reporter;
54a8c51b3fSopenharmony_ci  const size_t returned_count =
55a8c51b3fSopenharmony_ci      benchmark::RunSpecifiedBenchmarks(&test_reporter, "BM_MyBench");
56a8c51b3fSopenharmony_ci  assert(returned_count == 1);
57a8c51b3fSopenharmony_ci
58a8c51b3fSopenharmony_ci  // Check the min_time
59a8c51b3fSopenharmony_ci  const std::vector<double>& min_times = test_reporter.GetMinTimes();
60a8c51b3fSopenharmony_ci  assert(!min_times.empty() && AlmostEqual(min_times[0], expected));
61a8c51b3fSopenharmony_ci}
62a8c51b3fSopenharmony_ci
63a8c51b3fSopenharmony_ci}  // end namespace
64a8c51b3fSopenharmony_ci
65a8c51b3fSopenharmony_cistatic void BM_MyBench(benchmark::State& state) {
66a8c51b3fSopenharmony_ci  for (auto s : state) {
67a8c51b3fSopenharmony_ci  }
68a8c51b3fSopenharmony_ci}
69a8c51b3fSopenharmony_ciBENCHMARK(BM_MyBench);
70a8c51b3fSopenharmony_ci
71a8c51b3fSopenharmony_ciint main(int argc, char** argv) {
72a8c51b3fSopenharmony_ci  // Make a fake argv and append the new --benchmark_min_time=<foo> to it.
73a8c51b3fSopenharmony_ci  int fake_argc = argc + 1;
74a8c51b3fSopenharmony_ci  const char** fake_argv = new const char*[static_cast<size_t>(fake_argc)];
75a8c51b3fSopenharmony_ci
76a8c51b3fSopenharmony_ci  for (int i = 0; i < argc; ++i) fake_argv[i] = argv[i];
77a8c51b3fSopenharmony_ci
78a8c51b3fSopenharmony_ci  const char* no_suffix = "--benchmark_min_time=4";
79a8c51b3fSopenharmony_ci  const char* with_suffix = "--benchmark_min_time=4.0s";
80a8c51b3fSopenharmony_ci  double expected = 4.0;
81a8c51b3fSopenharmony_ci
82a8c51b3fSopenharmony_ci  fake_argv[argc] = no_suffix;
83a8c51b3fSopenharmony_ci  DoTestHelper(&fake_argc, fake_argv, expected);
84a8c51b3fSopenharmony_ci
85a8c51b3fSopenharmony_ci  fake_argv[argc] = with_suffix;
86a8c51b3fSopenharmony_ci  DoTestHelper(&fake_argc, fake_argv, expected);
87a8c51b3fSopenharmony_ci
88a8c51b3fSopenharmony_ci  delete[] fake_argv;
89a8c51b3fSopenharmony_ci  return 0;
90a8c51b3fSopenharmony_ci}
91