blob: 4d8c339a51c49b8f0757c1f2c735dc8e51dc1bc0 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from dataclasses import dataclass
import pyfory
import pytest
from pyfory import Fory
from pyfory.meta.typedef_encoder import encode_typedef
from pyfory.struct import DataClassSerializer, compute_struct_fingerprint
from pyfory.types import TypeId
try:
import numpy as np
except ImportError:
np = None
@dataclass
class UnsignedArrays:
u8: pyfory.uint8_array = pyfory.field(0)
u16: pyfory.uint16_array = pyfory.field(1)
u32: pyfory.uint32_array = pyfory.field(2)
u64: pyfory.uint64_array = pyfory.field(3)
def test_unsigned_array_typedef_type_ids():
fory = Fory(xlang=True)
fory.register_type(UnsignedArrays, namespace="test", typename="UnsignedArrays")
typedef = encode_typedef(fory.type_resolver, UnsignedArrays)
field_type_ids = {field.name: field.field_type.type_id for field in typedef.fields}
assert field_type_ids == {
"u8": TypeId.UINT8_ARRAY,
"u16": TypeId.UINT16_ARRAY,
"u32": TypeId.UINT32_ARRAY,
"u64": TypeId.UINT64_ARRAY,
}
def test_unsigned_array_fingerprint_type_ids():
fory = Fory(xlang=True)
serializer = DataClassSerializer(fory, UnsignedArrays)
fingerprint = compute_struct_fingerprint(
fory.type_resolver,
serializer._field_names,
serializer._serializers,
serializer._nullable_fields,
serializer._field_infos,
)
expected = f"0,{TypeId.UINT8_ARRAY},0,0;1,{TypeId.UINT16_ARRAY},0,0;2,{TypeId.UINT32_ARRAY},0,0;3,{TypeId.UINT64_ARRAY},0,0;"
assert fingerprint == expected
@pytest.mark.skipif(np is None, reason="Requires numpy")
@pytest.mark.parametrize(
"dtype,values",
[
(np.uint8, [0, 1, 255]),
(np.uint16, [0, 1, 65535]),
(np.uint32, [0, 1, 4294967295]),
(np.uint64, [0, 1, 18446744073709551615]),
],
)
def test_unsigned_numpy_array_roundtrip_top_level(dtype, values):
fory = Fory(xlang=True)
arr = np.array(values, dtype=dtype)
data = fory.serialize(arr)
out = fory.deserialize(data)
assert isinstance(out, np.ndarray)
assert out.dtype == arr.dtype
np.testing.assert_array_equal(out, arr)
@pytest.mark.skipif(np is None, reason="Requires numpy")
def test_unsigned_numpy_array_roundtrip_struct():
fory = Fory(xlang=True)
fory.register_type(UnsignedArrays, namespace="test", typename="UnsignedArrays")
obj = UnsignedArrays(
u8=np.array([0, 1, 255], dtype=np.uint8),
u16=np.array([0, 1, 65535], dtype=np.uint16),
u32=np.array([0, 1, 4294967295], dtype=np.uint32),
u64=np.array([0, 1, 18446744073709551615], dtype=np.uint64),
)
data = fory.serialize(obj)
out = fory.deserialize(data)
assert isinstance(out, UnsignedArrays)
np.testing.assert_array_equal(out.u8, obj.u8)
np.testing.assert_array_equal(out.u16, obj.u16)
np.testing.assert_array_equal(out.u32, obj.u32)
np.testing.assert_array_equal(out.u64, obj.u64)