from _pydevd_bundle.pydevd_constants import IS_PY36_OR_GREATER, GENERATED_LEN_ATTR_NAME from _pydevd_bundle import pydevd_constants, pydevd_frame_utils import pytest import sys def check_len_entry(len_entry, first_2_params): assert len_entry[:2] == first_2_params assert callable(len_entry[2]) assert len_entry[2]('check') == 'len(check)' def test_dict_resolver(): from _pydevd_bundle.pydevd_resolver import DictResolver dict_resolver = DictResolver() dct = {(1, 2): 2, u'22': 22} contents_debug_adapter_protocol = clear_contents_debug_adapter_protocol(dict_resolver.get_contents_debug_adapter_protocol(dct)) len_entry = contents_debug_adapter_protocol.pop(-1) check_len_entry(len_entry, (GENERATED_LEN_ATTR_NAME, 2)) if IS_PY36_OR_GREATER: assert contents_debug_adapter_protocol == [ ('(1, 2)', 2, '[(1, 2)]'), ("'22'", 22, "['22']")] else: assert contents_debug_adapter_protocol == [ ("'22'", 22, "['22']"), ('(1, 2)', 2, '[(1, 2)]')] def test_dict_resolver_hex(): from _pydevd_bundle.pydevd_resolver import DictResolver dict_resolver = DictResolver() dct = {(1, 10, 100): (10000, 100000, 100000)} contents_debug_adapter_protocol = clear_contents_debug_adapter_protocol( dict_resolver.get_contents_debug_adapter_protocol(dct, fmt={'hex': True})) len_entry = contents_debug_adapter_protocol.pop(-1) check_len_entry(len_entry, (GENERATED_LEN_ATTR_NAME, 1)) assert contents_debug_adapter_protocol == [ ('(0x1, 0xa, 0x64)', (10000, 100000, 100000), '[(1, 10, 100)]'), ] def test_object_resolver_simple(): from _pydevd_bundle.pydevd_resolver import DefaultResolver default_resolver = DefaultResolver() class MyObject(object): def __init__(self): self.a = 10 self.b = 20 obj = MyObject() dictionary = clear_contents_dictionary(default_resolver.get_dictionary(obj)) assert dictionary == {'a': 10, 'b': 20} contents_debug_adapter_protocol = clear_contents_debug_adapter_protocol(default_resolver.get_contents_debug_adapter_protocol(obj)) assert contents_debug_adapter_protocol == [('a', 10, '.a'), ('b', 20, '.b')] def test_object_resolver_error(): from _pydevd_bundle.pydevd_resolver import DefaultResolver default_resolver = DefaultResolver() class MyObject(object): def __init__(self): self.a = 10 def __dir__(self): return ['a', 'b'] def __getattribute__(self, attr_name): if attr_name == 'b': raise RuntimeError('unavailable') return object.__getattribute__(self, attr_name) obj = MyObject() dictionary = default_resolver.get_dictionary(obj) b_value = dictionary.pop('b') assert dictionary == {'a': 10} assert "raise RuntimeError('unavailable')" in b_value contents_debug_adapter_protocol = default_resolver.get_contents_debug_adapter_protocol(obj) b_value = contents_debug_adapter_protocol.pop(-1) assert contents_debug_adapter_protocol == [('a', 10, '.a')] assert b_value[0] == 'b' assert "raise RuntimeError('unavailable')" in b_value[1] assert b_value[2] == '.b' def test_object_resolver_hasattr_error(): from _pydevd_bundle.pydevd_resolver import DefaultResolver from _pydevd_bundle.pydevd_xml import get_type default_resolver = DefaultResolver() class MyObject(object): def __getattribute__(self, attr_name): raise RuntimeError() obj = MyObject() dictionary = default_resolver.get_dictionary(obj) assert dictionary == {} _type_object, type_name, _resolver = get_type(obj) assert type_name == 'MyObject' def test_object_resolver__dict__non_strings(): from _pydevd_bundle.pydevd_resolver import DefaultResolver default_resolver = DefaultResolver() class MyObject(object): def __init__(self): self.__dict__[(1, 2)] = (3, 4) obj = MyObject() dictionary = clear_contents_dictionary(default_resolver.get_dictionary(obj)) assert dictionary == {'(1, 2)': (3, 4)} contents_debug_adapter_protocol = clear_contents_debug_adapter_protocol( default_resolver.get_contents_debug_adapter_protocol(obj)) assert contents_debug_adapter_protocol == [('(1, 2)', (3, 4), '.__dict__[(1, 2)]')] def test_django_forms_resolver(): from _pydevd_bundle.pydevd_resolver import DjangoFormResolver django_form_resolver = DjangoFormResolver() class MyObject(object): def __init__(self): self.__dict__[(1, 2)] = (3, 4) self.__dict__['errors'] = 'foo' obj = MyObject() dictionary = clear_contents_dictionary(django_form_resolver.get_dictionary(obj)) assert dictionary == {'(1, 2)': (3, 4), 'errors': None} obj._errors = 'bar' dictionary = clear_contents_dictionary(django_form_resolver.get_dictionary(obj)) assert dictionary == {'(1, 2)': (3, 4), 'errors': 'bar', '_errors': 'bar'} def clear_contents_debug_adapter_protocol(contents_debug_adapter_protocol): lst = [] for x in contents_debug_adapter_protocol: if not x[0].startswith('__'): if '