Revision: 3314
Author: janne.t.harkonen
Date: Tue May 18 04:01:37 2010
Log: Report invalid settings
http://code.google.com/p/robotframework/source/detail?r=3314

Modified:
 /trunk/src/robot/parsing/populator.py
 /trunk/utest/parsing/test_populator.py

=======================================
--- /trunk/src/robot/parsing/populator.py       Tue May 18 03:55:35 2010
+++ /trunk/src/robot/parsing/populator.py       Tue May 18 04:01:37 2010
@@ -16,12 +16,16 @@
 import os

 from robot import utils
-
+from robot.output import LOGGER

 # Hook for external tools for altering ${CURDIR} processing
 PROCESS_CURDIR = True


+def report_invalid_setting(msg):
+    LOGGER.error("Invalid setting %s." % msg)
+
+
 class Populator(object):
     """Explicit interface for all populators."""
     def add(self, row): raise NotImplementedError()
@@ -77,13 +81,19 @@
             return OldStyleMetadataPopulator(self._table.add_metadata)
         if self._is_import_or_metadata(first_cell):
return SettingTableNameValuePopulator(self._table_attr_setter(first_cell))
-        return SettingPopulator(self._setting_setter(first_cell))
-
-    def _is_metadata_with_olde_prefix(self, setting_name):
-        return setting_name.lower().startswith(self.olde_metadata_prefix)
-
-    def _is_import_or_metadata(self, setting_name):
-        return setting_name in self.name_value_setters
+        if self._is_setting(first_cell):
+            return SettingPopulator(self._setting_setter(first_cell))
+        report_invalid_setting("'%s' in setting table" % (first_cell))
+        return NullPopulator()
+
+    def _is_metadata_with_olde_prefix(self, value):
+        return value.lower().startswith(self.olde_metadata_prefix)
+
+    def _is_import_or_metadata(self, value):
+        return value in self.name_value_setters
+
+    def _is_setting(self, value):
+        return value in self.attrs_by_name

     def _table_attr_setter(self, first_cell):
         attr_name = self.name_value_setters[first_cell]
@@ -178,7 +188,8 @@

     def _get_populator(self, row):
         if row.starts_test_or_user_keyword_setting():
-            return SettingPopulator(self._setting_setter(row.head()))
+            setter = self._setting_setter(row.head())
+            return SettingPopulator(setter) if setter else NullPopulator()
         if row.starts_for_loop():
             return ForLoopPopulator(self._test_or_uk.add_for_loop)
         return StepPopulator(self._test_or_uk.add_step)
@@ -188,14 +199,22 @@
(isinstance(self._populator, ForLoopPopulator) and row.is_indented())

     def _setting_setter(self, cell):
-        attr_name = self.attrs_by_name[self._setting_name(cell)]
-        return getattr(self._test_or_uk, attr_name).set
+        if self._setting_name(cell) in self.attrs_by_name:
+            attr_name = self.attrs_by_name[self._setting_name(cell)]
+            return getattr(self._test_or_uk, attr_name).set
+        self._log_invalid_setting(cell)
+        return None

     def _setting_name(self, cell):
         return cell[1:-1].strip()

+    def _log_invalid_setting(self, value):
+        report_invalid_setting("'%s' in %s '%s'" % (value, self._item_type,
+                                                    self._test_or_uk.name))
+

 class TestCasePopulator(_TestCaseUserKeywordPopulator):
+    _item_type = 'test case'
     attrs_by_name = utils.NormalizedDict({'Documentation': 'doc',
                                           'Document': 'doc',
                                           'Setup': 'setup',
@@ -206,8 +225,8 @@
                                           'Timeout': 'timeout'})


-
 class UserKeywordPopulator(_TestCaseUserKeywordPopulator):
+    _item_type = 'keyword'
     attrs_by_name = utils.NormalizedDict({'Documentation': 'doc',
                                           'Document': 'doc',
                                           'Arguments': 'args',
=======================================
--- /trunk/utest/parsing/test_populator.py      Tue May 18 02:58:59 2010
+++ /trunk/utest/parsing/test_populator.py      Tue May 18 04:01:37 2010
@@ -1,10 +1,26 @@
 import unittest
 import os
+from StringIO import StringIO

 from robot.parsing.populator import TestDataPopulator
 from robot.parsing.newmodel import TestCaseFile
 from robot.utils.asserts import assert_equals, assert_true, assert_false

+from robot.output import LOGGER
+LOGGER.disable_automatic_console_logger()
+LOGGER.disable_message_cache()
+
+
+class _MockLogger(object):
+    def __init__(self):
+        self._output = StringIO()
+
+    def message(self, msg):
+        self._output.write(msg.message)
+
+    def value(self):
+        return self._output.getvalue()
+

 class TestCaseFilePopulatingTest(unittest.TestCase):

@@ -12,6 +28,11 @@
         self._datafile = TestCaseFile()
         self._datafile.source = '/path/to/source.txt'
         self._populator = TestDataPopulator(self._datafile)
+        self._logger = _MockLogger()
+        LOGGER.register_logger(self._logger)
+
+    def tearDown(self):
+        LOGGER.unregister_logger(self._logger)

     def test_starting_valid_table(self):
         for name in ['Test Cases', '  variables   ', 'K E Y WO R D S']:
@@ -31,6 +52,10 @@
         self._assert_setting('doc', doc)
         self._assert_fixture('suite_setup', setup_name, setup_args)

+    def test_invalid_settings(self):
+        self._create_table('Settings', [['In valid', 'val ue']])
+ assert_equals(self._logger.value(), "Invalid setting 'In valid' in setting table.")
+
     def test_adding_import(self):
         self._create_table('settings', [['Library', 'FooBarness'],
['Library', 'BarFooness', 'arg1', 'arg2'],
@@ -140,6 +165,16 @@
         assert_equals(test.doc.value, doc)
         assert_equals(test.tags.value, ['ankka', 'kameli', 'aasi'])

+    def test_invalid_test_settings(self):
+        self._create_table('Test cases', [['My test name'],
+                                          ['', '[Aasi]']])
+ assert_equals(self._logger.value(), "Invalid setting '[Aasi]' in test case 'My test name'.")
+
+    def test_invalid_keyword_settings(self):
+        self._create_table('Keywords', [['My User Keyword'],
+                                        ['', '[ank ka]']])
+ assert_equals(self._logger.value(), "Invalid setting '[ank ka]' in keyword 'My User Keyword'.")
+
     def test_creating_user_keywords(self):
         self._create_table('Keywords', [['My User Keyword'],
['', '[Arguments]', '${foo}', '${bar}'],

Reply via email to