~ubuntu-branches/debian/sid/pyrlp/sid

« back to all changes in this revision

Viewing changes to tests/test_json.py

  • Committer: Package Import Robot
  • Author(s): Ben Finney
  • Date: 2017-07-15 05:25:42 UTC
  • Revision ID: package-import@ubuntu.com-20170715052542-a20zzsypt1qfecq1
Tags: upstream-0.5.1
ImportĀ upstreamĀ versionĀ 0.5.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from __future__ import unicode_literals
 
2
 
 
3
import json
 
4
import sys
 
5
import pytest
 
6
import rlp
 
7
from rlp import encode, decode, decode_lazy, infer_sedes, utils, DecodingError
 
8
 
 
9
 
 
10
if sys.version_info.major == 2:
 
11
    str_types = (str, unicode)
 
12
elif sys.version_info.major == 3:
 
13
    str_types = bytes
 
14
else:
 
15
    assert False
 
16
 
 
17
 
 
18
def evaluate(ll):
 
19
    if isinstance(ll, rlp.lazy.LazyList):
 
20
        return [evaluate(e) for e in ll]
 
21
    else:
 
22
        return ll
 
23
 
 
24
 
 
25
def to_bytes(value):
 
26
    if isinstance(value, str):
 
27
        return utils.str_to_bytes(value)
 
28
    elif isinstance(value, list):
 
29
        return [to_bytes(v) for v in value]
 
30
    else:
 
31
        return value
 
32
 
 
33
 
 
34
def compare_nested(got, expected):
 
35
    if isinstance(got, str_types):
 
36
        return got == expected
 
37
    try:
 
38
        zipped = zip(got, expected)
 
39
    except TypeError:
 
40
        return got == expected
 
41
    else:
 
42
        if len(list(zipped)) == len(got) == len(expected):
 
43
            return all(compare_nested(x, y) for x, y in zipped)
 
44
        else:
 
45
            return False
 
46
 
 
47
with open('tests/rlptest.json') as f:
 
48
    test_data = json.loads(f.read())
 
49
    test_pieces = [(name, {'in': to_bytes(in_out['in']),
 
50
                           'out': in_out['out']})
 
51
                   for name, in_out in test_data.items()]
 
52
 
 
53
 
 
54
@pytest.mark.parametrize('name, in_out', test_pieces)
 
55
def test_encode(name, in_out):
 
56
    msg_format = 'Test {} failed (encoded {} to {} instead of {})'
 
57
    data = in_out['in']
 
58
    result = utils.encode_hex(encode(data)).upper()
 
59
    expected = in_out['out'].upper()
 
60
    if result != expected:
 
61
        pytest.fail(msg_format.format(name, data, result, expected))
 
62
 
 
63
 
 
64
@pytest.mark.parametrize('name, in_out', test_pieces)
 
65
def test_decode(name, in_out):
 
66
    msg_format = 'Test {} failed (decoded {} to {} instead of {})'
 
67
    rlp_string = utils.decode_hex(in_out['out'])
 
68
    decoded = decode(rlp_string)
 
69
    with pytest.raises(DecodingError):
 
70
        decode(rlp_string + b'\x00')
 
71
    assert decoded == decode(rlp_string + b'\x00', strict=False)
 
72
 
 
73
    assert decoded == evaluate(decode_lazy(rlp_string))
 
74
    expected = in_out['in']
 
75
    sedes = infer_sedes(expected)
 
76
    data = sedes.deserialize(decoded)
 
77
    assert compare_nested(data, decode(rlp_string, sedes))
 
78
 
 
79
    if not compare_nested(data, expected):
 
80
        pytest.fail(msg_format.format(name, rlp_string, decoded, expected))