5
5
from robot .errors import DataError
6
6
from robot .parsing import TEST_EXTENSIONS
7
7
from robot .parsing .newparser import builder
8
+ from robot .parsing .newparser .nodes import TestCaseSection
8
9
from robot .model import SuiteNamePatterns
9
10
from robot .running .model import TestSuite , Keyword , ForLoop , ResourceFile
10
11
from robot .utils import abspath
11
12
from robot .variables import VariableIterator
12
13
from robot .output import LOGGER
13
- from robot .utils import get_error_message , unic
14
+ from robot .utils import normalize , unic
14
15
15
16
16
17
def create_fixture (data , type ):
@@ -329,6 +330,7 @@ class TestSuiteBuilder(object):
329
330
330
331
def __init__ (self , include_suites = None , extension = None , rpa = None ):
331
332
self .rpa = rpa
333
+ self ._rpa_not_given = rpa is None
332
334
self .include_suites = include_suites
333
335
self .extension = extension
334
336
@@ -372,11 +374,15 @@ def _parse_and_build(self, path, parent_defaults=None, include_suites=None, incl
372
374
else :
373
375
LOGGER .info ("Parsing file '%s'." % path )
374
376
suite , _ = self ._build_suite (path , name , parent_defaults )
377
+ suite .rpa = self .rpa
375
378
suite .remove_empty_suites ()
376
379
return suite
377
380
378
381
def _build_suite (self , source , name , parent_defaults ):
379
382
data = self ._parse (source )
383
+ test_section = self ._get_test_section (data )
384
+ if self ._rpa_not_given and test_section :
385
+ self ._set_execution_mode (test_section , source )
380
386
suite = TestSuite (name = name , source = source )
381
387
defaults = TestDefaults (parent_defaults )
382
388
if data :
@@ -385,6 +391,22 @@ def _build_suite(self, source, name, parent_defaults):
385
391
SuiteBuilder (suite , defaults ).visit (data )
386
392
return suite , defaults
387
393
394
+ def _get_test_section (self , data ):
395
+ test_sections = [s for s in data .sections if isinstance (s , TestCaseSection )]
396
+ return test_sections [0 ] if test_sections else None
397
+
398
+ def _set_execution_mode (self , test_section , source ):
399
+ rpa = test_section .header .lower () in ('task' , 'tasks' )
400
+ if self .rpa is None :
401
+ self .rpa = rpa
402
+ elif self .rpa is not rpa :
403
+ this , that = ('tasks' , 'tests' ) if rpa else ('tests' , 'tasks' )
404
+ raise DataError ("Conflicting execution modes. File '%s' has %s "
405
+ "but files parsed earlier have %s. Fix headers "
406
+ "or use '--rpa' or '--norpa' options to set the "
407
+ "execution mode explicitly."
408
+ % (source , this , that ))
409
+
388
410
def _parse (self , path ):
389
411
try :
390
412
return builder .get_test_case_file_ast (path )
0 commit comments