import unittest from .. import tool_imports_for_tests with tool_imports_for_tests(): from c_analyzer.variables import info from c_analyzer.variables.find import ( vars_from_binary, ) class _Base(unittest.TestCase): maxDiff = None @property def calls(self): try: return self._calls except AttributeError: self._calls = [] return self._calls class VarsFromBinaryTests(_Base): _return_iter_vars = () _return_get_symbol_resolver = None def setUp(self): super().setUp() self.kwargs = dict( _iter_vars=self._iter_vars, _get_symbol_resolver=self._get_symbol_resolver, ) def _iter_vars(self, binfile, resolve, handle_id): self.calls.append(('_iter_vars', (binfile, resolve, handle_id))) return [(v, v.id) for v in self._return_iter_vars] def _get_symbol_resolver(self, known=None, dirnames=(), *, handle_var, filenames=None, check_filename=None, perfilecache=None, ): self.calls.append(('_get_symbol_resolver', (known, dirnames, handle_var, filenames, check_filename, perfilecache))) return self._return_get_symbol_resolver def test_typical(self): resolver = self._return_get_symbol_resolver = object() variables = self._return_iter_vars = [ info.Variable.from_parts('dir1/spam.c', None, 'var1', 'int'), info.Variable.from_parts('dir1/spam.c', None, 'var2', 'static int'), info.Variable.from_parts('dir1/spam.c', None, 'var3', 'char *'), info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', 'const char *'), info.Variable.from_parts('dir1/eggs.c', None, 'var1', 'static int'), info.Variable.from_parts('dir1/eggs.c', 'func1', 'var2', 'static char *'), ] known = object() filenames = object() found = list(vars_from_binary('python', known=known, filenames=filenames, **self.kwargs)) self.assertEqual(found, [ info.Variable.from_parts('dir1/spam.c', None, 'var1', 'int'), info.Variable.from_parts('dir1/spam.c', None, 'var2', 'static int'), info.Variable.from_parts('dir1/spam.c', None, 'var3', 'char *'), info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', 'const char *'), info.Variable.from_parts('dir1/eggs.c', None, 'var1', 'static int'), info.Variable.from_parts('dir1/eggs.c', 'func1', 'var2', 'static char *'), ]) self.assertEqual(self.calls, [ ('_get_symbol_resolver', (filenames, known, info.Variable.from_id, None, None, {})), ('_iter_vars', ('python', resolver, None)), ]) # self._return_iter_symbols = [ # s_info.Symbol(('dir1/spam.c', None, 'var1'), 'variable', False), # s_info.Symbol(('dir1/spam.c', None, 'var2'), 'variable', False), # s_info.Symbol(('dir1/spam.c', None, 'func1'), 'function', False), # s_info.Symbol(('dir1/spam.c', None, 'func2'), 'function', True), # s_info.Symbol(('dir1/spam.c', None, 'var3'), 'variable', False), # s_info.Symbol(('dir1/spam.c', 'func2', 'var4'), 'variable', False), # s_info.Symbol(('dir1/ham.c', None, 'var1'), 'variable', True), # s_info.Symbol(('dir1/eggs.c', None, 'var1'), 'variable', False), # s_info.Symbol(('dir1/eggs.c', None, 'xyz'), 'other', False), # s_info.Symbol(('dir1/eggs.c', '???', 'var2'), 'variable', False), # s_info.Symbol(('???', None, 'var_x'), 'variable', False), # s_info.Symbol(('???', '???', 'var_y'), 'variable', False), # s_info.Symbol((None, None, '???'), 'other', False), # ] # known = object() # # vars_from_binary('python', knownvars=known, **this.kwargs) # found = list(globals_from_symbols(['dir1'], self.iter_symbols)) # # self.assertEqual(found, [ # info.Variable.from_parts('dir1/spam.c', None, 'var1', '???'), # info.Variable.from_parts('dir1/spam.c', None, 'var2', '???'), # info.Variable.from_parts('dir1/spam.c', None, 'var3', '???'), # info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', '???'), # info.Variable.from_parts('dir1/eggs.c', None, 'var1', '???'), # ]) # self.assertEqual(self.calls, [ # ('iter_symbols', (['dir1'],)), # ]) # # def test_no_symbols(self): # self._return_iter_symbols = [] # # found = list(globals_from_symbols(['dir1'], self.iter_symbols)) # # self.assertEqual(found, []) # self.assertEqual(self.calls, [ # ('iter_symbols', (['dir1'],)), # ]) # XXX need functional test