Revision: 3294
Author: pekka.klarck
Date: Mon May 17 04:48:44 2010
Log: 1) Pass separate name and args for imports, 2) For loops
http://code.google.com/p/robotframework/source/detail?r=3294
Modified:
/trunk/src/robot/parsing/newmodel.py
/trunk/utest/parsing/test_model.py
=======================================
--- /trunk/src/robot/parsing/newmodel.py Mon May 17 02:46:19 2010
+++ /trunk/src/robot/parsing/newmodel.py Mon May 17 04:48:44 2010
@@ -55,15 +55,19 @@
def add_metadata(self, name, value):
self.metadata.append(Metadata(name, value))
-
- def add_library(self, value):
- self.imports.append(Library(value))
-
- def add_resource(self, value):
- self.imports.append(Resource(value))
-
- def add_variables(self, value):
- self.imports.append(Variables(value))
+ return self.metadata[-1]
+
+ def add_library(self, name, args=None):
+ self.imports.append(Library(name, args))
+ return self.imports[-1]
+
+ def add_resource(self, name, invalid_args=None):
+ self.imports.append(Resource(name, invalid_args))
+ return self.imports[-1]
+
+ def add_variables(self, name, args=None):
+ self.imports.append(Variables(name, args))
+ return self.imports[-1]
def __iter__(self):
for setting in [self.doc, self.suite_setup, self.suite_teardown,
@@ -178,20 +182,37 @@
class Import(Setting):
- def __init__(self, value):
- self.value = value
+ def __init__(self, name, args=None, alias=None):
+ self.name = name
+ self.args = args or []
+ self.alias = alias
class Library(Import):
- pass
+
+ def __init__(self, name, args=None, alias=None):
+ if args and not alias:
+ args, alias = self._split_alias(args)
+ Import.__init__(self, name, args, alias)
+
+ def _split_alias(self, args):
+ if len(args) >= 2 and args[-2].upper() == 'WITH NAME':
+ return args[:-2], args[-1]
+ return args, None
class Resource(Import):
- pass
+
+ def __init__(self, name, invalid_args=None):
+ if invalid_args:
+ name += ' ' + ' '.join(invalid_args)
+ Import.__init__(self, name)
class Variables(Import):
- pass
+
+ def __init__(self, name, args=None):
+ Import.__init__(self, name, args)
class Variable(object):
@@ -203,7 +224,14 @@
self.value = value
-class TestCase(object):
+class WithSteps(object):
+
+ def add_step(self, content):
+ self.steps.append(Step(content))
+ return self.steps[-1]
+
+
+class TestCase(WithSteps):
def __init__(self, name):
self.name = name
@@ -214,11 +242,12 @@
self.timeout = Timeout()
self.steps = []
- def add_step(self, content):
- self.steps.append(Step(content))
+ def add_for_loop(self, data):
+ self.steps.append(ForLoop(data))
+ return self.steps[-1]
-class UserKeyword(object):
+class UserKeyword(TestCase):
def __init__(self, name):
self.name = name
@@ -228,8 +257,20 @@
self.timeout = Timeout()
self.steps = []
- def add_step(self, content):
- self.steps.append(Step(content))
+
+class ForLoop(WithSteps):
+
+ def __init__(self, data):
+ self.range, index = self._get_range_and_index(data)
+ self.vars = data[:index]
+ self.values = data[index+1:]
+ self.steps = []
+
+ def _get_range_and_index(self, data):
+ for index, item in enumerate(data):
+ if item.upper() in ['IN', 'IN RANGE']:
+ return item.upper() == 'IN RANGE', index
+ return False, len(data)
class Step(object):
=======================================
--- /trunk/utest/parsing/test_model.py Mon May 17 02:46:19 2010
+++ /trunk/utest/parsing/test_model.py Mon May 17 04:48:44 2010
@@ -92,13 +92,31 @@
assert_equal(self.table.metadata[1].value, 'f a r')
def test_imports(self):
- self.table.add_library(['Name', 'arg'])
- self.table.add_resource(['reso.txt'])
- self.table.add_variables(['varz.py', 'a1', 'a2'])
- self.table.add_resource(['reso2.txt'])
- assert_equal(len(self.table.imports), 4)
+ self._verify_import(self.table.add_library('Name'), 'Name')
+
self._verify_import(self.table.add_resource('reso.txt'), 'reso.txt')
+ self._verify_import(self.table.add_variables('varz.py'), 'varz.py')
+ self._verify_import(self.table.add_variables('./v2.py',
['a1', 'a2']),
+ './v2.py', ['a1', 'a2'])
+ self._verify_import(self.table.add_library('N2',
['1', '2', '3', '4']),
+ 'N2', ['1', '2', '3', '4'])
+ assert_equal(len(self.table.imports), 5)
assert_true(all(isinstance(im, Import) for im in
self.table.imports))
+ def test_resource_with_invalid_args(self):
+ reso = self.table.add_resource('reso.txt', ['invalid', 'args'])
+ self._verify_import(reso, 'reso.txt invalid args')
+
+ def test_library_with_name(self):
+ lib = self.table.add_library('Name', ['WITH NAME', 'New name'])
+ self._verify_import(lib, 'Name', [], 'New name')
+ lib = self.table.add_library('Orig', ['a1', 'a2', 'with
name', 'New'])
+ self._verify_import(lib, 'Orig', ['a1', 'a2'], 'New')
+
+ def _verify_import(self, imp, name, args=[], alias=None):
+ assert_equal(imp.name, name)
+ assert_equal(imp.args, args)
+ assert_equal(imp.alias, alias)
+
class TestVariableTable(unittest.TestCase):
@@ -150,10 +168,14 @@
assert_equal(self.test.tags.value, ['My', 'coooool', 'tags'])
def test_add_step(self):
- self.test.add_step(['Keyword', 'arg1', 'arg2'])
- assert_equal(len(self.test.steps), 1)
- assert_equal(self.test.steps[0].keyword, 'Keyword')
- assert_equal(self.test.steps[0].args, ['arg1', 'arg2'])
+ step = self.test.add_step(['Keyword', 'arg1', 'arg2'])
+ assert_equal(self.test.steps, [step])
+ assert_equal(step.keyword, 'Keyword')
+ assert_equal(step.args, ['arg1', 'arg2'])
+
+ def test_add_for_loop(self):
+ loop = self.test.add_for_loop(['${var}', 'IN', 'value'])
+ assert_equal(self.test.steps, [loop])
class TestKeywordTable(unittest.TestCase):
@@ -184,10 +206,14 @@
assert_equal(self.kw.args.value, ['${args}', 'are
not', 'validated'])
def test_add_step(self):
- self.kw.add_step(['Keyword', 'arg1', 'arg2'])
- assert_equal(len(self.kw.steps), 1)
- assert_equal(self.kw.steps[0].keyword, 'Keyword')
- assert_equal(self.kw.steps[0].args, ['arg1', 'arg2'])
+ step = self.kw.add_step(['Keyword', 'arg1', 'arg2'])
+ assert_equal(self.kw.steps, [step])
+ assert_equal(step.keyword, 'Keyword')
+ assert_equal(step.args, ['arg1', 'arg2'])
+
+ def test_add_for_loop(self):
+ loop = self.kw.add_for_loop(['${var}', 'IN', 'value'])
+ assert_equal(self.kw.steps, [loop])
class TestStep(unittest.TestCase):
@@ -218,5 +244,39 @@
assert_equal(step.assign, assign)
+class TestForLoop(unittest.TestCase):
+
+ def test_normal_for(self):
+ self._test(['${var}', 'IN', 'value1', 'value2'],
+ ['${var}'], ['value1', 'value2'])
+ self._test(['${v1}', '${v2}', 'in', '@{values}'],
+ ['${v1}', '${v2}'], ['@{values}'])
+ self._test(['${v1}', '${v2}', '${v3}', 'IN'],
+ ['${v1}', '${v2}', '${v3}'], [])
+ self._test(['${x}', 'IN', 'IN RANGE', 'IN', 'IN RANGE', 'X'],
+ ['${x}'], ['IN RANGE', 'IN', 'IN RANGE', 'X'])
+
+ def test_variable_format_is_not_verified(self):
+ self._test(['whatever', 'here', 'in', 'value1', 'value2'],
+ ['whatever', 'here'], ['value1', 'value2'])
+
+ def test_without_vars(self):
+ self._test(['IN', 'value1', 'value2'], [], ['value1', 'value2'])
+
+ def test_without_in(self):
+ self._test(['whatever', 'here'], ['whatever', 'here'], [])
+
+ def test_in_range(self):
+ self._test(['${i}', 'IN RANGE', '100'], ['${i}'], ['100'],
range=True)
+ self._test(['what', 'ever', 'in range', 'IN', 'whatever'],
+ ['what', 'ever'], ['IN', 'whatever'], range=True)
+
+ def _test(self, content, vars, values, range=False):
+ loop = ForLoop(content)
+ assert_equal(loop.vars, vars)
+ assert_equal(loop.values, values)
+ assert_equal(loop.range, range)
+
+
if __name__ == "__main__":
unittest.main()