Changeset 28

Show
Ignore:
Timestamp:
02/20/09 12:37:46 (3 years ago)
Author:
mgalloy
Message:

Fix to handle setup/teardown methods crashing.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/mgunit/src/mguttestcase__define.pro

    r17 r28  
    5959 
    6060;+ 
     61; Run setup method before each test. 
     62; 
     63; :Keywords: 
     64;    fail : out, optional, type=boolean 
     65;       set to a named variable to determine if the setup method failed 
     66;- 
     67pro mguttestcase::_runSetup, fail=fail 
     68  compile_opt strictarr 
     69 
     70  fail = 0L 
     71   
     72  catch, error 
     73  if (error ne 0L) then begin 
     74    catch, /cancel 
     75    fail = 1L 
     76    return 
     77  endif 
     78     
     79  self->setup 
     80end 
     81 
     82 
     83;+ 
     84; Run teardown method before each test. 
     85; 
     86; :Keywords: 
     87;    fail : out, optional, type=boolean 
     88;       set to a named variable to determine if the teardown method failed 
     89;- 
     90pro mguttestcase::_runTeardown, fail=fail 
     91  compile_opt strictarr 
     92 
     93  fail = 0L 
     94   
     95  catch, error 
     96  if (error ne 0L) then begin 
     97    catch, /cancel 
     98    fail = 1L 
     99    return 
     100  endif 
     101     
     102  self->teardown 
     103end 
     104 
     105 
     106 
     107;+ 
    61108; Run the tests for this class (i.e. methods with names that start with "test"). 
    62109;- 
     
    71118  for t = 0L, self.ntests - 1L do begin 
    72119    self.testRunner->reportTestStart, (*self.testnames)[t], level=self.level 
    73     self->setup 
    74     result = self->runTest((*self.testnames)[t], message=msg)  
    75     if (result) then ++self.npass else ++self.nfail 
     120 
     121    result = 0L         ; assume test failed 
     122    setupFailed = 0L    ; assume setup/teardown worked unless otherwise told 
     123    teardownFailed = 0L 
     124     
     125    self->_runSetup, fail=setupFailed 
     126    if (~setupFailed) then begin 
     127      result = self->runTest((*self.testnames)[t], message=msg) 
     128      self->_runTeardown, fail=teardownFailed   
     129    endif 
     130     
     131    passed = result && ~setupFailed && ~teardownFailed 
     132     
     133    if (setupFailed) then msg = 'setup failed' 
     134    if (result && teardownFailed) then msg = 'teardown failed' 
     135 
     136    if (passed) then begin 
     137      ++self.npass  
     138    endif else begin 
     139      ++self.nfail 
     140    endelse 
    76141 
    77142    ; remove prefix from msg if present 
     
    90155     
    91156    ; construct the log message for the test 
    92     logMsg = result $ 
     157    logMsg = passed $ 
    93158             ? '' $  
    94159             : (n_elements(msg) eq 0 $ 
    95160                ? '' $ 
    96161                : msg) 
    97  
    98     self->teardown     
    99     self.testRunner->reportTestResult, logMsg, passed=result 
     162                       
     163    self.testRunner->reportTestResult, logMsg, passed=passed 
    100164  endfor 
    101165