PuzzleSDK
TemplateVectorTest类 参考

#include <UnitTest.h>

+ 类 TemplateVectorTest 继承关系图:
+ TemplateVectorTest 的协作图:

Public 成员函数

 CREATE_FUNC (TemplateVectorTest)
 
virtual void onEnter () override
 
virtual std::string subtitle () const override
 
void constFunc (const cocos2d::Vector< Node * > &vec) const
 
- Public 成员函数 继承自 UnitTestDemo
virtual std::string title () const override
 
- Public 成员函数 继承自 TestCase
 TestCase ()
 
 ~TestCase ()
 
virtual Type getTestType () const
 
virtual float getDuration () const
 
virtual std::string getExpectedOutput () const
 
virtual std::string getActualOutput () const
 
virtual void restartTestCallback (cocos2d::Ref *sender)
 
virtual void nextTestCallback (cocos2d::Ref *sender)
 
virtual void priorTestCallback (cocos2d::Ref *sender)
 
virtual void onBackCallback (cocos2d::Ref *sender)
 
void setTestSuite (TestSuite *testSuite)
 
TestSuitegetTestSuite () const
 
float getRunTime () const
 
void setTestCaseName (const std::string &name)
 
std::string getTestCaseName () const
 
const cocos2d::Label * getSubtitleLable () const
 
const cocos2d::MenuItemImage * getRestartTestItem () const
 

额外继承的成员函数

- Public 类型 继承自 TestCase
enum class  Type { ROBUSTNESS , UNIT , GRAPHICAL_STATIC , MANUAL }
 
- Public 属性 继承自 TestCase
CC_CONSTRUCTOR_ACCESS __pad0__: virtual bool init() override
 
- Protected 属性 继承自 TestCase
cocos2d::MenuItemImage * _priorTestItem
 
cocos2d::MenuItemImage * _restartTestItem
 
cocos2d::MenuItemImage * _nextTestItem
 
cocos2d::Label * _titleLabel
 
cocos2d::Label * _subtitleLabel
 

详细描述

在文件 UnitTest.h40 行定义.

成员函数说明

◆ constFunc()

void TemplateVectorTest::constFunc ( const cocos2d::Vector< Node * > &  vec) const

在文件 UnitTest.cpp358 行定义.

359{
360 log("vec[8] = %d", vec.at(8)->getTag());
361}

被这些函数引用 onEnter().

+ 这是这个函数的调用关系图:

◆ CREATE_FUNC()

TemplateVectorTest::CREATE_FUNC ( TemplateVectorTest  )

◆ onEnter()

void TemplateVectorTest::onEnter ( )
overridevirtual

重载 TestCase .

在文件 UnitTest.cpp92 行定义.

93{
95
96 Vector<Node*> vec;
97 CCASSERT(vec.empty(), "vec should be empty.");
98 CCASSERT(vec.capacity() == 0, "vec.capacity should be 0.");
99 CCASSERT(vec.size() == 0, "vec.size should be 0.");
100 CCASSERT(vec.max_size() > 0, "vec.max_size should > 0.");
101
102 auto node1 = Node::create();
103 node1->setTag(1);
104 vec.pushBack(node1);
105 CCASSERT(node1->getReferenceCount() == 2, "node1->getReferenceCount should be 2.");
106
107 auto node2 = Node::create();
108 node2->setTag(2);
109 vec.pushBack(node2);
110 CCASSERT(vec.getIndex(node1) == 0, "node1 should at index 0 in vec.");
111 CCASSERT(vec.getIndex(node2) == 1, "node2 should at index 1 in vec.");
112
113 auto node3 = Node::create();
114 node3->setTag(3);
115 vec.insert(1, node3);
116 CCASSERT(vec.at(0)->getTag() == 1, "The element at 0, tag should be 1.");
117 CCASSERT(vec.at(1)->getTag() == 3, "The element at 1, tag should be 3.");
118 CCASSERT(vec.at(2)->getTag() == 2, "The element at 2, tag should be 2.");
119
120 // Test copy constructor
121 Vector<Node*> vec2(vec);
122 CCASSERT(vec2.size() == vec.size(), "vec2 and vec should have equal size.");
123 ssize_t size = vec.size();
124 for (ssize_t i = 0; i < size; ++i)
125 {
126 CCASSERT(vec2.at(i) == vec.at(i), "The element at the same index in vec2 and vec2 should be equal.");
127 CCASSERT(vec.at(i)->getReferenceCount() == 3, "The reference count of element in vec is 3. ");
128 CCASSERT(vec2.at(i)->getReferenceCount() == 3, "The reference count of element in vec2 is 3. ");
129 }
130
131 // Test copy assignment operator
132 Vector<Node*> vec3;
133 vec3 = vec2;
134 CCASSERT(vec3.size() == vec2.size(), "vec3 and vec2 should have equal size.");
135 size = vec3.size();
136 for (ssize_t i = 0; i < size; ++i)
137 {
138 CCASSERT(vec3.at(i) == vec2.at(i), "The element at the same index in vec3 and vec2 should be equal.");
139 CCASSERT(vec3.at(i)->getReferenceCount() == 4, "The reference count of element in vec3 is 4. ");
140 CCASSERT(vec2.at(i)->getReferenceCount() == 4, "The reference count of element in vec2 is 4. ");
141 CCASSERT(vec.at(i)->getReferenceCount() == 4, "The reference count of element in vec is 4. ");
142 }
143
144 // Test move constructor
145
146 auto createVector = [](){
147 Vector<Node*> ret;
148
149 for (int i = 0; i < 20; i++)
150 {
151 ret.pushBack(Node::create());
152 }
153
154 int j = 1000;
155 for (auto& child : ret)
156 {
157 child->setTag(j++);
158 }
159
160 return ret;
161 };
162
163 Vector<Node*> vec4(createVector());
164 for (const auto& child : vec4)
165 {
166 CC_UNUSED_PARAM(child);
167 CCASSERT(child->getReferenceCount() == 2, "child's reference count should be 2.");
168 }
169
170 // Test init Vector<T> with capacity
171 Vector<Node*> vec5(10);
172 CCASSERT(vec5.capacity() == 10, "vec5's capacity should be 10.");
173 vec5.reserve(20);
174 CCASSERT(vec5.capacity() == 20, "vec5's capacity should be 20.");
175
176 CCASSERT(vec5.size() == 0, "vec5's size should be 0.");
177 CCASSERT(vec5.empty(), "vec5 is empty now.");
178
179 auto toRemovedNode = Node::create();
180 vec5.pushBack(toRemovedNode);
181 CCASSERT(toRemovedNode->getReferenceCount() == 2, "toRemovedNode's reference count is 2.");
182
183 // Test move assignment operator
184 vec5 = createVector();
185 CCASSERT(toRemovedNode->getReferenceCount() == 1, "toRemovedNode's reference count is 1.");
186 CCASSERT(vec5.size() == 20, "size should be 20");
187
188 for (const auto& child : vec5)
189 {
190 CC_UNUSED_PARAM(child);
191 CCASSERT(child->getReferenceCount() == 2, "child's reference count is 2.");
192 }
193
194 // Test Vector<T>::find
195 CCASSERT(vec.find(node3) == (vec.begin() + 1), "node3 is the 2nd element in vec.");
196 CCASSERT(std::find(std::begin(vec), std::end(vec), node2) == (vec.begin() + 2), "node2 is the 3rd element in vec.");
197
198 CCASSERT(vec.front()->getTag() == 1, "vec's front element's tag is 1.");
199 CCASSERT(vec.back()->getTag() == 2, "vec's back element's tag is 2.");
200
201 CCASSERT(vec.getRandomObject(), "vec getRandomObject should return true.");
202 CCASSERT(!vec.contains(Node::create()), "vec doesn't contain a empty Node instance.");
203 CCASSERT(vec.contains(node1), "vec contains node1.");
204 CCASSERT(vec.contains(node2), "vec contains node2.");
205 CCASSERT(vec.contains(node3), "vec contains node3.");
206 CCASSERT(vec.equals(vec2), "vec is equal to vec2.");
207 CCASSERT(vec.equals(vec3), "vec is equal to vec3.");
208
209 // Insert
210 vec5.insert(2, node1);
211 CCASSERT(vec5.at(2)->getTag() == 1, "vec5's 3rd element's tag is 1.");
212 CCASSERT(vec5.size() == 21, "vec5's size is 21.");
213 vec5.back()->setTag(100);
214 vec5.popBack();
215 CCASSERT(vec5.size() == 20, "vec5's size is 20.");
216 CCASSERT(vec5.back()->getTag() != 100, "the back element of vec5's tag is 100.");
217
218 // Erase and clear
219 Vector<Node*> vec6 = createVector();
220 Vector<Node*> vec7 = vec6; // Copy for check
221
222 CCASSERT(vec6.size() == 20, "vec6's size is 20.");
223 vec6.erase(vec6.begin() + 1); //
224 CCASSERT(vec6.size() == 19, "vec6's size is 19.");
225 CCASSERT((*(vec6.begin() + 1))->getTag() == 1002, "The 2rd element in vec6's tag is 1002.");
226 vec6.erase(vec6.begin() + 2, vec6.begin() + 10);
227 CCASSERT(vec6.size() == 11, "vec6's size is 11.");
228 CCASSERT(vec6.at(0)->getTag() == 1000, "vec6's first element's tag is 1000.");
229 CCASSERT(vec6.at(1)->getTag() == 1002, "vec6's second element's tag is 1002.");
230 CCASSERT(vec6.at(2)->getTag() == 1011, "vec6's third element's tag is 1011.");
231 CCASSERT(vec6.at(3)->getTag() == 1012, "vec6's fouth element's tag is 1012.");
232 vec6.erase(3);
233 CCASSERT(vec6.at(3)->getTag() == 1013, "vec6's 4th element's tag is 1013.");
234 vec6.eraseObject(vec6.at(2));
235 CCASSERT(vec6.at(2)->getTag() == 1013, "vec6's 3rd element's tag is 1013.");
236 vec6.clear();
237
238 auto objA = Node::create(); // retain count is 1
239 auto objB = Node::create();
240 auto objC = Node::create();
241 {
242 Vector<Node*> array1;
243 Vector<Node*> array2;
244
245 // push back objA 3 times
246 array1.pushBack(objA); // retain count is 2
247 array1.pushBack(objA); // retain count is 3
248 array1.pushBack(objA); // retain count is 4
249
250 array2.pushBack(objA); // retain count is 5
251 array2.pushBack(objB);
252 array2.pushBack(objC);
253
254 for (auto obj : array1) {
255 array2.eraseObject(obj);
256 }
257 CCASSERT(objA->getReferenceCount() == 4, "objA's reference count is 4.");
258 }
259 CCASSERT(objA->getReferenceCount() == 1, "objA's reference count is 1.");
260
261 {
262 Vector<Node*> array1;
263 // push back objA 3 times
264 array1.pushBack(objA); // retain count is 2
265 array1.pushBack(objA); // retain count is 3
266 array1.pushBack(objA); // retain count is 4
267 CCASSERT(objA->getReferenceCount() == 4, "objA's reference count is 4.");
268 array1.eraseObject(objA, true); // Remove all occurrences in the Vector.
269 CCASSERT(objA->getReferenceCount() == 1, "objA's reference count is 1.");
270
271 array1.pushBack(objA); // retain count is 2
272 array1.pushBack(objA); // retain count is 3
273 array1.pushBack(objA); // retain count is 4
274
275 array1.eraseObject(objA, false);
276 CCASSERT(objA->getReferenceCount() == 3, "objA's reference count is 3."); // Only remove the first occurrence in the Vector.
277 }
278
279 // Check the retain count in vec7
280 CCASSERT(vec7.size() == 20, "vec7's size is 20.");
281 for (const auto& child : vec7)
282 {
283 CC_UNUSED_PARAM(child);
284 CCASSERT(child->getReferenceCount() == 2, "child's reference count is 2.");
285 }
286
287 // Sort
288 Vector<Node*> vecForSort = createVector();
289 std::sort(vecForSort.begin(), vecForSort.end(), [](Node* a, Node* b){
290 return a->getTag() >= b->getTag();
291 });
292
293 for (int i = 0; i < 20; ++i)
294 {
295 CCASSERT(vecForSort.at(i)->getTag() - 1000 == (19 - i), "vecForSort's element's tag is invalid.");
296 }
297
298 // Reverse
299 vecForSort.reverse();
300 for (int i = 0; i < 20; ++i)
301 {
302 CCASSERT(vecForSort.at(i)->getTag() - 1000 == i, "vecForSort's element's tag is invalid.");
303 }
304
305 // Swap
306 Vector<Node*> vecForSwap = createVector();
307 vecForSwap.swap(2, 4);
308 CCASSERT(vecForSwap.at(2)->getTag() == 1004, "vecForSwap's 3nd element's tag is 1004.");
309 CCASSERT(vecForSwap.at(4)->getTag() == 1002, "vecForSwap's 5rd element's tag is 1002.");
310 vecForSwap.swap(vecForSwap.at(2), vecForSwap.at(4));
311 CCASSERT(vecForSwap.at(2)->getTag() == 1002, "vecForSwap's 3rd element's tag is 1002.");
312 CCASSERT(vecForSwap.at(4)->getTag() == 1004, "vecForSwap's 5rd element's tag is 1004.");
313
314 // shrinkToFit
315 Vector<Node*> vecForShrink = createVector();
316 vecForShrink.reserve(100);
317 CCASSERT(vecForShrink.capacity() == 100, "vecForShrink's capacity is 100.");
318 vecForShrink.pushBack(Node::create());
319 vecForShrink.shrinkToFit();
320 CCASSERT(vecForShrink.capacity() == 21, "vecForShrink's capacity is 21.");
321
322 // get random object
323 // Set the seed by time
324 std::srand((unsigned)time(nullptr));
325 Vector<Node*> vecForRandom = createVector();
326 log("<--- begin ---->");
327 for (int i = 0; i < vecForRandom.size(); ++i)
328 {
329 log("Vector: random object tag = %d", vecForRandom.getRandomObject()->getTag());
330 }
331 log("<---- end ---->");
332
333 // Self assignment
334 Vector<Node*> vecSelfAssign = createVector();
335 vecSelfAssign = vecSelfAssign;
336 CCASSERT(vecSelfAssign.size() == 20, "vecSelfAssign's size is 20.");
337
338 for (const auto& child : vecSelfAssign)
339 {
340 CC_UNUSED_PARAM(child);
341 CCASSERT(child->getReferenceCount() == 2, "child's reference count is 2.");
342 }
343
344 vecSelfAssign = std::move(vecSelfAssign);
345 CCASSERT(vecSelfAssign.size() == 20, "vecSelfAssign's size is 20.");
346
347 for (const auto& child : vecSelfAssign)
348 {
349 CC_UNUSED_PARAM(child);
350 CCASSERT(child->getReferenceCount() == 2, "child's reference count is 2.");
351 }
352
353 // const at
354 Vector<Node*> vecConstAt = createVector();
355 constFunc(vecConstAt);
356}
void constFunc(const cocos2d::Vector< Node * > &vec) const
Definition: UnitTest.cpp:358
virtual void onEnter() override
Definition: BaseTest.cpp:430

引用了 constFunc() , 以及 TestCase::onEnter().

+ 函数调用图:

◆ subtitle()

std::string TemplateVectorTest::subtitle ( ) const
overridevirtual

重载 TestCase .

在文件 UnitTest.cpp363 行定义.

364{
365 return "Vector<T>, should not crash";
366}

该类的文档由以下文件生成: