Source code for ewokscore.tests.serialization.test_common

from copy import deepcopy

import numpy
import pytest

from ..._serialization import common


[docs] def test_primitives(): assert _roundtrip(None) is None assert _roundtrip("hello") == "hello" assert _roundtrip(True) is True assert _roundtrip(42) == 42 assert _roundtrip(3.14) == 3.14
[docs] def test_complex(): val = 1 + 2j result = _roundtrip(val) assert isinstance(result, complex) assert result == val
[docs] def test_numpy_int(): val = numpy.int64(5) assert common.pre_serialize(val) == 5 val = numpy.uintp(5) assert common.pre_serialize(val) == 5
[docs] def test_numpy_float(): val = numpy.float64(3.5) assert common.pre_serialize(val) == 3.5 try: val = numpy.float128(1e10) except AttributeError: pass else: assert common.pre_serialize(val) == 1e10
[docs] def test_numpy_complex(): obj = numpy.complex64(1 + 2j) result = _roundtrip(obj) assert isinstance(result, numpy.complex64) assert result == obj
[docs] def test_numpy_array(): obj = numpy.array([1, 2]) result = _roundtrip(obj) assert isinstance(result, numpy.ndarray) assert result.tolist() == obj.tolist()
[docs] def test_list(): obj = [1, 2, 3] assert _roundtrip(obj) == obj
[docs] def test_dict(): obj = {"a": 1, "b": 2} assert _roundtrip(obj) == obj
[docs] def test_nested(): obj = {"a": [1, {"b": (2, 3)}]} assert _roundtrip(obj) == obj
[docs] def test_tuple(): obj = (1, 2, 3) result = _roundtrip(obj) assert isinstance(result, tuple) assert result == obj
[docs] def test_set(): obj = {1, 2, 3} result = _roundtrip(obj) assert isinstance(result, set) assert result == obj
[docs] def test_bytes(): obj = b"hello" result = _roundtrip(obj) assert isinstance(result, bytes) assert result == obj
[docs] class Custom: def __init__(self, x): self.x = x def __eq__(self, other): return isinstance(other, Custom) and self.x == other.x
[docs] def test_pickle_fallback(): obj = Custom(10) result = _roundtrip(obj) assert isinstance(result, Custom) assert result == obj
[docs] def test_special_rules(): obj = {"links": [{"source": 1}, {"other": 2}]} def encode(v): return f"encoded:{v}" def decode(v): return int(v.split(":")[1]) encode_rules = [ (("links", "*", "source"), encode), ] decode_rules = [ (("links", "*", "source"), decode), ] result = common.pre_serialize(obj, custom_rules=encode_rules) assert result["links"][0] == {"source": "encoded:1"} assert result["links"][1] == {"other": 2} obj2 = common.post_deserialize(result, custom_rules=decode_rules) assert obj == obj2
[docs] def test_reserved_key_error(): obj = {common._EWOKS_KEY: "bad"} with pytest.raises(common.EwoksEncodeError): common.pre_serialize(obj)
[docs] def test_unknown_tag(): obj = {common._EWOKS_KEY: "unknown"} with pytest.raises(common.EwoksDecodeError): common.post_deserialize(obj)
[docs] def test_no_max_recursion_exeception(): depth = 10000 obj = current = {} for _ in range(depth): new = {} current["x"] = new current = new result = _unsaferoundtrip(obj) assert isinstance(result, dict)
[docs] def test_complex_structure(): obj = { "a": [1, 2, (3, 4)], "b": {5, 6}, "c": b"bytes", "d": {"nested": numpy.int64(7)}, } assert _roundtrip(obj) == obj
def _roundtrip(obj): return common.post_deserialize(common.pre_serialize(deepcopy(obj))) def _unsaferoundtrip(obj): return common.post_deserialize(common.pre_serialize(obj))