1e5c31af7Sopenharmony_ci#ifndef _VKTTESTGROUPUTIL_HPP
2e5c31af7Sopenharmony_ci#define _VKTTESTGROUPUTIL_HPP
3e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * Vulkan Conformance Tests
5e5c31af7Sopenharmony_ci * ------------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright (c) 2016 Google Inc.
8e5c31af7Sopenharmony_ci *
9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci *
15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci * limitations under the License.
20e5c31af7Sopenharmony_ci *
21e5c31af7Sopenharmony_ci *//*!
22e5c31af7Sopenharmony_ci * \file
23e5c31af7Sopenharmony_ci * \brief TestCaseGroup utilities
24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "tcuDefs.hpp"
27e5c31af7Sopenharmony_ci#include "tcuTestCase.hpp"
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_cinamespace vkt
30e5c31af7Sopenharmony_ci{
31e5c31af7Sopenharmony_ci
32e5c31af7Sopenharmony_ciclass TestGroupHelper0 : public tcu::TestCaseGroup
33e5c31af7Sopenharmony_ci{
34e5c31af7Sopenharmony_cipublic:
35e5c31af7Sopenharmony_ci	typedef void (*CreateChildrenFunc) (tcu::TestCaseGroup* testGroup);
36e5c31af7Sopenharmony_ci	typedef void (*CleanupGroupFunc) (tcu::TestCaseGroup* testGroup);
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_ci								TestGroupHelper0	(tcu::TestContext&		testCtx,
39e5c31af7Sopenharmony_ci													 const std::string&		name,
40e5c31af7Sopenharmony_ci													 CreateChildrenFunc		createChildren,
41e5c31af7Sopenharmony_ci													 CleanupGroupFunc		cleanupGroup)
42e5c31af7Sopenharmony_ci									: tcu::TestCaseGroup(testCtx, name.c_str(), "")
43e5c31af7Sopenharmony_ci									, m_createChildren(createChildren)
44e5c31af7Sopenharmony_ci									, m_cleanupGroup(cleanupGroup)
45e5c31af7Sopenharmony_ci								{
46e5c31af7Sopenharmony_ci								}
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_ci								~TestGroupHelper0	(void)
49e5c31af7Sopenharmony_ci								{
50e5c31af7Sopenharmony_ci								}
51e5c31af7Sopenharmony_ci
52e5c31af7Sopenharmony_ci	void						init				(void)
53e5c31af7Sopenharmony_ci								{
54e5c31af7Sopenharmony_ci									m_createChildren(this);
55e5c31af7Sopenharmony_ci								}
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_ci	void						deinit				(void)
58e5c31af7Sopenharmony_ci								{
59e5c31af7Sopenharmony_ci									if (m_cleanupGroup)
60e5c31af7Sopenharmony_ci										m_cleanupGroup(this);
61e5c31af7Sopenharmony_ci								}
62e5c31af7Sopenharmony_ci
63e5c31af7Sopenharmony_ciprivate:
64e5c31af7Sopenharmony_ci	const CreateChildrenFunc	m_createChildren;
65e5c31af7Sopenharmony_ci	const CleanupGroupFunc		m_cleanupGroup;
66e5c31af7Sopenharmony_ci};
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_citemplate<typename Arg0>
69e5c31af7Sopenharmony_ciclass TestGroupHelper1 : public tcu::TestCaseGroup
70e5c31af7Sopenharmony_ci{
71e5c31af7Sopenharmony_cipublic:
72e5c31af7Sopenharmony_ci	typedef void (*CreateChildrenFunc) (tcu::TestCaseGroup* testGroup, Arg0 arg0);
73e5c31af7Sopenharmony_ci	typedef void (*CleanupGroupFunc) (tcu::TestCaseGroup* testGroup, Arg0 arg0);
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_ci								TestGroupHelper1	(tcu::TestContext&		testCtx,
76e5c31af7Sopenharmony_ci													 const std::string&		name,
77e5c31af7Sopenharmony_ci													 CreateChildrenFunc		createChildren,
78e5c31af7Sopenharmony_ci													 const Arg0&			arg0,
79e5c31af7Sopenharmony_ci													 CleanupGroupFunc		cleanupGroup)
80e5c31af7Sopenharmony_ci									: tcu::TestCaseGroup	(testCtx, name.c_str())
81e5c31af7Sopenharmony_ci									, m_createChildren		(createChildren)
82e5c31af7Sopenharmony_ci									, m_cleanupGroup		(cleanupGroup)
83e5c31af7Sopenharmony_ci									, m_arg0				(arg0)
84e5c31af7Sopenharmony_ci								{}
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_ci	void						init				(void) { m_createChildren(this, m_arg0); }
87e5c31af7Sopenharmony_ci	void						deinit				(void) { if (m_cleanupGroup) m_cleanupGroup(this, m_arg0); }
88e5c31af7Sopenharmony_ci
89e5c31af7Sopenharmony_ciprivate:
90e5c31af7Sopenharmony_ci	const CreateChildrenFunc	m_createChildren;
91e5c31af7Sopenharmony_ci	const CleanupGroupFunc		m_cleanupGroup;
92e5c31af7Sopenharmony_ci	const Arg0					m_arg0;
93e5c31af7Sopenharmony_ci};
94e5c31af7Sopenharmony_ci
95e5c31af7Sopenharmony_citemplate<typename Arg0, typename Arg1>
96e5c31af7Sopenharmony_ciclass TestGroupHelper2 : public tcu::TestCaseGroup
97e5c31af7Sopenharmony_ci{
98e5c31af7Sopenharmony_cipublic:
99e5c31af7Sopenharmony_ci	typedef void(*CreateChildrenFunc) (tcu::TestCaseGroup* testGroup, Arg0 arg0, Arg1 arg1);
100e5c31af7Sopenharmony_ci	typedef void(*CleanupGroupFunc) (tcu::TestCaseGroup* testGroup, Arg0 arg0, Arg1 arg1);
101e5c31af7Sopenharmony_ci
102e5c31af7Sopenharmony_ci								TestGroupHelper2(tcu::TestContext&		testCtx,
103e5c31af7Sopenharmony_ci												const std::string&		name,
104e5c31af7Sopenharmony_ci												CreateChildrenFunc		createChildren,
105e5c31af7Sopenharmony_ci												const Arg0&				arg0,
106e5c31af7Sopenharmony_ci												const Arg1&				arg1,
107e5c31af7Sopenharmony_ci												CleanupGroupFunc		cleanupGroup)
108e5c31af7Sopenharmony_ci									: tcu::TestCaseGroup	(testCtx, name.c_str())
109e5c31af7Sopenharmony_ci									, m_createChildren		(createChildren)
110e5c31af7Sopenharmony_ci									, m_cleanupGroup		(cleanupGroup)
111e5c31af7Sopenharmony_ci									, m_arg0				(arg0)
112e5c31af7Sopenharmony_ci									, m_arg1				(arg1)
113e5c31af7Sopenharmony_ci								{}
114e5c31af7Sopenharmony_ci
115e5c31af7Sopenharmony_ci	void						init		(void) { m_createChildren(this, m_arg0, m_arg1); }
116e5c31af7Sopenharmony_ci	void						deinit		(void) { if (m_cleanupGroup) m_cleanupGroup(this, m_arg0, m_arg1); }
117e5c31af7Sopenharmony_ci
118e5c31af7Sopenharmony_ciprivate:
119e5c31af7Sopenharmony_ci	const CreateChildrenFunc	m_createChildren;
120e5c31af7Sopenharmony_ci	const CleanupGroupFunc		m_cleanupGroup;
121e5c31af7Sopenharmony_ci	const Arg0					m_arg0;
122e5c31af7Sopenharmony_ci	const Arg1					m_arg1;
123e5c31af7Sopenharmony_ci};
124e5c31af7Sopenharmony_ci
125e5c31af7Sopenharmony_ciinline tcu::TestCaseGroup* createTestGroup (tcu::TestContext&										testCtx,
126e5c31af7Sopenharmony_ci											const std::string&										name,
127e5c31af7Sopenharmony_ci											TestGroupHelper0::CreateChildrenFunc					createChildren,
128e5c31af7Sopenharmony_ci											TestGroupHelper0::CleanupGroupFunc						cleanupGroup = DE_NULL)
129e5c31af7Sopenharmony_ci{
130e5c31af7Sopenharmony_ci	return new TestGroupHelper0(testCtx, name, createChildren, cleanupGroup);
131e5c31af7Sopenharmony_ci}
132e5c31af7Sopenharmony_ci
133e5c31af7Sopenharmony_citemplate<typename Arg0>
134e5c31af7Sopenharmony_citcu::TestCaseGroup* createTestGroup (tcu::TestContext&										testCtx,
135e5c31af7Sopenharmony_ci									 const std::string&										name,
136e5c31af7Sopenharmony_ci									 typename TestGroupHelper1<Arg0>::CreateChildrenFunc	createChildren,
137e5c31af7Sopenharmony_ci									 Arg0													arg0,
138e5c31af7Sopenharmony_ci									 typename TestGroupHelper1<Arg0>::CleanupGroupFunc		cleanupGroup = DE_NULL)
139e5c31af7Sopenharmony_ci{
140e5c31af7Sopenharmony_ci	return new TestGroupHelper1<Arg0>(testCtx, name, createChildren, arg0, cleanupGroup);
141e5c31af7Sopenharmony_ci}
142e5c31af7Sopenharmony_citemplate<typename Arg0, typename Arg1>
143e5c31af7Sopenharmony_citcu::TestCaseGroup* createTestGroup (tcu::TestContext&											testCtx,
144e5c31af7Sopenharmony_ci									 const std::string&											name,
145e5c31af7Sopenharmony_ci									 typename TestGroupHelper2<Arg0, Arg1>::CreateChildrenFunc	createChildren,
146e5c31af7Sopenharmony_ci									 Arg0														arg0,
147e5c31af7Sopenharmony_ci									 Arg1														arg1,
148e5c31af7Sopenharmony_ci									 typename TestGroupHelper2<Arg0, Arg1>::CleanupGroupFunc	cleanupGroup = DE_NULL)
149e5c31af7Sopenharmony_ci{
150e5c31af7Sopenharmony_ci	return new TestGroupHelper2<Arg0, Arg1>(testCtx, name, createChildren, arg0, arg1, cleanupGroup);
151e5c31af7Sopenharmony_ci}
152e5c31af7Sopenharmony_ci
153e5c31af7Sopenharmony_ciinline void addTestGroup (tcu::TestCaseGroup*					parent,
154e5c31af7Sopenharmony_ci						  const std::string&					name,
155e5c31af7Sopenharmony_ci						  TestGroupHelper0::CreateChildrenFunc	createChildren)
156e5c31af7Sopenharmony_ci{
157e5c31af7Sopenharmony_ci	parent->addChild(createTestGroup(parent->getTestContext(), name, createChildren));
158e5c31af7Sopenharmony_ci}
159e5c31af7Sopenharmony_ci
160e5c31af7Sopenharmony_citemplate<typename Arg0>
161e5c31af7Sopenharmony_civoid addTestGroup (tcu::TestCaseGroup*									parent,
162e5c31af7Sopenharmony_ci				   const std::string&									name,
163e5c31af7Sopenharmony_ci				   typename TestGroupHelper1<Arg0>::CreateChildrenFunc	createChildren,
164e5c31af7Sopenharmony_ci				   Arg0													arg0,
165e5c31af7Sopenharmony_ci				   typename TestGroupHelper1<Arg0>::CleanupGroupFunc	cleanupGroup = DE_NULL)
166e5c31af7Sopenharmony_ci{
167e5c31af7Sopenharmony_ci	parent->addChild(createTestGroup<Arg0>(parent->getTestContext(), name, createChildren, arg0, cleanupGroup));
168e5c31af7Sopenharmony_ci}
169e5c31af7Sopenharmony_ci
170e5c31af7Sopenharmony_citemplate<typename Arg0, typename Arg1>
171e5c31af7Sopenharmony_civoid addTestGroup(tcu::TestCaseGroup*					parent,
172e5c31af7Sopenharmony_ci	const std::string&									name,
173e5c31af7Sopenharmony_ci	typename TestGroupHelper2<Arg0,Arg1>::CreateChildrenFunc	createChildren,
174e5c31af7Sopenharmony_ci	Arg0												arg0,
175e5c31af7Sopenharmony_ci	Arg1												arg1,
176e5c31af7Sopenharmony_ci	typename TestGroupHelper2<Arg0,Arg1>::CleanupGroupFunc	cleanupGroup = DE_NULL)
177e5c31af7Sopenharmony_ci{
178e5c31af7Sopenharmony_ci	parent->addChild(createTestGroup<Arg0,Arg1>(parent->getTestContext(), name, createChildren, arg0, arg1, cleanupGroup));
179e5c31af7Sopenharmony_ci}
180e5c31af7Sopenharmony_ci
181e5c31af7Sopenharmony_ci} // vkt
182e5c31af7Sopenharmony_ci
183e5c31af7Sopenharmony_ci#endif // _VKTTESTGROUPUTIL_HPP
184