113 lines
2.9 KiB
Python
113 lines
2.9 KiB
Python
|
|
||
|
""" test_model - our (very simple) type system
|
||
|
model tests
|
||
|
"""
|
||
|
|
||
|
from py.__.apigen.tracer.model import *
|
||
|
|
||
|
import types
|
||
|
import py
|
||
|
|
||
|
def check_guess(val, t):
|
||
|
assert isinstance(guess_type(val), t)
|
||
|
|
||
|
def test_basic():
|
||
|
""" This tests checks every object that we might want
|
||
|
to track
|
||
|
"""
|
||
|
check_guess(3, SomeInt)
|
||
|
check_guess(3., SomeFloat)
|
||
|
check_guess(True, SomeBoolean)
|
||
|
check_guess(lambda x: None, SomeFunction)
|
||
|
|
||
|
class A:
|
||
|
pass
|
||
|
|
||
|
check_guess(A, SomeClass)
|
||
|
check_guess(A(), SomeInstance)
|
||
|
|
||
|
class B(object):
|
||
|
def meth(self):
|
||
|
pass
|
||
|
|
||
|
class C(object):
|
||
|
def __call__(self):
|
||
|
pass
|
||
|
|
||
|
check_guess(B, SomeClass)
|
||
|
check_guess(B.meth, SomeFunction)
|
||
|
check_guess(B(), SomeInstance)
|
||
|
check_guess(B().meth, SomeMethod)
|
||
|
check_guess([1], SomeList)
|
||
|
check_guess(None, SomeNone)
|
||
|
check_guess((1,), SomeTuple)
|
||
|
check_guess(C(), SomeInstance)
|
||
|
import sys
|
||
|
check_guess(sys, SomeModule)
|
||
|
check_guess({}, SomeDict)
|
||
|
check_guess(sys.exc_info, SomeBuiltinFunction)
|
||
|
|
||
|
def test_anyof():
|
||
|
def check_lst(lst):
|
||
|
a = guess_type(lst[0])
|
||
|
for i in lst[1:]:
|
||
|
a = unionof(a, guess_type(i))
|
||
|
d = dict([(i, True) for i in a.possibilities])
|
||
|
assert len(a.possibilities) == len(d)
|
||
|
for i in a.possibilities:
|
||
|
assert not isinstance(i, SomeUnion)
|
||
|
return a
|
||
|
|
||
|
class C(object):
|
||
|
pass
|
||
|
|
||
|
ret = check_lst([3, 4, 3., "aa"])
|
||
|
assert len(ret.possibilities) == 3
|
||
|
ret = check_lst([3, 4, 3.])
|
||
|
ret2 = check_lst([1, "aa"])
|
||
|
ret3 = unionof(ret, ret2)
|
||
|
assert len(ret3.possibilities) == 3
|
||
|
ret = check_lst([3, 1.])
|
||
|
ret = unionof(ret, guess_type("aa"))
|
||
|
ret = unionof(guess_type("aa"), ret)
|
||
|
ret = unionof(guess_type(C()), ret)
|
||
|
ret = unionof(ret, guess_type("aa"))
|
||
|
ret = unionof(ret, guess_type(C()))
|
||
|
assert len(ret.possibilities) == 4
|
||
|
|
||
|
def test_union():
|
||
|
class A(object):
|
||
|
pass
|
||
|
|
||
|
class B(object):
|
||
|
pass
|
||
|
|
||
|
f = guess_type(A).unionof(guess_type(A))
|
||
|
assert isinstance(f, SomeClass)
|
||
|
assert f.cls is A
|
||
|
f = guess_type(A).unionof(guess_type(B)).unionof(guess_type(A))
|
||
|
assert isinstance(f, SomeUnion)
|
||
|
assert len(f.possibilities) == 2
|
||
|
f = guess_type(A()).unionof(guess_type(A()))
|
||
|
assert isinstance(f, SomeInstance)
|
||
|
assert isinstance(f.classdef, SomeClass)
|
||
|
assert f.classdef.cls is A
|
||
|
f = guess_type(B()).unionof(guess_type(A())).unionof(guess_type(B()))
|
||
|
assert isinstance(f, SomeInstance)
|
||
|
assert isinstance(f.classdef, SomeUnion)
|
||
|
assert len(f.classdef.possibilities) == 2
|
||
|
|
||
|
def test_striter():
|
||
|
class A(object):
|
||
|
pass
|
||
|
|
||
|
class B(object):
|
||
|
pass
|
||
|
|
||
|
g = guess_type(A).unionof(guess_type(A()))
|
||
|
l = py.builtin.sorted(list(g.striter()))
|
||
|
assert l[4] == "AnyOf("
|
||
|
assert isinstance(l[0], SomeClass)
|
||
|
assert l[3] == ", "
|
||
|
assert isinstance(l[1], SomeInstance)
|