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