1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: test_Test.cpp
4
5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Rev: 12449 $
14 *---------------------------------------------------------------------------*/
15
16 #include <nn.h>
17 //#include <nn/Result.h>
18 //#include <nn/os.h>
19 //#include <nn/Handle.h>
20 //#include <nn/os/os_Thread.h>
21 #include <nn/os/os_Initialize.h>
22 #include <nn/test/test_Test.h>
23 using namespace nn::dbg;
24 using namespace nn::os;
25
26 using nn::Handle;
27 using nn::test::String;
28 using nn::test::TextOutput;
29 using nn::test::XmlOutput;
30 using nn::test::AssertInfo;
31
32
33 // テストスイートの定義
34 //
35 // Suite を継承したクラスがテストスイートになる
36 // このクラスの中にテストメソッドを作り、コンストラクタ内で登録する
37 class Test : public nn::test::Suite
38 {
39 public:
Test()40 Test()
41 {
42 // テストスイート名
43 SUITE_NAME("Test");
44
45 // テストケースの登録
46 TEST_ADD(Test::Test1)
47 TEST_ADD(Test::Test2)
48 TEST_ADD(Test::Test3)
49 TEST_ADD(Test::Test4)
50 }
~Test()51 virtual ~Test() {}
52
53 private:
54 // 以下、テストメソッド
Test1()55 void Test1()
56 {
57 }
Test2()58 void Test2()
59 {
60 NN_TEST_ASSERT(1 == 0);
61 NN_TEST_ASSERT(2 & 0);
62 }
Test3()63 void Test3()
64 {
65 NN_TEST_ASSERT(1 > 2);
66 }
67
Test4()68 void Test4()
69 {
70 NN_TEST_ASSERT_EQUAL(1, 2);
71 }
72 };
73
74
75 class SuccessTest : public nn::test::Suite
76 {
77 public:
SuccessTest()78 SuccessTest()
79 {
80 // テストスイート名
81 SUITE_NAME("SuccessTest");
82
83 // テストケースの登録
84 TEST_ADD(SuccessTest::Test1)
85 TEST_ADD(SuccessTest::Test2)
86 TEST_ADD(SuccessTest::Test3)
87 TEST_ADD(SuccessTest::Test4)
88 }
~SuccessTest()89 virtual ~SuccessTest() {}
90
91 private:
92 // 以下、テストメソッド
Test1()93 void Test1()
94 {
95 }
Test2()96 void Test2()
97 {
98 NN_TEST_ASSERT(1 == 1);
99 NN_TEST_ASSERT(2 & 2);
100 }
Test3()101 void Test3()
102 {
103 NN_TEST_ASSERT(1 > 0);
104 }
105
Test4()106 void Test4()
107 {
108 NN_TEST_ASSERT_EQUAL(1, 1);
109 }
110 };
111
112
113
114 class SubTest1 : public nn::test::Suite
115 {
116 public:
SubTest1()117 SubTest1()
118 {
119 SUITE_NAME("SubTest1");
120 TEST_ADD(SubTest1::Test1)
121 TEST_ADD(SubTest1::Test2)
122 TEST_ADD(SubTest1::Test3)
123 }
124 private:
Test1()125 void Test1()
126 {
127 NN_TLOG_("SubTest1::Test1 in");
128 NN_TEST_BEGIN_EXPECT_FAILURE_ANY
129 {
130 NN_TASSERT_(0);
131 }
132 NN_TEST_END_EXPECT_FAILURE
133
134 NN_TLOG_("SubTest1::Test1 out");
135
136 }
Test2()137 void Test2()
138 {
139 NN_TLOG_("SubTest1::Test2 in");
140 NN_TEST_ASSERTMSG(10 == 9, "Assert!, %d\n", 1 + 2);
141 NN_TEST_ASSERT(1 == 2);
142 NN_TLOG_("SubTest1::Test2 out");
143 }
Test3()144 void Test3()
145 {
146 NN_TLOG_("SubTest1::Test3 in");
147 NN_TEST_ASSERT(10 == 9);
148 NN_TLOG_("SubTest1::Test3 out");
149 }
150 };
151
152
153
154 class SubTest2 : public nn::test::Suite
155 {
156 public:
SubTest2()157 SubTest2()
158 {
159 SUITE_NAME("SubTest2");
160 TEST_ADD_WITH_INFO(SubTest2::Test1, "SubTest2::Test1", "2_1 info")
161 TEST_ADD_WITH_INFO(SubTest2::Test2, "SubTest2::Test2", "2_2 info")
162 }
163 private:
Test1()164 void Test1()
165 {
166 NN_TLOG_("Do SubTest2::Test1.Success");
167 }
Test2()168 void Test2()
169 {
170 NN_TLOG_("Do SubTest2::Test2.Failure");
171 NN_TEST_ASSERT(1 == 2);
172 }
173 };
174
175
176
177 class SubTest3 : public nn::test::Suite
178 {
179 public:
SubTest3()180 SubTest3()
181 {
182 SUITE_NAME("SubTest3");
183 TEST_ADD_WITH_NAME(SubTest3::Test1, "Test3_1GO")
184 }
185 private:
Test1()186 void Test1()
187 {
188 NN_TLOG_("Do SubTest3::Test1.Failure");
189 NN_TEST_ASSERT(1 == 2);
190 }
191 };
192
193
194
195 class InitializeFinalizeSuiteTest : public nn::test::Suite
196 {
197 public:
InitializeFinalizeSuiteTest()198 InitializeFinalizeSuiteTest()
199 {
200 SUITE_NAME("InitializeFinalizeSuiteTest");
201 TEST_ADD(InitializeFinalizeSuiteTest::Test)
202
203 isInitialized = false;
204 isFinalized = false;
205 isTested = false;
206 }
207
208 bool isInitialized;
209 bool isFinalized;
210 bool isTested;
211
212 protected:
InitializeSuite()213 virtual bool InitializeSuite() { isInitialized = true; } // スートに属するテスト開始前に一度だけ呼ばれる
FinalizeSuite()214 virtual void FinalizeSuite() {isFinalized = true;} // スートに属するテストの終了時に呼ばれる
215
216
217 private:
Test()218 void Test()
219 {
220 NN_TLOG_("Do InitializeFinalizeSuiteTest::Test");
221 isTested = true;
222 }
223 };
224
225 #define TOTAL_TEST_NUM 11
226
227
228 /**
229 * Run関数のテスト
230 */
testRun(nn::test::Output & out)231 void testRun(nn::test::Output& out)
232 {
233 // Runの実行。テストがすべて成功するケース
234 {
235 SuccessTest test;
236 NN_TASSERT_(true == test.Run(out, false));
237 }
238
239 // Runの実行。失敗ケースあり。第二引数がtrue の場合、アサートに引っかかってもそのテストケースを抜けない
240 {
241 Test test; // テストスイートの作成
242
243 // テストケースの子として実行させるテストスイートがあれば
244 // AddSubSuite メソッドで子を登録できる
245 SubTest1 subTest1;
246 test.AddSubSuite(&subTest1);
247
248 // テストを実行
249 NN_TASSERT_(false == test.Run(out, true));
250 }
251
252 // Runの実行。失敗ケースあり。第二引数がfalse の場合、アサートに引っかかるとそのテストケースを抜ける
253 {
254 Test test; // テストスイートの作成
255
256 // テストケースの子として実行させるテストスイートがあれば
257 // AddSubSuite メソッドで子を登録できる
258 SubTest1 subTest1;
259 test.AddSubSuite(&subTest1);
260
261 // テストを実行
262 NN_TASSERT_(false == test.Run(out, false));
263 }
264
265 // Runの実行。サブSuiteのInitialize()とFinalizeSuite()が実行されることの確認テスト
266 {
267 SuccessTest test; // テストスイートの作成
268 InitializeFinalizeSuiteTest initializeFinalizeSuiteTest;
269 test.AddSubSuite(&initializeFinalizeSuiteTest);
270
271 NN_TASSERT_(initializeFinalizeSuiteTest.isInitialized == false);
272 NN_TASSERT_(initializeFinalizeSuiteTest.isFinalized == false);
273 NN_TASSERT_(initializeFinalizeSuiteTest.isTested == false);
274 NN_TASSERT_(true == test.Run(out, true));
275 NN_TASSERT_(initializeFinalizeSuiteTest.isInitialized == true);
276 NN_TASSERT_(initializeFinalizeSuiteTest.isFinalized == true);
277 NN_TASSERT_(initializeFinalizeSuiteTest.isTested == true);
278 }
279 }
280
281
282 /**
283 * Get系関数のテスト(Suite内のテストの情報を取得する機能に関するテスト)
284 */
testGetFunc()285 void testGetFunc()
286 {
287 Test test;
288 SubTest1 subTest1;
289 test.AddSubSuite(&subTest1);
290 SubTest2 subTest2;
291 test.AddSubSuite(&subTest2);
292 SubTest3 subTest3;
293 test.AddSubSuite(&subTest3);
294
295 /*---------------------------------------------------------------------------*
296 GetTestName()
297 *---------------------------------------------------------------------------*/
298 NN_TASSERT_(test.GetTestName() == "Test");
299 NN_TASSERT_(subTest1.GetTestName() == "SubTest1");
300 NN_TASSERT_(subTest2.GetTestName() == "SubTest2");
301 NN_TASSERT_(subTest3.GetTestName() == "SubTest3");
302
303 /*---------------------------------------------------------------------------*
304 GetTestNum()
305 *---------------------------------------------------------------------------*/
306 NN_TASSERT_(test.GetTestNum() == 4);
307 NN_TASSERT_(subTest1.GetTestNum() == 3);
308 NN_TASSERT_(subTest2.GetTestNum() == 2);
309 NN_TASSERT_(subTest3.GetTestNum() == 1);
310
311 /*---------------------------------------------------------------------------*
312 GetTotalTestNum()
313 *---------------------------------------------------------------------------*/
314 NN_TASSERT_(test.GetTotalTestNum() == 10);
315 NN_TASSERT_(subTest1.GetTotalTestNum() == 3);
316 NN_TASSERT_(subTest2.GetTotalTestNum() == 2);
317 NN_TASSERT_(subTest3.GetTotalTestNum() == 1);
318
319 /*---------------------------------------------------------------------------*
320 GetTestFuncInfos()
321 *---------------------------------------------------------------------------*/
322 String suiteName;
323 String funcName;
324
325 NN_TASSERT_(false == test.GetTestFuncInfos(0, suiteName, funcName));
326
327 NN_TASSERT_(true == test.GetTestFuncInfos(1, suiteName, funcName));
328 NN_TASSERT_(suiteName == "Test");
329 NN_TASSERT_(funcName == "Test::Test1");
330
331 NN_TASSERT_(true == test.GetTestFuncInfos(4, suiteName, funcName));
332 NN_TASSERT_(suiteName == "Test");
333 NN_TASSERT_(funcName == "Test::Test4");
334
335 NN_TASSERT_(true == test.GetTestFuncInfos(5, suiteName, funcName));
336 NN_TASSERT_(suiteName == "SubTest1");
337 NN_TASSERT_(funcName == "SubTest1::Test1");
338
339 NN_TASSERT_(true == test.GetTestFuncInfos(7, suiteName, funcName));
340 NN_TASSERT_(suiteName == "SubTest1");
341 NN_TASSERT_(funcName == "SubTest1::Test3");
342
343 NN_TASSERT_(true == test.GetTestFuncInfos(8, suiteName, funcName));
344 NN_TASSERT_(suiteName == "SubTest2");
345 NN_TASSERT_(funcName == "SubTest2::Test1");
346
347 NN_TASSERT_(true == test.GetTestFuncInfos(9, suiteName, funcName));
348 NN_TASSERT_(suiteName == "SubTest2");
349 NN_TASSERT_(funcName == "SubTest2::Test2");
350
351 NN_TASSERT_(true == test.GetTestFuncInfos(10, suiteName, funcName));
352 NN_TASSERT_(suiteName == "SubTest3");
353 NN_TASSERT_(funcName == "Test3_1GO");
354
355 NN_TASSERT_(false == test.GetTestFuncInfos(11, suiteName, funcName));
356
357 //テストの付帯情報が取得できることの確認
358 String funcInfo;
359 NN_TASSERT_(true == test.GetTestFuncInfos(7, suiteName, funcName, funcInfo));
360 NN_TASSERT_(funcInfo == "");
361
362
363 NN_TASSERT_(true == test.GetTestFuncInfos(8, suiteName, funcName, funcInfo));
364 NN_TASSERT_(funcInfo == "2_1 info");
365
366 NN_TASSERT_(true == test.GetTestFuncInfos(9, suiteName, funcName, funcInfo));
367 NN_TASSERT_(funcInfo == "2_2 info");
368
369 }
370
371
372 /**
373 * RunSpecificTestFunc()のテスト(Suite内の特定テストのみ実施する機能に関するテスト)
374 */
testRunSpecificTestFunc(nn::test::Output & output)375 void testRunSpecificTestFunc(nn::test::Output& output)
376 {
377 Test test;
378 SubTest1 subTest1;
379 test.AddSubSuite(&subTest1);
380 SubTest2 subTest2;
381 test.AddSubSuite(&subTest2);
382 SubTest3 subTest3;
383 test.AddSubSuite(&subTest3);
384 InitializeFinalizeSuiteTest initializeFinalizeSuiteTest;
385 test.AddSubSuite(&initializeFinalizeSuiteTest);
386
387 test.Initialize();
388 /*「テスト名を指定して実行」のテスト*/
389 NN_TASSERT_(true == test.RunSpecificTestFunc("Test::Test1", output));
390 NN_TASSERT_(false == test.RunSpecificTestFunc("Test::Test2", output));
391 NN_TASSERT_(false == test.RunSpecificTestFunc("Test::Test3", output));
392 NN_TASSERT_(false == test.RunSpecificTestFunc("Test::Test4", output));
393 ////テスト名を指定しての実行では、サブSuiteのテストは実行できない//
394 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest1::Test1", output));
395 NN_TASSERT_(test.GetTotalTestNum() == TOTAL_TEST_NUM);
396
397 /*「テストIDを指定して実行」のテスト*/
398 NN_TASSERT_(true == test.RunSpecificTestFunc(1, output));
399 NN_TASSERT_(false == test.RunSpecificTestFunc(2, output));
400 NN_TASSERT_(false == test.RunSpecificTestFunc(3, output));
401 NN_TASSERT_(false == test.RunSpecificTestFunc(4, output));
402 ////「テストIDを指定して実行」では、サブSuiteのテストも実行できる//
403 NN_TASSERT_(true == test.RunSpecificTestFunc(5, output));
404 NN_TASSERT_(test.GetTotalTestNum() == TOTAL_TEST_NUM);
405
406 /*「テストSuiteとテスト名を指定して実行」のテスト*/
407 NN_TASSERT_(true == test.RunSpecificTestFunc("SubTest1", "SubTest1::Test1", output));
408 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest1", "SubTest1::Test2", output));
409 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest1", "SubTest1::Test3", output));
410 NN_TASSERT_(true == test.RunSpecificTestFunc("SubTest2", "SubTest2::Test1", output));
411 NN_TASSERT_(true == test.RunSpecificTestFunc(8, output));
412 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest2", "SubTest2::Test2", output));
413
414 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest3", "SubTest3::Test1", output));
415 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest3", "Test3_1GO", output));
416 NN_TASSERT_(test.GetTotalTestNum() == TOTAL_TEST_NUM);
417
418 ////「テストSuiteとテスト名を指定して実行」では、Suiteとテスト名が合致していない場合、実行は失敗する//
419 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest3", "SubTest1::Test1", output));
420 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest3", "SubTest2::Test1", output));
421 NN_TASSERT_(test.GetTotalTestNum() == TOTAL_TEST_NUM);
422
423
424 /*RunSpecificTestFunc()の引数contAfterFailをfalseにした際のテスト*/
425 NN_TASSERT_(true == test.RunSpecificTestFunc(1, output, false));
426 NN_TASSERT_(false == test.RunSpecificTestFunc(2, output, false));
427 NN_TASSERT_(false == test.RunSpecificTestFunc(3, output, false));
428 NN_TASSERT_(false == test.RunSpecificTestFunc(4, output, false));
429 NN_TASSERT_(true == test.RunSpecificTestFunc(5, output, false));
430 NN_TASSERT_(true == test.RunSpecificTestFunc("SubTest1", "SubTest1::Test1", output, false));
431 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest1", "SubTest1::Test2", output, false));
432 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest1", "SubTest1::Test3", output, false));
433 NN_TASSERT_(true == test.RunSpecificTestFunc("SubTest2", "SubTest2::Test1", output, false));
434 NN_TASSERT_(true == test.RunSpecificTestFunc(8, output));
435 NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest2", "SubTest2::Test2", output, false));
436 NN_TASSERT_(test.GetTotalTestNum() == TOTAL_TEST_NUM);
437
438 /*RunSpecificTestFunc()において、サブSuiteのInitialize()とFinalizeSuite()が実行されることの確認テスト*/
439 NN_TASSERT_(initializeFinalizeSuiteTest.isInitialized == false);
440 NN_TASSERT_(initializeFinalizeSuiteTest.isFinalized == false);
441 NN_TASSERT_(initializeFinalizeSuiteTest.isTested == false);
442 NN_TASSERT_(true == test.RunSpecificTestFunc("InitializeFinalizeSuiteTest", "InitializeFinalizeSuiteTest::Test", output));
443 NN_TASSERT_(initializeFinalizeSuiteTest.isInitialized == true);
444 NN_TASSERT_(initializeFinalizeSuiteTest.isFinalized == true);
445 NN_TASSERT_(initializeFinalizeSuiteTest.isTested == true);
446
447 test.Finalize();
448 }
449
450
451 // nninitStartup と、nnMain については、
452 // 全テストコード置き換え時に、テストライブラリに組み込み
453 // ビルドシステムで CUnit 使わないようにして切り替える予定
454 //
455 // 置き換え段階では、各テストプロセス毎に定義してください。
456
457 // スタートアップ内で test::Startup を呼ぶ必要がある
nninitStartUp()458 void nninitStartUp()
459 {
460 nn::os::Initialize();
461 nn::test::InitializeAllocator();
462 }
463
nnMain(void)464 void nnMain( void )
465 {
466 //__breakpoint(0);
467 // 出力の設定
468 #ifdef NN_TEST_DEBUG
469 TextOutput out; // デバッグ時はテキスト出力
470 #else
471 XmlOutput out; // 非デバッグ時(自動テスト時は)XML 出力
472 #endif
473 /**
474 *Test.Runのテスト
475 */
476 testRun(out);
477
478
479 /**
480 *Get系関数のテスト(Suite内のテストの情報を取得する機能に関するテスト)
481 */
482 testGetFunc();
483
484 /**
485 *RunSpecificTestFunc()のテスト(Suite内の特定テストのみ実施する機能に関するテスト)
486 */
487 testRunSpecificTestFunc(out);
488
489 NN_TLOG_("---test_Test.cpp nnMain() finished.(into infinite roop)");
490 while(1)
491 {
492 // Sleep しつづける。
493 nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromSeconds(1));
494 }
495 }
496