split BadValue into WrongType and RangeError
in order to match SECoP specification fixes #4668 Change-Id: Ica73a8171536ccc324cf8db915347a6263c2d736 Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30625 Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de> Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de> Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
@ -31,6 +31,7 @@ from frappy.datatypes import ArrayOf, BLOBType, BoolType, \
|
||||
StringType, StructOf, TextType, TupleOf, get_datatype, \
|
||||
DiscouragedConversion
|
||||
from frappy.lib import generalConfig
|
||||
from frappy.errors import WrongTypeError, RangeError, BadValueError
|
||||
|
||||
|
||||
def copytest(dt):
|
||||
@ -54,15 +55,15 @@ def test_FloatRange():
|
||||
copytest(dt)
|
||||
assert dt.export_datatype() == {'type': 'double', 'min':-3.14, 'max':3.14}
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt.validate(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt.validate(-9)
|
||||
dt(9) # convert, but do not check limits
|
||||
dt(-9) # convert, but do not check limits
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt('XX')
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt([19, 'X'])
|
||||
dt(1)
|
||||
dt(0)
|
||||
@ -107,19 +108,19 @@ def test_IntRange():
|
||||
copytest(dt)
|
||||
assert dt.export_datatype() == {'type': 'int', 'min':-3, 'max':3}
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt.validate(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt.validate(-9)
|
||||
dt(9) # convert, but do not check limits
|
||||
dt(-9) # convert, but do not check limits
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt('XX')
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt([19, 'X'])
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt(1.3)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt('1.3')
|
||||
dt(1)
|
||||
dt(0)
|
||||
@ -145,19 +146,19 @@ def test_ScaledInteger():
|
||||
# serialisation of datatype contains limits on the 'integer' value
|
||||
assert dt.export_datatype() == {'type': 'scaled', 'scale':0.01, 'min':-300, 'max':300}
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt.validate(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt.validate(-9)
|
||||
dt(9) # convert, but do not check limits
|
||||
dt(-9) # convert, but do not check limits
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt('XX')
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt([19, 'X'])
|
||||
dt(1)
|
||||
dt(0)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(ProgrammingError):
|
||||
ScaledInteger('xc', 'Yx')
|
||||
with pytest.raises(ProgrammingError):
|
||||
ScaledInteger(scale=0, minval=1, maxval=2)
|
||||
@ -189,10 +190,10 @@ def test_ScaledInteger():
|
||||
assert dt.format_value(0.6, '') == '0.6'
|
||||
assert dt.format_value(0.6, 'Z') == '0.6 Z'
|
||||
assert round(dt.validate(1.0004), 5) == 0.999 # rounded value within limit
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt.validate(1.006) # rounded value outside limit
|
||||
assert round(dt.validate(0.398), 5) == 0.399 # rounded value within rounded limit
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt.validate(0.395) # rounded value outside limit
|
||||
|
||||
dt.setProperty('min', 1)
|
||||
@ -200,7 +201,7 @@ def test_ScaledInteger():
|
||||
with pytest.raises(ConfigError):
|
||||
dt.checkProperties()
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt.setProperty('scale', None)
|
||||
|
||||
|
||||
@ -214,21 +215,21 @@ def test_EnumType():
|
||||
dt = EnumType('dt', a=3, c=7, stuff=1)
|
||||
copytest(dt)
|
||||
|
||||
assert dt.export_datatype() == {'type': 'enum', 'members': dict(a=3, c=7, stuff=1)}
|
||||
assert dt.export_datatype() == {'type': 'enum', 'members': {'a': 3, 'c': 7, 'stuff': 1}}
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt(-9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt('XX')
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt([19, 'X'])
|
||||
|
||||
assert dt('a') == 3
|
||||
assert dt('stuff') == 1
|
||||
assert dt(1) == 1
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt(2)
|
||||
|
||||
assert dt.export_value('c') == 7
|
||||
@ -237,9 +238,9 @@ def test_EnumType():
|
||||
assert dt.import_value('c') == 7
|
||||
assert dt.import_value('a') == 3
|
||||
assert dt.import_value('stuff') == 1
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt.export_value(2)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt.import_value('A')
|
||||
|
||||
assert dt.format_value(3) == 'a<3>'
|
||||
@ -258,13 +259,13 @@ def test_BLOBType():
|
||||
copytest(dt)
|
||||
assert dt.export_datatype() == {'type': 'blob', 'minbytes':3, 'maxbytes':10}
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt(b'av')
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt(b'abcdefghijklmno')
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt('abcd')
|
||||
assert dt(b'abcd') == b'abcd'
|
||||
|
||||
@ -296,13 +297,13 @@ def test_StringType():
|
||||
copytest(dt)
|
||||
assert dt.export_datatype() == {'type': 'string', 'minchars':4, 'maxchars':11}
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt('av')
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt('abcdefghijklmno')
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt('abcdefg\0')
|
||||
assert dt('abcd') == 'abcd'
|
||||
# tests with bytes have to be added after migration to py3
|
||||
@ -326,11 +327,11 @@ def test_TextType():
|
||||
copytest(dt)
|
||||
assert dt.export_datatype() == {'type': 'string', 'maxchars':12}
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt('abcdefghijklmno')
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(RangeError):
|
||||
dt('abcdefg\0')
|
||||
assert dt('ab\n\ncd\n') == 'ab\n\ncd\n'
|
||||
# assert dt(b'ab\n\ncd\n') == 'ab\n\ncd\n'
|
||||
@ -347,9 +348,9 @@ def test_BoolType():
|
||||
copytest(dt)
|
||||
assert dt.export_datatype() == {'type': 'bool'}
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt('av')
|
||||
|
||||
assert dt('true') is True
|
||||
@ -362,7 +363,7 @@ def test_BoolType():
|
||||
|
||||
assert dt.import_value(False) is False
|
||||
assert dt.import_value(True) is True
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt.import_value('av')
|
||||
|
||||
assert dt.format_value(0) == "False"
|
||||
@ -375,9 +376,9 @@ def test_BoolType():
|
||||
|
||||
def test_ArrayOf():
|
||||
# test constructor catching illegal arguments
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(ProgrammingError):
|
||||
ArrayOf(int)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(ProgrammingError):
|
||||
ArrayOf(-3, IntRange(-10,10))
|
||||
dt = ArrayOf(IntRange(-10, 10), 5)
|
||||
copytest(dt)
|
||||
@ -390,9 +391,9 @@ def test_ArrayOf():
|
||||
assert dt.export_datatype() == {'type': 'array', 'minlen':1, 'maxlen':3,
|
||||
'members':{'type': 'double', 'min':-10,
|
||||
'max':10, 'unit': 'Z'}}
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt('av')
|
||||
|
||||
assert dt([1, 2, 3]) == (1, 2, 3)
|
||||
@ -422,16 +423,16 @@ def test_ArrayOf():
|
||||
|
||||
def test_TupleOf():
|
||||
# test constructor catching illegal arguments
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(ProgrammingError):
|
||||
TupleOf(2)
|
||||
|
||||
dt = TupleOf(IntRange(-10, 10), BoolType())
|
||||
copytest(dt)
|
||||
assert dt.export_datatype() == {'type': 'tuple',
|
||||
'members':[{'type': 'int', 'min':-10, 'max':10}, {'type': 'bool'}]}
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt([99, 'X'])
|
||||
|
||||
assert dt([1, True]) == (1, True)
|
||||
@ -447,7 +448,7 @@ def test_TupleOf():
|
||||
|
||||
def test_StructOf():
|
||||
# test constructor catching illegal arguments
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(ProgrammingError):
|
||||
StructOf(IntRange) # pylint: disable=E1121
|
||||
with pytest.raises(ProgrammingError):
|
||||
StructOf(IntRange=1)
|
||||
@ -460,15 +461,15 @@ def test_StructOf():
|
||||
'an_int': {'type': 'int', 'min':0, 'max':999}},
|
||||
'optional':['an_int']}
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt(9)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
dt([99, 'X'])
|
||||
with pytest.raises(ValueError):
|
||||
dt.validate(dict(a_string='XXX', an_int=1811))
|
||||
with pytest.raises(RangeError):
|
||||
dt.validate({'a_string': 'XXX', 'an_int': 1811})
|
||||
|
||||
assert dt(dict(a_string='XXX', an_int=8)) == {'a_string': 'XXX',
|
||||
'an_int': 8}
|
||||
assert dt({'a_string': 'XXX', 'an_int': 8}) == {'a_string': 'XXX',
|
||||
'an_int': 8}
|
||||
assert dt.export_value({'an_int': 13, 'a_string': 'WFEC'}) == {
|
||||
'a_string': 'WFEC', 'an_int': 13}
|
||||
assert dt.import_value({'an_int': 13, 'a_string': 'WFEC'}) == {
|
||||
@ -502,30 +503,30 @@ def test_StatusType():
|
||||
|
||||
|
||||
def test_get_datatype():
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(1)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(True)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(str)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'undefined': {}})
|
||||
|
||||
assert isinstance(get_datatype({'type': 'bool'}), BoolType)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['bool'])
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'int', 'min':-10}) # missing max
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'int', 'max':10}) # missing min
|
||||
assert isinstance(get_datatype({'type': 'int', 'min':-10, 'max':10}), IntRange)
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'int', 'min':10, 'max':-10}) # min > max
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'int'}) # missing limits
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'int', 'x': 2})
|
||||
|
||||
assert isinstance(get_datatype({'type': 'double'}), FloatRange)
|
||||
@ -534,16 +535,16 @@ def test_get_datatype():
|
||||
assert isinstance(get_datatype({'type': 'double', 'min':-9.9, 'max':11.1}),
|
||||
FloatRange)
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['double'])
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'double', 'min':10, 'max':-10})
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['double', {}, 2])
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'scaled', 'scale':0.01, 'min':-2.718})
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'scaled', 'scale':0.02, 'max':3.14})
|
||||
assert isinstance(get_datatype(
|
||||
{'type': 'scaled', 'scale':0.03, 'min':-99, 'max':111}), ScaledInteger)
|
||||
@ -552,45 +553,45 @@ def test_get_datatype():
|
||||
assert dt.export_datatype() == {'type': 'scaled', 'max':330, 'min':0, 'scale':0.03}
|
||||
assert get_datatype(dt.export_datatype()).export_datatype() == dt.export_datatype()
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['scaled']) # dict missing
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'scaled', 'min':-10, 'max':10}) # no scale
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'scaled', 'min':10, 'max':-10, 'scale': 1}) # limits reversed
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['scaled', {'min':10, 'max':-10, 'scale': 1}, 2])
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['enum'])
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'enum', 'a': -2})
|
||||
assert isinstance(get_datatype({'type': 'enum', 'members':dict(a=-2)}), EnumType)
|
||||
assert isinstance(get_datatype({'type': 'enum', 'members': {'a': -2}}), EnumType)
|
||||
|
||||
assert isinstance(get_datatype({'type': 'blob', 'maxbytes':1}), BLOBType)
|
||||
assert isinstance(get_datatype({'type': 'blob', 'minbytes':1, 'maxbytes':10}), BLOBType)
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'blob', 'minbytes':10, 'maxbytes':1})
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'blob', 'minbytes':10, 'maxbytes':-10})
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['blob', {'maxbytes':10}, 'x'])
|
||||
|
||||
assert isinstance(get_datatype({'type': 'string', 'maxchars':1}), StringType)
|
||||
assert isinstance(get_datatype({'type': 'string', 'maxchars':1}), StringType)
|
||||
assert isinstance(get_datatype({'type': 'string', 'minchars':1, 'maxchars':10}), StringType)
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'string', 'minchars':10, 'maxchars':1})
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'string', 'minchars':10, 'maxchars':-10})
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['string', {'maxchars':-0}, 'x'])
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['array'])
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'array', 'members': [1]})
|
||||
assert isinstance(get_datatype({'type': 'array', 'minlen':1, 'maxlen':1,
|
||||
'members':{'type': 'blob', 'maxbytes':1}}
|
||||
@ -599,43 +600,43 @@ def test_get_datatype():
|
||||
'members':{'type': 'blob', 'maxbytes':1}}
|
||||
).members, BLOBType)
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'array', 'members':{'type': 'blob', 'maxbytes':1}, 'minbytes':-10})
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'array', 'members':{'type': 'blob', 'maxbytes':1},
|
||||
'min':10, 'max':1})
|
||||
with pytest.raises(ValueError):
|
||||
get_datatype({'type': 'array', 'blob': dict(max=4), 'maxbytes': 10})
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'array', 'blob': {'max': 4}, 'maxbytes': 10})
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['tuple'])
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['tuple', [1], 2, 3])
|
||||
assert isinstance(get_datatype(
|
||||
{'type': 'tuple', 'members':[{'type': 'blob', 'maxbytes':1}]}), TupleOf)
|
||||
assert isinstance(get_datatype(
|
||||
{'type': 'tuple', 'members':[{'type': 'blob', 'maxbytes':1}]}).members[0], BLOBType)
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'tuple', 'members': {}})
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['tuple', 10, -10])
|
||||
|
||||
assert isinstance(get_datatype({'type': 'tuple', 'members':[{'type': 'blob', 'maxbytes':1},
|
||||
{'type': 'bool'}]}), TupleOf)
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['struct'])
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype(['struct', [1], 2, 3])
|
||||
assert isinstance(get_datatype({'type': 'struct', 'members':
|
||||
{'name': {'type': 'blob', 'maxbytes':1}}}), StructOf)
|
||||
assert isinstance(get_datatype({'type': 'struct', 'members':
|
||||
{'name': {'type': 'blob', 'maxbytes':1}}}).members['name'], BLOBType)
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'struct', 'members': {}})
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(WrongTypeError):
|
||||
get_datatype({'type': 'struct', 'members':[1,2,3]})
|
||||
|
||||
|
||||
@ -651,7 +652,7 @@ def test_get_datatype():
|
||||
])
|
||||
def test_oneway_compatible(dt, contained_in):
|
||||
dt.compatible(contained_in)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(BadValueError):
|
||||
contained_in.compatible(dt)
|
||||
|
||||
|
||||
@ -676,9 +677,9 @@ def test_twoway_compatible(dt1, dt2):
|
||||
(StructOf(a=FloatRange(-1, 1), b=StringType()), StructOf(a=FloatRange(), b=BoolType())),
|
||||
])
|
||||
def test_incompatible(dt1, dt2):
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(BadValueError):
|
||||
dt1.compatible(dt2)
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(BadValueError):
|
||||
dt2.compatible(dt1)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user