137 lines
4.2 KiB
Python
137 lines
4.2 KiB
Python
import unittest
|
|
|
|
class TestFunctional(object):
|
|
def test_deserialize_ok(self):
|
|
import cereal.tests
|
|
data = {
|
|
'int':'10',
|
|
'ob':'cereal.tests',
|
|
'seq':[('1', 's'),('2', 's'), ('3', 's'), ('4', 's')],
|
|
'seq2':[{'key':'1', 'key2':'2'}, {'key':'3', 'key2':'4'}],
|
|
'tup':('1', 's'),
|
|
}
|
|
schema = self._makeSchema()
|
|
result = schema.deserialize(data)
|
|
self.assertEqual(result['int'], 10)
|
|
self.assertEqual(result['ob'], cereal.tests)
|
|
self.assertEqual(result['seq'],
|
|
[(1, 's'), (2, 's'), (3, 's'), (4, 's')])
|
|
self.assertEqual(result['seq2'],
|
|
[{'key':1, 'key2':2}, {'key':3, 'key2':4}])
|
|
self.assertEqual(result['tup'], (1, 's'))
|
|
|
|
def test_invalid_asdict(self):
|
|
expected = {
|
|
'int': '20 is greater than maximum value 10',
|
|
'ob': "The dotted name 'no.way.this.exists' cannot be imported",
|
|
'seq.0.0': "'q' is not a number",
|
|
'seq.1.0': "'w' is not a number",
|
|
'seq.2.0': "'e' is not a number",
|
|
'seq.3.0': "'r' is not a number",
|
|
'seq2.0.key': "'t' is not a number",
|
|
'seq2.0.key2': "'y' is not a number",
|
|
'seq2.1.key': "'u' is not a number",
|
|
'seq2.1.key2': "'i' is not a number",
|
|
'tup.0': "'s' is not a number"}
|
|
import cereal
|
|
data = {
|
|
'int':'20',
|
|
'ob':'no.way.this.exists',
|
|
'seq':[('q', 's'),('w', 's'), ('e', 's'), ('r', 's')],
|
|
'seq2':[{'key':'t', 'key2':'y'}, {'key':'u', 'key2':'i'}],
|
|
'tup':('s', 's'),
|
|
}
|
|
schema = self._makeSchema()
|
|
try:
|
|
schema.deserialize(data)
|
|
except cereal.Invalid, e:
|
|
errors = e.asdict()
|
|
self.assertEqual(errors, expected)
|
|
|
|
class TestImperative(unittest.TestCase, TestFunctional):
|
|
|
|
def _makeSchema(self):
|
|
import cereal
|
|
|
|
integer = cereal.Structure(
|
|
cereal.Integer(),
|
|
name='int',
|
|
validator=cereal.Range(0, 10)
|
|
)
|
|
|
|
ob = cereal.Structure(
|
|
cereal.GlobalObject(package=cereal),
|
|
name='ob',
|
|
)
|
|
|
|
tup = cereal.Structure(
|
|
cereal.Tuple(),
|
|
cereal.Structure(
|
|
cereal.Integer(),
|
|
name='tupint',
|
|
),
|
|
cereal.Structure(
|
|
cereal.String(),
|
|
name='tupstring',
|
|
),
|
|
name='tup',
|
|
)
|
|
|
|
seq = cereal.Structure(
|
|
cereal.Sequence(tup),
|
|
name='seq',
|
|
)
|
|
|
|
seq2 = cereal.Structure(
|
|
cereal.Sequence(
|
|
cereal.Structure(
|
|
cereal.Mapping(),
|
|
cereal.Structure(
|
|
cereal.Integer(),
|
|
name='key',
|
|
),
|
|
cereal.Structure(
|
|
cereal.Integer(),
|
|
name='key2',
|
|
),
|
|
name='mapping',
|
|
)
|
|
),
|
|
name='seq2',
|
|
)
|
|
|
|
schema = cereal.Structure(
|
|
cereal.Mapping(),
|
|
integer,
|
|
ob,
|
|
tup,
|
|
seq,
|
|
seq2)
|
|
|
|
return schema
|
|
|
|
class TestDeclarative(unittest.TestCase, TestFunctional):
|
|
|
|
def _makeSchema(self):
|
|
|
|
import cereal
|
|
|
|
class TupleSchema(cereal.TupleSchema):
|
|
tupint = cereal.Structure(cereal.Int())
|
|
tupstring = cereal.Structure(cereal.String())
|
|
|
|
class MappingSchema(cereal.MappingSchema):
|
|
key = cereal.Structure(cereal.Int())
|
|
key2 = cereal.Structure(cereal.Int())
|
|
|
|
class MainSchema(cereal.MappingSchema):
|
|
int = cereal.Structure(cereal.Int(), validator=cereal.Range(0, 10))
|
|
ob = cereal.Structure(cereal.GlobalObject(package=cereal))
|
|
seq = cereal.Structure(cereal.Sequence(TupleSchema()))
|
|
tup = TupleSchema()
|
|
seq2 = cereal.SequenceSchema(MappingSchema())
|
|
|
|
schema = MainSchema()
|
|
return schema
|
|
|