OSDN Git Service

Initial Commit. Toppers/JSP for Blackfin 3.3.1
[trx-305dsp/dsp.git] / trx305 / kernel / cfg / base / singleton.cpp
1 /*
2  *  TOPPERS/JSP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Just Standard Profile Kernel
5  * 
6  *  Copyright (C) 2002-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  * 
9  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
10  *  によって公表されている GNU General Public License の Version 2 に記
11  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13  *  利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  * 
31  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
35  * 
36  *  @(#) $Id: singleton.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $
37  */
38
39 // $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/singleton.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $
40
41 #include "base/singleton.h"
42 #include "base/testsuite.h"
43
44 using namespace std;
45
46     //Singleton 静的変数
47 bool SingletonBase::initialize = false;     //初期化済みフラグ
48 bool SingletonBase::is_valid   = true;      //インスタンス生成成功フラグ
49
50 struct SingletonBase::chain * SingletonBase::top  = 0;  //デストラクタチェーンのトップ
51
52
53 /************************************* テストスィート *************************************/
54
55 #ifdef TESTSUITE
56 #include "base/coverage_undefs.h"
57
58     bool throw_DummyType;
59     class DummyType {
60     public:
61         static int counter;
62         int dummy_value;
63         int order;
64         SINGLETON_CONSTRUCTOR(DummyType) throw(bad_alloc) : dummy_value(0), order(++counter)
65         {
66             CHECKPOINT("DummyType::DummyType");
67             if(throw_DummyType)
68                 throw bad_alloc();
69         } 
70         ~DummyType(void) throw(int)
71         {
72             CHECKPOINT("DummyType::~DummyType");
73             if(throw_DummyType)
74                 throw 0;
75             if(counter-- != order)
76                 CHECKPOINT("illegal order");
77         }
78     };
79
80     SINGLETON_WRAPPER(DummyType2, DummyType)
81
82     int DummyType::counter = 0;
83
84     TESTSUITE(main, SingletonBase)
85     {
86         struct chain * old_top  = top;
87
88         top  = 0;
89
90         BEGIN_CASE("getInstance","getInstance") {
91             BEGIN_CASE("1","単一のインスタンスが生成される") {
92                 TestSuite::clearCheckpoints();
93                 DummyType * dummy = Singleton<DummyType>::getInstance();
94                 TEST_CASE("1","コンストラクタが起動されている", TestSuite::isReached("DummyType::DummyType"));
95
96                 TestSuite::clearCheckpoints();
97                 TEST_CASE("2","インスタンスが生成される", Singleton<DummyType>::getInstance() == dummy);
98                 TEST_CASE("3","2回目以降はコンストラクタが起動されない", !TestSuite::isReached("DummyType::DummyType"));
99                 TEST_CASE("4","シングルトンの初期化が終わっている", SingletonBase::initialize);
100                 TEST_CASE("5","デストラクタチェーンが構成されている", SingletonBase::top != 0);
101             } END_CASE;
102         } END_CASE;
103
104         BEGIN_CASE("final_release","final_release") {
105             BEGIN_CASE("1","インスタンスが削除できる") {
106                 TEST_CASE("0","[前提] 削除すべき要素がある", SingletonBase::top != 0);
107
108                 TestSuite::clearCheckpoints();
109                 SingletonBase::final_release();
110
111                 TEST_CASE("1","デストラクタが起動されている", TestSuite::isReached("DummyType::~DummyType"));
112                 TEST_CASE("2","デストラクタチェーンがなくなっている", SingletonBase::top == 0);
113             } END_CASE;
114
115             BEGIN_CASE("2","順番が正しい") {
116                 DummyType::counter = 0;
117
118                 DummyType  * dummy  = Singleton<DummyType>::getInstance();
119                 DummyType2 * dummy2 = Singleton<DummyType2>::getInstance();
120
121                 TEST_CASE("0","[前提] 生成順序が正しい", dummy->order == 1 && dummy2->order == 2);
122
123                 TestSuite::clearCheckpoints();
124                 SingletonBase::final_release();
125
126                 TEST_CASE("1","デストラクタが起動されている", TestSuite::isReached("DummyType::~DummyType"));
127                 TEST_CASE("2","デストラクタチェーンがなくなっている", SingletonBase::top == 0);
128                 TEST_CASE("3","破棄順序が正しい", !TestSuite::isReached("illegal order"));
129             } END_CASE;
130
131         } END_CASE;
132
133         BEGIN_CASE("getInstance","getInstance") {
134             BEGIN_CASE("1","生成時に例外") {
135                 BEGIN_CASE("1","getInstance()") {
136                     throw_DummyType = true;
137                     bool result = false;
138                     try { Singleton<DummyType>::getInstance(); }
139                     catch(...) { result = true; }
140
141                     TEST_CASE("1","例外は起こる",result);
142                     TEST_CASE("2","デストラクタチェーンには何もつながっていない", SingletonBase::top == 0);
143                 } END_CASE;
144
145                 SingletonBase::final_release();
146
147                 BEGIN_CASE("2","getInstance(nothrow)") {
148
149                     DummyType * dummy;
150                     throw_DummyType = true;
151                     bool result = true;
152                     try { dummy = Singleton<DummyType>::getInstance(nothrow); }
153                     catch(...) { result = false; }
154
155                     TEST_CASE("1","例外は起きない",result);
156                     TEST_CASE("2","NULLが返る", dummy == 0);
157                     TEST_CASE("3","デストラクタチェーンには何もつながっていない", SingletonBase::top == 0);
158                 } END_CASE;
159             } END_CASE;
160         } END_CASE;
161
162         top  = old_top;
163     }
164
165 #endif
166
167
168