use tegdb::parser::{parse_sql, Statement};
#[test]
fn test_parse_begin() {
let sql = "BEGIN";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Begin));
let sql = "begin";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Begin));
let sql = " BEGIN ";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Begin));
}
#[test]
fn test_parse_start_transaction() {
let sql = "START TRANSACTION";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Begin));
let sql = "start transaction";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Begin));
let sql = "Start Transaction";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Begin));
let sql = " START TRANSACTION ";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Begin));
}
#[test]
fn test_parse_commit() {
let sql = "COMMIT";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Commit));
let sql = "commit";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Commit));
let sql = " COMMIT ";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Commit));
}
#[test]
fn test_parse_rollback() {
let sql = "ROLLBACK";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Rollback));
let sql = "rollback";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Rollback));
let sql = " ROLLBACK ";
let result = parse_sql(sql);
assert!(result.is_ok());
let statement = result.unwrap();
assert!(matches!(statement, Statement::Rollback));
}
#[test]
fn test_transaction_statement_priority() {
let statements = vec!["BEGIN", "COMMIT", "ROLLBACK", "START TRANSACTION"];
for sql in statements {
let result = parse_sql(sql);
assert!(result.is_ok(), "Failed to parse: {sql}");
let statement = result.unwrap();
match sql {
"BEGIN" | "START TRANSACTION" => assert!(matches!(statement, Statement::Begin)),
"COMMIT" => assert!(matches!(statement, Statement::Commit)),
"ROLLBACK" => assert!(matches!(statement, Statement::Rollback)),
_ => panic!("Unexpected SQL statement: {sql}"),
}
}
}
#[test]
fn test_invalid_transaction_statements() {
let invalid_statements = vec![
"BEGINS", "COMMITS", "ROLLBACKS", "START", "TRANSACTION", "BEGIN COMMIT", "COMMIT ROLLBACK", ];
for sql in invalid_statements {
let result = parse_sql(sql);
if result.is_ok() {
panic!("Unexpected successful parse for: {sql}");
}
}
}