@@ -47,15 +47,13 @@ namespace
47
47
size_t case_failed = 0 ;
48
48
size_t case_failed_before = 0 ;
49
49
50
- handlers_t & defaults () {
51
- static handlers_t _handlers = default_handlers;
52
- return _handlers;
53
- }
50
+ struct DefaultHandlers : public handlers_t {
51
+ DefaultHandlers () : handlers_t (default_handlers) { }
52
+ DefaultHandlers ( const handlers_t & other) : handlers_t (other) { }
53
+ };
54
54
55
- handlers_t & handlers () {
56
- static handlers_t _handlers = default_handlers;
57
- return _handlers;
58
- }
55
+ SingletonPtr<DefaultHandlers> defaults;
56
+ SingletonPtr<DefaultHandlers> handlers;
59
57
60
58
location_t location = LOCATION_UNKNOWN;
61
59
@@ -117,10 +115,10 @@ bool Harness::run(const Specification& specification)
117
115
return false ;
118
116
test_cases = specification.cases ;
119
117
test_length = specification.length ;
120
- defaults () = specification.defaults ;
121
- handlers (). test_setup = defaults (). get_handler (specification.setup_handler );
122
- handlers (). test_teardown = defaults (). get_handler (specification.teardown_handler );
123
- handlers (). test_failure = defaults (). get_handler (specification.failure_handler );
118
+ * defaults. get () = specification.defaults ;
119
+ handlers-> test_setup = defaults-> get_handler (specification.setup_handler );
120
+ handlers-> test_teardown = defaults-> get_handler (specification.teardown_handler );
121
+ handlers-> test_failure = defaults-> get_handler (specification.failure_handler );
124
122
125
123
test_index_of_case = 0 ;
126
124
test_passed = 0 ;
@@ -134,16 +132,16 @@ bool Harness::run(const Specification& specification)
134
132
int setup_status = 0 ;
135
133
failure_t failure (REASON_NONE, location);
136
134
137
- if (handlers (). test_setup ) {
138
- setup_status = handlers (). test_setup (test_length);
135
+ if (handlers-> test_setup ) {
136
+ setup_status = handlers-> test_setup (test_length);
139
137
if (setup_status == STATUS_CONTINUE) setup_status = 0 ;
140
138
else if (setup_status < STATUS_CONTINUE) failure.reason = REASON_TEST_SETUP;
141
139
else if (setup_status > signed (test_length)) failure.reason = REASON_CASE_INDEX;
142
140
}
143
141
144
142
if (failure.reason != REASON_NONE) {
145
- if (handlers (). test_failure ) handlers (). test_failure (failure);
146
- if (handlers (). test_teardown ) handlers (). test_teardown (0 , 0 , failure);
143
+ if (handlers-> test_failure ) handlers-> test_failure (failure);
144
+ if (handlers-> test_teardown ) handlers-> test_teardown (0 , 0 , failure);
147
145
test_cases = NULL ;
148
146
exit (1 );
149
147
return true ;
@@ -157,8 +155,8 @@ bool Harness::run(const Specification& specification)
157
155
scheduler.post (run_next_case, 0 );
158
156
if (scheduler.run () != 0 ) {
159
157
failure.reason = REASON_SCHEDULER;
160
- if (handlers (). test_failure ) handlers (). test_failure (failure);
161
- if (handlers (). test_teardown ) handlers (). test_teardown (0 , 0 , failure);
158
+ if (handlers-> test_failure ) handlers-> test_failure (failure);
159
+ if (handlers-> test_teardown ) handlers-> test_teardown (0 , 0 , failure);
162
160
test_cases = NULL ;
163
161
exit (1 );
164
162
return true ;
@@ -174,8 +172,8 @@ void Harness::raise_failure(const failure_reason_t reason)
174
172
if (test_cases == NULL ) return ;
175
173
176
174
utest::v1::status_t fail_status = STATUS_ABORT;
177
- if (handlers (). test_failure ) handlers (). test_failure (failure_t (reason, location));
178
- if (handlers (). case_failure ) fail_status = handlers (). case_failure (case_current, failure_t (reason, location));
175
+ if (handlers-> test_failure ) handlers-> test_failure (failure_t (reason, location));
176
+ if (handlers-> case_failure ) fail_status = handlers-> case_failure (case_current, failure_t (reason, location));
179
177
180
178
{
181
179
UTEST_ENTER_CRITICAL_SECTION;
@@ -191,25 +189,25 @@ void Harness::raise_failure(const failure_reason_t reason)
191
189
}
192
190
193
191
if (fail_status == STATUS_ABORT || reason & REASON_CASE_SETUP) {
194
- if (handlers (). case_teardown && location != LOCATION_CASE_TEARDOWN) {
192
+ if (handlers-> case_teardown && location != LOCATION_CASE_TEARDOWN) {
195
193
location_t fail_loc (location);
196
194
location = LOCATION_CASE_TEARDOWN;
197
195
198
- utest::v1::status_t teardown_status = handlers (). case_teardown (case_current, case_passed, case_failed, failure_t (reason, fail_loc));
196
+ utest::v1::status_t teardown_status = handlers-> case_teardown (case_current, case_passed, case_failed, failure_t (reason, fail_loc));
199
197
if (teardown_status < STATUS_CONTINUE) raise_failure (REASON_CASE_TEARDOWN);
200
198
else if (teardown_status > signed (test_length)) raise_failure (REASON_CASE_INDEX);
201
199
else if (teardown_status >= 0 ) case_index = teardown_status - 1 ;
202
200
203
201
// Restore case failure location once we have dealt with case teardown
204
202
location = fail_loc;
205
- handlers (). case_teardown = NULL ;
203
+ handlers-> case_teardown = NULL ;
206
204
}
207
205
}
208
206
if (fail_status == STATUS_ABORT) {
209
207
test_failed++;
210
208
failure_t fail (reason, location);
211
209
location = LOCATION_TEST_TEARDOWN;
212
- if (handlers (). test_teardown ) handlers (). test_teardown (test_passed, test_failed, fail);
210
+ if (handlers-> test_teardown ) handlers-> test_teardown (test_passed, test_failed, fail);
213
211
exit (test_failed);
214
212
die ();
215
213
}
@@ -225,8 +223,8 @@ void Harness::schedule_next_case()
225
223
if (case_control.repeat & REPEAT_SETUP_TEARDOWN || !(case_control.repeat & (REPEAT_ON_TIMEOUT | REPEAT_ON_VALIDATE))) {
226
224
location = LOCATION_CASE_TEARDOWN;
227
225
228
- if (handlers (). case_teardown ) {
229
- utest::v1::status_t status = handlers (). case_teardown (case_current, case_passed, case_failed,
226
+ if (handlers-> case_teardown ) {
227
+ utest::v1::status_t status = handlers-> case_teardown (case_current, case_passed, case_failed,
230
228
case_failed ? failure_t (REASON_CASES, LOCATION_UNKNOWN) : failure_t (REASON_NONE));
231
229
if (status < STATUS_CONTINUE) raise_failure (REASON_CASE_TEARDOWN);
232
230
else if (status > signed (test_length)) raise_failure (REASON_CASE_INDEX);
@@ -305,9 +303,9 @@ void Harness::run_next_case()
305
303
UTEST_LOG_FUNCTION ();
306
304
if (case_current < (test_cases + test_length))
307
305
{
308
- handlers (). case_setup = defaults (). get_handler (case_current->setup_handler );
309
- handlers (). case_teardown = defaults (). get_handler (case_current->teardown_handler );
310
- handlers (). case_failure = defaults (). get_handler (case_current->failure_handler );
306
+ handlers-> case_setup = defaults-> get_handler (case_current->setup_handler );
307
+ handlers-> case_teardown = defaults-> get_handler (case_current->teardown_handler );
308
+ handlers-> case_failure = defaults-> get_handler (case_current->failure_handler );
311
309
312
310
if (case_current->is_empty ()) {
313
311
location = LOCATION_UNKNOWN;
@@ -328,7 +326,7 @@ void Harness::run_next_case()
328
326
329
327
if (setup_repeat & REPEAT_SETUP_TEARDOWN) {
330
328
location = LOCATION_CASE_SETUP;
331
- if (handlers (). case_setup && (handlers (). case_setup (case_current, test_index_of_case) != STATUS_CONTINUE)) {
329
+ if (handlers-> case_setup && (handlers-> case_setup (case_current, test_index_of_case) != STATUS_CONTINUE)) {
332
330
raise_failure (REASON_CASE_SETUP);
333
331
schedule_next_case ();
334
332
return ;
@@ -368,9 +366,9 @@ void Harness::run_next_case()
368
366
UTEST_LEAVE_CRITICAL_SECTION;
369
367
}
370
368
}
371
- else if (handlers (). test_teardown ) {
369
+ else if (handlers-> test_teardown ) {
372
370
location = LOCATION_TEST_TEARDOWN;
373
- handlers (). test_teardown (test_passed, test_failed, test_failed ? failure_t (REASON_CASES, LOCATION_UNKNOWN) : failure_t (REASON_NONE));
371
+ handlers-> test_teardown (test_passed, test_failed, test_failed ? failure_t (REASON_CASES, LOCATION_UNKNOWN) : failure_t (REASON_NONE));
374
372
test_cases = NULL ;
375
373
exit (test_failed);
376
374
} else {
0 commit comments