source: anotherchoice/tags/jsp-1.4.4-full-UTF8/cfg/base/testsuite.h@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 12.3 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: testsuite.h,v 1.4 2003/12/20 06:51:58 takayuki Exp $
51 */
52
53/*
54 * テストスィート実行補助 クラス/マクロライブラリ
55 */
56
57// $Header: /home/CVS/configurator/base/testsuite.h,v 1.4 2003/12/20 06:51:58 takayuki Exp $
58
59
60#ifdef TESTSUITE
61
62 //シナリオ終端マクロ(Exceptionクラスの有無によって中身を替えたいのでここにおく)
63# undef END_CASE
64# ifdef EXCEPT_H
65# define END_CASE }catch(TestSuite::Fail & x) { _suite_control.fail_in_suite(x.getMessage()); } catch(Exception & exc) { _suite_control.fail_in_suite(string("不明な例外 : ") + exc.getDetails()); } catch(...) { _suite_control.fail_in_suite("テスト実行中に不明な例外を受け取ったため中断された"); } _suite_control.leave_case(); }
66# else
67# define END_CASE }catch(TestSuite::Fail & x) { _suite_control.fail_in_suite(x.getMessage()); } catch(...) { _suite_control.fail_in_suite("テスト実行中に不明な例外を受け取ったため中断された"); } _suite_control.leave_case(); }
68# endif
69
70#endif
71
72
73#ifndef TESTSUITE_H
74#define TESTSUITE_H
75
76 //テストスィートをかけるかどうか
77//#define TESTSUITE
78
79
80#if defined(TESTSUITE) //&& defined(_DEBUG)
81
82 //ストリームの内
83容をテストで使いたいのでå…
84¥ã‚Œæ›¿ãˆã‚‹
85#include <iostream>
86#define cin _cin
87#define cout _cout
88#define cerr _cerr
89
90#include <sstream>
91
92namespace std {
93 extern stringstream _cin;
94 extern stringstream _cout;
95 extern stringstream _cerr;
96}
97
98#include <string>
99#include <list>
100#include <set>
101#include <map>
102
103
104 //標準のテストスィート関数のプロトタイプ宣言用マクロ
105#define TESTSUITE_PROTOTYPE(suite) \
106 public: \
107 static void test_suite_##suite(TestSuiteControl & _suite_control);
108
109
110 //標準のテストスィート関数の定義用マクロ (わざとスィート実行の条件コンパイル用の定義名と同じ名前にする)
111#undef TESTSUITE
112#define TESTSUITE(suite,cls) \
113 TestSuite TestSuite_##cls##_##suite(#cls "(" #suite ")", cls::test_suite_##suite); \
114 void cls::test_suite_##suite(TestSuiteControl & _suite_control)
115
116#define TESTSUITE_(suite,cls,spr) \
117 TestSuite TestSuite_##spr##_##cls##_##suite(#spr "::" #cls "(" #suite ")", spr::cls::test_suite_##suite); \
118 void spr::cls::test_suite_##suite(TestSuiteControl & _suite_control)
119
120 //多重実行防止用マクロ
121#define PROCEED_ONCE static bool _proceed_once_flag_ = false; if(_proceed_once_flag_) return; else _proceed_once_flag_ = true;
122
123 //シナリオ開始マクロ
124#define BEGIN_CASE(x,y) if(_suite_control.enter_case(x,y,__FILE__,__LINE__)) { try {
125
126 //シナリオ失敗マクロ
127#define TEST_FAIL throw TestSuite::Fail();
128#define TEST_FAIL_(x) throw TestSuite::Fail(x);
129
130 //短いシナリオ用マクロ
131#define TEST_CASE(x,y,z) BEGIN_CASE(x,y) { if(!(z)) TEST_FAIL; } END_CASE
132#define TEST_CASE_(x,y,z,u) BEGIN_CASE(x,y) { if(!(z)) TEST_FAIL_(u); } END_CASE
133
134 //到達判定マクロ
135#define CHECKPOINT(x) TestSuite::check(x);
136
137 //シングルトン退避
138#define SINGLETON(x) Singleton<x>::Context context; Singleton<x>::saveContext(context);
139#define SINGLETON_(x,y) Singleton<x>::Context context_##y; Singleton<x>::saveContext(context_##y);
140
141/*
142 * テストスィートの実行制御クラス
143 */
144class TestSuiteControl {
145protected:
146 std::list<std::string> session; //現在のセッション名スタック
147
148 std::string target_session; //処理対象セッション名
149 std::string current_session; //現在のスィートシナリオ名
150 std::string current_description; //現在のスィートシナリオの説明
151 std::ostream * out; //説明の出力å…
152ˆ
153 bool fail; //失敗したシナリオがあったかどうか
154 bool verbose; //冗長出力するか否か
155
156 unsigned int case_count; //ケースの総数
157 unsigned int fail_count; //失敗したケースの数
158
159 //シナリオ名の取得
160 std::string get_suitename(const char * name = "") const;
161
162
163public:
164 //コンストラクタ
165 TestSuiteControl(std::ostream & _out, const char * _pattern = "");
166
167 //テストシナリオの表題設定 (返却値 : 実行する必
168要があるかどうか)
169 bool _enter_case(const char * session, const char * description, const char * filename = "", long lineno = -1);
170 inline void leave_case(void) { leave_session(); }
171
172 //シングルステップ実行時に中に飛び込まないためのラッパ
173 inline bool enter_case(const char * session, const char * description, const char * filename = "", long lineno = -1)
174 { return _enter_case(session, description, filename, lineno); }
175
176 //テストセッション名 (シナリオプレフィクス) の設定/解除
177 void enter_session(const std::string & session);
178 void leave_session(void);
179
180 //テストシナリオの失敗報告
181 void fail_in_suite(std::string msg="");
182
183 //失敗したシナリオの有無の確認
184 inline bool is_failed(void) const
185 { return fail; }
186
187 //冗長出力の設定
188 inline void set_verbose(bool _verbose = true)
189 { verbose = _verbose; }
190
191 //実行したテストケースの数
192 inline unsigned int countCases(void) const
193 { return case_count; }
194
195 //失敗したテストケースの数
196 inline unsigned int countFails(void) const
197 { return fail_count; }
198};
199
200 //シングルトンのテストスィートのためにここでインクルード
201#include "base/singleton.h"
202
203/*
204 * テストスィート実行クラス
205 */
206class TestSuite {
207public:
208 class Fail //テストケース失敗通知に用いる例外用クラス
209 {
210 protected:
211 std::string msg;
212
213 public:
214 //コンストラクタ
215 Fail(std::string src = "") throw() : msg(src) {}
216
217 //コピーコンストラクタ
218 Fail(const Fail & src) throw() : msg(src.msg) {}
219
220 //メッセージを取得
221 inline const std::string & getMessage(void) const throw()
222 { return msg; }
223 };
224
225 typedef void (*SuiteFunction)(TestSuiteControl &);
226
227 /* クラス毎のテストスィートに関する情
228報を保持するクラス */
229 class SuiteContainerNode
230 {
231 protected:
232 std::string session;
233 SuiteFunction suite;
234
235 public:
236 //スィート情
237報コンストラクタ
238 SuiteContainerNode(const char * session, SuiteFunction suite);
239 SuiteContainerNode(const SuiteContainerNode & src);
240
241 //スィートの実行
242 bool invoke(TestSuiteControl & suite_control);
243
244 //スィート名の取得
245 inline const std::string & getName(void) const throw()
246 { return session; }
247 };
248
249 //実行すべきテストスィートを持つインスタンスのリストの型
250 class SuiteContainer : public std::list<SuiteContainerNode>
251 { public: SINGLETON_CONSTRUCTOR(SuiteContainer) {} };
252
253 /* 実行オプション */
254 enum tagPerformOption {
255 THROUGH = 1, //すべて通しで実行する (いちいち止めない)
256 VERBOSE = 2, //冗長出力
257
258 DEFAULT = THROUGH
259 };
260
261 /* チェックポイントを格納するクラス */
262 class Checkpoint : public std::set<std::string>
263 { public: SINGLETON_CONSTRUCTOR(Checkpoint) throw() {} };
264
265protected:
266 bool fail; //最後に実行したスィートが失敗したがどうかを保持する変数
267 static bool starvated; //newに失敗するかどうか
268
269public:
270 //コンストラクタ
271 TestSuite(const char * session, SuiteFunction suite);
272
273 //デストラクタ
274 ~TestSuite(void);
275
276 //テストスィートの実行 (返却値:スィートが正しく実行されたかどうか)
277 static bool performTestSuite(int flags = THROUGH, const char * pattern = "");
278
279 //テストスィートの実行 (引数変換)
280 inline static bool performTestSuite(const char * pattern)
281 { return performTestSuite(THROUGH, pattern); }
282
283 //登録されているトップレベルスィートの一覧表示
284 static void listTestSuite(void);
285
286 /*
287 * チェックポイント用関数
288 */
289
290 //通過したことを報告
291 inline static void check(std::string checkname)
292 { Singleton<Checkpoint>::getInstance()->insert(checkname); }
293
294 //これまでに受けた報告を削除
295 inline static void clearCheckpoints(void)
296 { Singleton<Checkpoint>::getInstance()->clear(); }
297
298 //その位置に来たか
299 static bool isReached(std::string checkname);
300
301 /*
302 * テスト用作業関数
303 */
304
305 //ファイルの中身を開いてチェックする
306 static bool compareFileContents(const char * filename, const char * filecontents, bool remove = true);
307};
308
309/*
310 * スィート実行用main関数
311 */
312extern int main(int argc, char ** argv);
313
314#define main pseudo_main //通常のmainを差し換え
315
316 //簡易ソフトウェアトレース機能のインクルード
317#include "base/coverage_defs.h"
318
319#else
320
321/*********************************************************************************************/
322/*
323 * テストを実行しないときのクラス定義
324 */
325
326#define TESTABLEOBJECT(x)
327#define TESTABLEOBJECT_(x,y)
328#define TESTSUITE_PROTOTYPE(x)
329#define TESTSUITE_(x,y)
330#define PROCEED_ONCE
331
332#define BEGIN_CASE(x,y)
333#define END_CASE
334#define TEST_FAIL
335
336#define CHECKPOINT(x)
337
338/*
339 * テストスィート実行クラス
340 */
341class TestSuite {
342public:
343 //テストスィートの実行 (返却値:スィートを正しく実行したかどうか)
344 inline static bool performTestSuite(void) { return true; };
345};
346
347#endif
348
349#endif /* TESTSUITE_H */
350
Note: See TracBrowser for help on using the repository browser.