提交 46bfaa51 authored 作者: Frederic Bastien's avatar Frederic Bastien

added more test

上级 be7d7282
...@@ -47,38 +47,38 @@ class T_test_module(unittest.TestCase): ...@@ -47,38 +47,38 @@ class T_test_module(unittest.TestCase):
def test_members_in_list_tuple_or_dict(self): def test_members_in_list_tuple_or_dict(self):
"""Test that a Member which is only included via a list, tuple or dictionary is still treated as if it """Test that a Member which is only included via a list, tuple or dictionary is still treated as if it
were a toplevel attribute were a toplevel attribute and not shared
Fred: toplevel attribute? do you mean as a toplevel member? m1.x=x work as m1.lx=[x]? Fred: toplevel attribute? do you mean as a toplevel member? m1.x=x work as m1.lx=[x]?
""" """
def local_test(x,y): def local_test(x,y):
m1=Module() m1=Module()
m1.x=x m1.x=x()
m1.y=y m1.y=y()
m1.lx=[x]#cast Result] m1.lx=[x()]#cast Result]
m1.ly=[y] m1.ly=[y()]
m1.llx=[[x]]#cast Result] m1.llx=[[x()]]#cast Result]
m1.lly=[[y]] m1.lly=[[y()]]
m1.ltx=[(x,)] m1.ltx=[(x(),)]
m1.lty=[(y,)] m1.lty=[(y(),)]
m1.ldx=[{"x":x}] m1.ldx=[{"x":x()}]
m1.ldy=[{"y":y}] m1.ldy=[{"y":y()}]
m1.tx=(x,) m1.tx=(x(),)
m1.ty=(y,) m1.ty=(y(),)
m1.tlx=[(x,)] m1.tlx=[(x(),)]
m1.tly=[(y,)] m1.tly=[(y(),)]
m1.ttx=((x,),) m1.ttx=((x(),),)
m1.tty=((y,),) m1.tty=((y(),),)
m1.tdx=({"x":x},) m1.tdx=({"x":x()},)
m1.tdy=({"y":y},) m1.tdy=({"y":y()},)
m1.dx={"x":x} m1.dx={"x":x()}
m1.dy={"y":y} m1.dy={"y":y()}
m1.dlx=[{"x":x}] m1.dlx=[{"x":x()}]
m1.dly=[{"y":y}] m1.dly=[{"y":y()}]
m1.dtx=({"x":x},) m1.dtx=({"x":x()},)
m1.dty=({"y":y},) m1.dty=({"y":y()},)
m1.ddx={"x":{"x":x}} m1.ddx={"x":{"x":x()}}
m1.ddy={"y":{"y":y}} m1.ddy={"y":{"y":y()}}
inst=m1.make() inst=m1.make()
...@@ -109,9 +109,9 @@ class T_test_module(unittest.TestCase): ...@@ -109,9 +109,9 @@ class T_test_module(unittest.TestCase):
assert inst.ddy assert inst.ddy
assert inst.ddx assert inst.ddx
local_test(T.dscalar(),Member(T.dscalar())) local_test(lambda:T.dscalar(),lambda:Member(T.dscalar()))
local_test(T.value(1),Member(T.value(2))) local_test(lambda:T.value(1),lambda:Member(T.value(2)))
local_test(T.constant(1),Member(T.constant(2))) local_test(lambda:T.constant(1),lambda:Member(T.constant(2)))
def test_method_in_list_or_dict(self): def test_method_in_list_or_dict(self):
"""Test that a Method which is only included via a list or dictionary is still treated as if it """Test that a Method which is only included via a list or dictionary is still treated as if it
...@@ -132,8 +132,22 @@ class T_test_module(unittest.TestCase): ...@@ -132,8 +132,22 @@ class T_test_module(unittest.TestCase):
m1.dz={'z':Method([],m1.x*2)} m1.dz={'z':Method([],m1.x*2)}
m1.lly=[[Method(x,x*2)]] m1.lly=[[Method(x,x*2)]]
m1.llz=[[Method([],m1.x*2)]] m1.llz=[[Method([],m1.x*2)]]
m1.lty=[(Method(x,x*2),)]
m1.ltz=[(Method([],m1.x*2),)]
m1.ldy=[{'y':Method(x,x*2)}]
m1.ldz=[{'z':Method([],m1.x*2)}]
m1.tly=([Method(x,x*2)],)
m1.tlz=([Method([],m1.x*2)],)
m1.tty=((Method(x,x*2),),) m1.tty=((Method(x,x*2),),)
m1.ttz=((Method([],m1.x*2),),) m1.ttz=((Method([],m1.x*2),),)
m1.tdy=({'y':Method(x,x*2)},)
m1.tdz=({'z':Method([],m1.x*2)},)
m1.dly={'y':[Method(x,x*2)]}
m1.dlz={'z':[Method([],m1.x*2)]}
m1.dty={'y':(Method(x,x*2),)}
m1.dtz={'z':(Method([],m1.x*2),)}
m1.ddy={'y':{'y':Method(x,x*2)}}
m1.ddz={'z':{'z':Method([],m1.x*2)}}
inst=m1.make() inst=m1.make()
inst.x=1 inst.x=1
...@@ -145,129 +159,122 @@ class T_test_module(unittest.TestCase): ...@@ -145,129 +159,122 @@ class T_test_module(unittest.TestCase):
assert inst.tz[0]()==2 assert inst.tz[0]()==2
assert inst.dy['y'](2)==4 assert inst.dy['y'](2)==4
assert inst.dz['z']()==2 assert inst.dz['z']()==2
for f in inst.lly[0][0], inst.lty[0][0], inst.ldy[0]['y'], inst.tly[0][0], inst.tty[0][0], inst.tdy[0]['y'], inst.dly['y'][0], inst.dty['y'][0], inst.ddy['y']['y']:
assert f(2)==4
for f in inst.llz[0][0], inst.ltz[0][0], inst.ldz[0]['z'], inst.tlz[0][0], inst.ttz[0][0], inst.tdz[0]['z'], inst.dlz['z'][0], inst.dtz['z'][0], inst.ddz['z']['z']:
assert f()==2
assert isinstance(inst.z,theano.compile.function_module.Function) assert isinstance(inst.z,theano.compile.function_module.Function)
assert isinstance(inst.lz[0],theano.compile.function_module.Function)
assert isinstance(inst.tz[0],theano.compile.function_module.Function)
assert isinstance(inst.y,theano.compile.function_module.Function) assert isinstance(inst.y,theano.compile.function_module.Function)
assert isinstance(inst.ly[0],theano.compile.function_module.Function) for f in inst.ly,inst.lz,inst.ty,inst.tz:
assert isinstance(inst.ty[0],theano.compile.function_module.Function) assert isinstance(f[0],theano.compile.function_module.Function)
for f in inst.lly,inst.llz,inst.lty,inst.ltz,inst.tly,inst.tlz,inst.tty,inst.ttz:
assert inst.lly[0][0](2)==4#BUG: we don't support list of list of Method... assert isinstance(f[0][0],theano.compile.function_module.Function)
assert inst.llz[0][0]()==2 for f in inst.dly['y'][0],inst.dty['y'][0], inst.dlz['z'][0],inst.dtz['z'][0], inst.ddy['y']['y'], inst.ddz['z']['z']:
assert inst.tty[0][0](2)==4 assert isinstance(f,theano.compile.function_module.Function)
assert inst.ttz[0][0]()==2
assert isinstance(inst.llz[0][0],theano.compile.function_module.Function)
assert isinstance(inst.ttz[0][0],theano.compile.function_module.Function)
assert isinstance(inst.lly[0][0],theano.compile.function_module.Function)
assert isinstance(inst.tty[0][0],theano.compile.function_module.Function)
def test_shared_members(self): def test_shared_members(self):
"""Test that under a variety of tricky conditions, the shared-ness of Results and Members """Test that under a variety of tricky conditions, the shared-ness of Results and Members
is respected.""" is respected."""
def populate_module(m,x):
m.x=x
m.lx=[x]
m.llx=[[x],[x]]
m.ltx=[(x,)]
m.ldx=[{'x':x}]
m.tx=(x,)
m.tlx=([x],)
m.ttx=((x,),)
m.tdx=({'x':x},)
m.dx={'x':x}
m.dlx={'x':[x]}
m.dtx={'x':(x,)}
m.ddx={'x':{'x':x}}
def get_element(i):
return [i.x,i.lx[0],i.tx[0],i.dx['x'],i.llx[0][0], i.llx[1][0], i.ltx[0][0], i.ldx[0]['x'], i.tlx[0][0], i.tlx[0][0], i.tdx[0]['x'], i.dlx['x'][0], i.dtx['x'][0], i.ddx['x']['x']]
m1=Module() m1=Module()
m2=Module() m2=Module()
x=T.dscalar() x=T.dscalar()
m1.x=x populate_module(m1,x)
m2.x=Member(x) populate_module(m2,Member(x))
m1.lx=[x]
m2.lx=[Member(x)]
m1.llx=[[x],[x]]
m2.llx=[[Member(x)],[Member(x)]]
m1.ltx=[(x,)]
m2.ltx=[(Member(x),)]
m1.tx=(x,)
m2.tx=(Member(x),)
m1.ttx=((x,),)
m2.ttx=((Member(x),),)
m1.tlx=([x],)
m2.tlx=([Member(x)],)
m1.dx={'x':x}
m2.dx={'x':Member(x)}
#m1.x and m2.x should not be shared as their is no hierarchi link between them. #m1.x and m2.x should not be shared as their is no hierarchi link between them.
inst1=m1.make() inst1=m1.make()
inst2=m2.make() inst2=m2.make()
m1.m2=m2
#m1.x and m2.x should be shared as their is a hierarchi link between them.
inst3=m1.make()
inst1.x=1 inst1.x=1
inst2.x=2 inst2.x=2
assert inst1.x==1 inst3.x=3
assert inst2.x==2 for f in get_element(inst1):
assert inst1.lx[0]==1 assert f==1
assert inst2.lx[0]==2 for f in get_element(inst2):
assert inst1.tx[0]==1 assert f==2
assert inst2.tx[0]==2 for f in get_element(inst3)+get_element(inst3.m2):
assert inst1.dx['x']==1 assert f==3
assert inst2.dx['x']==2
assert inst1.ltx[0][0]==1#BUG: list of tuple don't work inst3.m2.x=4
assert inst2.ltx[0][0]==2#BUG: list of tuple don't work for f in get_element(inst3)+get_element(inst3.m2):
assert inst1.llx[0][0]==1#BUG: list of list don't work assert f==4
assert inst2.llx[0][0]==2#BUG: list of list don't work
assert inst1.llx[1][0]==1#BUG: list of list don't work
assert inst2.llx[1][0]==2#BUG: list of list don't work
assert inst1.ttx[0][0]==1#BUG: tuple of list don't work
assert inst2.ttx[0][0]==2#BUG: tuple of list don't work
assert inst1.tlx[0][0]==1#BUG: tuple of list don't work
assert inst2.tlx[0][0]==2#BUG: tuple of list don't work
#m1.x and m2.x should be shared as their is a hierarchi link between them.
m1.m2=m2
inst=m1.make()
inst.x=1
assert inst.x==1
assert inst.m2.x==1
assert inst.lx[0]==1
assert inst.m2.lx[0]==1
assert inst.tx[0]==1
assert inst.m2.tx[0]==1
assert inst.dx['x']==1
assert inst.m2.dx['x']==1
assert inst.llx[0][0]==1#BUG: list of list don't work
assert inst.m2.llx[0][0]==1#BUG: list of list don't work
assert inst.llx[1][0]==1#BUG: list of list don't work
assert inst.m2.llx[1][0]==1#BUG: list of list don't work
assert inst.ltx[0][0]==1#BUG: list of list don't work
assert inst.m2.ltx[0][0]==1#BUG: list of list don't work
assert inst.ttx[0][0]==1#BUG: list of list don't work
assert inst.m2.ttx[0][0]==1#BUG: list of list don't work
assert inst.tlx[0][0]==1#BUG: list of list don't work
assert inst.m2.tlx[0][0]==1#BUG: list of list don't work
inst.m2.x=2
assert inst.x==2
assert inst.m2.x==2
assert inst.lx[0]==2
assert inst.m2.lx[0]==2
assert inst.tx[0]==2
assert inst.m2.tx[0]==2
assert inst.dx['x']==2
assert inst.m2.dx['x']==2
assert inst.llx[0][0]==2#BUG: list of list don't work
assert inst.m2.llx[0][0]==2#BUG: list of list don't work
assert inst.llx[1][0]==2#BUG: list of list don't work
assert inst.m2.llx[1][0]==2#BUG: list of list don't work
assert inst.ltx[0][0]==2#BUG: list of list don't work
assert inst.m2.ltx[0][0]==2#BUG: list of list don't work
assert inst.ttx[0][0]==2#BUG: list of list don't work
assert inst.m2.ttx[0][0]==2#BUG: list of list don't work
assert inst.tlx[0][0]==2#BUG: list of list don't work
assert inst.m2.tlx[0][0]==2#BUG: list of list don't work
#put them in subModules, sub-sub-Modules, shared between a list and a dict, shared between
#a list and a submodule with a dictionary, etc...
def test_shared_members_N(self): def test_shared_members_N(self):
"""Test that Members can be shared an arbitrary number of times between many submodules and """Test that Members can be shared an arbitrary number of times between many submodules and
internal data structures.""" internal data structures."""
print >> sys.stderr, "WARNING MODULE TEST NOT IMPLEMENTED" def populate_module(m,x):
m.x=x
#put them in subModules, sub-sub-Modules, shared between a list and a dict, shared between m.lx=[x]
#a list and a submodule with a dictionary, etc... m.llx=[[x],[x]]
m.ltx=[(x,)]
m.ldx=[{'x':x}]
m.tx=(x,)
m.tlx=([x],)
m.ttx=((x,),)
m.tdx=({'x':x},)
m.dx={'x':x}
m.dlx={'x':[x]}
m.dtx={'x':(x,)}
m.ddx={'x':{'x':x}}
def get_element(i):
return [i.x,i.lx[0],i.tx[0],i.dx['x'],i.llx[0][0], i.llx[1][0], i.ltx[0][0], i.ldx[0]['x'], i.tlx[0][0], i.tlx[0][0], i.tdx[0]['x'], i.dlx['x'][0], i.dtx['x'][0], i.ddx['x']['x']]
m1=Module()
m2=Module()
m3=Module()
m4=Module()
x=T.dscalar()
populate_module(m1,x)
populate_module(m2,Member(x))
populate_module(m4,Member(x))
#m1.x and m2.x should not be shared as their is no hierarchi link between them.
inst1=m1.make()
inst2=m2.make()
m1.m2=m2
m2.m3=m3
m3.m4=m4
#m1.x and m2.x should be shared as their is a hierarchi link between them.
inst3=m1.make()
inst1.x=1
inst2.x=2
inst3.x=3
for f in get_element(inst1):
assert f==1
for f in get_element(inst2):
assert f==2
for f in get_element(inst3)+get_element(inst3.m2)+get_element(inst3.m2.m3.m4):
assert f==3
inst3.m2.x=4
for f in get_element(inst3)+get_element(inst3.m2)+get_element(inst3.m2.m3.m4):
assert f==4
def test_shared_method(self): def test_shared_method(self):
"""Test that under a variety of tricky conditions, the shared-ness of Results and Methods """Test that under a variety of tricky conditions, the shared-ness of Results and Methods
is respected.""" is respected.
Fred: the test create different method event if they are shared. Do we want this?
"""
#Fred: the test create different method event if they are shared. Do we want this?
m1=Module() m1=Module()
m1.x=T.dscalar() m1.x=T.dscalar()
x=T.dscalar() x=T.dscalar()
...@@ -296,7 +303,7 @@ class T_test_module(unittest.TestCase): ...@@ -296,7 +303,7 @@ class T_test_module(unittest.TestCase):
assert inst.tz[0]()==2 assert inst.tz[0]()==2
assert inst.dy['y'](2)==4 assert inst.dy['y'](2)==4
assert inst.dz['z']()==2 assert inst.dz['z']()==2
assert inst.lly[0][0](2)==4#BUG: we don't support list of list of Method... assert inst.lly[0][0](2)==4
assert inst.llz[0][0]()==2 assert inst.llz[0][0]()==2
assert inst.tty[0][0](2)==4 assert inst.tty[0][0](2)==4
assert inst.ttz[0][0]()==2 assert inst.ttz[0][0]()==2
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论