Mini Shell
# Tests of equivalence relations.
# These are also tested by test_Classifiers.
# This is some more tests, tailored esp. to the user view.
# (test_Classifiers was so slow already, so I start over)
# o Intended to be exhaustive wrt all ER's defined
#
# o Intersection of ER's
from guppy.heapy.test import support
import inspect
import os.path
class TestCase(support.TestCase):
pass
class FirstCase(TestCase):
def test_1(self):
hp = self.heapy.Use
hp.reprefix = 'hp.'
a = hp.iso(1, '', 'asdf', 3.4, 3.7, 2)
ts = (hp.Type & hp.Size)
k = ts[a]
# From Sep 1-2 2005
# (h&dict).by(hp.Id.dictof&hp.Size)._get_partition()
# (h&dict).by((hp.Type&hp.Size).dictof&hp.Size)
# These require with_referrers of refby/via classifier
# after gc collect referrers graph will be empty
# (h).by(hp.Module.refby.dictof)
# (h).by(hp.Via.dictof)
# How to construct RCS / refby
# self.aseq(hp.Type.refby(int, list) , hp.Type.refby(list, int)
class C:
pass
di = hp.iso(C.__dict__, [])
# db = di.by('Rcs')
# for i in (0, 1):
# rk = repr(db[i].kind)
# ek = eval(rk, {'hp': hp}, {})
# self.aseq(ek, db[i].kind)
# self.aseq(db & ek, db[i])
def test_2(self):
' Systematically test all kind constructors: '
# wrt repr and evaluation of repr
hp = self.heapy.Use
hp.reprefix = 'hp.'
class C:
pass
class T(object):
pass
c = C()
t = T()
import sys
for s in (
'hp.Clodo(dictof=C)',
'hp.Clodo(dictof=T)',
'hp.Clodo(dictof=())',
'hp.Clodo(C)',
'hp.Clodo(T)',
'hp.Id(id(c))',
'hp.Module("sys")',
'hp.Prod()',
'hp.Prod("<string>")',
'hp.Prod(T)',
'hp.Prod("/foo.py", 1)',
'hp.Prod("/foo.py", None)',
'hp.Prod(None, 1)',
'hp.Rcs(hp.Clodo.sokind(int)(dictof=C))',
'hp.Size(hp.iso(c).indisize)',
'hp.Size(hp.iso(C).indisize).dictof',
'hp.Type(T)',
'hp.Type(int)',
'hp.Unity()',
'hp.Via()',
# Via is also specially tested below
):
x = eval(s, {'hp': hp, 'C': C, 'T': T, 'c': c}, {})
rx = repr(x)
self.aseq(eval(rx, {'hp': hp}, {}), x)
for i, s in enumerate((
# Test Via construction.
# One test for each relation kind defined in Path except IDENTITY and RELSRC.
# In code order.
"hp.Via('_.x')",
"hp.Via('_[0]')",
"hp.Via('_.keys()[0]')",
"hp.Via('_->abc')",
"hp.Via('_.__dict__.keys()[0]')",
"hp.Via('_.f_locals[\"abc\"]')",
"hp.Via('_.f_locals [\"abc\"]')",
"hp.Via('_->f_valuestack[0]')",
"hp.Via('list(_)[0]')",
)):
code = i + 1
x = eval(s, {'hp': hp}, {})
rel = list(x.arg)[0]
self.aseq(rel.kind, code)
rx = repr(x)
self.aseq(eval(rx, {'hp': hp}, {}), x)
def test_3(self):
' Test of dictof '
# Test of dictof on something that requires memoization, i.e. Size, & (and)
hp = self.heapy.Use
class C:
pass
class T(object):
# The test works only if sizes of objects of class C and T differ.
# At first test, T() was 4 bytes smaller than C().
# This might be brittle with different systems.
# This is to make sure this diff gets significantly bigger:
__slots__ = '__dict__', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'
c = C()
t = T()
dn = {}
isod = hp.iso(c.__dict__, t.__dict__, dn)
for x in (
t, c):
X = x.__class__
for k in (
hp.Clodo(dictof=X),
hp.Size(hp.iso(x).indisize).dictof,
hp.iso(x).bysize.kind.dictof,
hp.iso(x.__dict__).kind,
):
self.aseq(isod & k, hp.iso(x.__dict__))
# Test no-owner selection
for k in (
hp.Nothing.dictof,
):
self.aseq(isod & k, hp.iso(dn))
def test_4(self):
' Test of via '
# Esp. representation, construction
class C:
pass
c = C()
hp = self.heapy.Use
isod = hp.iso(c.__dict__)
x = isod.by('Via').kind
self.aseq(repr(x), "hpy().Via('.__dict__')")
def test_5(self):
' Non-systematic tests that came up around Sep 14 2005 '
class C:
pass
c = C()
d = {}
cref = [c]
cref.append(cref)
c.cref = cref
hp = self.heapy.Use
hp.reprefix = 'hp.'
# I thought these should be the same
a = hp.iso(C, c, c.__dict__, d)
b = hp.iso(C, c, c.__dict__, d)
self.aseq(a, b)
# This is a kind of nested refdby that has been a concern lately
# -- how to represent it
s = hp.iso(C.__dict__, C, c, c.__dict__,
d).by(hp.Clodo.refdby.refdby)
for i in range(len(s)):
a = s[i].kind
ra = repr(a)
era = eval(ra, {'hp': hp}, {})
self.aseq(a, era)
self.aseq(s & era,
s[i])
import sys
p = sys.path
del sys
s = hp.iso(p)
x = s.by(hp.Module.dictof.refdby)
self.aseq(s & eval(repr(x.kind), {'hp': hp}, {}), s)
def test_6(self):
' Test of .refdby on all others '
with self.tracemalloc_state():
class C:
pass
c = C()
d = {}
cref = [c]
cref.append(cref)
c.cref = cref
hp = self.heapy.Use
hp.reprefix = 'hp.'
s = hp.iso(C.__dict__, C, c, c.__dict__, d, inspect)
for pre in (
'Unity',
'Clodo',
'Id',
'Module',
'Prod',
('Rcs', 0),
'Size',
'Type',
'Via'
):
if isinstance(pre, tuple):
pre, level = pre
else:
level = 1
er = getattr(hp, pre)
self.er_test(er, s, level)
def er_test(self, er, set, level=1):
# Tests what any eqv. rel. er should do
hp = self.heapy.Use
rer = repr(er)
self.aseq(eval(rer, {'hp': hp}, {}), er)
for s in (set,):
sby = s.by(er)
sk = sby.kind
rsk = repr(sk)
ske = eval(rsk, {'hp': hp}, {})
self.aseq(ske, sk, -1)
self.aseq(s & sk, s, -1)
self.aseq(s & ske, s, -1)
# That it can do .refdby
er_refdby = er.refdby
# That it can do .dictof
er_dictof = er.dictof
if level > 0:
self.er_test(er_refdby, set, level - 1)
self.er_test(er_dictof, set, level - 1)
def test_7(self):
' Test of alternative sets w. biper '
hp = self.heapy.Use
class C:
pass
class D(C):
pass
class E(D):
pass
class T(object):
pass
class U(T):
pass
class V(U):
pass
c = C()
d = D()
e = E()
t = T()
u = U()
v = V()
s = hp.iso([], {}, c, d, e, t, u, v, d.__dict__)
for k in (
hp.Size(32),
hp.Type(U),
):
lt = k.alt('<')
le = k.alt('<=')
ge = k.alt('>=')
gt = k.alt('>=')
ne = k.alt('!=')
assert (s & le) & (s & ge) == s & k
for a in (lt, le, ge, gt, ne, le & ~k):
s & a
import gc
gc.collect()
a = s.by(k.alt('>=').biper)
b = s.by(k.alt('>=').biper)
self.assertTrue(hp.iso(d.__dict__) <= a[0])
self.assertTrue(a == b)
gc.collect()
a = s.by(k.alt('<=').biper)
b = s.by(k.alt('<=').biper)
self.assertTrue(hp.iso(d.__dict__) <= a[0])
self.assertTrue(a == b)
def test_8(self):
' Test of findex and biper '
# added Nov 3 2005
hp = self.heapy.Use
class C:
pass
c = C()
li = []
di = {}
s = hp.iso(li, di, c, 1)
for k, i in (
(hp.Type(dict), 0),
(hp.iso(c), 1),
(hp.iso(c, li), 1),
):
p = s.by(k.biper)
self.aseq(p[i].kind.fam.classifier.kinds[0], k)
def test_9(self):
' Test the subrelation relation '
from guppy import hpy
ernames = ['Clodo', 'Id', 'Idset', 'Module',
'Prod', 'Rcs', 'Size', 'Type',
'Unity']
hp = hpy()
ers = [(name, getattr(hp, name)) for name in ernames]
ers.append(('Size&Type', hp.Size & hp.Type))
from io import StringIO
f = StringIO()
print(''.ljust(10), end=' ', file=f)
for b in ers:
print(b[0].ljust(7), end=' ', file=f)
print(file=f)
for a in ers:
print(a[0].ljust(10), end=' ', file=f)
for b in ers:
print(str((a[1] < b[1]))[:1].ljust(7), end=' ', file=f)
print(file=f)
self.aseq(f.getvalue(), """\
Clodo Id Idset Module Prod Rcs Size Type Unity Size&Type \n\
Clodo F F F F F F F T T F \n\
Id F F F F F F F F T F \n\
Idset F F F F F F F F T F \n\
Module F F F F F F F F T F \n\
Prod F F F F F F F F T F \n\
Rcs F F F F F F F F T F \n\
Size F F F F F F F F T F \n\
Type F F F F F F F F T F \n\
Unity F F F F F F F F F F \n\
Size&Type F F F F F F T T T F \n\
""")
def test_10(self):
' Test of producer profile '
hp = self.heapy.Use
with self.tracemalloc_state():
class C:
pass
file = inspect.currentframe().f_code.co_filename
def lineno():
return inspect.currentframe().f_back.f_lineno
str_aloc = eval('C()', {'C': C}, {})
test_aloc, test_aloc_line = C(), lineno()
def subf():
return C(), lineno()
subf_aloc, subf_aloc_line = subf()
isod = hp.iso(None, str_aloc, test_aloc, subf_aloc)
self.aseq(isod & hp.Prod(), hp.iso(None))
self.aseq(isod & hp.Prod('<string>', 1), hp.iso(str_aloc))
self.aseq(isod & hp.Prod(file, test_aloc_line), hp.iso(test_aloc))
self.aseq(isod & hp.Prod(file, subf_aloc_line), hp.iso(subf_aloc))
self.aseq(isod & hp.Prod(file), hp.iso(test_aloc, subf_aloc))
self.aseq(isod & hp.Prod(os.path.dirname(file)),
hp.iso(test_aloc, subf_aloc))
self.aseq(isod & hp.Prod(self.test_10), hp.iso(test_aloc, subf_aloc))
self.aseq(isod & hp.Prod(subf), hp.iso(subf_aloc))
self.aseq(isod & hp.Prod(None, test_aloc_line).alt('>=') &
hp.Prod(None, test_aloc_line).alt('<='),
hp.iso(test_aloc))
with self.assertRaises(TypeError):
hp.Prod('', lineno=1)
with self.assertRaises(TypeError):
hp.Prod(filename='', line=1)
with self.assertRaises(TypeError):
hp.Prod(None)
with self.assertRaises(TypeError):
hp.Prod(1, 1)
with self.assertRaises(TypeError):
hp.Prod('', '')
with self.assertRaises(TypeError):
hp.Prod('', 1, 2)
def test_main(debug=0):
support.run_unittest(FirstCase, debug)
if __name__ == "__main__":
from guppy.heapy.Remote import off
off()
test_main()
Zerion Mini Shell 1.0