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