2024-08-10 12:44:12 +00:00
mod parse ;
use parse ::Parse ;
mod helpers ;
use helpers ::new_ds ;
use surrealdb ::dbs ::Session ;
use surrealdb ::err ::Error ;
use surrealdb ::sql ::Value ;
#[ tokio::test ]
async fn closures ( ) -> Result < ( ) , Error > {
let sql = "
LET $double = | $n : number | $n * 2 ;
$double ( 2 ) ;
LET $pipe = | $arg | $arg ;
$pipe ( ' abc ' ) ;
LET $rettype = | $arg | -> string { $arg } ;
$rettype ( ' works ' ) ;
$rettype ( 123 ) ;
LET $argtype = | $arg : string | $arg ;
$argtype ( ' works ' ) ;
$argtype ( 123 ) ;
" ;
let dbs = new_ds ( ) . await ? ;
let ses = Session ::owner ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( sql , & ses , None ) . await ? ;
assert_eq! ( res . len ( ) , 10 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::None ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 4 " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::None ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 'abc' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::None ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 'works' " ) ;
assert_eq! ( tmp , val ) ;
//
match res . remove ( 0 ) . result {
2024-08-13 17:10:13 +00:00
Err ( Error ::FunctionCheck {
name ,
value ,
check ,
} ) if name = = " ANONYMOUS " & & value = = " 123 " & & check = = " string " = > ( ) ,
_ = > panic! ( " Invocation should have failed with error " ) ,
2024-08-10 12:44:12 +00:00
}
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::None ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 'works' " ) ;
assert_eq! ( tmp , val ) ;
//
match res . remove ( 0 ) . result {
Err ( Error ::InvalidArguments { name , message } ) if name = = " ANONYMOUS " & & message = = " Expected a value of type 'string' for argument $arg " = > ( ) ,
_ = > panic! ( " Invocation should have failed with error: There was a problem running the ANONYMOUS() function. Expected a value of type 'string' for argument $arg " )
}
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn closures_inline ( ) -> Result < ( ) , Error > {
let sql = "
( | | 1 ) ( ) ;
{ | | 2 } ( ) ;
{ a : | | 3 } . a ( ) ;
" ;
let dbs = new_ds ( ) . await ? ;
let ses = Session ::owner ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( sql , & ses , None ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 1 " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 2 " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 3 " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}