xref: /sqlite-3.40.0/ext/repair/test/test.tcl (revision 37ab9523)
1# Run this script using
2#
3#       sqlite3_checker --test $thisscript $testscripts
4#
5# The $testscripts argument is optional.  If omitted, all *.test files
6# in the same directory as $thisscript are run.
7#
8set NTEST 0
9set NERR  0
10
11
12# Invoke the do_test procedure to run a single test
13#
14# The $expected parameter is the expected result.  The result is the return
15# value from the last TCL command in $cmd.
16#
17# Normally, $expected must match exactly.  But if $expected is of the form
18# "/regexp/" then regular expression matching is used.  If $expected is
19# "~/regexp/" then the regular expression must NOT match.  If $expected is
20# of the form "#/value-list/" then each term in value-list must be numeric
21# and must approximately match the corresponding numeric term in $result.
22# Values must match within 10%.  Or if the $expected term is A..B then the
23# $result term must be in between A and B.
24#
25proc do_test {name cmd expected} {
26  if {[info exists ::testprefix]} {
27    set name "$::testprefix$name"
28  }
29
30  incr ::NTEST
31  puts -nonewline $name...
32  flush stdout
33
34  if {[catch {uplevel #0 "$cmd;\n"} result]} {
35    puts -nonewline $name...
36    puts "\nError: $result"
37    incr ::NERR
38  } else {
39    set ok [expr {[string compare $result $expected]==0}]
40    if {!$ok} {
41      puts "\n!  $name expected: \[$expected\]\n! $name got:      \[$result\]"
42      incr ::NERR
43    } else {
44      puts " Ok"
45    }
46  }
47  flush stdout
48}
49
50#
51#   do_execsql_test TESTNAME SQL RES
52#
53proc do_execsql_test {testname sql {result {}}} {
54  uplevel [list do_test $testname [list db eval $sql] [list {*}$result]]
55}
56
57if {[llength $argv]==0} {
58  set dir [file dirname $argv0]
59  set argv [glob -nocomplain $dir/*.test]
60}
61foreach testfile $argv {
62  file delete -force test.db
63  sqlite3 db test.db
64  source $testfile
65  catch {db close}
66}
67puts "$NERR errors out of $NTEST tests"
68