#![cfg(test)]

use crate::ast::dml::expressions::binary::BinaryOperatorExpression;
use crate::ast::dml::expressions::operators::BinaryOperator;
use crate::ast::dml::parts::_where::WhereClause;
use crate::ast::dml::parts::update_item::UpdateItem;
use crate::ast::dml::update::UpdateQuery;
use crate::ast::types::{SQLExpression, SelectColumn, TableName};
use crate::parser::context::ParserContext;
use crate::parser::predule::Parser;

#[test]
pub fn update_set_1() {
    let text = r#"
        Update foo.bar
        set
            a = 1
    "#
    .to_owned();

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

    let expected = UpdateQuery::builder()
        .set_target_table(TableName {
            database_name: Some("foo".into()),
            table_name: "bar".into(),
        })
        .add_update_item(UpdateItem {
            column: "a".into(),
            value: SQLExpression::Integer(1),
        })
        .build();

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

#[test]
pub fn update_set_2() {
    let text = r#"
        Update foo.bar
        set
            a = 1,
            b = 2
    "#
    .to_owned();

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

    let expected = UpdateQuery::builder()
        .set_target_table(TableName {
            database_name: Some("foo".into()),
            table_name: "bar".into(),
        })
        .add_update_item(UpdateItem {
            column: "a".into(),
            value: SQLExpression::Integer(1),
        })
        .add_update_item(UpdateItem {
            column: "b".into(),
            value: SQLExpression::Integer(2),
        })
        .build();

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

#[test]
pub fn update_set_where_1() {
    let text = r#"
        Update foo.bar
        set
            a = 1
        where a = 5
    "#
    .to_owned();

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

    let expected = UpdateQuery::builder()
        .set_target_table(TableName {
            database_name: Some("foo".into()),
            table_name: "bar".into(),
        })
        .add_update_item(UpdateItem {
            column: "a".into(),
            value: SQLExpression::Integer(1),
        })
        .set_where(WhereClause {
            expression: BinaryOperatorExpression {
                operator: BinaryOperator::Eq,
                lhs: SelectColumn::new(None, "a".into()).into(),
                rhs: SQLExpression::Integer(5),
            }
            .into(),
        })
        .build();

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