15e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
25e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
35e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// found in the LICENSE file.
45e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
55e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#ifndef V8_TESTING_GTEST_SUPPORT_H_
65e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#define V8_TESTING_GTEST_SUPPORT_H_
75e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
85e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#include "include/v8stdint.h"
95e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#include "testing/gtest/include/gtest/gtest.h"
105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace testing {
125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace internal {
135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#define GET_TYPE_NAME(type)                \
155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  template <>                              \
165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  inline std::string GetTypeName<type>() { \
175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    return #type;                          \
185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgGET_TYPE_NAME(int8_t)
205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgGET_TYPE_NAME(uint8_t)
215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgGET_TYPE_NAME(int16_t)
225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgGET_TYPE_NAME(uint16_t)
235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgGET_TYPE_NAME(int32_t)
245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgGET_TYPE_NAME(uint32_t)
255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgGET_TYPE_NAME(int64_t)
265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgGET_TYPE_NAME(uint64_t)
275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgGET_TYPE_NAME(float)
285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgGET_TYPE_NAME(double)
295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#undef GET_TYPE_NAME
305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// TRACED_FOREACH(type, var, array) expands to a loop that assigns |var| every
335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// item in the |array| and adds a SCOPED_TRACE() message for the |var| while
345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// inside the loop body.
355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// TODO(bmeurer): Migrate to C++11 once we're ready.
365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#define TRACED_FOREACH(_type, _var, _array)                                \
37fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  for (size_t _i = 0; _i < arraysize(_array); ++_i)                        \
385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    for (bool _done = false; !_done;)                                      \
3906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org      for (_type const _var = _array[_i]; !_done;)                         \
405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        for (SCOPED_TRACE(::testing::Message() << #_var << " = " << _var); \
415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org             !_done; _done = true)
425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// TRACED_FORRANGE(type, var, low, high) expands to a loop that assigns |var|
455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// every value in the range |low| to (including) |high| and adds a
465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// SCOPED_TRACE() message for the |var| while inside the loop body.
475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// TODO(bmeurer): Migrate to C++11 once we're ready.
485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#define TRACED_FORRANGE(_type, _var, _low, _high)                          \
495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  for (_type _i = _low; _i <= _high; ++_i)                                 \
505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    for (bool _done = false; !_done;)                                      \
5106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org      for (_type const _var = _i; !_done;)                                 \
525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        for (SCOPED_TRACE(::testing::Message() << #_var << " = " << _var); \
535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org             !_done; _done = true)
545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace internal
565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace testing
575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#endif  // V8_TESTING_GTEST_SUPPORT_H_
59