@@ -50,6 +50,87 @@ exports.test = function(SQL, assert){
5050 db . create_function ( "addOne" , function ( x ) { return x + 1 ; } ) ;
5151 result = db . exec ( "SELECT addOne(1);" ) ;
5252 assert . equal ( result [ 0 ] [ "values" ] [ 0 ] [ 0 ] , 2 , "Accepts anonymous functions" ) ;
53+
54+ // Test api support of different sqlite types and special values
55+ db . create_function ( "identityFunction" , function ( x ) { return x ; } ) ;
56+ var verbose = false ;
57+ function canHandle ( testData )
58+ {
59+ let result = { } ;
60+ let ok = true ;
61+ let sql_value = ( "sql_value" in testData ) ?testData . sql_value :( "" + testData . value ) ;
62+ function simpleEqual ( a , b ) { return a === b ; }
63+ let value_equal = ( "equal" in testData ) ?testData . equal :simpleEqual ;
64+ db . create_function ( "CheckTestValue" , function ( x ) { return value_equal ( testData . value , x ) ?12345 :5678 ; } ) ;
65+ db . create_function ( "GetTestValue" , function ( ) { return testData . value ; } ) ;
66+ // Check sqlite to js value conversion
67+ result = db . exec ( "SELECT CheckTestValue(" + sql_value + ")==12345" ) ;
68+ if ( result [ 0 ] [ "values" ] [ 0 ] [ 0 ] != 1 )
69+ {
70+ if ( verbose )
71+ assert . ok ( false , "Can accept " + testData . info ) ;
72+ ok = false ;
73+ }
74+ // Check js to sqlite value conversion
75+ result = db . exec ( "SELECT GetTestValue()" ) ;
76+ if ( ! value_equal ( result [ 0 ] [ "values" ] [ 0 ] [ 0 ] , testData . value ) )
77+ {
78+ if ( verbose )
79+ assert . ok ( false , "Can return " + testData . info ) ;
80+ ok = false ;
81+ }
82+ // Check sqlite to sqlite value conversion (identityFunction(x)==x)
83+ if ( sql_value !== "null" )
84+ {
85+ result = db . exec ( "SELECT identityFunction(" + sql_value + ")=" + sql_value ) ;
86+ } else
87+ {
88+ result = db . exec ( "SELECT identityFunction(" + sql_value + ") is null" ) ;
89+ }
90+ if ( result [ 0 ] [ "values" ] [ 0 ] [ 0 ] != 1 )
91+ {
92+ if ( verbose )
93+ assert . ok ( false , "Can pass " + testData . info ) ;
94+ ok = false ;
95+ }
96+ return ok ;
97+ }
98+
99+ function numberEqual ( a , b ) {
100+ return ( + a ) === ( + b ) ;
101+ }
102+
103+ function blobEqual ( a , b ) {
104+ if ( ( ( typeof a ) != "object" ) || ( ! a ) || ( ( typeof b ) != "object" ) || ( ! b ) ) return false ;
105+ if ( a . byteLength !== b . byteLength ) return false ;
106+ return a . every ( ( val , i ) => val === b [ i ] ) ;
107+ }
108+
109+ [
110+ { info :"null" , value :null } , // sqlite special value null
111+ { info :"false" , value :false , sql_value :"0" , equal :numberEqual } , // sqlite special value (==false)
112+ { info :"true" , value :true , sql_value :"1" , equal :numberEqual } , // sqlite special value (==true)
113+ { info :"integer 0" , value :0 } , // sqlite special value (==false)
114+ { info :"integer 1" , value :1 } , // sqlite special value (==true)
115+ { info :"integer -1" , value :- 1 } ,
116+ { info :"long integer 5e+9" , value :5000000000 } , // int64
117+ { info :"long integer -5e+9" , value :- 5000000000 } , // negative int64
118+ { info :"double" , value :0.5 } ,
119+ { info :"string" , value :"Test" , sql_value :"'Test'" } ,
120+ { info :"empty string" , value :"" , sql_value :"''" } ,
121+ { info :"unicode string" , value :"\uC7B8" , sql_value :"CAST(x'EC9EB8' AS TEXT)" } , // unicode-hex: C7B8 utf8-hex: EC9EB8
122+ { info :"blob" , value :new Uint8Array ( [ 0xC7 , 0xB8 ] ) , sql_value :"x'C7B8'" , equal :blobEqual } ,
123+ { info :"empty blob" , value :new Uint8Array ( [ ] ) , sql_value :"x''" , equal :blobEqual }
124+ ] . forEach ( function ( testData )
125+ {
126+ assert . ok ( canHandle ( testData ) , "Can handle " + testData . info ) ;
127+ } ) ;
128+
129+ db . create_function ( "throwFunction" , function ( ) { throw "internal exception" ; return 5 ; } ) ;
130+ assert . throws ( function ( ) { db . exec ( "SELECT throwFunction()" ) ; } , / i n t e r n a l e x c e p t i o n / , "Can handle internal exceptions" ) ;
131+
132+ db . create_function ( "customeObjectFunction" , function ( ) { return { test :123 } ; } ) ;
133+ assert . throws ( function ( ) { db . exec ( "SELECT customeObjectFunction()" ) ; } , / W r o n g A P I u s e / , "Reports wrong API use" ) ;
53134
54135 db . close ( ) ;
55136} ;
0 commit comments