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()

Reply via email to