nlib
ParamValue.h
[詳解]
1 
2 /*--------------------------------------------------------------------------------*
3  Project: CrossRoad
4  Copyright (C)Nintendo All rights reserved.
5 
6  These coded instructions, statements, and computer programs contain proprietary
7  information of Nintendo and/or its licensed developers and are protected by
8  national and international copyright laws. They may not be disclosed to third
9  parties or copied or duplicated in any form, in whole or in part, without the
10  prior written consent of Nintendo.
11 
12  The content herein is highly confidential and should be handled accordingly.
13  *--------------------------------------------------------------------------------*/
14 
15 #pragma once
16 #ifndef INCLUDE_NN_NLIB_TESTING_PARAMVALUE_H_
17 #define INCLUDE_NN_NLIB_TESTING_PARAMVALUE_H_
18 
19 #include "nn/nlib/Config.h"
20 #include "nn/nlib/testing/NTest.h"
21 #include "nn/nlib/testing/ParamValueTypes.h"
22 #include "nn/nlib/UniquePtr.h"
23 #include "nn/nlib/Nlist.h"
24 
25 #if defined(_MSC_VER) && defined(nx_testing_EXPORTS)
26 #undef NLIB_VIS_PUBLIC
27 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT
28 #endif
29 
30 NLIB_NAMESPACE_BEGIN
31 namespace testing {
32 
33 class NLIB_VIS_PUBLIC TestWithParamBase : public Test {
34  public:
35  virtual void TestBody() NLIB_OVERRIDE;
36 
37  private:
38  virtual void TestBodySub() = 0;
39  virtual bool SetParam(size_t i) = 0;
40 };
41 
42 template<class T>
43 class TestWithParam : public TestWithParamBase {
44  public:
45  typedef T ParamType;
46  TestWithParam() : param_(nullptr) {}
47  const ParamType& GetParam() const { return *param_; }
48  static Nlist<ParamType>* GetParams() { return &param_vec_; }
49 
50  private:
51  virtual bool SetParam(size_t i) NLIB_OVERRIDE;
52 
53  private:
54  const ParamType* param_;
55  static Nlist<ParamType> param_vec_;
56 
57  NLIB_DISALLOW_COPY_AND_ASSIGN(TestWithParam);
58 };
59 
60 template<class T>
61 bool TestWithParam<T>::SetParam(size_t i) {
62  if (i < param_vec_.size()) {
63  param_ = &param_vec_[i];
64  return true;
65  }
66  return false;
67 }
68 
69 template<>
70 NLIB_VIS_PUBLIC bool TestWithParam<bool>::SetParam(size_t i);
71 
72 template<class T>
73 Nlist<T> TestWithParam<T>::param_vec_;
74 
75 class NLIB_VIS_PUBLIC TestParamAdderBase {
76  public:
77  virtual ~TestParamAdderBase() {}
78  virtual void AddParams() = 0;
79 
80  protected:
81  TestParamAdderBase() {}
82 
83  private:
84  NLIB_DISALLOW_COPY_AND_ASSIGN(TestParamAdderBase);
85 };
86 
87 class NLIB_VIS_PUBLIC TestParamAdderList {
88  public:
89  static void AddParams();
90  static void AddTestParamAdder(TestParamAdderBase* v);
91 
92  public:
93  TestParamAdderList() {}
94  ~TestParamAdderList() {}
95 
96  private:
97  static TestParamAdderBase* adder_list_[1024];
98  static int adder_list_idx_;
99 
100  NLIB_DISALLOW_COPY_AND_ASSIGN(TestParamAdderList);
101 };
102 
103 inline detail::ValuesBool Bool() {
104  return detail::ValuesBool();
105 }
106 
107 template<class C, size_t N>
108 detail::ValuesInObjArray<C, N> ValuesIn(const C (&a)[N]) {
109  return detail::ValuesInObjArray<C, N>(a);
110 }
111 
112 template<class Container>
113 detail::ValuesInObjContainer<Container> ValuesIn(const Container& c) {
114  return detail::ValuesInObjContainer<Container>(c);
115 }
116 
117 template<class Iterator>
118 detail::ValuesInObjIterator<Iterator> ValuesIn(Iterator first, Iterator last) {
119  return detail::ValuesInObjIterator<Iterator>(first, last);
120 }
121 
122 template<class T>
123 detail::ValuesRange<T, T> Range(T first, T last) {
124  return detail::ValuesRange<T, T>(first, last, T(1));
125 }
126 
127 template<class T, class S>
128 detail::ValuesRange<T, S> Range(T first, T last, S step) {
129  return detail::ValuesRange<T, S>(first, last, step);
130 }
131 
132 template<class T1>
133 detail::Values1<T1> Values(T1 v1) {
134  return detail::Values1<T1>(v1);
135 }
136 
137 template<class T1, class T2>
138 detail::Values2<T1, T2> Values(T1 v1, T2 v2) {
139  return detail::Values2<T1, T2>(v1, v2);
140 }
141 
142 template<class T1, class T2, class T3>
143 detail::Values3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
144  return detail::Values3<T1, T2, T3>(v1, v2, v3);
145 }
146 
147 template<class T1, class T2, class T3, class T4>
148 detail::Values4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
149  return detail::Values4<T1, T2, T3, T4>(v1, v2, v3, v4);
150 }
151 
152 template<class T1, class T2, class T3, class T4, class T5>
153 detail::Values5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) {
154  return detail::Values5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
155 }
156 
157 template<class T1, class T2, class T3, class T4, class T5, class T6>
158 detail::Values6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) {
159  return detail::Values6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
160 }
161 
162 template<class T1, class T2, class T3, class T4, class T5, class T6, class T7>
163 detail::Values7<T1, T2, T3, T4, T5, T6, T7>
164 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) {
165  return detail::Values7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5, v6, v7);
166 }
167 
168 template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
169 detail::Values8<T1, T2, T3, T4, T5, T6, T7, T8>
170 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
171  return detail::Values8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4, v5, v6, v7, v8);
172 }
173 
174 template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
175 detail::Values9<T1, T2, T3, T4, T5, T6, T7, T8, T9>
176 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
177  return detail::Values9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3, v4, v5, v6, v7, v8, v9);
178 }
179 
180 template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
181  class T10>
182 detail::Values10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
183 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
184  return detail::Values10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1, v2, v3, v4, v5, v6, v7, v8,
185  v9, v10);
186 }
187 
188 } // namespace testing
189 NLIB_NAMESPACE_END
190 
191 #define TEST_P(test_case, test_name) \
192  class NLIB_TESTING_CLASS_NAME_(test_case, test_name) : public test_case { \
193  public: \
194  NLIB_TESTING_CLASS_NAME_(test_case, test_name)() {} \
195  \
196  private: \
197  virtual void TestBodySub(); \
198  static ::nlib_ns::testing::TestInfo* info_; \
199  NLIB_DISALLOW_COPY_AND_ASSIGN(NLIB_TESTING_CLASS_NAME_(test_case, test_name)); \
200  }; \
201  ::nlib_ns::testing::TestInfo* NLIB_TESTING_CLASS_NAME_(test_case, test_name)::info_ = \
202  ::nlib_ns::testing::TestInfo::AddTestInfo<NLIB_TESTING_CLASS_NAME_(test_case, test_name)>( \
203  #test_case, #test_name, -1, test_case::SetUpTestCase, test_case::TearDownTestCase); \
204  void NLIB_TESTING_CLASS_NAME_(test_case, test_name)::TestBodySub()
205 
206 #define INSTANTIATE_TEST_CASE_P(prefix, test_case, generator) \
207  class TestParamAdder_##test_case##prefix : public ::nlib_ns::testing::TestParamAdderBase { \
208  public: \
209  TestParamAdder_##test_case##prefix() { \
210  ::nlib_ns::testing::TestParamAdderList::AddTestParamAdder(this); \
211  } \
212  virtual void AddParams() { (generator).Gen(test_case::GetParams()); } \
213  } ntest_##test_case##prefix##_glbval_
214 
215 #if defined(_MSC_VER) && defined(nx_testing_EXPORTS)
216 #undef NLIB_VIS_PUBLIC
217 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT
218 #endif
219 
220 #endif // INCLUDE_NN_NLIB_TESTING_PARAMVALUE_H_
#define NLIB_OVERRIDE
利用可能であればoverrideが定義されます。そうでない場合は空文字列です。
Definition: Config.h:249
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:183
std::unique_ptrに相当するクラスが定義されています。
#define NLIB_VIS_PUBLIC
関数やクラス等のシンボルをライブラリの外部に公開します。
Definition: Platform_unix.h:87
std::vectorに似ていますが、コピーできないオブジェクトを格納可能なクラスが定義されています。 ...
開発環境別の設定が書かれるファイルです。
基本的な単体テスト用マクロが定義されています。