// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.

#ifndef CEF_TESTS_CEFCLIENT_RENDERER_PERFORMANCE_TEST_SETUP_H_
#define CEF_TESTS_CEFCLIENT_RENDERER_PERFORMANCE_TEST_SETUP_H_
#pragma once

#include "include/base/cef_logging.h"
#include "include/base/cef_macros.h"

namespace client {
namespace performance_test {

// Default number of iterations.
extern const int kDefaultIterations;

// Test name.
#define PERF_TEST_NAME(name) PerfTest##name

// Entry in test array.
#define PERF_TEST_ENTRY_EX(name, iterations) \
  { #name, PERF_TEST_NAME(name), iterations }
#define PERF_TEST_ENTRY(name) PERF_TEST_ENTRY_EX(name, kDefaultIterations)

// Test function declaration.
#define PERF_TEST_RESULT int64
#define PERF_TEST_PARAM_ITERATIONS iterations
#define PERF_TEST_PARAMS int PERF_TEST_PARAM_ITERATIONS
#define PERF_TEST_FUNC(name) \
  PERF_TEST_RESULT PERF_TEST_NAME(name)(PERF_TEST_PARAMS)

// Typedef for test pointers.
typedef PERF_TEST_RESULT(PerfTest(PERF_TEST_PARAMS));

class CefTimer {
 public:
  CefTimer() : running_(false) {}

  bool IsRunning() { return running_; }

  void Start() {
    DCHECK(!running_);
    running_ = true;
    start_.Now();
  }

  void Stop() {
    stop_.Now();
    DCHECK(running_);
    running_ = false;
  }

  int64 Delta() {
    DCHECK(!running_);
    return start_.Delta(stop_);
  }

 private:
  bool running_;
  CefTime start_;
  CefTime stop_;

  DISALLOW_COPY_AND_ASSIGN(CefTimer);
};

// Peform test iterations using a user-provided timing result variable.
#define PERF_ITERATIONS_START_EX() \
  {                                \
    CefTimer _timer;               \
    _timer.Start();                \
    for (int _i = 0; _i < PERF_TEST_PARAM_ITERATIONS; ++_i) {
#define PERF_ITERATIONS_END_EX(result) \
  }                                    \
  _timer.Stop();                       \
  result = _timer.Delta();             \
  }

// Perform test iterations and return the timing result.
#define PERF_ITERATIONS_START() \
  int64 _result = 0;            \
  PERF_ITERATIONS_START_EX()

#define PERF_ITERATIONS_END()     \
  PERF_ITERATIONS_END_EX(_result) \
  return _result;

// Perf test entry structure.
struct PerfTestEntry {
  const char* name;
  PerfTest* test;
  int iterations;
};

// Array of perf tests.
extern const PerfTestEntry kPerfTests[];
extern const int kPerfTestsCount;

}  // namespace performance_test
}  // namespace client

#endif  // CEF_TESTS_CEFCLIENT_RENDERER_PERFORMANCE_TEST_H_
