@@ -802,3 +802,66 @@ fn test_parse_expression() {
802
802
}
803
803
}
804
804
}
805
+
806
+ #[ test]
807
+ fn test_parse_unary_expression ( ) {
808
+ struct TestCase {
809
+ name : String ,
810
+ operator : UnaryOperator ,
811
+ input : Vec < Token > ,
812
+ expected : SQLExpression ,
813
+ want_error : bool ,
814
+ }
815
+
816
+ let test_cases = vec ! [
817
+ TestCase {
818
+ name: "! 3 BETWEEN 2 AND 5" . into( ) ,
819
+ operator: UnaryOperator :: Not ,
820
+ input: vec![
821
+ Token :: Integer ( 3 ) ,
822
+ Token :: Between ,
823
+ Token :: Integer ( 2 ) ,
824
+ Token :: And ,
825
+ Token :: Integer ( 5 ) ,
826
+ ] ,
827
+ expected: BetweenExpression {
828
+ a: UnaryOperatorExpression {
829
+ operator: UnaryOperator :: Not ,
830
+ operand: SQLExpression :: Integer ( 3 ) ,
831
+ }
832
+ . into( ) ,
833
+ x: SQLExpression :: Integer ( 2 ) ,
834
+ y: SQLExpression :: Integer ( 5 ) ,
835
+ }
836
+ . into( ) ,
837
+ want_error: false ,
838
+ } ,
839
+ TestCase {
840
+ name: "실패: 빈 토큰" . into( ) ,
841
+ operator: UnaryOperator :: Not ,
842
+ input: vec![ ] ,
843
+ expected: Default :: default ( ) ,
844
+ want_error: true ,
845
+ } ,
846
+ ] ;
847
+
848
+ for t in test_cases {
849
+ let mut parser = Parser :: new ( t. input ) ;
850
+
851
+ let got: Result < SQLExpression , crate :: errors:: RRDBError > =
852
+ parser. parse_unary_expression ( t. operator , Default :: default ( ) ) ;
853
+
854
+ assert_eq ! (
855
+ got. is_err( ) ,
856
+ t. want_error,
857
+ "{}: want_error: {}, error: {:?}" ,
858
+ t. name,
859
+ t. want_error,
860
+ got. err( )
861
+ ) ;
862
+
863
+ if let Ok ( statements) = got {
864
+ assert_eq ! ( statements, t. expected, "TC: {}" , t. name) ;
865
+ }
866
+ }
867
+ }
0 commit comments