@@ -50,6 +50,87 @@ exports.test = function(SQL, assert){
50
50
db . create_function ( "addOne" , function ( x ) { return x + 1 ; } ) ;
51
51
result = db . exec ( "SELECT addOne(1);" ) ;
52
52
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" ) ;
53
134
54
135
db . close ( ) ;
55
136
} ;
0 commit comments