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)
 |