use crate::native::core::{EngineError, NativeTestCase};
use ciborium::Value;
use super::{bignum_overflows_i128, cbor_to_i128, i128_to_cbor, require, u128_to_cbor};
pub(super) fn interpret_integer(
ntc: &mut NativeTestCase,
schema: &Value,
) -> Result<Value, EngineError> {
let min_cbor = require(schema, "min_value")?;
let max_cbor = require(schema, "max_value")?;
let min_value = cbor_to_i128(min_cbor)?;
let max_value = cbor_to_i128(max_cbor)?;
if bignum_overflows_i128(max_cbor) {
let min_value_u128 = if min_value >= 0 { min_value as u128 } else { 0 };
let selector = ntc.draw_integer(0, 99)?;
match selector {
0 => return Ok(u128_to_cbor(min_value_u128)),
1 => return Ok(u128_to_cbor(u128::MAX)),
_ => {}
}
let hi = ntc.draw_integer(0, u64::MAX as i128)?;
let lo = ntc.draw_integer(0, u64::MAX as i128)?;
let v = ((hi as u128) << 64) | (lo as u128);
return Ok(u128_to_cbor(v.max(min_value_u128)));
}
let v = ntc.draw_integer(min_value, max_value)?;
Ok(i128_to_cbor(v))
}
pub(super) fn interpret_boolean(ntc: &mut NativeTestCase) -> Result<Value, EngineError> {
let v = ntc.weighted(0.5, None)?;
Ok(Value::Bool(v))
}
pub(super) fn interpret_constant(schema: &Value) -> Result<Value, EngineError> {
let value = require(schema, "value")?;
Ok(value.clone())
}
#[cfg(test)]
#[path = "../../../tests/embedded/native/schema/numeric_tests.rs"]
mod tests;