import re import textwrap import unittest from .. import tool_imports_for_tests with tool_imports_for_tests(): from c_analyzer.common.info import ID from c_analyzer.variables.info import Variable from cpython.supported import ( is_supported, ignored_from_file, ) class IsSupportedTests(unittest.TestCase): @unittest.expectedFailure def test_supported(self): statics = [ Variable('src1/spam.c', None, 'var1', 'const char *'), Variable('src1/spam.c', None, 'var1', 'int'), ] for static in statics: with self.subTest(static): result = is_supported(static) self.assertTrue(result) @unittest.expectedFailure def test_not_supported(self): statics = [ Variable('src1/spam.c', None, 'var1', 'PyObject *'), Variable('src1/spam.c', None, 'var1', 'PyObject[10]'), ] for static in statics: with self.subTest(static): result = is_supported(static) self.assertFalse(result) class IgnoredFromFileTests(unittest.TestCase): maxDiff = None _return_read_tsv = () @property def calls(self): try: return self._calls except AttributeError: self._calls = [] return self._calls def _read_tsv(self, *args): self.calls.append(('_read_tsv', args)) return self._return_read_tsv def test_typical(self): lines = textwrap.dedent(''' filename funcname name kind reason file1.c - var1 variable ... file1.c func1 local1 variable | file1.c - var2 variable ??? file1.c func2 local2 variable | file2.c - var1 variable reasons ''').strip().splitlines() lines = [re.sub(r'\s{1,8}', '\t', line, 4).replace('|', '') for line in lines] self._return_read_tsv = [tuple(v.strip() for v in line.split('\t')) for line in lines[1:]] ignored = ignored_from_file('spam.c', _read_tsv=self._read_tsv) self.assertEqual(ignored, { 'variables': { ID('file1.c', '', 'var1'): '...', ID('file1.c', 'func1', 'local1'): '', ID('file1.c', '', 'var2'): '???', ID('file1.c', 'func2', 'local2'): '', ID('file2.c', '', 'var1'): 'reasons', }, }) self.assertEqual(self.calls, [ ('_read_tsv', ('spam.c', 'filename\tfuncname\tname\tkind\treason')), ]) def test_empty(self): self._return_read_tsv = [] ignored = ignored_from_file('spam.c', _read_tsv=self._read_tsv) self.assertEqual(ignored, { 'variables': {}, }) self.assertEqual(self.calls, [ ('_read_tsv', ('spam.c', 'filename\tfuncname\tname\tkind\treason')), ])