Skip to content

Commit

Permalink
[#142] parse_join 테스트코드 작성
Browse files Browse the repository at this point in the history
  • Loading branch information
myyrakle committed Jul 29, 2024
1 parent daed7a6 commit cea19d4
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/ast/dml/parts/join.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::ast::types::{SQLExpression, TableName};

use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Default)]
pub struct JoinClause {
pub join_type: JoinType,
pub right: TableName,
Expand All @@ -19,3 +19,9 @@ pub enum JoinType {
RightOuterJoin,
FullOuterJoin,
}

impl Default for JoinType {
fn default() -> Self {
JoinType::InnerJoin
}
}
120 changes: 120 additions & 0 deletions src/parser/test/select.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2046,3 +2046,123 @@ fn test_parse_group_by_item() {
}
}
}

#[test]
fn test_parse_join() {
struct TestCase {
name: String,
input: Vec<Token>,
expected: JoinClause,
want_error: bool,
}

let test_cases = vec![
TestCase {
name: "foo.bar as fb ON p.id = fb.id".into(),
input: vec![
Token::Identifier("foo".into()),
Token::Period,
Token::Identifier("bar".into()),
Token::As,
Token::Identifier("fb".into()),
Token::On,
Token::Identifier("p".into()),
Token::Period,
Token::Identifier("id".into()),
Token::Operator(OperatorToken::Eq),
Token::Identifier("fb".into()),
Token::Period,
Token::Identifier("id".into()),
],
expected: JoinClause {
join_type: JoinType::InnerJoin,
right: TableName {
database_name: Some("foo".into()),
table_name: "bar".into(),
},
right_alias: Some("fb".into()),
on: BinaryOperatorExpression {
operator: BinaryOperator::Eq,
lhs: SelectColumn::new(Some("p".into()), "id".into()).into(),
rhs: SelectColumn::new(Some("fb".into()), "id".into()).into(),
}
.into(),
},
want_error: false,
},
TestCase {
name: "foo.bar ON p.id = fb.id".into(),
input: vec![
Token::Identifier("foo".into()),
Token::Period,
Token::Identifier("bar".into()),
Token::On,
Token::Identifier("p".into()),
Token::Period,
Token::Identifier("id".into()),
Token::Operator(OperatorToken::Eq),
Token::Identifier("fb".into()),
Token::Period,
Token::Identifier("id".into()),
],
expected: JoinClause {
join_type: JoinType::InnerJoin,
right: TableName {
database_name: Some("foo".into()),
table_name: "bar".into(),
},
right_alias: None,
on: BinaryOperatorExpression {
operator: BinaryOperator::Eq,
lhs: SelectColumn::new(Some("p".into()), "id".into()).into(),
rhs: SelectColumn::new(Some("fb".into()), "id".into()).into(),
}
.into(),
},
want_error: false,
},
TestCase {
name: "foo.bar".into(),
input: vec![
Token::Identifier("foo".into()),
Token::Period,
Token::Identifier("bar".into()),
],
expected: JoinClause {
join_type: JoinType::InnerJoin,
right: TableName {
database_name: Some("foo".into()),
table_name: "bar".into(),
},
right_alias: None,
on: None,
},
want_error: false,
},
TestCase {
name: "실패: 빈 토큰".into(),
input: vec![],
expected: Default::default(),
want_error: true,
},
];

for t in test_cases {
let mut parser = Parser::new(t.input);

let got = parser.parse_join(JoinType::InnerJoin, Default::default());

assert_eq!(
got.is_err(),
t.want_error,
"{}: want_error: {}, error: {:?}",
t.name,
t.want_error,
got.err()
);

if let Ok(statements) = got {
assert_eq!(statements, t.expected, "TC: {}", t.name);
}
}
}

0 comments on commit cea19d4

Please sign in to comment.