use super::*;
use crate::executor::{VMConfig, VirtualMachine};
use arrow_schema::{DataType, Field, Schema};
use shape_value::datatable::{DataTable, DataTableBuilder};
use shape_value::heap_value::HeapKind;
use shape_value::NativeKind;
use std::sync::Arc;
fn make_sample_table() -> Arc<DataTable> {
let schema = Schema::new(vec![
Field::new("price", DataType::Float64, false),
Field::new("name", DataType::Utf8, false),
]);
let mut builder = DataTableBuilder::new(schema);
builder.add_f64_column(vec![10.0, 20.0, 30.0]);
builder.add_string_column(vec!["a", "b", "c"]);
Arc::new(builder.finish().unwrap())
}
fn make_empty_table() -> Arc<DataTable> {
let schema = Schema::new(vec![Field::new("x", DataType::Float64, false)]);
let mut builder = DataTableBuilder::new(schema);
builder.add_f64_column(vec![]);
Arc::new(builder.finish().unwrap())
}
fn make_single_row_table() -> Arc<DataTable> {
let schema = Schema::new(vec![Field::new("val", DataType::Float64, false)]);
let mut builder = DataTableBuilder::new(schema);
builder.add_f64_column(vec![42.0]);
Arc::new(builder.finish().unwrap())
}
#[allow(dead_code)]
fn run_table_count_loop(_table_arc: Arc<DataTable>) -> i64 {
todo!("phase-2c — see ADR-006 §2.7.4 (Constant::Value(ValueWord) carrier deleted; kinded constant variant pending)")
}
#[test]
fn test_datatable_for_loop_counts_rows() {
let table = make_sample_table();
let result = run_table_count_loop(table);
assert_eq!(
result, 3,
"for-loop over 3-row DataTable should iterate 3 times"
);
}
#[test]
fn test_typed_table_for_loop_counts_rows() {
todo!("phase-2c — see ADR-006 §2.7.4 (TypedTable carrier pending kinded redesign)");
}
#[test]
fn test_empty_table_for_loop_zero_iterations() {
let table = make_empty_table();
let result = run_table_count_loop(table);
assert_eq!(
result, 0,
"for-loop over empty DataTable should iterate 0 times"
);
}
#[test]
fn test_single_row_table_for_loop() {
let table = make_single_row_table();
let result = run_table_count_loop(table);
assert_eq!(
result, 1,
"for-loop over 1-row DataTable should iterate exactly once"
);
}
#[inline]
fn push_datatable(vm: &mut VirtualMachine, table: Arc<DataTable>) {
let bits = Arc::into_raw(table) as u64;
vm.push_kinded(bits, NativeKind::Ptr(HeapKind::DataTable))
.unwrap();
}
#[inline]
fn push_int(vm: &mut VirtualMachine, v: i64) {
vm.push_kinded(v as u64, NativeKind::Int64).unwrap();
}
#[inline]
fn push_bool(vm: &mut VirtualMachine, b: bool) {
vm.push_kinded(b as u64, NativeKind::Bool).unwrap();
}
#[inline]
fn pop_bool(vm: &mut VirtualMachine) -> bool {
let (bits, kind) = vm.pop_kinded().unwrap();
assert_eq!(
kind,
NativeKind::Bool,
"expected Bool result on top-of-stack, got {:?}",
kind
);
bits != 0
}
#[test]
fn test_iter_done_datatable_false_when_in_bounds() {
let table = make_sample_table();
let mut vm = VirtualMachine::new(VMConfig::default());
push_datatable(&mut vm, table);
push_int(&mut vm, 0);
vm.op_iter_done().unwrap();
assert!(
!pop_bool(&mut vm),
"idx=0 with 3 rows should not be done"
);
}
#[test]
fn test_iter_done_datatable_true_at_end() {
let table = make_sample_table();
let mut vm = VirtualMachine::new(VMConfig::default());
push_datatable(&mut vm, table);
push_int(&mut vm, 3);
vm.op_iter_done().unwrap();
assert!(
pop_bool(&mut vm),
"idx=3 with 3 rows should be done"
);
}
#[test]
fn test_iter_done_typed_table_boundary() {
todo!("phase-2c — see ADR-006 §2.7.4 (TypedTable carrier pending kinded redesign)");
}
#[test]
fn test_iter_done_negative_index() {
let table = make_sample_table();
let mut vm = VirtualMachine::new(VMConfig::default());
push_datatable(&mut vm, table);
push_int(&mut vm, -1);
vm.op_iter_done().unwrap();
assert!(
pop_bool(&mut vm),
"negative index should be treated as done"
);
}
#[test]
fn test_iter_next_datatable_returns_row_view() {
todo!("phase-2c — see ADR-006 §2.7.4 (RowView carrier pending kinded redesign)");
}
#[test]
fn test_iter_next_typed_table_preserves_schema_id() {
todo!("phase-2c — see ADR-006 §2.7.4 (TypedTable + RowView carrier pending kinded redesign)");
}
#[test]
fn test_iter_next_out_of_bounds_returns_none() {
todo!("phase-2c — see ADR-006 §2.7.4 (IterNext null-result carrier pending kinded redesign)");
}
#[test]
fn test_iter_next_negative_index_returns_none() {
todo!("phase-2c — see ADR-006 §2.7.4 (IterNext null-result carrier pending kinded redesign)");
}
#[test]
fn test_iter_next_all_rows_sequential() {
todo!("phase-2c — see ADR-006 §2.7.4 (RowView carrier pending kinded redesign)");
}
#[test]
fn test_iter_done_error_message_includes_table() {
let mut vm = VirtualMachine::new(VMConfig::default());
push_bool(&mut vm, true);
push_int(&mut vm, 0);
let err = vm.op_iter_done().unwrap_err();
match err {
VMError::TypeError { expected, .. } => {
assert!(
expected.contains("table"),
"error message should mention 'table', got: {}",
expected
);
}
other => panic!("Expected TypeError, got: {:?}", other),
}
}
#[test]
fn test_row_view_from_iter_next_has_correct_data() {
todo!("phase-2c — see ADR-006 §2.7.4 (RowView carrier pending kinded redesign)");
}
#[test]
fn test_large_table_iteration() {
let n = 1000;
let schema = Schema::new(vec![Field::new("val", DataType::Float64, false)]);
let mut builder = DataTableBuilder::new(schema);
builder.add_f64_column((0..n).map(|i| i as f64).collect());
let table = Arc::new(builder.finish().unwrap());
let result = run_table_count_loop(table);
assert_eq!(
result, n as i64,
"for-loop over {}-row table should iterate {} times",
n, n
);
}
#[test]
fn test_empty_typed_table_iteration() {
todo!("phase-2c — see ADR-006 §2.7.4 (TypedTable carrier pending kinded redesign)");
}