summaryrefslogtreecommitdiff
path: root/test/func_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/func_test.py')
-rw-r--r--test/func_test.py193
1 files changed, 193 insertions, 0 deletions
diff --git a/test/func_test.py b/test/func_test.py
new file mode 100644
index 000000000..3de8891c8
--- /dev/null
+++ b/test/func_test.py
@@ -0,0 +1,193 @@
+# Copyright (c) 2002-2005 LOGILAB S.A. (Paris, FRANCE).
+# http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+"""functional/non regression tests for pylint"""
+
+__revision__ = '$Id: func_test.py,v 1.37 2005-12-28 14:58:22 syt Exp $'
+
+import unittest
+import sys
+import re
+import new
+from os import linesep
+from os.path import exists
+
+from logilab.common import testlib
+
+from utils import get_tests_info, fix_path, TestReporter
+
+from pylint.lint import PyLinter
+from pylint import checkers
+
+test_reporter = TestReporter()
+linter = PyLinter()
+linter.set_reporter(test_reporter)
+linter.config.persistent = 0
+linter.quiet = 1
+checkers.initialize(linter)
+
+PY23 = sys.version_info >= (2, 3)
+PY24 = sys.version_info >= (2, 4)
+
+
+if linesep != '\n':
+ LINE_RGX = re.compile(linesep)
+ def ulines(string):
+ return LINE_RGX.sub('\n', string)
+else:
+ def ulines(string):
+ return string
+
+INFO_TEST_RGX = re.compile('^func_i\d\d\d\d$')
+
+def exception_str(ex):
+ """function used to replace default __str__ method of exception instances"""
+ return 'in %s\n:: %s' % (ex.file, ', '.join(ex.args))
+
+class LintTestUsingModule(testlib.TestCase):
+
+ def test_functionality(self):
+ tocheck = ['input.'+self.module]
+ if self.depends:
+ tocheck += ['input.%s' % name.replace('.py', '')
+ for name, file in self.depends]
+ self._test(tocheck)
+
+ def _test(self, tocheck):
+ if INFO_TEST_RGX.match(self.module):
+ linter.enable_message_category('I')
+ else:
+ linter.disable_message_category('I')
+ try:
+ linter.check(tocheck)
+ except Exception, ex:
+ # need finalization to restore a correct state
+ linter.reporter.finalize()
+ ex.file = tocheck
+ ex.__str__ = new.instancemethod(exception_str, ex, None)
+ raise
+ if self.module.startswith('func_noerror_'):
+ expected = ''
+ else:
+ output = open(self.output)
+ expected = output.read().strip()
+ output.close()
+ got = linter.reporter.finalize().strip()
+ try:
+ self.assertLinesEquals(got, expected)
+ except Exception, ex:
+ ex.file = tocheck
+ ex.__str__ = new.instancemethod(exception_str, ex, None)
+ raise # AssertionError('%s: %r\n!=\n%r\n\n%s' % (self.module, got, expected, ex))
+
+class LintTestUsingFile(LintTestUsingModule):
+
+ def test_functionality(self):
+ tocheck = ['input/' + self.module + '.py']
+ if self.depends:
+ tocheck += ['input/%s' % name for name, file in self.depends]
+ self._test(tocheck)
+
+
+class TestTests(unittest.TestCase):
+ """check that all testable messages have been checked"""
+ def test(self):
+ todo = linter._messages.keys()
+ for msg_id in test_reporter.message_ids.keys():
+ todo.remove(msg_id)
+ todo.sort()
+ if PY23:
+ self.assertEqual(todo, ['E0503', 'F0002', 'F0202', 'F0321', 'I0001'])
+ else:
+ self.assertEqual(todo, ['F0002', 'F0202', 'F0321', 'I0001'])
+
+
+def make_tests(filter_rgx):
+ """generate tests classes from test info
+
+ return the list of generated test classes
+ """
+ if filter_rgx:
+ is_to_run = re.compile(filter_rgx).match
+ else:
+ is_to_run = lambda x: 1
+ tests = []
+ for module_file, messages_file in get_tests_info('func_', '.py') + [('nonexistant', 'messages/nonexistant.txt')]:
+ # skip those tests with python >= 2.3 since py2.3 detects them by itself
+ if PY23 and module_file == "func_unknown_encoding.py": #"func_nonascii_noencoding.py"):
+ continue
+ if not PY24:
+ if module_file == "func_noerror_staticmethod_as_decorator.py" or \
+ module_file.endswith('py24.py'):
+ continue
+ if not is_to_run(module_file):
+ continue
+ base = module_file.replace('func_', '').replace('.py', '')
+ dependancies = get_tests_info(base, '.py')
+
+ class LintTestUsingModuleTC(LintTestUsingModule):
+ module = module_file.replace('.py', '')
+ output = messages_file
+ depends = dependancies or None
+ tests.append(LintTestUsingModuleTC)
+
+ if MODULES_ONLY:
+ continue
+
+ class LintTestUsingFileTC(LintTestUsingFile):
+ module = module_file.replace('.py', '')
+ output = exists(messages_file + '2') and (messages_file + '2') or messages_file
+ depends = dependancies or None
+ tests.append(LintTestUsingFileTC)
+
+## # special test for f0003
+## module_file, messages_file in get_tests_info('func_f0003', '.pyc')
+## class LintTestSubclass(LintTest):
+## module = module_file.replace('.pyc', '')
+## output = messages_file
+## depends = dependancies or None
+## tests.append(LintTestSubclass)
+
+ class LintBuiltinModuleTest(LintTestUsingModule):
+ output = 'messages/builtin_module.txt'
+ module = 'sys'
+ def test_functionality(self):
+ self._test(['sys'])
+ tests.append(LintBuiltinModuleTest)
+
+ if not filter_rgx:
+ # test all features are tested :)
+ tests.append(TestTests)
+
+ return tests
+
+FILTER_RGX = None
+MODULES_ONLY = False
+
+def suite():
+ return unittest.TestSuite([unittest.makeSuite(test)
+ for test in make_tests(FILTER_RGX)])
+
+if __name__=='__main__':
+ if '-m' in sys.argv:
+ MODULES_ONLY = True
+ sys.argv.remove('-m')
+
+ if len(sys.argv) > 1:
+ FILTER_RGX = sys.argv[1]
+ del sys.argv[1]
+ unittest.main(defaultTest='suite')
+
+