1# 2010 Novemeber 18 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. The 12# focus of this script testing the callback-free C/C++ API. 13# 14# $Id: capi3e.test,v 1.70 2009/01/09 02:49:32 drh Exp $ 15# 16 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20# Make sure the system encoding is utf-8. Otherwise, if the system encoding 21# is other than utf-8, [file isfile $x] may not refer to the same file 22# as [sqlite3 db $x]. 23encoding system utf-8 24 25# Do not use a codec for tests in this file, as the database file is 26# manipulated directly using tcl scripts (using the [hexio_write] command). 27# 28do_not_use_codec 29 30# Return the UTF-16 representation of the supplied UTF-8 string $str. 31# If $nt is true, append two 0x00 bytes as a nul terminator. 32proc utf16 {str {nt 1}} { 33 set r [encoding convertto unicode $str] 34 if {$nt} { 35 append r "\x00\x00" 36 } 37 return $r 38} 39 40# Return the UTF-8 representation of the supplied UTF-16 string $str. 41proc utf8 {str} { 42 # If $str ends in two 0x00 0x00 bytes, knock these off before 43 # converting to UTF-8 using TCL. 44 binary scan $str \c* vals 45 if {[lindex $vals end]==0 && [lindex $vals end-1]==0} { 46 set str [binary format \c* [lrange $vals 0 end-2]] 47 } 48 49 set r [encoding convertfrom unicode $str] 50 return $r 51} 52 53# These tests complement those in capi2.test. They are organized 54# as follows: 55# 56# capi3e-1.*: Test sqlite3_open with various UTF8 filenames 57# capi3e-2.*: Test sqlite3_open16 with various UTF8 filenames 58# capi3e-3.*: Test ATTACH with various UTF8 filenames 59 60db close 61 62# here's the list of file names we're testing 63set names {t 1 t. 1. t.d 1.d t-1 1-1 t.db �.db �.db �.db �.db �.db} 64 65set i 0 66foreach name $names { 67 incr i 68 do_test capi3e-1.1.$i { 69 set db2 [sqlite3_open $name {}] 70 sqlite3_errcode $db2 71 } {SQLITE_OK} 72 do_test capi3e-1.2.$i { 73 sqlite3_close $db2 74 } {SQLITE_OK} 75 do_test capi3e-1.3.$i { 76 file isfile $name 77 } {1} 78} 79 80ifcapable {utf16} { 81 set i 0 82 foreach name $names { 83 incr i 84 do_test capi3e-2.1.$i { 85 set db2 [sqlite3_open16 [utf16 $name] {}] 86 sqlite3_errcode $db2 87 } {SQLITE_OK} 88 do_test capi3e-2.2.$i { 89 sqlite3_close $db2 90 } {SQLITE_OK} 91 do_test capi3e-2.3.$i { 92 file isfile $name 93 } {1} 94 } 95} 96 97ifcapable attach { 98 do_test capi3e-3.1 { 99 sqlite3 db2 base.db 100 } {} 101 set i 0 102 foreach name $names { 103 incr i 104 do_test capi3e-3.2.$i { 105 db2 eval "ATTACH DATABASE '$name' AS db$i;" 106 } {} 107 do_test capi3e-3.3.$i { 108 db2 eval "DETACH DATABASE db$i;" 109 } {} 110 } 111 do_test capi3e-3.4 { 112 db2 close 113 } {} 114} 115 116# clean up 117forcedelete base.db 118foreach name $names { 119 forcedelete $name 120} 121 122finish_test 123