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}'],