1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     test_Test.cpp
4   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
5   These coded instructions, statements, and computer programs contain
6   proprietary information of Nintendo of America Inc. and/or Nintendo
7   Company Ltd., and are protected by Federal copyright law. They may
8   not be disclosed to third parties or copied or duplicated in any form,
9   in whole or in part, without the prior written consent of Nintendo.
10   $Rev: 12449 $
11  *---------------------------------------------------------------------------
12 
13 
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 // Test suite definitions
34 //
35 // Class that inherits Suite is the test suite
36 // Create test method in this class and register it in the constructor
37 class Test : public nn::test::Suite
38 {
39 public:
Test()40     Test()
41     {
42         // Test suite name
43         SUITE_NAME("Test");
44 
45         // Test case registration
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     // The following is the test method
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         // Test suite name
81         SUITE_NAME("SuccessTest");
82 
83         // Test case registration
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     // The following is the test method
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; } // Called once before starting the test belonging to the suite
FinalizeSuite()214     virtual void FinalizeSuite() {isFinalized = true;}                 // Called when ending the test belonging to the suite
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 /* Please see man pages for details
229 
230  */
testRun(nn::test::Output & out)231 void testRun(nn::test::Output& out)
232 {
233     // Execute Run. All tests succeed in this case.
234     {
235         SuccessTest test;
236         NN_TASSERT_(true == test.Run(out, false));
237     }
238 
239     // Execute Run. A failure occurs. If the second argument is true, do not exit test case even if caught by an assert
240     {
241         Test test;              // Create test suite
242 
243         // If there is a test suite to execute as a child of a test case
244         // Child can be registered with the AddSubSuite method
245         SubTest1 subTest1;
246         test.AddSubSuite(&subTest1);
247 
248         // Execute test
249         NN_TASSERT_(false == test.Run(out, true));
250     }
251 
252     // Execute Run. A failure occurs. If the second argument is false, exit test case when caught by an assert
253     {
254         Test test;              // Create test suite
255 
256         // If there is a test suite to execute as a child of a test case
257         // Child can be registered with the AddSubSuite method
258         SubTest1 subTest1;
259         test.AddSubSuite(&subTest1);
260 
261         // Execute test
262         NN_TASSERT_(false == test.Run(out, false));
263     }
264 
265     // Execute Run. Test to confirm that Initialize() and FinalizeSuite() of the sub Suite execute
266     {
267         SuccessTest test;              // Create test suite
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 /* Please see man pages for details
283 
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     //Confirms that test extra information can be obtained
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 /* Please see man pages for details
373 
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     /*Test "specifying test name and executing"*/
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     //// When executing by specifying test name, the sub Suite test cannot be executed //
394     NN_TASSERT_(false == test.RunSpecificTestFunc("SubTest1::Test1", output));
395     NN_TASSERT_(test.GetTotalTestNum() == TOTAL_TEST_NUM);
396 
397     /*Test "specifying test ID and executing"*/
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     //// When "executing by specifying test ID," the sub Suite test can also be executed //
403     NN_TASSERT_(true == test.RunSpecificTestFunc(5, output));
404     NN_TASSERT_(test.GetTotalTestNum() == TOTAL_TEST_NUM);
405 
406     /*Test "specifying test Suite and test name and executing"*/
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     //// With "specifying test Suite and test name and executing," execution fails if the Suite and test name do not match //
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     /*Test when the contAfterFail argument of RunSpecificTestFunc() is set to 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     /*Test to confirm that Initialize() and FinalizeSuite() of the sub Suite execute for RunSpecificTestFunc()*/
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 // For nninitStartup  and nnMain:
452 // Include in the test library when all test code is replaced
453 // Plan to switch so that CUnit is not used with the build system
454 //
455 // When replacing, define them for each test process.
456 
457 // test::Startup must be called at 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     // Output settings
468 #ifdef NN_TEST_DEBUG
469     TextOutput out;          // Text output during debugging
470 #else
471     XmlOutput out;           // XML output when not debugging (when automatic testing)
472 #endif
473     /* Please see man pages for details
474 
475      */
476     testRun(out);
477 
478 
479     /* Please see man pages for details
480 
481      */
482     testGetFunc();
483 
484      /* Please see man pages for details
485 
486      */
487      testRunSpecificTestFunc(out);
488 
489     NN_TLOG_("---test_Test.cpp nnMain() finished.(into infinite loop)");
490     while(1)
491     {
492         // Continue Sleep.
493         nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromSeconds(1));
494     }
495 }
496