use sql_cli::data::data_view::DataView;
use sql_cli::data::datatable::{DataColumn, DataRow, DataTable, DataValue};
use std::sync::Arc;
fn create_test_table() -> Arc<DataTable> {
let mut table = DataTable::new("test");
table.add_column(DataColumn::new("id"));
table.add_column(DataColumn::new("name"));
table.add_column(DataColumn::new("orderid"));
table.add_column(DataColumn::new("externalOrderId"));
table.add_column(DataColumn::new("parentOrderId"));
table.add_column(DataColumn::new("platformOrderId"));
table.add_column(DataColumn::new("status"));
table.add_column(DataColumn::new("date"));
for i in 1..=5 {
table
.add_row(DataRow::new(vec![
DataValue::Integer(i),
DataValue::String(format!("Item{i}")),
DataValue::String(format!("ORD{i:03}")),
DataValue::String(format!("EXT{i:03}")),
DataValue::String(format!("PAR{i:03}")),
DataValue::String(format!("PLAT{i:03}")),
DataValue::String("Active".to_string()),
DataValue::String(format!("2024-01-{i:02}")),
]))
.unwrap();
}
Arc::new(table)
}
#[test]
fn test_column_search_basic() {
let table = create_test_table();
let mut view = DataView::new(table);
view.search_columns("order");
let matches = view.get_matching_columns();
assert_eq!(matches.len(), 4);
let match_names: Vec<String> = matches.iter().map(|(_, name)| name.clone()).collect();
assert!(match_names.contains(&"orderid".to_string()));
assert!(match_names.contains(&"externalOrderId".to_string()));
assert!(match_names.contains(&"parentOrderId".to_string()));
assert!(match_names.contains(&"platformOrderId".to_string()));
let current_match = view.get_current_column_match();
assert!(current_match.is_some());
let idx = current_match.unwrap();
assert!(idx < view.column_count());
}
#[test]
fn test_column_search_with_hidden_columns() {
let table = create_test_table();
let mut view = DataView::new(table);
view.hide_column(1); view.hide_column(6); view.hide_column(5);
assert_eq!(view.column_count(), 5);
let visible_names = view.get_display_column_names();
assert_eq!(
visible_names,
vec![
"id",
"orderid",
"externalOrderId",
"parentOrderId",
"platformOrderId"
]
);
view.search_columns("order");
let matches = view.get_matching_columns();
assert_eq!(matches.len(), 4);
let current_match = view.get_current_column_match();
assert!(current_match.is_some());
let idx = current_match.unwrap();
assert_eq!(idx, 1);
view.next_column_match();
let next_idx = view.get_current_column_match().unwrap();
assert_eq!(next_idx, 2);
view.next_column_match();
assert_eq!(view.get_current_column_match().unwrap(), 3);
view.next_column_match();
assert_eq!(view.get_current_column_match().unwrap(), 4);
view.next_column_match();
assert_eq!(view.get_current_column_match().unwrap(), 1); }
#[test]
fn test_column_search_navigation() {
let table = create_test_table();
let mut view = DataView::new(table);
view.search_columns("order");
let matches = view.get_matching_columns();
assert_eq!(matches.len(), 4);
let first = view.get_current_column_match().unwrap();
assert_eq!(first, 2);
view.next_column_match();
assert_eq!(view.get_current_column_match().unwrap(), 3);
view.prev_column_match();
assert_eq!(view.get_current_column_match().unwrap(), 2);
view.prev_column_match();
assert_eq!(view.get_current_column_match().unwrap(), 5); }
#[test]
fn test_column_search_case_insensitive() {
let table = create_test_table();
let mut view = DataView::new(table);
view.search_columns("ORDER");
assert_eq!(view.get_matching_columns().len(), 4);
view.search_columns("Order");
assert_eq!(view.get_matching_columns().len(), 4);
view.search_columns("OrDeR");
assert_eq!(view.get_matching_columns().len(), 4);
}
#[test]
fn test_column_search_clear() {
let table = create_test_table();
let mut view = DataView::new(table);
view.search_columns("order");
assert_eq!(view.get_matching_columns().len(), 4);
assert!(view.has_column_search());
view.search_columns("");
assert_eq!(view.get_matching_columns().len(), 0);
assert!(!view.has_column_search());
assert!(view.get_current_column_match().is_none());
}
#[test]
fn test_column_search_no_matches() {
let table = create_test_table();
let mut view = DataView::new(table);
view.search_columns("xyz");
assert_eq!(view.get_matching_columns().len(), 0);
assert!(view.get_current_column_match().is_none());
}