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