test_dir2.py
67 lines
| 1.4 KiB
| text/x-python
|
PythonLexer
Tim Couper
|
r6309 | from IPython.utils.dir2 import dir2 | ||
Samuel Gaist
|
r26929 | import pytest | ||
Tim Couper
|
r6309 | |||
class Base(object): | ||||
x = 1 | ||||
z = 23 | ||||
def test_base(): | ||||
res = dir2(Base()) | ||||
Samuel Gaist
|
r26918 | assert "x" in res | ||
assert "z" in res | ||||
assert "y" not in res | ||||
assert "__class__" in res | ||||
assert res.count("x") == 1 | ||||
assert res.count("__class__") == 1 | ||||
Tim Couper
|
r6309 | |||
def test_SubClass(): | ||||
class SubClass(Base): | ||||
y = 2 | ||||
res = dir2(SubClass()) | ||||
Samuel Gaist
|
r26918 | assert "y" in res | ||
assert res.count("y") == 1 | ||||
assert res.count("x") == 1 | ||||
Tim Couper
|
r6309 | |||
def test_SubClass_with_trait_names_attr(): | ||||
# usecase: trait_names is used in a class describing psychological classification | ||||
class SubClass(Base): | ||||
y = 2 | ||||
trait_names = 44 | ||||
res = dir2(SubClass()) | ||||
Samuel Gaist
|
r26929 | assert "trait_names" in res | ||
Jeffrey Tratner
|
r12965 | |||
def test_misbehaving_object_without_trait_names(): | ||||
# dir2 shouldn't raise even when objects are dumb and raise | ||||
# something other than AttribteErrors on bad getattr. | ||||
Samuel Gaist
|
r26929 | class MisbehavingGetattr: | ||
def __getattr__(self, attr): | ||||
Jeffrey Tratner
|
r12965 | raise KeyError("I should be caught") | ||
def some_method(self): | ||||
Samuel Gaist
|
r26929 | return True | ||
Jeffrey Tratner
|
r12965 | |||
class SillierWithDir(MisbehavingGetattr): | ||||
def __dir__(self): | ||||
return ['some_method'] | ||||
Thomas Kluyver
|
r21287 | for bad_klass in (MisbehavingGetattr, SillierWithDir): | ||
Samuel Gaist
|
r26929 | obj = bad_klass() | ||
assert obj.some_method() | ||||
with pytest.raises(KeyError): | ||||
obj.other_method() | ||||
res = dir2(obj) | ||||
assert "some_method" in res | ||||