use arrow_array::Array;
use arrow_array::builder::{Int64Builder, ListBuilder};
use std::sync::Arc;
use uni_common::DataType;
use uni_store::storage::value_codec::{CrdtDecodeMode, value_from_column};
#[test]
#[allow(clippy::assertions_on_constants)] fn test_recursive_depth_limit_enforced() {
use uni_store::storage::value_codec::MAX_DECODE_DEPTH;
assert!(
MAX_DECODE_DEPTH >= 16 && MAX_DECODE_DEPTH <= 64,
"MAX_DECODE_DEPTH should be 16-64 for safety and usability, got {}",
MAX_DECODE_DEPTH
);
}
#[test]
fn test_normal_nested_list_decodes() {
let value_builder = Int64Builder::new();
let inner_builder = ListBuilder::new(value_builder);
let middle_builder = ListBuilder::new(inner_builder);
let mut outer_builder = ListBuilder::new(middle_builder);
outer_builder.values().values().values().append_value(42);
outer_builder.values().values().values().append_value(43);
outer_builder.values().values().append(true);
outer_builder.values().append(true);
outer_builder.values().values().values().append_value(44);
outer_builder.values().values().append(true);
outer_builder.values().append(true);
outer_builder.append(true);
let array = Arc::new(outer_builder.finish()) as Arc<dyn Array>;
let data_type = DataType::List(Box::new(DataType::List(Box::new(DataType::List(
Box::new(DataType::Int64),
)))));
let result = value_from_column(array.as_ref(), &data_type, 0, CrdtDecodeMode::Strict);
assert!(
result.is_ok(),
"Normal nested list should decode: {:?}",
result
);
let value = result.unwrap();
assert!(value.is_array(), "Top level should be array");
let arr = value.as_array().unwrap();
assert_eq!(arr.len(), 2, "Should have 2 outer elements");
}