2019-11-08 19:27:16 +03:00
import pytest
from generic . multimethod import has_multimethods , multimethod
def test_multimethod ( ) :
@has_multimethods
class Dummy ( object ) :
@multimethod ( int )
def foo ( self , x ) :
return x + 1
2019-11-08 19:38:51 +03:00
@foo.register ( str ) # type: ignore[no-redef]
2019-11-08 19:27:16 +03:00
def foo ( self , x ) :
return x + " 1 "
assert Dummy ( ) . foo ( 1 ) == 2
assert Dummy ( ) . foo ( " 1 " ) == " 11 "
with pytest . raises ( TypeError ) :
Dummy ( ) . foo ( [ ] )
def test_inheritance ( ) :
@has_multimethods
class Dummy ( object ) :
@multimethod ( int )
def foo ( self , x ) :
return x + 1
2019-11-08 19:38:51 +03:00
@foo.register ( float ) # type: ignore[no-redef]
2019-11-08 19:27:16 +03:00
def foo ( self , x ) :
return x + 1.5
@has_multimethods
class DummySub ( Dummy ) :
@Dummy.foo.register ( str )
def foo ( self , x ) :
return x + " 1 "
2019-11-08 19:38:51 +03:00
@foo.register ( tuple ) # type: ignore[no-redef]
2019-11-08 19:27:16 +03:00
def foo ( self , x ) :
return x + ( 1 , )
2019-11-08 19:38:51 +03:00
@Dummy.foo.register ( bool ) # type: ignore[no-redef]
2019-11-08 19:27:16 +03:00
def foo ( self , x ) :
return not x
assert Dummy ( ) . foo ( 1 ) == 2
assert Dummy ( ) . foo ( 1.5 ) == 3.0
with pytest . raises ( TypeError ) :
Dummy ( ) . foo ( " 1 " )
assert DummySub ( ) . foo ( 1 ) == 2
assert DummySub ( ) . foo ( 1.5 ) == 3.0
assert DummySub ( ) . foo ( " 1 " ) == " 11 "
assert DummySub ( ) . foo ( ( 1 , 2 ) ) == ( 1 , 2 , 1 )
assert DummySub ( ) . foo ( True ) == False
with pytest . raises ( TypeError ) :
DummySub ( ) . foo ( [ ] )
def test_override_in_same_class_not_allowed ( ) :
with pytest . raises ( ValueError ) :
@has_multimethods
class Dummy ( object ) :
@multimethod ( str , str )
def foo ( self , x , y ) :
return x + y
2019-11-08 19:38:51 +03:00
@foo.register ( str , str ) # type: ignore[no-redef]
2019-11-08 19:27:16 +03:00
def foo ( self , x , y ) :
return y + x
def test_inheritance_override ( ) :
@has_multimethods
class Dummy ( object ) :
@multimethod ( int )
def foo ( self , x ) :
return x + 1
@has_multimethods
class DummySub ( Dummy ) :
@Dummy.foo.register ( int )
def foo ( self , x ) :
return x + 3
assert Dummy ( ) . foo ( 1 ) == 2
assert DummySub ( ) . foo ( 1 ) == 4