2022-10-27 12:23:24 +00:00
mod parse ;
use parse ::Parse ;
2022-12-30 08:23:19 +00:00
use surrealdb ::dbs ::Session ;
use surrealdb ::err ::Error ;
use surrealdb ::kvs ::Datastore ;
2022-10-27 12:23:24 +00:00
use surrealdb ::sql ::Value ;
2023-04-30 18:34:26 +00:00
// --------------------------------------------------
// array
// --------------------------------------------------
#[ tokio::test ]
async fn function_array_add ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::add ( [ ] , 3 ) ;
RETURN array ::add ( 3 , true ) ;
RETURN array ::add ( [ 1 , 2 ] , 2 ) ;
RETURN array ::add ( [ 1 , 2 ] , 3 ) ;
RETURN array ::add ( [ 1 , 2 ] , [ 2 , 3 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 5 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [3] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::add(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,3] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,3] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-01-15 09:48:20 +00:00
#[ tokio::test ]
async fn function_array_all ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::all ( [ ] ) ;
RETURN array ::all ( " some text " ) ;
RETURN array ::all ( [ 1 , 2 , " text " , 3 , NONE , 3 , 4 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-29 15:58:22 +00:00
let val = Value ::Bool ( true ) ;
2023-01-15 09:48:20 +00:00
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::all(). Argument 1 was the wrong type. Expected a array but failed to convert 'some text' into a array "
) ) ;
2023-01-15 09:48:20 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-29 15:58:22 +00:00
let val = Value ::Bool ( false ) ;
2023-01-15 09:48:20 +00:00
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_array_any ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::any ( [ ] ) ;
RETURN array ::any ( " some text " ) ;
RETURN array ::any ( [ 1 , 2 , " text " , 3 , NONE , 3 , 4 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-29 15:58:22 +00:00
let val = Value ::Bool ( false ) ;
2023-01-15 09:48:20 +00:00
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::any(). Argument 1 was the wrong type. Expected a array but failed to convert 'some text' into a array "
) ) ;
2023-01-15 09:48:20 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-29 15:58:22 +00:00
let val = Value ::Bool ( true ) ;
2023-01-15 09:48:20 +00:00
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-04-30 18:34:26 +00:00
#[ tokio::test ]
async fn function_array_append ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::append ( [ ] , 3 ) ;
RETURN array ::append ( 3 , true ) ;
RETURN array ::append ( [ 1 , 2 ] , [ 2 , 3 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [3] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::append(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,[2,3]] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2022-11-27 19:42:24 +00:00
#[ tokio::test ]
async fn function_array_combine ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::combine ( [ ] , [ ] ) ;
RETURN array ::combine ( 3 , true ) ;
RETURN array ::combine ( [ 1 , 2 ] , [ 2 , 3 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::combine(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
2022-11-27 19:42:24 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [ [1,2], [1,3], [2,2], [2,3] ] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_array_complement ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::complement ( [ ] , [ ] ) ;
RETURN array ::complement ( 3 , true ) ;
RETURN array ::complement ( [ 1 , 2 , 3 , 4 ] , [ 3 , 4 , 5 , 6 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::complement(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
2022-11-27 19:42:24 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_array_concat ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::concat ( [ ] , [ ] ) ;
RETURN array ::concat ( 3 , true ) ;
RETURN array ::concat ( [ 1 , 2 , 3 , 4 ] , [ 3 , 4 , 5 , 6 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::concat(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
2022-11-27 19:42:24 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,3,4,3,4,5,6] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_array_difference ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::difference ( [ ] , [ ] ) ;
RETURN array ::difference ( 3 , true ) ;
RETURN array ::difference ( [ 1 , 2 , 3 , 4 ] , [ 3 , 4 , 5 , 6 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::difference(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
2022-11-27 19:42:24 +00:00
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,5,6] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2022-10-27 12:23:24 +00:00
#[ tokio::test ]
2022-11-27 11:05:33 +00:00
async fn function_array_distinct ( ) -> Result < ( ) , Error > {
2022-10-27 12:23:24 +00:00
let sql = r #"
2022-11-27 11:05:33 +00:00
RETURN array ::distinct ( [ ] ) ;
2022-11-27 19:42:24 +00:00
RETURN array ::distinct ( " some text " ) ;
RETURN array ::distinct ( [ 1 , 2 , 1 , 3 , 3 , 4 ] ) ;
2022-10-27 12:23:24 +00:00
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
2022-11-27 19:42:24 +00:00
assert_eq! ( res . len ( ) , 3 ) ;
2022-10-27 12:23:24 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
2022-11-27 19:42:24 +00:00
let val = Value ::parse ( " [] " ) ;
2022-10-27 12:23:24 +00:00
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::distinct(). Argument 1 was the wrong type. Expected a array but failed to convert 'some text' into a array "
) ) ;
2022-11-27 19:42:24 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,3,4] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2022-11-28 12:18:30 +00:00
#[ tokio::test ]
async fn function_array_flatten ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::flatten ( [ ] ) ;
RETURN array ::flatten ( " some text " ) ;
RETURN array ::flatten ( [ [ 1 , 2 ] , [ 3 , 4 ] ] ) ;
RETURN array ::flatten ( [ [ 1 , 2 ] , [ 3 , 4 ] , ' SurrealDB ' , [ 5 , 6 , [ 7 , 8 ] ] ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 4 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::flatten(). Argument 1 was the wrong type. Expected a array but failed to convert 'some text' into a array "
) ) ;
2022-11-28 12:18:30 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,3,4] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1, 2, 3, 4, 'SurrealDB', 5, 6, [7, 8]] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-01-07 20:02:49 +00:00
#[ tokio::test ]
async fn function_array_group ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::group ( [ ] ) ;
RETURN array ::group ( 3 ) ;
RETURN array ::group ( [ [ 1 , 2 , 3 , 4 ] , [ 3 , 4 , 5 , 6 ] ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::group(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
2023-01-07 20:02:49 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,3,4,5,6] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2022-12-17 21:03:13 +00:00
#[ tokio::test ]
async fn function_array_insert ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::insert ( [ ] , 1 ) ;
2023-04-20 18:21:53 +00:00
RETURN array ::insert ( [ 3 ] , 1 , 5 ) ;
2022-12-17 21:03:13 +00:00
RETURN array ::insert ( [ 3 ] , 1 , 1 ) ;
RETURN array ::insert ( [ 1 , 2 , 3 , 4 ] , 5 , - 1 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
2023-04-20 18:21:53 +00:00
assert_eq! ( res . len ( ) , 4 ) ;
2022-12-17 21:03:13 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-20 18:21:53 +00:00
let val = Value ::parse ( " [3] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2022-12-17 21:03:13 +00:00
let val = Value ::parse ( " [3,1] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,3,5,4] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2022-11-27 19:42:24 +00:00
#[ tokio::test ]
async fn function_array_intersect ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::intersect ( [ ] , [ ] ) ;
RETURN array ::intersect ( 3 , true ) ;
RETURN array ::intersect ( [ 1 , 2 , 3 , 4 ] , [ 3 , 4 , 5 , 6 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::intersect(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
2022-11-27 19:42:24 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [3,4] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-05-04 20:38:02 +00:00
#[ tokio::test ]
async fn function_string_join_arr ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::join ( [ ] , " " ) ;
RETURN array ::join ( [ " hello " , " world " ] , " , " ) ;
RETURN array ::join ( [ " again " , " again " , " again " ] , " and " ) ;
RETURN array ::join ( [ 42 , 3.14 , 2.72 , 1.61 ] , " and " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 4 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " hello, world " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " again and again and again " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " 42 and 3.14 and 2.72 and 1.61 " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-04-30 18:34:26 +00:00
#[ tokio::test ]
async fn function_array_len ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::len ( [ ] ) ;
RETURN array ::len ( " some text " ) ;
RETURN array ::len ( [ 1 , 2 , " text " , 3 , 3 , 4 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::len(). Argument 1 was the wrong type. Expected a array but failed to convert 'some text' into a array "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 6 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-01-15 09:48:20 +00:00
#[ tokio::test ]
async fn function_array_max ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::max ( [ ] ) ;
RETURN array ::max ( " some text " ) ;
RETURN array ::max ( [ 1 , 2 , " text " , 3 , 3 , 4 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::None ;
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::max(). Argument 1 was the wrong type. Expected a array but failed to convert 'some text' into a array "
) ) ;
2023-01-15 09:48:20 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
2023-01-18 00:11:19 +00:00
let val = Value ::parse ( " 'text' " ) ;
2023-01-15 09:48:20 +00:00
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_array_min ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::min ( [ ] ) ;
RETURN array ::min ( " some text " ) ;
RETURN array ::min ( [ 1 , 2 , " text " , 3 , 3 , 4 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::None ;
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::min(). Argument 1 was the wrong type. Expected a array but failed to convert 'some text' into a array "
) ) ;
2023-01-15 09:48:20 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 1 " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-04-30 18:34:26 +00:00
#[ tokio::test ]
async fn function_array_pop ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::pop ( [ ] ) ;
RETURN array ::pop ( " some text " ) ;
RETURN array ::pop ( [ 1 , 2 , " text " , 3 , 3 , 4 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::None ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::pop(). Argument 1 was the wrong type. Expected a array but failed to convert 'some text' into a array "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 4 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_array_prepend ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::prepend ( [ ] , 3 ) ;
RETURN array ::prepend ( 3 , true ) ;
RETURN array ::prepend ( [ 1 , 2 ] , [ 2 , 3 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [3] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::prepend(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [[2,3],1,2] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_array_push ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::push ( [ ] , 3 ) ;
RETURN array ::push ( 3 , true ) ;
RETURN array ::push ( [ 1 , 2 ] , [ 2 , 3 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [3] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::push(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,[2,3]] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-04-20 18:21:53 +00:00
#[ tokio::test ]
async fn function_array_remove ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::remove ( [ 3 ] , 0 ) ;
RETURN array ::remove ( [ 3 ] , 2 ) ;
RETURN array ::remove ( [ 3 , 4 , 5 ] , 1 ) ;
RETURN array ::remove ( [ 1 , 2 , 3 , 4 ] , - 1 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 4 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [3] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [3,5] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,3] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2022-11-27 19:42:24 +00:00
#[ tokio::test ]
2023-04-30 18:34:26 +00:00
async fn function_array_reverse ( ) -> Result < ( ) , Error > {
2022-11-27 19:42:24 +00:00
let sql = r #"
2023-04-30 18:34:26 +00:00
RETURN array ::reverse ( [ ] ) ;
RETURN array ::reverse ( 3 ) ;
RETURN array ::reverse ( [ 1 , 2 , " text " , 3 , 3 , 4 ] ) ;
2022-11-27 19:42:24 +00:00
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2022-10-27 12:23:24 +00:00
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
2023-04-25 10:13:04 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
2023-04-30 18:34:26 +00:00
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::reverse(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
2023-04-25 10:13:04 +00:00
) ) ;
2022-10-27 12:23:24 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [4,3,3,'text',2,1] " ) ;
2022-10-27 12:23:24 +00:00
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2022-11-27 11:05:33 +00:00
#[ tokio::test ]
2023-04-30 18:34:26 +00:00
async fn function_array_slice ( ) -> Result < ( ) , Error > {
2022-11-27 11:05:33 +00:00
let sql = r #"
2023-04-30 18:34:26 +00:00
RETURN array ::slice ( [ ] ) ;
RETURN array ::slice ( 3 ) ;
RETURN array ::slice ( [ 1 , 2 , " text " , 3 , 3 , 4 ] ) ;
RETURN array ::slice ( [ 1 , 2 , " text " , 3 , 3 , 4 ] , 1 ) ;
RETURN array ::slice ( [ 1 , 2 , " text " , 3 , 3 , 4 ] , 3 ) ;
RETURN array ::slice ( [ 1 , 2 , " text " , 3 , 3 , 4 ] , 3 , - 1 ) ;
RETURN array ::slice ( [ 1 , 2 , " text " , 3 , 3 , 4 ] , - 1 ) ;
2022-11-27 11:05:33 +00:00
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
2022-12-03 23:30:38 +00:00
assert_eq! ( res . len ( ) , 7 ) ;
2022-11-27 11:05:33 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [] " ) ;
2022-11-27 11:05:33 +00:00
assert_eq! ( tmp , val ) ;
//
2023-04-30 18:34:26 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::slice(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
2022-11-27 11:05:33 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [1,2,'text',3,3,4] " ) ;
2022-11-27 11:05:33 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [2,'text',3,3,4] " ) ;
2022-11-27 11:05:33 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [3,3,4] " ) ;
2022-11-27 11:05:33 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [3,3] " ) ;
2022-11-27 11:05:33 +00:00
assert_eq! ( tmp , val ) ;
//
2022-12-03 23:30:38 +00:00
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [4] " ) ;
2022-12-03 23:30:38 +00:00
assert_eq! ( tmp , val ) ;
//
2022-11-27 11:05:33 +00:00
Ok ( ( ) )
}
2022-12-30 09:34:46 +00:00
#[ tokio::test ]
2023-04-30 18:34:26 +00:00
async fn function_array_sort ( ) -> Result < ( ) , Error > {
2022-12-30 09:34:46 +00:00
let sql = r #"
2023-04-30 18:34:26 +00:00
RETURN array ::sort ( [ ] ) ;
RETURN array ::sort ( 3 , false ) ;
RETURN array ::sort ( [ 4 , 2 , " text " , 1 , 3 , 4 ] ) ;
RETURN array ::sort ( [ 4 , 2 , " text " , 1 , 3 , 4 ] , true ) ;
RETURN array ::sort ( [ 4 , 2 , " text " , 1 , 3 , 4 ] , false ) ;
RETURN array ::sort ( [ 4 , 2 , " text " , 1 , 3 , 4 ] , " asc " ) ;
RETURN array ::sort ( [ 4 , 2 , " text " , 1 , 3 , 4 ] , " desc " ) ;
2022-12-30 09:34:46 +00:00
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 7 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [] " ) ;
2022-12-30 09:34:46 +00:00
assert_eq! ( tmp , val ) ;
//
2023-04-30 18:34:26 +00:00
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::sort(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
//
2022-12-30 09:34:46 +00:00
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [1,2,3,4,4,'text'] " ) ;
2022-12-30 09:34:46 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [1,2,3,4,4,'text'] " ) ;
2022-12-30 09:34:46 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " ['text',4,4,3,2,1] " ) ;
2022-12-30 09:34:46 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [1,2,3,4,4,'text'] " ) ;
2022-12-30 09:34:46 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " ['text',4,4,3,2,1] " ) ;
2022-12-30 09:34:46 +00:00
assert_eq! ( tmp , val ) ;
//
2023-04-30 18:34:26 +00:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_array_sort_asc ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::sort ::asc ( [ ] ) ;
RETURN array ::sort ::asc ( 3 ) ;
RETURN array ::sort ::asc ( [ 4 , 2 , " text " , 1 , 3 , 4 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
2022-12-30 09:34:46 +00:00
let tmp = res . remove ( 0 ) . result ? ;
2023-04-30 18:34:26 +00:00
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::sort::asc(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,3,4,4,'text'] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_array_sort_desc ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::sort ::desc ( [ ] ) ;
RETURN array ::sort ::desc ( 3 ) ;
RETURN array ::sort ::desc ( [ 4 , 2 , " text " , 1 , 3 , 4 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::sort::desc(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " ['text',4,4,3,2,1] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_array_union ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN array ::union ( [ ] , [ ] ) ;
RETURN array ::union ( 3 , true ) ;
RETURN array ::union ( [ 1 , 2 , 1 , 6 ] , [ 1 , 3 , 4 , 5 , 6 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function array::union(). Argument 1 was the wrong type. Expected a array but failed to convert 3 into a array "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [1,2,6,3,4,5] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-05-09 20:43:16 +00:00
// --------------------------------------------------
// bytes
// --------------------------------------------------
#[ tokio::test ]
async fn function_bytes_len ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN bytes ::len ( < bytes > " " ) ;
RETURN bytes ::len ( true ) ;
RETURN bytes ::len ( < bytes > " π " ) ;
RETURN bytes ::len ( " ππ " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 4 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 0 " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function bytes::len(). Argument 1 was the wrong type. Expected a bytes but failed to convert true into a bytes "
) ) ;
//
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 ( " 4 " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-04-30 18:34:26 +00:00
// --------------------------------------------------
// count
// --------------------------------------------------
#[ tokio::test ]
async fn function_count ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN count ( ) ;
RETURN count ( true ) ;
RETURN count ( false ) ;
RETURN count ( 15 > 10 ) ;
RETURN count ( 15 < 10 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 5 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 1 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 1 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 1 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// crypto
// --------------------------------------------------
#[ tokio::test ]
async fn function_crypto_md5 ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN crypto ::md5 ( ' tobie ' ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " 4768b3fc7ac751e03a614e2349abf3bf " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_crypto_sha1 ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN crypto ::sha1 ( ' tobie ' ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " c6be709a1b6429472e0c5745b411f1693c4717be " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_crypto_sha256 ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN crypto ::sha256 ( ' tobie ' ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " 33fe1859daba927ea5674813adc1cf34b9e2795f2b7e91602fae19c0d0c493af " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_crypto_sha512 ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN crypto ::sha512 ( ' tobie ' ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " 39f0160c946c4c53702112d6ef3eea7957ea8e1c78787a482a89f8b0a8860a20ecd543432e4a187d9fdcd1c415cf61008e51a7e8bf2f22ac77e458789c9cdccc " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// duration
// --------------------------------------------------
#[ tokio::test ]
async fn function_duration_days ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::days ( 7 d ) ;
RETURN duration ::days ( 4 w3d ) ;
RETURN duration ::days ( 4 h ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 7 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 31 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_hours ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::hours ( 7 h ) ;
RETURN duration ::hours ( 4 d3h ) ;
RETURN duration ::hours ( 30 m ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 7 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 99 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_micros ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::micros ( 150 µ s ) ;
RETURN duration ::micros ( 1 m100µs ) ;
RETURN duration ::micros ( 100 ns ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 150 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 60000100 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_millis ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::millis ( 150 ms ) ;
RETURN duration ::millis ( 1 m100ms ) ;
RETURN duration ::millis ( 100 µ s ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 150 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 60100 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_mins ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::mins ( 30 m ) ;
RETURN duration ::mins ( 1 h30m ) ;
RETURN duration ::mins ( 45 s ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 30 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 90 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_nanos ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::nanos ( 200 ns ) ;
RETURN duration ::nanos ( 30 ms100ns ) ;
RETURN duration ::nanos ( 0 ns ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 200 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 30000100 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_secs ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::secs ( 25 s ) ;
RETURN duration ::secs ( 1 m25s ) ;
RETURN duration ::secs ( 350 ms ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 25 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 85 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_weeks ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::weeks ( 7 w ) ;
RETURN duration ::weeks ( 1 y3w ) ;
RETURN duration ::weeks ( 4 d ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 7 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 55 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_years ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::years ( 7 y ) ;
RETURN duration ::years ( 7 y4w30d ) ;
RETURN duration ::years ( 4 w ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 7 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 7 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_from_days ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::from ::days ( 3 ) ;
RETURN duration ::from ::days ( 50 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 3d " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 7w1d " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_from_hours ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::from ::hours ( 3 ) ;
RETURN duration ::from ::hours ( 30 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 3h " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 1d6h " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_from_micros ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::from ::micros ( 300 ) ;
RETURN duration ::from ::micros ( 50500 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 300µs " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 50ms500µs " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_from_millis ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::from ::millis ( 30 ) ;
RETURN duration ::from ::millis ( 1500 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 30ms " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 1s500ms " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_from_mins ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::from ::mins ( 3 ) ;
RETURN duration ::from ::mins ( 100 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 3m " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 1h40m " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_from_nanos ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::from ::nanos ( 30 ) ;
RETURN duration ::from ::nanos ( 5005000 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 30ns " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 5ms5µs " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_from_secs ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::from ::secs ( 3 ) ;
RETURN duration ::from ::secs ( 100 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 3s " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 1m40s " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_duration_from_weeks ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN duration ::from ::weeks ( 3 ) ;
RETURN duration ::from ::weeks ( 60 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 3w " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 1y7w6d " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-05-09 20:43:16 +00:00
// --------------------------------------------------
// encoding
// --------------------------------------------------
#[ tokio::test ]
async fn function_encoding_base64_decode ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN encoding ::base64 ::decode ( " " ) ;
RETURN encoding ::base64 ::decode ( " aGVsbG8 " ) = < bytes > " hello " ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bytes ( Vec ::new ( ) . into ( ) ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( true ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_encoding_base64_encode ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN encoding ::base64 ::encode ( " " ) ;
RETURN encoding ::base64 ::encode ( " hello " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 'aGVsbG8' " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-04-30 18:34:26 +00:00
// --------------------------------------------------
// geo
// --------------------------------------------------
#[ tokio::test ]
async fn function_parse_geo_area ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN geo ::area ( {
type : ' Polygon ' ,
coordinates : [ [
[ - 0.38314819 , 51.37692386 ] , [ 0.1785278 , 51.37692386 ] ,
[ 0.1785278 , 51.61460570 ] , [ - 0.38314819 , 51.61460570 ] ,
[ - 0.38314819 , 51.37692386 ]
] ]
} ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 1029944667.4192368 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_geo_bearing ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN geo ::bearing (
{
type : ' Point ' ,
coordinates : [ - 0.136439 , 51.509865 ]
} ,
{
type : ' Point ' ,
coordinates : [ - 73.971321 , 40.776676 ]
}
) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( - 71.63409590760736 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_geo_centroid ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN geo ::centroid ( {
type : ' Polygon ' ,
coordinates : [ [
[ - 0.38314819 , 51.37692386 ] , [ 0.1785278 , 51.37692386 ] ,
[ 0.1785278 , 51.61460570 ] , [ - 0.38314819 , 51.61460570 ] ,
[ - 0.38314819 , 51.37692386 ]
] ]
} ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" {
type : ' Point ' ,
coordinates : [
- 0.10231019499999999 ,
51.49576478
]
} " ,
) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_geo_distance ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN geo ::distance (
{
type : ' Point ' ,
coordinates : [ - 0.136439 , 51.509865 ]
} ,
{
type : ' Point ' ,
coordinates : [ - 73.971321 , 40.776676 ]
}
) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 5562851.11270021 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_geo_hash_encode ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN geo ::hash ::encode ( {
type : ' Point ' ,
coordinates : [ - 0.136439 , 51.509865 ]
} ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " gcpvhchdswz9 " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_geo_hash_decode ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN geo ::hash ::decode ( ' gcpvhchdswz9 ' ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" {
type : ' Point ' ,
coordinates : [
- 0.13643911108374596 ,
51.50986502878368
]
} " ,
) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// is
// --------------------------------------------------
#[ tokio::test ]
async fn function_parse_is_alphanum ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::alphanum ( " abcdefg123 " ) ;
RETURN is ::alphanum ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_alpha ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::alpha ( " abcdefg " ) ;
RETURN is ::alpha ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_ascii ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::ascii ( " abcdefg123 " ) ;
RETURN is ::ascii ( " this is a test 😀 " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_datetime ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::datetime ( " 2015-09-05 23:56:04 " , " %Y-%m-%d %H:%M:%S " ) ;
RETURN is ::datetime ( " 2012-06-22 23:56:04 " , " %T " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_domain ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::domain ( " surrealdb.com " ) ;
RETURN is ::domain ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_email ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::email ( " info@surrealdb.com " ) ;
RETURN is ::email ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_hexadecimal ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::hexadecimal ( " ff009e " ) ;
RETURN is ::hexadecimal ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_latitude ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::latitude ( " 51.509865 " ) ;
RETURN is ::latitude ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_longitude ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::longitude ( " -0.136439 " ) ;
RETURN is ::longitude ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_numeric ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::numeric ( " 13136439 " ) ;
RETURN is ::numeric ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_semver ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::semver ( " 1.0.0-rc.1 " ) ;
RETURN is ::semver ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_url ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::url ( " https://surrealdb.com/docs " ) ;
RETURN is ::url ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_is_uuid ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN is ::uuid ( " e72bee20-f49b-11ec-b939-0242ac120002 " ) ;
RETURN is ::uuid ( " this is a test! " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// math
// --------------------------------------------------
#[ tokio::test ]
async fn function_math_abs ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::abs ( 0 ) ;
RETURN math ::abs ( 100 ) ;
RETURN math ::abs ( - 100 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 100 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 100 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_bottom ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::bottom ( [ 1 , 2 , 3 ] , 0 ) ;
RETURN math ::bottom ( [ 1 , 2 , 3 ] , 1 ) ;
RETURN math ::bottom ( [ 1 , 2 , 3 ] , 2 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function math::bottom(). The second argument must be an integer greater than 0. "
) ) ;
//
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,1] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_ceil ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::ceil ( 101 ) ;
RETURN math ::ceil ( 101.5 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 101 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 102 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_fixed ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::fixed ( 101 , 0 ) ;
RETURN math ::fixed ( 101 , 2 ) ;
RETURN math ::fixed ( 101.5 , 2 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function math::fixed(). The second argument must be an integer greater than 0. "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 101 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 101.50 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_floor ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::floor ( 101 ) ;
RETURN math ::floor ( 101.5 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 101 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 101 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_interquartile ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::interquartile ( [ ] ) ;
RETURN math ::interquartile ( [ 101 , 213 , 202 ] ) ;
RETURN math ::interquartile ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_nan ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-05-23 06:10:09 +00:00
let val = Value ::from ( 56.0 ) ;
2023-04-30 18:34:26 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-05-23 06:10:09 +00:00
let val = Value ::from ( 56.0 ) ;
2023-04-30 18:34:26 +00:00
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_max ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::max ( [ ] ) ;
RETURN math ::max ( [ 101 , 213 , 202 ] ) ;
RETURN math ::max ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::None ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 213 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 213.5 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_mean ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::mean ( [ ] ) ;
RETURN math ::mean ( [ 101 , 213 , 202 ] ) ;
RETURN math ::mean ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_nan ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 172 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 172.5 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_median ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::median ( [ ] ) ;
RETURN math ::median ( [ 101 , 213 , 202 ] ) ;
RETURN math ::median ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::None ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 202 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 202.5 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_midhinge ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::midhinge ( [ ] ) ;
RETURN math ::midhinge ( [ 101 , 213 , 202 ] ) ;
RETURN math ::midhinge ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_nan ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-05-23 06:10:09 +00:00
let val = Value ::from ( 179.5 ) ;
2023-04-30 18:34:26 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-05-23 06:10:09 +00:00
let val = Value ::from ( 180 ) ;
2023-04-30 18:34:26 +00:00
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_min ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::min ( [ ] ) ;
RETURN math ::min ( [ 101 , 213 , 202 ] ) ;
RETURN math ::min ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::None ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 101 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 101.5 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_mode ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::mode ( [ ] ) ;
RETURN math ::mode ( [ 101 , 213 , 202 ] ) ;
RETURN math ::mode ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_nan ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 213 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 213.5 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_nearestrank ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::nearestrank ( [ ] , 75 ) ;
RETURN math ::nearestrank ( [ 101 , 213 , 202 ] , 75 ) ;
RETURN math ::nearestrank ( [ 101.5 , 213.5 , 202.5 ] , 75 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_nan ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 213 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 213.5 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_percentile ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::percentile ( [ ] , 99 ) ;
RETURN math ::percentile ( [ 101 , 213 , 202 ] , 99 ) ;
RETURN math ::percentile ( [ 101.5 , 213.5 , 202.5 ] , 99 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_nan ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-05-23 06:10:09 +00:00
let val = Value ::from ( 212.78 ) ;
2023-04-30 18:34:26 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-05-23 06:10:09 +00:00
let val = Value ::from ( 213.28 ) ;
2023-04-30 18:34:26 +00:00
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_pow ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::pow ( 101 , 3 ) ;
RETURN math ::pow ( 101.5 , 3 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 1030301 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 1045678.375 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_product ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::product ( [ ] ) ;
RETURN math ::product ( [ 101 , 213 , 202 ] ) ;
RETURN math ::product ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 1 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 4345626 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 4388225.625 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_round ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::round ( 101 ) ;
RETURN math ::round ( 101.5 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 101 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 102 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_spread ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::spread ( [ ] ) ;
RETURN math ::spread ( [ 101 , 213 , 202 ] ) ;
RETURN math ::spread ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_nan ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 112 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 112.0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_sqrt ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::sqrt ( 101 ) ;
RETURN math ::sqrt ( 101.5 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 10.04987562112089 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 10.07472083980494220820325739456714210123675076934383520155548236146713380225253351613768233376490240 " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_stddev ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::stddev ( [ ] ) ;
RETURN math ::stddev ( [ 101 , 213 , 202 ] ) ;
RETURN math ::stddev ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_nan ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-05-23 06:10:09 +00:00
let val = Value ::from ( 61.73329733620261 ) ;
2023-04-30 18:34:26 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-05-23 06:10:09 +00:00
let val = Value ::from ( 61.73329733620261 ) ;
2023-04-30 18:34:26 +00:00
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_sum ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::sum ( [ ] ) ;
RETURN math ::sum ( [ 101 , 213 , 202 ] ) ;
RETURN math ::sum ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 516 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 517.5 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_top ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::top ( [ 1 , 2 , 3 ] , 0 ) ;
RETURN math ::top ( [ 1 , 2 , 3 ] , 1 ) ;
RETURN math ::top ( [ 1 , 2 , 3 ] , 2 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = " Incorrect arguments for function math::top(). The second argument must be an integer greater than 0. "
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [3] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [2,3] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_trimean ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::trimean ( [ ] ) ;
RETURN math ::trimean ( [ 101 , 213 , 202 ] ) ;
RETURN math ::trimean ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_nan ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-05-23 06:10:09 +00:00
let val = Value ::from ( 190.75 ) ;
2023-04-30 18:34:26 +00:00
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
2023-05-23 06:10:09 +00:00
let val = Value ::from ( 191.25 ) ;
2023-04-30 18:34:26 +00:00
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_math_variance ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN math ::variance ( [ ] ) ;
RETURN math ::variance ( [ 101 , 213 , 202 ] ) ;
RETURN math ::variance ( [ 101.5 , 213.5 , 202.5 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_nan ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 3811 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 3811.0 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// meta
// --------------------------------------------------
#[ tokio::test ]
async fn function_parse_meta_id ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN meta ::id ( " person:tobie " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " tobie " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_meta_table ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN meta ::table ( " person:tobie " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " person " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_meta_tb ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN meta ::tb ( " person:tobie " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " person " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// not
// --------------------------------------------------
#[ tokio::test ]
async fn function_not ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN not ( true ) ;
RETURN not ( not ( true ) ) ;
RETURN not ( false ) ;
RETURN not ( not ( false ) ) ;
RETURN not ( 0 ) ;
RETURN not ( 1 ) ;
RETURN not ( " hello " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 7 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// parse
// --------------------------------------------------
#[ tokio::test ]
async fn function_parse_email_host ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN parse ::email ::host ( " john.doe@example.com " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " example.com " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_email_user ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN parse ::email ::user ( " john.doe@example.com " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " john.doe " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_url_domain ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN parse ::url ::domain ( " https://user:pass@www.surrealdb.com:80/path/to/page?query=param#somefragment " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " www.surrealdb.com " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_url_fragment ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN parse ::url ::fragment ( " https://user:pass@www.surrealdb.com:80/path/to/page?query=param#somefragment " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " somefragment " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_url_host ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN parse ::url ::host ( " https://user:pass@www.surrealdb.com:80/path/to/page?query=param#somefragment " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " www.surrealdb.com " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_url_path ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN parse ::url ::path ( " https://user:pass@www.surrealdb.com:80/path/to/page?query=param#somefragment " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " /path/to/page " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_url_port ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN parse ::url ::port ( " https://user:pass@www.surrealdb.com:80/path/to/page?query=param#somefragment " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 80 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_url_query ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN parse ::url ::query ( " https://user:pass@www.surrealdb.com:80/path/to/page?query=param#somefragment " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " query=param " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_parse_url_scheme ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN parse ::url ::scheme ( " https://user:pass@www.surrealdb.com:80/path/to/page?query=param#somefragment " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " https " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// rand
// --------------------------------------------------
#[ tokio::test ]
async fn function_rand ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ( ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_float ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_bool ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::bool ( ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_bool ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_enum ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::enum ( [ " one " , " two " , " three " ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_strand ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_float ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::float ( ) ;
RETURN rand ::float ( 5 , 10 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_float ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_float ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_guid ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::guid ( ) ;
RETURN rand ::guid ( 10 ) ;
RETURN rand ::guid ( 10 , 15 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_strand ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_strand ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_strand ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_int ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::int ( ) ;
RETURN rand ::int ( 5 , 10 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_int ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_int ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_string ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::string ( ) ;
RETURN rand ::string ( 10 ) ;
RETURN rand ::string ( 10 , 15 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_strand ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_strand ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_strand ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_time ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::time ( ) ;
RETURN rand ::time ( 1577836800 , 1893456000 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_datetime ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_datetime ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_ulid ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::ulid ( ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_strand ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_uuid ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::uuid ( ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_uuid ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_uuid_v4 ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::uuid ::v4 ( ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_uuid ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_rand_uuid_v7 ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN rand ::uuid ::v7 ( ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_uuid ( ) ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// string
// --------------------------------------------------
#[ tokio::test ]
async fn function_string_concat ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::concat ( ) ;
RETURN string ::concat ( " test " ) ;
RETURN string ::concat ( " this " , " " , " is " , " " , " a " , " " , " test " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " test " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " this is a test " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-05-03 10:40:17 +00:00
#[ tokio::test ]
async fn function_string_contains ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::contains ( " " , " " ) ;
RETURN string ::contains ( " a " , " " ) ;
RETURN string ::contains ( " abcdefg " , " " ) ;
RETURN string ::contains ( " abcdefg " , " bcd " ) ;
RETURN string ::contains ( " abcdefg " , " abcd " ) ;
RETURN string ::contains ( " abcdefg " , " xxabcd " ) ;
RETURN string ::contains ( " abcdefg " , " hij " ) ;
RETURN string ::contains ( " ประเทศไทย中华 " , " ประเ " ) ;
RETURN string ::contains ( " ประเทศไทย中华 " , " ะเ " ) ;
RETURN string ::contains ( " ประเทศไทย中华 " , " ไท华 " ) ;
RETURN string ::contains ( " 1234567ah012345678901ah " , " hah " ) ;
RETURN string ::contains ( " 00abc01234567890123456789abc " , " bcabc " ) ;
RETURN string ::contains ( " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab " , " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaba " ) ;
RETURN string ::contains ( " * \t " , " " ) ;
RETURN string ::contains ( " * \t " , " ? " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 15 ) ;
// 1
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
// 2
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
// 3
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
// 4
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
// 5
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
// 6
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
// 7
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
// 8
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
// 9
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
// 10
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
// 11
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
// 12
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
// 13
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
// 14
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
// 15
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-04-30 18:34:26 +00:00
#[ tokio::test ]
async fn function_string_ends_with ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::endsWith ( " " , " " ) ;
RETURN string ::endsWith ( " " , " test " ) ;
RETURN string ::endsWith ( " this is a test " , " test " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_join ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::join ( " " ) ;
RETURN string ::join ( " test " ) ;
RETURN string ::join ( " " , " this " , " is " , " a " , " test " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " this is a test " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_len ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::len ( " " ) ;
RETURN string ::len ( " test " ) ;
RETURN string ::len ( " test this string " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 0 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 4 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 16 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_lowercase ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::lowercase ( " " ) ;
RETURN string ::lowercase ( " TeSt " ) ;
RETURN string ::lowercase ( " THIS IS A TEST " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " test " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " this is a test " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_repeat ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::repeat ( " " , 3 ) ;
RETURN string ::repeat ( " test " , 3 ) ;
RETURN string ::repeat ( " test this " , 3 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " testtesttest " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " test thistest thistest this " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_replace ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::replace ( " " , " " , " " ) ;
RETURN string ::replace ( ' this is a test ' , ' a test ' , ' awesome ' ) ;
RETURN string ::replace ( " this is an 😀 emoji test " , " 😀 " , " awesome 👍 " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " this is awesome " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " this is an awesome 👍 emoji test " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_reverse ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::reverse ( " " ) ;
RETURN string ::reverse ( " test " ) ;
RETURN string ::reverse ( " test this string " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " tset " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " gnirts siht tset " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_slice ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::slice ( " the quick brown fox jumps over the lazy dog. " ) ;
RETURN string ::slice ( " the quick brown fox jumps over the lazy dog. " , 16 ) ;
RETURN string ::slice ( " the quick brown fox jumps over the lazy dog. " , 0 , 60 ) ;
RETURN string ::slice ( " the quick brown fox jumps over the lazy dog. " , 0 , - 1 ) ;
RETURN string ::slice ( " the quick brown fox jumps over the lazy dog. " , 16 , - 1 ) ;
RETURN string ::slice ( " the quick brown fox jumps over the lazy dog. " , - 9 , - 1 ) ;
RETURN string ::slice ( " the quick brown fox jumps over the lazy dog. " , - 100 , - 100 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 7 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 'the quick brown fox jumps over the lazy dog.' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 'fox jumps over the lazy dog.' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 'the quick brown fox jumps over the lazy dog.' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 'the quick brown fox jumps over the lazy dog' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 'fox jumps over the lazy dog' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 'lazy dog' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '' " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_slug ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::slug ( " " ) ;
RETURN string ::slug ( " this is a test " ) ;
RETURN string ::slug ( " blog - this is a test with 😀 emojis " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " this-is-a-test " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " blog-this-is-a-test-with-grinning-emojis " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_split ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::split ( " " , " " ) ;
RETURN string ::split ( " this, is, a, list " , " , " ) ;
RETURN string ::split ( " this - is - another - test " , " - " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " ['', ''] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " ['this', 'is', 'a', 'list'] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " ['this', 'is', 'another', 'test'] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_starts_with ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::startsWith ( " " , " " ) ;
RETURN string ::startsWith ( " " , " test " ) ;
RETURN string ::startsWith ( " test this string " , " test " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_trim ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::trim ( " " ) ;
RETURN string ::trim ( " test " ) ;
RETURN string ::trim ( " this is a test with text " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " test " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " this is a test with text " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_uppercase ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::uppercase ( " " ) ;
RETURN string ::uppercase ( " tEsT " ) ;
RETURN string ::uppercase ( " this is a test " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " TEST " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " THIS IS A TEST " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_string_words ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN string ::words ( " " ) ;
RETURN string ::words ( " test " ) ;
RETURN string ::words ( " this is a test " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " [] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " ['test'] " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " ['this', 'is', 'a', 'test'] " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// time
// --------------------------------------------------
2023-05-11 18:46:36 +00:00
#[ tokio::test ]
async fn function_time_ceil ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::ceil ( " 1987-06-22T08:30:45Z " , 1 w ) ;
RETURN time ::ceil ( " 1987-06-22T08:30:45Z " , 1 y ) ;
2023-05-12 17:59:58 +00:00
RETURN time ::ceil ( " 2023-05-11T03:09:00Z " , 1 s ) ;
2023-05-11 18:46:36 +00:00
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
2023-05-12 17:59:58 +00:00
assert_eq! ( res . len ( ) , 3 ) ;
2023-05-11 18:46:36 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1987-06-25T00:00:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1987-12-28T00:00:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
2023-05-12 17:59:58 +00:00
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '2023-05-11T03:09:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
2023-05-11 18:46:36 +00:00
Ok ( ( ) )
}
2023-04-30 18:34:26 +00:00
#[ tokio::test ]
async fn function_time_day ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::day ( ) ;
RETURN time ::day ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 22 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_floor ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::floor ( " 1987-06-22T08:30:45Z " , 1 w ) ;
RETURN time ::floor ( " 1987-06-22T08:30:45Z " , 1 y ) ;
2023-05-12 17:59:58 +00:00
RETURN time ::floor ( " 2023-05-11T03:09:00Z " , 1 s ) ;
2023-04-30 18:34:26 +00:00
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
2023-05-12 17:59:58 +00:00
assert_eq! ( res . len ( ) , 3 ) ;
2023-04-30 18:34:26 +00:00
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1987-06-18T00:00:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1986-12-28T00:00:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
2023-05-12 17:59:58 +00:00
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '2023-05-11T03:09:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
2023-04-30 18:34:26 +00:00
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_format ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::format ( " 1987-06-22T08:30:45Z " , " %Y-%m-%d " ) ;
RETURN time ::format ( " 1987-06-22T08:30:45Z " , " %T " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1987-06-22' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '08:30:45' " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_group ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::group ( " 1987-06-22T08:30:45Z " , ' hour ' ) ;
RETURN time ::group ( " 1987-06-22T08:30:45Z " , ' month ' ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1987-06-22T08:00:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1987-06-01T00:00:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_hour ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::hour ( ) ;
RETURN time ::hour ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 8 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_minute ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::minute ( ) ;
RETURN time ::minute ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 30 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_month ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::month ( ) ;
RETURN time ::month ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 6 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_nano ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::nano ( ) ;
RETURN time ::nano ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 551349045000000000 i64 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_now ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::now ( ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 1 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_datetime ( ) ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_round ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::round ( " 1987-06-22T08:30:45Z " , 1 w ) ;
RETURN time ::round ( " 1987-06-22T08:30:45Z " , 1 y ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1987-06-25T00:00:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1986-12-28T00:00:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_second ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::second ( ) ;
RETURN time ::second ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 45 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_unix ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::unix ( ) ;
RETURN time ::unix ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 551349045 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_wday ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::wday ( ) ;
RETURN time ::wday ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 1 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_week ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::week ( ) ;
RETURN time ::week ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 26 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_yday ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::yday ( ) ;
RETURN time ::yday ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 173 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_year ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::year ( ) ;
RETURN time ::year ( " 1987-06-22T08:30:45Z " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
assert! ( tmp . is_number ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 1987 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_from_micros ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::from ::micros ( 384025770384840 ) ;
RETURN time ::from ::micros ( 2840257704384440 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1982-03-03T17:49:30.384840Z' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '2060-01-02T08:28:24.384440Z' " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_from_millis ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::from ::millis ( 384025773840 ) ;
RETURN time ::from ::millis ( 2840257704440 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1982-03-03T17:49:33.840Z' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '2060-01-02T08:28:24.440Z' " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_from_secs ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::from ::secs ( 384053840 ) ;
RETURN time ::from ::secs ( 2845704440 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1982-03-04T01:37:20Z' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '2060-03-05T09:27:20Z' " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_time_from_unix ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN time ::from ::unix ( 384053840 ) ;
RETURN time ::from ::unix ( 2845704440 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1982-03-04T01:37:20Z' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '2060-03-05T09:27:20Z' " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
// --------------------------------------------------
// type
// --------------------------------------------------
#[ tokio::test ]
async fn function_type_bool ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN type ::bool ( " true " ) ;
RETURN type ::bool ( " false " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( true ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Bool ( false ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_type_datetime ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN type ::datetime ( " 1987-06-22 " ) ;
RETURN type ::datetime ( " 2022-08-01 " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '1987-06-22T00:00:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " '2022-08-01T00:00:00Z' " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_type_decimal ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN type ::decimal ( " 13.1043784018 " ) ;
RETURN type ::decimal ( " 13.5719384719384719385639856394139476937756394756 " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 13.1043784018 " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 13.5719384719384719385639856394139476937756394756 " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_type_duration ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN type ::duration ( " 1h30m " ) ;
RETURN type ::duration ( " 1h30m30s50ms " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 1h30m " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 1h30m30s50ms " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_type_float ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN type ::float ( " 13.1043784018 " ) ;
RETURN type ::float ( " 13.5719384719384719385639856394139476937756394756 " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 13.1043784018 f64 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 13.571938471938472 f64 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_type_int ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN type ::int ( " 194719 " ) ;
RETURN type ::int ( " 1457105732053058 " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 194719 i64 ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( 1457105732053058 i64 ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_type_number ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN type ::number ( " 194719.1947104740 " ) ;
RETURN type ::number ( " 1457105732053058.3957394823281756381849375 " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 194719.1947104740 " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse ( " 1457105732053058.3957394823281756381849375 " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_type_point ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN type ::point ( [ 1.345 , 6.789 ] ) ;
RETURN type ::point ( [ - 0.136439 , 51.509865 ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" {
type : ' Point ' ,
coordinates : [
1.345 ,
6.789
]
} " ,
) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" {
type : ' Point ' ,
coordinates : [
- 0.136439 ,
51.509865
]
} " ,
) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_type_string ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN type ::string ( 30 s ) ;
RETURN type ::string ( 13.58248 ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " 30s " ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::from ( " 13.58248 " ) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
#[ tokio::test ]
async fn function_type_table ( ) -> Result < ( ) , Error > {
let sql = r #"
RETURN type ::table ( " person " ) ;
RETURN type ::table ( " animal " ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 2 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Table ( " person " . into ( ) ) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::Table ( " animal " . into ( ) ) ;
2022-12-30 09:34:46 +00:00
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-02-11 18:17:02 +00:00
#[ tokio::test ]
async fn function_type_thing ( ) -> Result < ( ) , Error > {
let sql = r #"
CREATE type ::thing ( ' person ' , ' test ' ) ;
CREATE type ::thing ( ' person ' , 1434619 ) ;
CREATE type ::thing ( ' city ' , ' 8e60244 d - 95 f6 - 4 f95 - 9e30 - 09 a98977efb0 ' ) ;
CREATE type ::thing ( ' temperature ' , [ ' London ' , ' 2022 - 09 - 30 T20 :25 :01.406828 Z ' ] ) ;
" #;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
let res = & mut dbs . execute ( & sql , & ses , None , false ) . await ? ;
assert_eq! ( res . len ( ) , 4 ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" [
{
id : person :test ,
}
] " ,
) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" [
{
id : person :1434619 ,
}
] " ,
) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" [
{
id : city :⟨ 8e60244 d - 95 f6 - 4 f95 - 9e30 - 09 a98977efb0 ⟩ ,
}
] " ,
) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" [
{
id : temperature :[ ' London ' , ' 2022 - 09 - 30 T20 :25 :01.406828 Z ' ] ,
}
] " ,
) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}