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 c_analyzer.variables.known import ( read_file, from_file, ) class _BaseTests(unittest.TestCase): maxDiff = None @property def calls(self): try: return self._calls except AttributeError: self._calls = [] return self._calls class ReadFileTests(_BaseTests): _return_read_tsv = () 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 declaration file1.c - var1 variable static int file1.c func1 local1 variable static int file1.c - var2 variable int file1.c func2 local2 variable char * file2.c - var1 variable char * ''').strip().splitlines() lines = [re.sub(r'\s+', '\t', line, 4) for line in lines] self._return_read_tsv = [tuple(v.strip() for v in line.split('\t')) for line in lines[1:]] known = list(read_file('known.tsv', _read_tsv=self._read_tsv)) self.assertEqual(known, [ ('variable', ID('file1.c', '', 'var1'), 'static int'), ('variable', ID('file1.c', 'func1', 'local1'), 'static int'), ('variable', ID('file1.c', '', 'var2'), 'int'), ('variable', ID('file1.c', 'func2', 'local2'), 'char *'), ('variable', ID('file2.c', '', 'var1'), 'char *'), ]) self.assertEqual(self.calls, [ ('_read_tsv', ('known.tsv', 'filename\tfuncname\tname\tkind\tdeclaration')), ]) def test_empty(self): self._return_read_tsv = [] known = list(read_file('known.tsv', _read_tsv=self._read_tsv)) self.assertEqual(known, []) self.assertEqual(self.calls, [ ('_read_tsv', ('known.tsv', 'filename\tfuncname\tname\tkind\tdeclaration')), ]) class FromFileTests(_BaseTests): _return_read_file = () _return_handle_var = () def _read_file(self, infile): self.calls.append(('_read_file', (infile,))) return iter(self._return_read_file) def _handle_var(self, varid, decl): self.calls.append(('_handle_var', (varid, decl))) var = self._return_handle_var.pop(0) return var def test_typical(self): expected = [ Variable.from_parts('file1.c', '', 'var1', 'static int'), Variable.from_parts('file1.c', 'func1', 'local1', 'static int'), Variable.from_parts('file1.c', '', 'var2', 'int'), Variable.from_parts('file1.c', 'func2', 'local2', 'char *'), Variable.from_parts('file2.c', '', 'var1', 'char *'), ] self._return_read_file = [('variable', v.id, v.vartype) for v in expected] # ('variable', ID('file1.c', '', 'var1'), 'static int'), # ('variable', ID('file1.c', 'func1', 'local1'), 'static int'), # ('variable', ID('file1.c', '', 'var2'), 'int'), # ('variable', ID('file1.c', 'func2', 'local2'), 'char *'), # ('variable', ID('file2.c', '', 'var1'), 'char *'), # ] self._return_handle_var = list(expected) # a copy known = from_file('known.tsv', handle_var=self._handle_var, _read_file=self._read_file, ) self.assertEqual(known, { 'variables': {v.id: v for v in expected}, }) # Variable.from_parts('file1.c', '', 'var1', 'static int'), # Variable.from_parts('file1.c', 'func1', 'local1', 'static int'), # Variable.from_parts('file1.c', '', 'var2', 'int'), # Variable.from_parts('file1.c', 'func2', 'local2', 'char *'), # Variable.from_parts('file2.c', '', 'var1', 'char *'), # ]}, # }) self.assertEqual(self.calls, [ ('_read_file', ('known.tsv',)), *[('_handle_var', (v.id, v.vartype)) for v in expected], ]) def test_empty(self): self._return_read_file = [] known = from_file('known.tsv', handle_var=self._handle_var, _read_file=self._read_file, ) self.assertEqual(known, { 'variables': {}, }) self.assertEqual(self.calls, [ ('_read_file', ('known.tsv',)), ])