Skip to content

Commit

Permalink
Merge pull request #140 from myyrakle/test/#137
Browse files Browse the repository at this point in the history
[#137] DeleteQuery 리팩토링, 테스트코드 작성
  • Loading branch information
myyrakle authored Jul 27, 2024
2 parents 756cbaf + 75399d9 commit 32c36a4
Show file tree
Hide file tree
Showing 16 changed files with 220 additions and 128 deletions.
2 changes: 1 addition & 1 deletion src/ast/dml/delete.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::ast::{types::TableName, DMLStatement, SQLStatement};

use super::parts::{_where::WhereClause, target::UpdateTarget};

#[derive(Clone, Debug, PartialEq)]
#[derive(Clone, Debug, PartialEq, Default)]
pub struct DeleteQuery {
pub from_table: Option<UpdateTarget>,
pub where_clause: Option<WhereClause>,
Expand Down
10 changes: 9 additions & 1 deletion src/parser/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,15 @@ pub struct Parser {

impl Parser {
// 파서 객체 생성
pub fn new(text: String) -> Result<Self, RRDBError> {
pub fn new(tokens: Vec<Token>) -> Self {
Self {
current_token: Token::EOF,
tokens: VecDeque::from(tokens),
}
}

// deorecated
pub fn with_string(text: String) -> Result<Self, RRDBError> {
Ok(Self {
current_token: Token::EOF,
tokens: VecDeque::from(Tokenizer::string_to_tokens(text)?),
Expand Down
4 changes: 2 additions & 2 deletions src/parser/test/alter_database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ pub fn alter_database_1() {
"#
.to_owned();

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

let expected = AlterDatabaseQuery::builder()
.set_name("foo".to_owned())
Expand All @@ -34,7 +34,7 @@ pub fn alter_database_2() {
"#
.to_owned();

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

let expected = AlterDatabaseQuery::builder()
.set_name("foo".to_owned())
Expand Down
26 changes: 13 additions & 13 deletions src/parser/test/alter_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ pub fn alter_table_rename_1() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand All @@ -42,7 +42,7 @@ pub fn alter_table_add_column_1() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -73,7 +73,7 @@ pub fn alter_table_add_column_2() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -104,7 +104,7 @@ pub fn alter_table_rename_column_1() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -133,7 +133,7 @@ pub fn alter_table_rename_column_2() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -162,7 +162,7 @@ pub fn alter_table_alter_column_drop_not_null_1() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -191,7 +191,7 @@ pub fn alter_table_alter_column_set_not_null_1() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -220,7 +220,7 @@ pub fn alter_table_alter_column_set_type_1() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -252,7 +252,7 @@ pub fn alter_table_alter_column_set_type_2() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -284,7 +284,7 @@ pub fn alter_table_alter_column_set_default_1() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -316,7 +316,7 @@ pub fn alter_table_alter_column_drop_default_1() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -345,7 +345,7 @@ pub fn alter_table_drop_column_1() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down Expand Up @@ -373,7 +373,7 @@ pub fn alter_table_drop_column_2() {
"#
.to_owned();

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

let expected = AlterTableQuery::builder()
.set_table(TableName {
Expand Down
4 changes: 2 additions & 2 deletions src/parser/test/create_database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pub fn create_database_1() {
"#
.to_owned();

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

let expected = CreateDatabaseQuery::builder()
.set_name("test_db".to_owned())
Expand All @@ -30,7 +30,7 @@ pub fn create_database_2() {
"#
.to_owned();

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

let expected = CreateDatabaseQuery::builder()
.set_name("test_db".to_owned())
Expand Down
2 changes: 1 addition & 1 deletion src/parser/test/create_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ pub fn create_table() {
"#
.to_owned();

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

let expected = CreateTableQuery::builder()
.set_table(TableName::new(
Expand Down
167 changes: 122 additions & 45 deletions src/parser/test/delete.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,57 +5,134 @@ use crate::ast::dml::expressions::binary::BinaryOperatorExpression;
use crate::ast::dml::expressions::operators::BinaryOperator;
use crate::ast::dml::parts::_where::WhereClause;
use crate::ast::types::{SQLExpression, SelectColumn, TableName};
use crate::parser::context::ParserContext;
use crate::lexer::predule::OperatorToken;
use crate::lexer::tokens::Token;
use crate::parser::predule::Parser;

#[test]
pub fn delete_from_1() {
let text = r#"
DELETE FROM foo.bar
"#
.to_owned();
pub fn test_delete_query() {
struct TestCase {
name: String,
input: Vec<Token>,
expected: DeleteQuery,
want_error: bool,
}

let mut parser = Parser::new(text).unwrap();
let test_cases = vec![
TestCase {
name: "성공: delete from foo.bar".into(),
input: vec![
Token::Delete,
Token::From,
Token::Identifier("foo".into()),
Token::Period,
Token::Identifier("bar".into()),
],
expected: DeleteQuery::builder()
.set_from_table(TableName {
database_name: Some("foo".into()),
table_name: "bar".into(),
})
.build(),
want_error: false,
},
TestCase {
name: "성공: DELETE FROM foo.bar WHERE name = 'asdf'".into(),
input: vec![
Token::Delete,
Token::From,
Token::Identifier("foo".into()),
Token::Period,
Token::Identifier("bar".into()),
Token::Where,
Token::Identifier("name".into()),
Token::Operator(OperatorToken::Eq),
Token::String("asdf".into()),
],
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(),
want_error: false,
},
TestCase {
name: "성공: DELETE FROM foo.bar as f".into(),
input: vec![
Token::Delete,
Token::From,
Token::Identifier("foo".into()),
Token::Period,
Token::Identifier("bar".into()),
Token::As,
Token::Identifier("f".into()),
],
expected: DeleteQuery::builder()
.set_from_table(TableName {
database_name: Some("foo".into()),
table_name: "bar".into(),
})
.set_from_alias("f".into())
.build(),
want_error: false,
},
TestCase {
name: "실패: 토큰이 하나도 없음".into(),
input: vec![],
expected: Default::default(),
want_error: true,
},
TestCase {
name: "실패: DELETE가 아님".into(),
input: vec![Token::Select],
expected: Default::default(),
want_error: true,
},
TestCase {
name: "실패: DELETE밖에 없음".into(),
input: vec![Token::Delete],
expected: Default::default(),
want_error: true,
},
TestCase {
name: "실패: DELETE INTO".into(),
input: vec![Token::Delete, Token::Into],
expected: Default::default(),
want_error: true,
},
TestCase {
name: "실패: DELETE FROM".into(),
input: vec![Token::Delete, Token::From],
expected: Default::default(),
want_error: true,
},
];

let expected = DeleteQuery::builder()
.set_from_table(TableName {
database_name: Some("foo".into()),
table_name: "bar".into(),
})
.build();
for t in test_cases {
let mut parser = Parser::new(t.input);

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 got = parser.handle_delete_query(Default::default());

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!(
got.is_err(),
t.want_error,
"{}: want_error: {}, error: {:?}",
t.name,
t.want_error,
got.err()
);

assert_eq!(
parser.parse(ParserContext::default()).unwrap(),
vec![expected.into()],
);
if let Ok(statements) = got {
assert_eq!(statements, t.expected.into(), "TC: {}", t.name);
}
}
}
2 changes: 1 addition & 1 deletion src/parser/test/drop_database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pub fn drop_database() {
"#
.to_owned();

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

let expected = DropDatabaseQuery::builder()
.set_name("test_db".to_owned())
Expand Down
2 changes: 1 addition & 1 deletion src/parser/test/drop_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ pub fn drop_table() {
"#
.to_owned();

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

let expected = DropTableQuery::builder()
.set_table(TableName::new(Some("foo_db".to_owned()), "foo".to_owned()))
Expand Down
Loading

0 comments on commit 32c36a4

Please sign in to comment.