#![cfg(test)]

use crate::lib::ast::predule::{
    BinaryOperator, BinaryOperatorExpression, DeleteQuery, SQLExpression, SelectColumn, TableName,
    WhereClause,
};
use crate::lib::parser::context::ParserContext;
use crate::lib::parser::predule::Parser;

#[test]
pub fn delete_from_1() {
    let text = r#"
        DELETE FROM foo.bar
    "#
    .to_owned();

    let mut parser = Parser::new(text).unwrap();

    let expected = DeleteQuery::builder()
        .set_from_table(TableName {
            database_name: Some("foo".into()),
            table_name: "bar".into(),
        })
        .build();

    assert_eq!(
        parser.parse(ParserContext::default()).unwrap(),
        vec![expected.into()],
    );
}

#[test]
pub fn delete_from_where_1() {
    let text = r#"
        DELETE FROM foo.bar WHERE name = 'asdf'
    "#
    .to_owned();

    let mut parser = Parser::new(text).unwrap();

    let expected = DeleteQuery::builder()
        .set_from_table(TableName {
            database_name: Some("foo".into()),
            table_name: "bar".into(),
        })
        .set_where(WhereClause {
            expression: BinaryOperatorExpression {
                operator: BinaryOperator::Eq,
                lhs: SelectColumn::new(None, "name".into()).into(),
                rhs: SQLExpression::String("asdf".into()),
            }
            .into(),
        })
        .build();

    assert_eq!(
        parser.parse(ParserContext::default()).unwrap(),
        vec![expected.into()],
    );
}