#![cfg(feature = "select")]
use minarrow::traits::selection::{ColumnSelection, RowSelection};
use minarrow::{Array, FieldArray, IntegerArray, MaskedArray, StringArray, Table};
#[test]
fn test_table_column_selection_by_names() {
let table = create_test_table();
let view = table.c(&["name", "value"]);
assert_eq!(view.n_cols(), 2);
assert_eq!(view.col_names(), vec!["name", "value"]);
assert_eq!(view.n_rows(), 5);
}
#[test]
fn test_table_column_selection_by_indices() {
let table = create_test_table();
let view = table.c(&[0, 2]);
assert_eq!(view.n_cols(), 2);
assert_eq!(view.n_rows(), 5);
}
#[test]
fn test_table_column_selection_by_range() {
let table = create_test_table();
let view = table.c(0..2);
assert_eq!(view.n_cols(), 2);
assert_eq!(view.n_rows(), 5);
}
#[test]
fn test_table_row_selection_by_range() {
let table = create_test_table();
let view = table.r(1..4);
assert_eq!(view.n_rows(), 3);
assert_eq!(view.n_cols(), 3);
}
#[test]
fn test_table_row_selection_by_indices() {
let table = create_test_table();
let view = table.r(&[0, 2, 4]);
assert_eq!(view.n_rows(), 3);
assert_eq!(view.n_cols(), 3);
}
#[test]
fn test_chained_column_then_row_selection() {
let table = create_test_table();
let view = table.c(&["id", "value"]).r(1..4);
assert_eq!(view.n_cols(), 2);
assert_eq!(view.n_rows(), 3);
let names = view.col_names();
assert_eq!(names, vec!["id", "value"]);
}
#[test]
fn test_chained_row_then_column_selection() {
let table = create_test_table();
let view = table.r(1..4).c(&["name"]);
assert_eq!(view.n_rows(), 3);
assert_eq!(view.n_cols(), 1);
assert_eq!(view.col_names(), vec!["name"]);
}
#[test]
fn test_tablev_column_refinement() {
let table = create_test_table();
let view1 = table.c(&["id", "name", "value"]);
assert_eq!(view1.n_cols(), 3);
let view2 = view1.c(&["name", "value"]);
assert_eq!(view2.n_cols(), 2);
assert_eq!(view2.col_names(), vec!["name", "value"]);
}
#[test]
fn test_tablev_row_refinement() {
let table = create_test_table();
let view1 = table.r(0..5);
assert_eq!(view1.n_rows(), 5);
let view2 = view1.r(&[1, 2]);
assert_eq!(view2.n_rows(), 2);
}
#[test]
fn test_tablev_methods_respect_column_selection() {
let table = create_test_table();
let view = table.c(&["id", "value"]);
assert_eq!(view.n_cols(), 2);
assert_eq!(view.col_names(), vec!["id", "value"]);
let col0 = view.col_ix(0);
assert!(col0.is_some());
let col1 = view.col_ix(1);
assert!(col1.is_some());
let col2 = view.col_ix(2);
assert!(col2.is_none());
assert_eq!(view.col("id").col_ix(0).is_some(), true);
assert_eq!(view.col("value").col_ix(0).is_some(), true);
assert_eq!(view.col("name").col_ix(0).is_none(), true); }
#[test]
fn test_tablev_methods_respect_row_selection() {
let table = create_test_table();
let view = table.r(&[1, 3]);
assert_eq!(view.n_rows(), 2);
}
#[test]
fn test_to_table_respects_selections() {
let table = create_test_table();
let view = table.c(&["id", "value"]).r(1..4);
let materialised = view.to_table();
assert_eq!(materialised.n_cols(), 2);
assert_eq!(materialised.n_rows, 3);
}
#[test]
fn test_column_selection_methods() {
let table = create_test_table();
let view1 = table.c(&["name", "value"]);
assert_eq!(view1.n_cols(), 2);
assert_eq!(view1.col_names(), vec!["name", "value"]);
let view2 = table.c(&[0, 2]);
assert_eq!(view2.n_cols(), 2);
let view3 = table.col("id");
assert_eq!(view3.n_cols(), 1);
assert_eq!(view3.col_names(), vec!["id"]);
}
#[test]
fn test_row_selection_methods() {
let table = create_test_table();
let view1 = table.r(1..4);
assert_eq!(view1.n_rows(), 3);
let view2 = table.r(&[0, 2, 4]);
assert_eq!(view2.n_rows(), 3);
}
#[test]
fn test_chained_selection() {
let table = create_test_table();
let view1 = table.c(&["id", "value"]).r(1..4);
assert_eq!(view1.n_cols(), 2);
assert_eq!(view1.n_rows(), 3);
let view2 = table.r(1..4).c(&["name"]);
assert_eq!(view2.n_cols(), 1);
assert_eq!(view2.n_rows(), 3);
}
#[test]
fn test_tablev_new_api_refinement() {
let table = create_test_table();
let view1 = table.c(&["id", "name", "value"]).r(0..5);
assert_eq!(view1.n_cols(), 3);
assert_eq!(view1.n_rows(), 5);
let view2 = view1.c(&["name", "value"]).r(&[1, 2, 3]);
assert_eq!(view2.n_cols(), 2);
assert_eq!(view2.n_rows(), 3);
assert_eq!(view2.col_names(), vec!["name", "value"]);
}
#[test]
fn test_api_compatibility() {
let table = create_test_table();
let view_old = table.c(&["id", "value"]).r(1..4);
let view_new = table.c(&["id", "value"]).r(1..4);
assert_eq!(view_old.n_cols(), view_new.n_cols());
assert_eq!(view_old.n_rows(), view_new.n_rows());
assert_eq!(view_old.col_names(), view_new.col_names());
}
fn create_test_table() -> Table {
let mut id_arr = IntegerArray::<i32>::default();
for i in 0..5 {
id_arr.push(i);
}
let mut name_arr = StringArray::<u32>::default();
for i in 0..5 {
name_arr.push(format!("name{}", i));
}
let mut value_arr = IntegerArray::<i64>::default();
for i in 0..5 {
value_arr.push((i * 10) as i64);
}
let col_id = FieldArray::from_arr("id", Array::from_int32(id_arr));
let col_name = FieldArray::from_arr("name", Array::from_string32(name_arr));
let col_value = FieldArray::from_arr("value", Array::from_int64(value_arr));
Table::new(
"TestTable".to_string(),
Some(vec![col_id, col_name, col_value]),
)
}