3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
6 * Copyright (C) 2002-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
9 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
10 * によって公表されている GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 * @(#) $Id: singleton.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $
39 // $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/singleton.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $
41 #include "base/singleton.h"
42 #include "base/testsuite.h"
47 bool SingletonBase::initialize = false; //初期化済みフラグ
48 bool SingletonBase::is_valid = true; //インスタンス生成成功フラグ
50 struct SingletonBase::chain * SingletonBase::top = 0; //デストラクタチェーンのトップ
53 /************************************* テストスィート *************************************/
56 #include "base/coverage_undefs.h"
64 SINGLETON_CONSTRUCTOR(DummyType) throw(bad_alloc) : dummy_value(0), order(++counter)
66 CHECKPOINT("DummyType::DummyType");
70 ~DummyType(void) throw(int)
72 CHECKPOINT("DummyType::~DummyType");
75 if(counter-- != order)
76 CHECKPOINT("illegal order");
80 SINGLETON_WRAPPER(DummyType2, DummyType)
82 int DummyType::counter = 0;
84 TESTSUITE(main, SingletonBase)
86 struct chain * old_top = top;
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"));
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);
104 BEGIN_CASE("final_release","final_release") {
105 BEGIN_CASE("1","インスタンスが削除できる") {
106 TEST_CASE("0","[前提] 削除すべき要素がある", SingletonBase::top != 0);
108 TestSuite::clearCheckpoints();
109 SingletonBase::final_release();
111 TEST_CASE("1","デストラクタが起動されている", TestSuite::isReached("DummyType::~DummyType"));
112 TEST_CASE("2","デストラクタチェーンがなくなっている", SingletonBase::top == 0);
115 BEGIN_CASE("2","順番が正しい") {
116 DummyType::counter = 0;
118 DummyType * dummy = Singleton<DummyType>::getInstance();
119 DummyType2 * dummy2 = Singleton<DummyType2>::getInstance();
121 TEST_CASE("0","[前提] 生成順序が正しい", dummy->order == 1 && dummy2->order == 2);
123 TestSuite::clearCheckpoints();
124 SingletonBase::final_release();
126 TEST_CASE("1","デストラクタが起動されている", TestSuite::isReached("DummyType::~DummyType"));
127 TEST_CASE("2","デストラクタチェーンがなくなっている", SingletonBase::top == 0);
128 TEST_CASE("3","破棄順序が正しい", !TestSuite::isReached("illegal order"));
133 BEGIN_CASE("getInstance","getInstance") {
134 BEGIN_CASE("1","生成時に例外") {
135 BEGIN_CASE("1","getInstance()") {
136 throw_DummyType = true;
138 try { Singleton<DummyType>::getInstance(); }
139 catch(...) { result = true; }
141 TEST_CASE("1","例外は起こる",result);
142 TEST_CASE("2","デストラクタチェーンには何もつながっていない", SingletonBase::top == 0);
145 SingletonBase::final_release();
147 BEGIN_CASE("2","getInstance(nothrow)") {
150 throw_DummyType = true;
152 try { dummy = Singleton<DummyType>::getInstance(nothrow); }
153 catch(...) { result = false; }
155 TEST_CASE("1","例外は起きない",result);
156 TEST_CASE("2","NULLが返る", dummy == 0);
157 TEST_CASE("3","デストラクタチェーンには何もつながっていない", SingletonBase::top == 0);