@@ -55,46 +55,57 @@ impl Function for Coalesce {
5555mod tests {
5656 use crate :: configure:: context:: Context ;
5757 use crate :: parser:: Statement ;
58+ use super :: * ;
59+ // TODO: Add tests for direct function calls with nulls and mixed types if the parser accept it
60+ // #[test]
61+ // fn all_null_returns_null() {
62+ // let mut parser = Statement::new().unwrap();
63+ // let result = parser.parse_and_execute("[coalesce(null, null, null)]", &Context::new()).unwrap();
64+ // assert_eq!(result, serde_json::Value::Null);
65+ // }
5866
5967 #[ test]
60- fn first_non_null_string ( ) {
61- let mut parser = Statement :: new ( ) . unwrap ( ) ;
62- let result = parser. parse_and_execute ( "[coalesce(null, 'hello', 'world')]" , & Context :: new ( ) ) . unwrap ( ) ;
63- assert_eq ! ( result, "hello" ) ;
68+ fn direct_function_call_with_nulls ( ) {
69+ let coalesce = Coalesce { } ;
70+ let context = Context :: new ( ) ;
71+
72+ let args = vec ! [ Value :: Null , Value :: Null , Value :: String ( "hello" . to_string( ) ) ] ;
73+ let result = coalesce. invoke ( & args, & context) . unwrap ( ) ;
74+ assert_eq ! ( result, Value :: String ( "hello" . to_string( ) ) ) ;
75+
76+ let args = vec ! [ Value :: Null , Value :: Null , Value :: Null ] ;
77+ let result = coalesce. invoke ( & args, & context) . unwrap ( ) ;
78+ assert_eq ! ( result, Value :: Null ) ;
79+
80+ let args = vec ! [ Value :: String ( "first" . to_string( ) ) , Value :: String ( "second" . to_string( ) ) ] ;
81+ let result = coalesce. invoke ( & args, & context) . unwrap ( ) ;
82+ assert_eq ! ( result, Value :: String ( "first" . to_string( ) ) ) ;
6483 }
6584
6685 #[ test]
67- fn first_non_null_number ( ) {
68- let mut parser = Statement :: new ( ) . unwrap ( ) ;
69- let result = parser. parse_and_execute ( "[coalesce(null, null, 42)]" , & Context :: new ( ) ) . unwrap ( ) ;
70- assert_eq ! ( result, 42 ) ;
86+ fn direct_function_call_mixed_types ( ) {
87+ let coalesce = Coalesce { } ;
88+ let context = Context :: new ( ) ;
89+
90+ let args = vec ! [ Value :: Null , serde_json:: json!( 42 ) , Value :: String ( "fallback" . to_string( ) ) ] ;
91+ let result = coalesce. invoke ( & args, & context) . unwrap ( ) ;
92+ assert_eq ! ( result, serde_json:: json!( 42 ) ) ;
93+
94+ let args = vec ! [ Value :: Null , Value :: Bool ( true ) ] ;
95+ let result = coalesce. invoke ( & args, & context) . unwrap ( ) ;
96+ assert_eq ! ( result, Value :: Bool ( true ) ) ;
7197 }
7298
7399 #[ test]
74- fn first_non_null_boolean ( ) {
100+ fn parser_with_values ( ) {
75101 let mut parser = Statement :: new ( ) . unwrap ( ) ;
76- let result = parser. parse_and_execute ( "[coalesce(null, true)]" , & Context :: new ( ) ) . unwrap ( ) ;
102+ let result = parser. parse_and_execute ( "[coalesce('hello', 'world')]" , & Context :: new ( ) ) . unwrap ( ) ;
103+ assert_eq ! ( result, "hello" ) ;
104+
105+ let result = parser. parse_and_execute ( "[coalesce(42, 'fallback')]" , & Context :: new ( ) ) . unwrap ( ) ;
106+ assert_eq ! ( result, 42 ) ;
107+
108+ let result = parser. parse_and_execute ( "[coalesce(true)]" , & Context :: new ( ) ) . unwrap ( ) ;
77109 assert_eq ! ( result, true ) ;
78110 }
79-
80- #[ test]
81- fn all_null_returns_null ( ) {
82- let mut parser = Statement :: new ( ) . unwrap ( ) ;
83- let result = parser. parse_and_execute ( "[coalesce(null, null, null)]" , & Context :: new ( ) ) . unwrap ( ) ;
84- assert_eq ! ( result, serde_json:: Value :: Null ) ;
85- }
86-
87- #[ test]
88- fn single_non_null_value ( ) {
89- let mut parser = Statement :: new ( ) . unwrap ( ) ;
90- let result = parser. parse_and_execute ( "[coalesce('first')]" , & Context :: new ( ) ) . unwrap ( ) ;
91- assert_eq ! ( result, "first" ) ;
92- }
93-
94- #[ test]
95- fn mixed_types ( ) {
96- let mut parser = Statement :: new ( ) . unwrap ( ) ;
97- let result = parser. parse_and_execute ( "[coalesce(null, 123, 'fallback')]" , & Context :: new ( ) ) . unwrap ( ) ;
98- assert_eq ! ( result, 123 ) ;
99- }
100111}
0 commit comments