reifydb-codec 0.9.0

Unified encoding and decoding for all ReifyDB values, frames, rows, keys, and boundaries
Documentation
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2026 ReifyDB

use reifydb_codec::row::shape::{RowFamily, RowShape};
use reifydb_value::value::value_type::ValueType;

#[test]
fn test_set_get_u128() {
	let shape = RowShape::testing(RowFamily::Pod, &[ValueType::Uint16]);
	let mut row = shape.allocate_pod();
	shape.set::<u128>(&mut row, 0, 340282366920938463463374607431768211455u128);
	assert_eq!(shape.get::<u128>(&row, 0), 340282366920938463463374607431768211455u128);
}

#[test]
fn test_try_get_u128() {
	let shape = RowShape::testing(RowFamily::Pod, &[ValueType::Uint16]);
	let mut row = shape.allocate_pod();

	assert_eq!(shape.try_get::<u128>(&row, 0), None);

	shape.set::<u128>(&mut row, 0, 340282366920938463463374607431768211455u128);
	assert_eq!(shape.try_get::<u128>(&row, 0), Some(340282366920938463463374607431768211455u128));
}

#[test]
fn test_extremes() {
	let shape = RowShape::testing(RowFamily::Pod, &[ValueType::Uint16]);
	let mut row = shape.allocate_pod();

	shape.set::<u128>(&mut row, 0, u128::MAX);
	assert_eq!(shape.get::<u128>(&row, 0), u128::MAX);

	let mut row2 = shape.allocate_pod();
	shape.set::<u128>(&mut row2, 0, u128::MIN);
	assert_eq!(shape.get::<u128>(&row2, 0), u128::MIN);

	let mut row3 = shape.allocate_pod();
	shape.set::<u128>(&mut row3, 0, 0u128);
	assert_eq!(shape.get::<u128>(&row3, 0), 0u128);
}

#[test]
fn test_very_large_values() {
	let shape = RowShape::testing(RowFamily::Pod, &[ValueType::Uint16]);

	let test_values = [
		0u128,
		1u128,
		99999999999999999999999999999999999999u128,
		170141183460469231731687303715884105727u128, // i128::MAX as u128
		170141183460469231731687303715884105728u128, // i128::MAX + 1
		300000000000000000000000000000000000000u128,
		340282366920938463463374607431768211454u128,
		340282366920938463463374607431768211455u128, // u128::MAX
	];

	for value in test_values {
		let mut row = shape.allocate_pod();
		shape.set::<u128>(&mut row, 0, value);
		assert_eq!(shape.get::<u128>(&row, 0), value);
	}
}

#[test]
fn test_powers_of_two() {
	let shape = RowShape::testing(RowFamily::Pod, &[ValueType::Uint16]);

	let powers = [
		1u128, 2u128, 4u128, 8u128, 16u128, 32u128, 64u128, 128u128, 256u128, 512u128, 1024u128, 2048u128,
		4096u128, 8192u128, 16384u128, 32768u128, 65536u128,
	];

	for power in powers {
		let mut row = shape.allocate_pod();
		shape.set::<u128>(&mut row, 0, power);
		assert_eq!(shape.get::<u128>(&row, 0), power);
	}
}

#[test]
fn test_ipv6_addresses() {
	let shape = RowShape::testing(RowFamily::Pod, &[ValueType::Uint16]);

	let ipv6_values = [
		0u128,                                       // ::0
		1u128,                                       // ::1 (loopback)
		281470681743360u128,                         // ::ffff:0:0 (IPv4-mapped prefix)
		338953138925153547590470800371487866880u128, // Example IPv6
	];

	for ipv6 in ipv6_values {
		let mut row = shape.allocate_pod();
		shape.set::<u128>(&mut row, 0, ipv6);
		assert_eq!(shape.get::<u128>(&row, 0), ipv6);
	}
}

#[test]
fn test_uuid_values() {
	let shape = RowShape::testing(RowFamily::Pod, &[ValueType::Uint16]);

	let uuid_values = [
		123456789012345678901234567890123456789u128,
		123456789012345678901234567890123456789u128,
		111111111111111111111111111111111111111u128,
	];

	for uuid_val in uuid_values {
		let mut row = shape.allocate_pod();
		shape.set::<u128>(&mut row, 0, uuid_val);
		assert_eq!(shape.get::<u128>(&row, 0), uuid_val);
	}
}

#[test]
fn test_mixed_with_other_types() {
	let shape = RowShape::testing(RowFamily::Pod, &[ValueType::Uint16, ValueType::Boolean, ValueType::Uint16]);
	let mut row = shape.allocate_pod();

	let large_value1 = 200000000000000000000000000000000000000u128;
	let large_value2 = 150000000000000000000000000000000000000u128;

	shape.set::<u128>(&mut row, 0, large_value1);
	shape.set::<bool>(&mut row, 1, true);
	shape.set::<u128>(&mut row, 2, large_value2);

	assert_eq!(shape.get::<u128>(&row, 0), large_value1);
	assert_eq!(shape.get::<bool>(&row, 1), true);
	assert_eq!(shape.get::<u128>(&row, 2), large_value2);
}

#[test]
fn test_undefined_handling() {
	let shape = RowShape::testing(RowFamily::Pod, &[ValueType::Uint16, ValueType::Uint16]);
	let mut row = shape.allocate_pod();

	let value = 340282366920938463463374607431768211455u128;
	shape.set::<u128>(&mut row, 0, value);

	assert_eq!(shape.try_get::<u128>(&row, 0), Some(value));
	assert_eq!(shape.try_get::<u128>(&row, 1), None);

	shape.set_none(&mut row, 0);
	assert_eq!(shape.try_get::<u128>(&row, 0), None);
}

#[test]
fn test_try_get_u128_wrong_type() {
	let shape = RowShape::testing(RowFamily::Pod, &[ValueType::Boolean]);
	let mut row = shape.allocate_pod();

	shape.set::<bool>(&mut row, 0, true);

	assert_eq!(shape.try_get::<u128>(&row, 0), None);
}