use sql_cli::data::recursive_where_evaluator::RecursiveWhereEvaluator;
use sql_cli::datatable::{DataColumn, DataRow, DataTable, DataValue};
use sql_cli::recursive_parser::Parser;
fn create_test_table() -> DataTable {
let mut table = DataTable::new("test");
table.add_column(DataColumn::new("id"));
table.add_column(DataColumn::new("book"));
table.add_column(DataColumn::new("description"));
table
.add_row(DataRow::new(vec![
DataValue::Integer(1),
DataValue::String(" derivatives ".to_string()), DataValue::String("with spaces".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(2),
DataValue::String(" equity trading".to_string()), DataValue::String("no trim needed".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(3),
DataValue::String("FX ".to_string()), DataValue::String("clean".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(4),
DataValue::String("bonds".to_string()), DataValue::String("already clean".to_string()),
]))
.unwrap();
table
.add_row(DataRow::new(vec![
DataValue::Integer(5),
DataValue::String(" ".to_string()), DataValue::String("empty after trim".to_string()),
]))
.unwrap();
table
}
#[test]
fn test_trim_method() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.Trim() = 'derivatives'");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
assert!(evaluator.evaluate(&where_clause, 0).unwrap()); assert!(!evaluator.evaluate(&where_clause, 1).unwrap()); assert!(!evaluator.evaluate(&where_clause, 2).unwrap()); assert!(!evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_trimstart_method() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.TrimStart() = 'equity trading'");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
assert!(!evaluator.evaluate(&where_clause, 0).unwrap()); assert!(evaluator.evaluate(&where_clause, 1).unwrap()); assert!(!evaluator.evaluate(&where_clause, 2).unwrap()); assert!(!evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_trimend_method() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.TrimEnd() = 'FX'");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
assert!(!evaluator.evaluate(&where_clause, 0).unwrap()); assert!(!evaluator.evaluate(&where_clause, 1).unwrap()); assert!(evaluator.evaluate(&where_clause, 2).unwrap()); assert!(!evaluator.evaluate(&where_clause, 3).unwrap()); assert!(!evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_trim_empty_string() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.Trim() = ''");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
assert!(!evaluator.evaluate(&where_clause, 0).unwrap()); assert!(!evaluator.evaluate(&where_clause, 1).unwrap()); assert!(!evaluator.evaluate(&where_clause, 2).unwrap()); assert!(!evaluator.evaluate(&where_clause, 3).unwrap()); assert!(evaluator.evaluate(&where_clause, 4).unwrap()); }
#[test]
fn test_trim_with_startswith() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.Trim().StartsWith('equity')");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
}
#[test]
fn test_trim_preserves_internal_spaces() {
let table = create_test_table();
let mut evaluator = RecursiveWhereEvaluator::new(&table);
let mut parser = Parser::new("SELECT * FROM test WHERE book.TrimStart() = 'equity trading'");
let statement = parser.parse().expect("Failed to parse");
let where_clause = statement.where_clause.expect("Expected WHERE clause");
assert!(evaluator.evaluate(&where_clause, 1).unwrap());
}