2025-04-09 12:44:32 +02:00

98 lines
2.6 KiB
Python

import struct
import pytest
from ..helpers import Suite
TYPE_LIST = [
'u8', 'u32', 'u64',
'i8', 'i32', 'i64',
'f32', 'f64',
]
BOUND_MAP = {
'u8': struct.unpack('<BB', bytes.fromhex('00FF')),
'u32': struct.unpack('<II', bytes.fromhex('00000000FFFFFFFF')),
'u64': struct.unpack('<QQ', bytes.fromhex('0000000000000000FFFFFFFFFFFFFFFF')),
'i8': struct.unpack('<bb', bytes.fromhex('807F')),
'i32': struct.unpack('<ii', bytes.fromhex('00000080FFFFFF7F')),
'i64': struct.unpack('<qq', bytes.fromhex('0000000000000080FFFFFFFFFFFFFF7F')),
'f32': struct.unpack('<ff', bytes.fromhex('01000000FFFF7F7F')),
'f64': struct.unpack('<dd', bytes.fromhex('0000000000001000FFFFFFFFFFFFEF7F')),
}
@pytest.mark.integration_test
@pytest.mark.parametrize('type_', TYPE_LIST)
@pytest.mark.parametrize('test_lft,test_opr,test_rgt,test_out', [
(1, '<', 2, True, ),
(1, '<', 0, False, ),
(1, '<=', 1, True, ),
(1, '<=', 0, False, ),
(1, '>', 0, True, ),
(1, '>', 1, False, ),
(1, '>=', 0, True, ),
(1, '>=', 2, False, ),
])
def test_ord_operators(type_, test_lft, test_opr, test_rgt, test_out):
code_py = f"""
@exported
def testEntry(lft: {type_}, rgt: {type_}) -> bool:
return lft {test_opr} rgt
"""
if type_[0] == 'f':
test_lft = float(test_lft)
test_rgt = float(test_rgt)
result = Suite(code_py).run_code(test_lft, test_rgt)
assert test_out is result.returned_value
@pytest.mark.integration_test
@pytest.mark.parametrize('type_', TYPE_LIST)
@pytest.mark.parametrize('test_mth,test_lft,test_rgt,test_out', [
('min', 1, 2, 1),
('min', 2, 1, 1),
('min', 2, 2, 2),
('max', 1, 2, 2),
('max', 2, 1, 2),
('max', 2, 2, 2),
])
def test_ord_methods(type_, test_mth, test_lft, test_rgt, test_out):
code_py = f"""
@exported
def testEntry(lft: {type_}, rgt: {type_}) -> {type_}:
return {test_mth}(lft, rgt)
"""
if type_[0] == 'f':
test_lft = float(test_lft)
test_rgt = float(test_rgt)
result = Suite(code_py).run_code(test_lft, test_rgt)
assert test_out == result.returned_value
@pytest.mark.integration_test
@pytest.mark.parametrize('type_', TYPE_LIST)
@pytest.mark.parametrize('test_mth', ['min', 'max'])
def test_ord_bounds_min_max(type_, test_mth):
code_py = f"""
@exported
def testEntry(lft: {type_}, rgt: {type_}) -> {type_}:
return {test_mth}(lft, rgt)
"""
test_lft, test_rgt = BOUND_MAP[type_]
result = Suite(code_py).run_code(test_lft, test_rgt)
if 'min' == test_mth:
assert test_lft == result.returned_value
else:
assert test_rgt == result.returned_value