Changeset 54 for trunk

Show
Ignore:
Timestamp:
04/13/09 12:22:23 (3 years ago)
Author:
mgalloy
Message:

Adding draft of GUI test runner.

Location:
trunk/mgunit
Files:
9 modified

Legend:

Unmodified
Added
Removed
  • trunk/mgunit/RELEASE

    r49 r54  
    1919 
    2020* Several test runners for outputting test results to various formats are 
    21   available; output can be sent to stdout, log files, or html files. 
     21  available; output can be sent to stdout, log files, or html files. In 
     22  addition, there is a GUI test runner that will show results and re-run tests 
     23  with the push of a button (also recompiling tests before running them). 
    2224 
    2325* If there is common setup required for each test method in a test case, a 
  • trunk/mgunit/src/mgunit.pro

    r52 r54  
    1616;    html : in, optional, type=boolean 
    1717;       set to indicate HTML output instead of plain text 
     18;    gui : in, optional, type=boolean 
     19;       set to bring up an interactive GUI to run the tests 
    1820;    npass : out, optional, type=long 
    1921;       number of tests that passed 
     
    2325;       number of tests       
    2426;- 
    25 pro mgunit, tests, filename=filename, html=html, $ 
     27pro mgunit, tests, filename=filename, html=html, gui=gui, $ 
    2628            color=color, $ 
    2729            npass=npass, nfail=nfail, ntests=ntests 
    2830  compile_opt strictarr 
    2931 
    30   testRunner = obj_new('MGutCompoundRunner') 
    31    
    32   runnerName = keyword_set(html) ? 'MGutHTMLRunner' : 'MGutCliRunner' 
    33   testRunner->add, obj_new(runnerName, filename=filename, color=color) 
    34    
    35   npass = 0L 
    36   nfail = 0L 
    37    
     32  case 1 of  
     33    keyword_set(gui): runnerName = 'MGutGuiRunner' 
     34    keyword_set(html): runnerName = 'MGutHtmlRunner' 
     35    else: runnerName = 'MgutCliRunner' 
     36  endcase 
     37     
    3838  if (n_elements(tests) gt 0) then begin 
     39    testRunner = obj_new('MGutCompoundRunner') 
     40     
     41    npass = 0L 
     42    nfail = 0L 
     43 
    3944    testsuite = obj_new('MGutTestSuite', $ 
    4045                        test_runner=testRunner, $ 
    4146                        name='All tests') 
     47 
     48    testRunner->add, obj_new(runnerName, parent=testRunner, $ 
     49                             filename=filename, color=color, $ 
     50                             test_suite=testsuite) 
     51   
    4252    testsuite->add, tests 
    4353    testsuite->run 
    4454    testsuite->getProperty, npass=npass, nfail=nfail, ntests=ntests 
    45     obj_destroy, testsuite 
     55     
     56    if (~keyword_set(gui)) then obj_destroy, testRunner 
    4657  endif 
    47  
    48   obj_destroy, testRunner 
    4958end 
  • trunk/mgunit/src/mgutclirunner__define.pro

    r53 r54  
    7272;  
    7373; :Params: 
    74 ;    testcase {in}{required}{type=string} name of test case 
     74;    testcase : in, required, type=string 
     75;       name of test case 
    7576; 
    7677; :Keywords: 
     
    228229;       set to print color output 
    229230;- 
    230 function mgutclirunner::init, filename=filename, color=color 
    231   compile_opt strictarr 
    232  
    233   if (~self->mguttestrunner::init()) then return, 0B 
     231function mgutclirunner::init, filename=filename, color=color, _extra=e 
     232  compile_opt strictarr 
     233 
     234  if (~self->mguttestrunner::init(_extra=e)) then return, 0B 
    234235 
    235236  if (n_elements(filename) gt 0) then begin 
  • trunk/mgunit/src/mgutcompoundrunner__define.pro

    r53 r54  
    168168;       stdout 
    169169;- 
    170 function mgutcompoundrunner::init, filename=filename 
     170function mgutcompoundrunner::init, filename=filename, _extra=e 
    171171  compile_opt strictarr 
    172172 
    173   if (~self->mguttestrunner::init()) then return, 0B 
     173  if (~self->mguttestrunner::init(_extra=e)) then return, 0B 
    174174  if (~self->idl_container::init()) then return, 0B 
    175  
     175   
    176176  return, 1B 
    177177end 
     
    184184  compile_opt strictarr 
    185185   
    186   define = { MGutCompoundRunner, inherits MGutTestRunner, inherits IDL_Container } 
     186  define = { MGutCompoundRunner, $ 
     187             inherits MGutTestRunner, $ 
     188             inherits IDL_Container $ 
     189           } 
    187190end 
  • trunk/mgunit/src/mgutguirunner__define.pro

    r53 r54  
    1111  compile_opt strictarr 
    1212 
    13   widget_control, event.id, get_uvalue=widget 
     13  widget_control, event.top, get_uvalue=widget 
    1414  widget->_eventHandler, event 
    1515end 
     
    4545  compile_opt strictarr 
    4646 
    47   ;indent = level eq 0 ? '' : string(bytarr(level * self.indent) + self.space) 
    48   ;self->_print, self.logLun, $ 
    49   ;              indent + '"' + testsuite $ 
    50   ;                + '" test suite starting (' $ 
    51   ;                + strtrim(ntestcases, 2) + ' test suite' $ 
    52   ;                + (ntestcases eq 1 ? '' : 's') $           
    53   ;                + '/case' $ 
    54   ;                + (ntestcases eq 1 ? '' : 's') $ 
    55   ;                + ', ' $ 
    56   ;                + strtrim(ntests, 2) + ' test' + (ntests eq 1 ? '' : 's') $ 
    57   ;                + ')', $ 
    58   ;              /magenta 
     47  indent = level eq 0 ? '' : string(bytarr(level * self.indent) + self.space) 
     48  self->_print, indent + '"' + testsuite $ 
     49                  + '" test suite starting (' $ 
     50                  + strtrim(ntestcases, 2) + ' test suite' $ 
     51                  + (ntestcases eq 1 ? '' : 's') $           
     52                  + '/case' $ 
     53                  + (ntestcases eq 1 ? '' : 's') $ 
     54                  + ', ' $ 
     55                  + strtrim(ntests, 2) + ' test' + (ntests eq 1 ? '' : 's') $ 
     56                  + ')' 
    5957end 
    6058 
     
    7674  compile_opt strictarr 
    7775 
    78   ;indent = level eq 0 ? '' : string(bytarr(level * self.indent) + self.space) 
    79   ;self->_print, self.logLun, $ 
    80   ;              indent + 'Results: ' $ 
    81   ;                + strtrim(npass, 2) + ' / ' + strtrim(npass + nfail, 2) $ 
    82   ;                + ' tests passed', $ 
    83   ;              /magenta 
     76  indent = level eq 0 ? '' : string(bytarr(level * self.indent) + self.space) 
     77  self->_print, indent + 'Results: ' $ 
     78                  + strtrim(npass, 2) + ' / ' + strtrim(npass + nfail, 2) $ 
     79                  + ' tests passed' 
    8480end 
    8581 
     
    8985;  
    9086; :Params: 
    91 ;    testcase {in}{required}{type=string} name of test case 
     87;    testcase : in, required, type=string 
     88;       name of test case 
    9289; 
    9390; :Keywords: 
     
    10097  compile_opt strictarr 
    10198 
    102   ;indent = string(bytarr(level * self.indent) + self.space) 
    103   ;self->_print, self.logLun, $ 
    104   ;              indent + '"' + testcase + '" test case starting' $ 
    105   ;                + ' (' + strtrim(ntests, 2) $ 
    106   ;                + ' test' + (ntests eq 1 ? '' : 's') + ')', $ 
    107   ;              /blue  
     99  indent = string(bytarr(level * self.indent) + self.space) 
     100  self->_print, indent + '"' + testcase + '" test case starting' $ 
     101                  + ' (' + strtrim(ntests, 2) $ 
     102                  + ' test' + (ntests eq 1 ? '' : 's') + ')' 
    108103end 
    109104 
     
    123118  compile_opt strictarr 
    124119 
    125   ;indent = string(bytarr(level * self.indent) + self.space) 
    126   ;self->_print, self.logLun, $ 
    127   ;              indent + 'Results: ' $ 
    128   ;                + strtrim(npass, 2) + ' / ' + strtrim(npass + nfail, 2) $ 
    129   ;                + ' tests passed', $ 
    130   ;              /blue 
     120  indent = string(bytarr(level * self.indent) + self.space) 
     121  self->_print, indent + 'Results: ' $ 
     122                  + strtrim(npass, 2) + ' / ' + strtrim(npass + nfail, 2) $ 
     123                  + ' tests passed' 
    131124end 
    132125 
     
    146139  compile_opt strictarr 
    147140 
    148   ;indent = string(bytarr((level + 1L) * self.indent) + self.space) 
    149   ;self->_print, self.logLun, indent + testname + ': ', format='(A, $)' 
     141  indent = string(bytarr((level + 1L) * self.indent) + self.space) 
     142  self->_print, indent + testname + ': ', /continued 
    150143end 
    151144 
     
    167160  compile_opt strictarr 
    168161 
    169   ;if (passed) then begin 
    170   ;  self->_print, self.logLun, 'passed', /green 
    171   ;endif else begin 
    172   ;  self->_print, self.logLun, 'failed' + (msg eq '' ? '' : ' "' + msg + '"'), /red 
    173   ;endelse 
     162  if (passed) then begin 
     163    self->_print, 'passed', /continued 
     164  endif else begin 
     165    self->_print, 'failed' + (msg eq '' ? '' : ' "' + msg + '"'), /continued 
     166  endelse 
     167   
     168  self->_print, string(time, format='(%" (%f seconds)")') 
     169end 
     170 
     171 
     172pro mgutguirunner::_print, text, continued=continued, _extra=e 
     173  compile_opt strictarr 
     174   
     175  if (self.continued) then begin 
     176    widget_control, self.text, get_value=fullText 
     177    fullText[n_elements(fullText) - 1L] += text 
     178    widget_control, self.text, set_value=fullText 
     179  endif else begin 
     180    widget_control, self.text, set_value=text, append=~self.cleared 
     181    self.cleared = 0B 
     182  endelse 
     183   
     184  self.continued = keyword_set(continued) 
    174185end 
    175186 
     
    181192  compile_opt strictarr 
    182193 
     194  obj_destroy, [self.suite, self.parent] 
    183195  self->mguttestrunner::cleanup 
    184196end 
    185197 
    186198 
     199;+ 
     200; Creates the user-interface for the GUI test runner. 
     201;- 
    187202pro mgutguirunner::_createWidgets 
    188203  compile_opt strictarr 
    189204   
    190   self.tlb = widget_base(title='mgunit', /column) 
    191 end 
    192  
    193  
     205  self.tlb = widget_base(title='mgunit', /column, uvalue=self, uname='tlb', $ 
     206                         /tlb_size_events) 
     207   
     208  self.toolbar = widget_base(self.tlb, /toolbar, space=0) 
     209   
     210  resourcedir = ['resource', 'bitmaps'] 
     211  rerun = widget_button(self.toolbar, uname='rerun', $ 
     212                        value=filepath('redo.bmp', subdir=resourcedir), $ 
     213                        /bitmap) 
     214                         
     215  self.text = widget_text(self.tlb, xsize=100, ysize=20, /scroll) 
     216end 
     217 
     218 
     219;+ 
     220; Realizes the user-interface for the GUI test runner. 
     221;- 
    194222pro mgutguirunner::_realizeWidgets 
    195223  compile_opt strictarr 
    196224   
    197 end 
    198  
    199  
     225  widget_control, self.tlb, /realize 
     226end 
     227 
     228 
     229;+ 
     230; Starts up XMANAGER. 
     231;- 
    200232pro mgutguirunner::_startXManager 
    201233  compile_opt strictarr 
     
    207239 
    208240 
     241;+ 
     242; Handles all events from the GUI test runner. 
     243;  
     244; :Params: 
     245;    event : in, required, type=structure 
     246;       event structure from any widget generating events in the GUI test  
     247;       runner 
     248;- 
    209249pro mgutguirunner::_eventHandler, event 
    210250  compile_opt strictarr 
    211251 
     252  uname = widget_info(event.id, /uname) 
     253   
     254  case uname of 
     255    'tlb': begin 
     256        tlbG = widget_info(event.top, /geometry) 
     257        toolbarG = widget_info(self.toolbar, /geometry) 
     258         
     259        xsize = event.x - 2 * tlbG.xpad 
     260        ysize = event.y - 2 * tlbG.ypad - tlbG.space - toolbarG.scr_ysize 
     261         
     262        widget_control, self.text, scr_xsize=xsize, scr_ysize=ysize 
     263      end 
     264    'rerun': begin 
     265        ; clear text widget 
     266        widget_control, self.text, set_value='' 
     267        self.cleared = 1B 
     268         
     269        ; rerun tests 
     270        self.suite->recompileTestCases 
     271        self.suite->run 
     272      end 
     273    else: 
     274  endcase 
    212275end 
    213276 
     
    216279  compile_opt strictarr 
    217280   
     281  obj_destroy, self 
    218282end 
    219283 
     
    225289;    1 for success, 0 for failure 
    226290;- 
    227 function mgutguirunner::init 
    228   compile_opt strictarr 
    229  
    230   if (~self->mguttestrunner::init()) then return, 0B 
     291function mgutguirunner::init, filename=filename, color=color, _extra=e 
     292  compile_opt strictarr 
     293 
     294  if (~self->mguttestrunner::init(_extra=e)) then return, 0B 
    231295 
    232296  self->_createWidgets 
    233297  self->_realizeWidgets 
    234298  self->_startXManager 
     299 
     300  self.cleared = 0B 
     301  self.indent = 3L 
     302  self.space = (byte(' '))[0] 
    235303   
    236304  return, 1B 
     
    244312;    tlb 
    245313;       top-level base of GUI 
     314;    text 
     315;    continued 
    246316;- 
    247317pro mgutguirunner__define 
     
    249319 
    250320  define = { mgutguirunner, inherits MGutTestRunner, $ 
    251              tlb : 0L $ 
     321             tlb: 0L, $ 
     322             toolbar: 0L, $ 
     323             text: 0L, $ 
     324             continued: 0B, $ 
     325             cleared: 0B, $ 
     326             indent: 0L, $ 
     327             space: '' $ 
    252328           } 
    253329end 
  • trunk/mgunit/src/mguthtmlrunner__define.pro

    r53 r54  
    184184;       stdout 
    185185;    color : in, optional, type=boolean 
    186 ;       unused for MGutHTMLRunner 
    187 ;- 
    188 function mguthtmlrunner::init, filename=filename, color=color 
    189   compile_opt strictarr 
    190  
    191   if (~self->mguttestrunner::init()) then return, 0B 
     186;       unused for MGutHtmlRunner 
     187;    _extra : in, optional, type=keywords 
     188;       keywords to MGutTestRunner::init 
     189;- 
     190function mguthtmlrunner::init, filename=filename, color=color, _extra=e 
     191  compile_opt strictarr 
     192 
     193  if (~self->mguttestrunner::init(_extra=e)) then return, 0B 
    192194 
    193195  ; make the directory the output file is in if it doesn't exist 
  • trunk/mgunit/src/mguttestcase__define.pro

    r53 r54  
    133133  compile_opt strictarr, logical_predicate 
    134134 
     135  self.npass = 0L 
     136  self.nfail = 0L 
     137   
    135138  self.testRunner->reportTestCaseStart, strlowcase(obj_class(self)), $ 
    136139                                        ntests=self.ntests, $ 
     
    288291 
    289292  self.level = 0L 
    290   self.npass = 0L 
    291   self.nfail = 0L 
    292293 
    293294  return, 1B 
  • trunk/mgunit/src/mguttestrunner__define.pro

    r53 r54  
    127127  compile_opt strictarr 
    128128 
     129  if (obj_valid(self.parent)) then obj_destroy, self.parent 
    129130end 
    130131 
     
    136137;    1 for success, 0 for failure 
    137138;- 
    138 function mguttestrunner::init 
     139function mguttestrunner::init, parent=parent, test_suite=testSuite 
    139140  compile_opt strictarr 
     141 
     142  self.suite = obj_valid(testsuite) ? testsuite : obj_new() 
     143  self.parent = obj_valid(parent) ? parent : obj_new() 
    140144   
    141145  return, 1B 
     
    147151; 
    148152; :Fields: 
    149 ;    dummy  
    150 ;       needed because IDL requires at least one field 
     153;    suite 
     154;       suite of tests the runner will run 
     155;    parent 
     156;       parent compound test, if present 
    151157;- 
    152158pro mguttestrunner__define 
    153159  compile_opt strictarr 
    154160 
    155   define = { MGutTestRunner, dummy : 0L } 
     161  define = { MGutTestRunner, $ 
     162             suite: obj_new(), $ 
     163             parent: obj_new() $  
     164           } 
    156165end 
  • trunk/mgunit/src/mguttestsuite__define.pro

    r27 r54  
    66; use the add method to add test suites/cases. 
    77;- 
     8 
    89 
    910;+ 
     
    5960 
    6061;+ 
     62; Recompiles all test cases contained by the suite or contained by child  
     63; suites. 
     64;- 
     65pro mguttestsuite::recompileTestCases 
     66  compile_opt strictarr 
     67   
     68  for i = 0L, self.testcases->count() - 1L do begin 
     69    testcase = self.testcases->get(position=i) 
     70    if (obj_isa(testcase, 'MGutTestSuite')) then begin 
     71      testcase->recompileTestCases 
     72    endif else begin 
     73      self->_recompile, obj_class(testcase) 
     74    endelse 
     75  endfor 
     76end 
     77 
     78 
     79;+ 
    6180; Run the contained test suites or test cases. 
    6281;- 
     
    6483  compile_opt strictarr 
    6584 
     85  self.npass = 0L 
     86  self.nfail = 0L 
     87   
    6688  self->getProperty, name=name, ntestcases=ntestcases, ntests=ntests 
    6789  self.testRunner->reportTestSuiteStart, name, $ 
     
    270292  self.testcases = obj_new('IDL_Container') 
    271293 
    272   self.npass = 0L 
    273   self.nfail = 0L 
    274  
    275294  return, 1B 
    276295end 
     
    283302;    name  
    284303;       name of the object 
     304;    home 
     305;       directory (with trailing slash) containing the source code for this 
     306;       test suite 
    285307;    level  
    286308;       number of layers below the top-most containing test suite 
     
    300322 
    301323  define = { MGutTestSuite, $ 
    302              name : '', $ 
    303              home : '', $ 
    304              level : 0L, $ 
    305              testcases : obj_new(), $ 
    306              testRunner : obj_new(), $ 
    307              npass : 0L, $ 
    308              nfail : 0L $ 
     324             name: '', $ 
     325             home: '', $ 
     326             level: 0L, $ 
     327             testcases: obj_new(), $ 
     328             testRunner: obj_new(), $ 
     329             npass: 0L, $ 
     330             nfail: 0L $ 
    309331           } 
    310332end