@@ -36,7 +36,7 @@ namespace
3636
3737 const Case *case_current = NULL ;
3838 size_t case_index = 0 ;
39- control_t case_control = control_t ( REPEAT_SETUP_TEARDOWN) ;
39+ base_control_t case_control = { REPEAT_SETUP_TEARDOWN, TIMEOUT_UNDECLR } ;
4040 size_t case_repeat_count = 1 ;
4141
4242 void *case_timeout_handle = NULL ;
@@ -47,8 +47,13 @@ namespace
4747 size_t case_failed = 0 ;
4848 size_t case_failed_before = 0 ;
4949
50- handlers_t defaults = default_handlers;
51- handlers_t handlers = defaults;
50+ struct DefaultHandlers : public handlers_t {
51+ DefaultHandlers () : handlers_t (default_handlers) { }
52+ DefaultHandlers (const handlers_t & other) : handlers_t (other) { }
53+ };
54+
55+ SingletonPtr<DefaultHandlers> defaults;
56+ SingletonPtr<DefaultHandlers> handlers;
5257
5358 location_t location = LOCATION_UNKNOWN;
5459
@@ -110,10 +115,10 @@ bool Harness::run(const Specification& specification)
110115 return false ;
111116 test_cases = specification.cases ;
112117 test_length = specification.length ;
113- defaults = specification.defaults ;
114- handlers. test_setup = defaults. get_handler (specification.setup_handler );
115- handlers. test_teardown = defaults. get_handler (specification.teardown_handler );
116- 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 );
117122
118123 test_index_of_case = 0 ;
119124 test_passed = 0 ;
@@ -127,16 +132,16 @@ bool Harness::run(const Specification& specification)
127132 int setup_status = 0 ;
128133 failure_t failure (REASON_NONE, location);
129134
130- if (handlers. test_setup ) {
131- setup_status = handlers. test_setup (test_length);
135+ if (handlers-> test_setup ) {
136+ setup_status = handlers-> test_setup (test_length);
132137 if (setup_status == STATUS_CONTINUE) setup_status = 0 ;
133138 else if (setup_status < STATUS_CONTINUE) failure.reason = REASON_TEST_SETUP;
134139 else if (setup_status > signed (test_length)) failure.reason = REASON_CASE_INDEX;
135140 }
136141
137142 if (failure.reason != REASON_NONE) {
138- if (handlers. test_failure ) handlers. test_failure (failure);
139- 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);
140145 test_cases = NULL ;
141146 exit (1 );
142147 return true ;
@@ -150,8 +155,8 @@ bool Harness::run(const Specification& specification)
150155 scheduler.post (run_next_case, 0 );
151156 if (scheduler.run () != 0 ) {
152157 failure.reason = REASON_SCHEDULER;
153- if (handlers. test_failure ) handlers. test_failure (failure);
154- 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);
155160 test_cases = NULL ;
156161 exit (1 );
157162 return true ;
@@ -167,8 +172,8 @@ void Harness::raise_failure(const failure_reason_t reason)
167172 if (test_cases == NULL ) return ;
168173
169174 utest::v1::status_t fail_status = STATUS_ABORT;
170- if (handlers. test_failure ) handlers. test_failure (failure_t (reason, location));
171- 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));
172177
173178 {
174179 UTEST_ENTER_CRITICAL_SECTION;
@@ -184,25 +189,25 @@ void Harness::raise_failure(const failure_reason_t reason)
184189 }
185190
186191 if (fail_status == STATUS_ABORT || reason & REASON_CASE_SETUP) {
187- if (handlers. case_teardown && location != LOCATION_CASE_TEARDOWN) {
192+ if (handlers-> case_teardown && location != LOCATION_CASE_TEARDOWN) {
188193 location_t fail_loc (location);
189194 location = LOCATION_CASE_TEARDOWN;
190195
191- 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));
192197 if (teardown_status < STATUS_CONTINUE) raise_failure (REASON_CASE_TEARDOWN);
193198 else if (teardown_status > signed (test_length)) raise_failure (REASON_CASE_INDEX);
194199 else if (teardown_status >= 0 ) case_index = teardown_status - 1 ;
195200
196201 // Restore case failure location once we have dealt with case teardown
197202 location = fail_loc;
198- handlers. case_teardown = NULL ;
203+ handlers-> case_teardown = NULL ;
199204 }
200205 }
201206 if (fail_status == STATUS_ABORT) {
202207 test_failed++;
203208 failure_t fail (reason, location);
204209 location = LOCATION_TEST_TEARDOWN;
205- 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);
206211 exit (test_failed);
207212 die ();
208213 }
@@ -218,8 +223,8 @@ void Harness::schedule_next_case()
218223 if (case_control.repeat & REPEAT_SETUP_TEARDOWN || !(case_control.repeat & (REPEAT_ON_TIMEOUT | REPEAT_ON_VALIDATE))) {
219224 location = LOCATION_CASE_TEARDOWN;
220225
221- if (handlers. case_teardown ) {
222- 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,
223228 case_failed ? failure_t (REASON_CASES, LOCATION_UNKNOWN) : failure_t (REASON_NONE));
224229 if (status < STATUS_CONTINUE) raise_failure (REASON_CASE_TEARDOWN);
225230 else if (status > signed (test_length)) raise_failure (REASON_CASE_INDEX);
@@ -298,9 +303,9 @@ void Harness::run_next_case()
298303 UTEST_LOG_FUNCTION ();
299304 if (case_current < (test_cases + test_length))
300305 {
301- handlers. case_setup = defaults. get_handler (case_current->setup_handler );
302- handlers. case_teardown = defaults. get_handler (case_current->teardown_handler );
303- 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 );
304309
305310 if (case_current->is_empty ()) {
306311 location = LOCATION_UNKNOWN;
@@ -321,7 +326,7 @@ void Harness::run_next_case()
321326
322327 if (setup_repeat & REPEAT_SETUP_TEARDOWN) {
323328 location = LOCATION_CASE_SETUP;
324- 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)) {
325330 raise_failure (REASON_CASE_SETUP);
326331 schedule_next_case ();
327332 return ;
@@ -361,9 +366,9 @@ void Harness::run_next_case()
361366 UTEST_LEAVE_CRITICAL_SECTION;
362367 }
363368 }
364- else if (handlers. test_teardown ) {
369+ else if (handlers-> test_teardown ) {
365370 location = LOCATION_TEST_TEARDOWN;
366- 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));
367372 test_cases = NULL ;
368373 exit (test_failed);
369374 } else {
0 commit comments