1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     test_Test.cpp
4 
5   Copyright (C)2009-2012 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: 47284 $
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::test::InitializeAllocator();
461 }
462 
nnMain(void)463 void nnMain( void )
464 {
465     //__breakpoint(0);
466     // Output settings
467 #ifdef NN_TEST_DEBUG
468     TextOutput out;          // Text output during debugging
469 #else
470     XmlOutput out;           // XML output when not debugging (when automatic testing)
471 #endif
472     /* Please see man pages for details
473 
474      */
475     testRun(out);
476 
477 
478     /* Please see man pages for details
479 
480      */
481     testGetFunc();
482 
483      /* Please see man pages for details
484 
485      */
486      testRunSpecificTestFunc(out);
487 
488     NN_TLOG_("---test_Test.cpp nnMain() finished.(into infinite loop)");
489     while(1)
490     {
491         // Continue Sleep.
492         nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromSeconds(1));
493     }
494 }
495