github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/permutations.test (about)

     1  # 2008 June 21
     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  #
    12  
    13  set testdir [file dirname $argv0]
    14  source $testdir/tester.tcl
    15  db close
    16  
    17  #-------------------------------------------------------------------------
    18  # test_suite NAME OPTIONS
    19  #
    20  # where available options are:  
    21  #
    22  #       -description TITLE                  (default "")
    23  #       -initialize  SCRIPT                 (default "")
    24  #       -shutdown    SCRIPT                 (default "")
    25  #       -presql      SQL                    (default "")
    26  #       -files       LIST-OF-FILES          (default $::ALLTESTS)
    27  #       -prefix      NAME                   (default "$::NAME.")
    28  #       -dbconfig    SCRIPT                 (default "")
    29  #
    30  proc test_suite {name args} {
    31  
    32    set default(-shutdown)    ""
    33    set default(-initialize)  ""
    34    set default(-presql)      ""
    35    set default(-description) "no description supplied (fixme)"
    36    set default(-files)       ""
    37    set default(-prefix)      "${name}."
    38    set default(-dbconfig)    ""
    39  
    40    array set options [array get default]
    41    if {[llength $args]%2} {
    42      error "uneven number of options/switches passed to test_suite"
    43    }
    44    foreach {k v} $args {
    45      set o [array names options ${k}*]
    46      if {[llength $o]>1}  { error "ambiguous option: $k" }
    47      if {[llength $o]==0} { error "unknown option: $k" }
    48      set options([lindex $o 0]) $v
    49    }
    50  
    51    set     ::testspec($name) [array get options]
    52    lappend ::testsuitelist $name
    53  }
    54  
    55  #-------------------------------------------------------------------------
    56  # test_set ARGS...
    57  #
    58  proc test_set {args} {
    59    set isExclude 0
    60    foreach a $args {
    61      if {[string match -* $a]} {
    62        switch -- $a {
    63          -include { set isExclude 0 }
    64          -exclude { set isExclude 1 }
    65          default {
    66            error "Unknown switch: $a"
    67          }
    68        }
    69      } elseif {$isExclude == 0} {
    70        foreach f $a { set t($f) 1 }
    71      } else {
    72        foreach f $a { array unset t $f }
    73        foreach f $a { array unset t */$f }
    74      }
    75    }
    76  
    77    return [array names t]
    78  }
    79  
    80  #-------------------------------------------------------------------------
    81  # Set up the following global list variables containing the names of 
    82  # various test scripts:
    83  #
    84  #   $alltests
    85  #   $allquicktests
    86  #
    87  set alltests [list]
    88  foreach f [glob $testdir/*.test] { lappend alltests [file tail $f] }
    89  foreach f [glob -nocomplain            \
    90      $testdir/../ext/rtree/*.test       \
    91      $testdir/../ext/fts5/test/*.test   \
    92      $testdir/../ext/expert/*.test      \
    93      $testdir/../ext/lsm1/test/*.test   \
    94  ] {
    95    lappend alltests $f 
    96  }
    97  foreach f [glob -nocomplain $testdir/../ext/session/*.test] { 
    98    lappend alltests $f 
    99  }
   100  
   101  if {$::tcl_platform(platform)!="unix"} {
   102    set alltests [test_set $alltests -exclude crash.test crash2.test]
   103  }
   104  set alltests [test_set $alltests -exclude {
   105    all.test        async.test         quick.test  veryquick.test
   106    memleak.test    permutations.test  soak.test   fts3.test
   107    mallocAll.test  rtree.test         full.test   extraquick.test
   108    session.test    rbu.test
   109  }]
   110  
   111  set allquicktests [test_set $alltests -exclude {
   112    async2.test async3.test backup_ioerr.test corrupt.test
   113    corruptC.test crash.test crash2.test crash3.test crash4.test crash5.test
   114    crash6.test crash7.test delete3.test e_fts3.test fts3rnd.test
   115    fkey_malloc.test fuzz.test fuzz3.test fuzz_malloc.test in2.test loadext.test
   116    misc7.test mutex2.test notify2.test onefile.test pagerfault2.test 
   117    savepoint4.test savepoint6.test select9.test 
   118    speed1.test speed1p.test speed2.test speed3.test speed4.test 
   119    speed4p.test sqllimits1.test tkt2686.test thread001.test thread002.test
   120    thread003.test thread004.test thread005.test trans2.test vacuum3.test 
   121    incrvacuum_ioerr.test autovacuum_crash.test btree8.test shared_err.test
   122    vtab_err.test walslow.test walcrash.test walcrash3.test
   123    walthread.test rtree3.test indexfault.test securedel2.test
   124    sort3.test sort4.test fts4growth.test fts4growth2.test
   125    bigsort.test walprotocol.test mmap4.test fuzzer2.test
   126    walcrash2.test e_fkey.test backup.test
   127  
   128    fts4merge.test fts4merge2.test fts4merge4.test fts4check.test
   129    fts4merge5.test
   130    fts3cov.test fts3snippet.test fts3corrupt2.test fts3an.test
   131    fts3defer.test fts4langid.test fts3sort.test fts5unicode.test
   132  
   133    rtree4.test
   134    sessionbig.test
   135  }]
   136  if {[info exists ::env(QUICKTEST_INCLUDE)]} {
   137    set allquicktests [concat $allquicktests $::env(QUICKTEST_INCLUDE)]
   138  }
   139  if {[info exists ::env(QUICKTEST_OMIT)]} {
   140    # If environment variable QUICKTEST_OMIT is set, it is a comma-separated
   141    # list of regular expressions to match against test file names in
   142    # the "allquicktests" set. Any matches are excluded. Only the filename
   143    # is matched, not any directory component of the path.
   144    set all [list]
   145    foreach a $allquicktests {
   146      set bIn 1
   147      foreach x [split $::env(QUICKTEST_OMIT) ,] {
   148        if {[regexp $x [file tail $a]]} {
   149          set bIn 0
   150          break
   151        }
   152      }
   153      if {$bIn} {
   154        lappend all $a
   155      }
   156    }
   157    set allquicktests $all
   158  }
   159  
   160  # If the TEST_FAILURE environment variable is set, it means that we what to
   161  # deliberately provoke test failures in order to test the test infrastructure.
   162  # Only the main.test module is needed for this.
   163  #
   164  if {[info exists ::env(TEST_FAILURE)]} {
   165    set allquicktests main.test
   166  }
   167  
   168  #############################################################################
   169  # Start of tests
   170  #
   171  
   172  #-------------------------------------------------------------------------
   173  # Define the generic test suites:
   174  #
   175  #   veryquick
   176  #   quick
   177  #   full
   178  #
   179  lappend ::testsuitelist xxx
   180  
   181  test_suite "veryquick" -prefix "" -description {
   182    "Very" quick test suite. Runs in minutes on a workstation.
   183    This test suite is the same as the "quick" tests, except that some files
   184    that test malloc and IO errors are omitted.
   185  } -files [
   186    test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
   187        *fts5corrupt* *fts5big* *fts5aj*
   188  ]
   189  
   190  test_suite "shell" -prefix "" -description {
   191    Run tests of the command-line shell
   192  } -files [
   193    test_set [glob $testdir/shell*.test]
   194  ]
   195  
   196  test_suite "extraquick" -prefix "" -description {
   197    "Extra" quick test suite. Runs in a few minutes on a workstation.
   198    This test suite is the same as the "veryquick" tests, except that
   199    slower tests are omitted.
   200  } -files [
   201    test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
   202       wal3.test fts4merge* sort2.test mmap1.test walcrash* \
   203       percentile.test where8m.test walcksum.test savepoint3.test \
   204       fuzzer1.test fuzzer3.test fts3expr3.test
   205  ]
   206  
   207  test_suite "mmap" -prefix "mm-" -description {
   208    Similar to veryquick. Except with memory mapping enabled.
   209  } -presql {
   210    pragma mmap_size = 268435456;
   211  } -files [
   212    test_set $allquicktests -exclude *malloc* *ioerr* *fault* -include malloc.test
   213  ]
   214  
   215  test_suite "valgrind" -prefix "" -description {
   216    Run the "veryquick" test suite with a couple of multi-process tests (that
   217    fail under valgrind) omitted.
   218  } -files [
   219    test_set $allquicktests -exclude *malloc* *ioerr* *fault* *_err* wal.test \
   220                shell*.test crash8.test atof1.test selectG.test \
   221                tkt-fc62af4523.test numindex1.test corruptK.test
   222  ] -initialize {
   223    set ::G(valgrind) 1
   224  } -shutdown {
   225    unset -nocomplain ::G(valgrind)
   226  }
   227  
   228  test_suite "valgrind-nolookaside" -prefix "" -description {
   229    Run the "veryquick" test suite with a couple of multi-process tests (that
   230    fail under valgrind) omitted.
   231  } -files [
   232    test_set $allquicktests -exclude *malloc* *ioerr* *fault* *_err* \
   233        wal.test atof1.test
   234  ] -initialize {
   235    set ::G(valgrind) 1
   236    catch {db close}
   237    sqlite3_shutdown
   238    sqlite3_config_lookaside 0 0
   239    sqlite3_initialize
   240    autoinstall_test_functions
   241  } -shutdown {
   242    catch {db close}
   243    sqlite3_shutdown
   244    sqlite3_config_lookaside 100 500
   245    sqlite3_initialize
   246    autoinstall_test_functions
   247    unset -nocomplain ::G(valgrind)
   248  }
   249  
   250  
   251  test_suite "quick" -prefix "" -description {
   252    Quick test suite. Runs in around 10 minutes on a workstation.
   253  } -files [
   254    test_set $allquicktests
   255  ]
   256  
   257  test_suite "full" -prefix "" -description {
   258    Full test suite. Takes a long time.
   259  } -files [ 
   260    test_set $alltests 
   261  ] -initialize {
   262    unset -nocomplain ::G(isquick)
   263  }
   264  
   265  test_suite "threads" -prefix "" -description {
   266    All multi-threaded tests.
   267  } -files {
   268    notify2.test   thread001.test thread002.test thread003.test 
   269    thread004.test thread005.test walthread.test
   270  }
   271  
   272  test_suite "fts3" -prefix "" -description {
   273    All FTS3 tests except fts3rnd.test.
   274  } -files {
   275    fts3aa.test fts3ab.test fts3ac.test fts3ad.test
   276    fts3ae.test fts3af.test fts3ag.test fts3ah.test
   277    fts3ai.test fts3aj.test fts3ak.test fts3al.test
   278    fts3am.test fts3an.test fts3ao.test fts3atoken.test
   279    fts3auto.test fts3aux1.test fts3aux2.test fts3b.test
   280    fts3comp1.test fts3conf.test fts3corrupt2.test fts3corrupt.test
   281    fts3corrupt4.test
   282    fts3cov.test fts3c.test fts3defer2.test fts3defer3.test
   283    fts3defer.test fts3drop.test fts3d.test fts3e.test
   284    fts3expr2.test fts3expr3.test fts3expr4.test fts3expr5.test
   285    fts3expr.test fts3fault2.test fts3fault.test fts3first.test
   286    fts3join.test fts3malloc.test fts3matchinfo.test fts3near.test
   287    fts3offsets.test fts3prefix2.test fts3prefix.test fts3query.test
   288    fts3shared.test fts3snippet.test fts3sort.test fts3tok1.test
   289    fts3tok_err.test fts3varint.test fts4aa.test fts4check.test
   290    fts4content.test fts4docid.test fts4growth2.test fts4growth.test
   291    fts4incr.test fts4langid.test fts4lastrowid.test fts4merge2.test
   292    fts4merge4.test fts4merge.test fts4noti.test fts4onepass.test 
   293    fts4opt.test fts4unicode.test
   294    fts3corrupt3.test
   295    fts3misc.test
   296  }
   297  
   298  test_suite "fts5" -prefix "" -description {
   299    All FTS5 tests.
   300  } -files [glob -nocomplain $::testdir/../ext/fts5/test/*.test]
   301  
   302  test_suite "fts5-light" -prefix "" -description {
   303    All FTS5 tests.
   304  } -files [
   305    test_set \
   306        [glob -nocomplain $::testdir/../ext/fts5/test/*.test] \
   307        -exclude *corrupt* *fault* *big* *fts5aj*
   308  ]
   309  
   310  test_suite "window" -prefix "" -description {
   311    All window function related tests .
   312  } -files [
   313    test_set [glob -nocomplain $::testdir/window*.test]
   314  ]
   315  
   316  test_suite "lsm1" -prefix "" -description {
   317    All LSM1 tests.
   318  } -files [glob -nocomplain $::testdir/../ext/lsm1/test/*.test]
   319  
   320  test_suite "nofaultsim" -prefix "" -description {
   321    "Very" quick test suite. Runs in less than 5 minutes on a workstation. 
   322    This test suite is the same as the "quick" tests, except that some files
   323    that test malloc and IO errors are omitted.
   324  } -files [
   325    test_set $allquicktests -exclude *malloc* *ioerr* *fault* *_err*
   326  ] -initialize {
   327    catch {db close}
   328    sqlite3_shutdown
   329    install_malloc_faultsim 0
   330    sqlite3_initialize
   331    autoinstall_test_functions
   332  } -shutdown {
   333    unset -nocomplain ::G(valgrind)
   334  }
   335  
   336  test_suite "queryplanner" -prefix "" -description {
   337    Tests of the query planner and query optimizer
   338  } -files {
   339    alter2.test alter3.test alter4.test alter.test analyze3.test
   340    analyze4.test analyze5.test analyze6.test analyze7.test analyze8.test
   341    analyze.test attach2.test attach3.test attach4.test
   342    attach.test autoinc.test autoindex1.test between.test cast.test
   343    check.test closure01.test coalesce.test collate1.test collate2.test
   344    collate3.test collate4.test collate5.test collate6.test collate7.test
   345    collate8.test collate9.test collateA.test colmeta.test colname.test
   346    conflict.test count.test coveridxscan.test createtab.test cse.test
   347    date.test dbstatus2.test dbstatus.test default.test delete2.test
   348    delete3.test delete.test descidx1.test descidx2.test descidx3.test
   349    distinctagg.test distinct.test e_createtable.test e_delete.test
   350    e_droptrigger.test e_dropview.test e_expr.test e_insert.test
   351    eqp.test e_reindex.test e_resolve.test e_select2.test e_select.test
   352    e_update.test exists.test expr.test fkey1.test fkey2.test fkey3.test
   353    fkey4.test fkey5.test func2.test func3.test func.test 
   354    in3.test in4.test in5.test index2.test index3.test
   355    index4.test index5.test indexedby.test index.test
   356    insert2.test insert3.test insert4.test insert5.test insert.test
   357    instr.test in.test intpkey.test join2.test join3.test join4.test
   358    join5.test join6.test join.test like2.test like.test limit.test
   359    minmax2.test minmax3.test minmax4.test minmax.test misc1.test misc2.test
   360    misc3.test misc4.test misc5.test misc6.test misc7.test orderby1.test
   361    orderby2.test orderby3.test orderby4.test randexpr1.test regexp1.test
   362    reindex.test rowhash.test rowid.test schema2.test schema3.test
   363    schema4.test schema5.test schema.test
   364    select1.test select2.test select3.test select4.test select5.test
   365    select6.test select7.test select8.test select9.test selectA.test
   366    selectB.test selectC.test selectD.test selectE.test sidedelete.test
   367    sort.test spellfix.test subquery2.test subquery.test subselect.test
   368    substr.test tkt-02a8e81d44.test tkt1435.test tkt1443.test tkt1444.test
   369    tkt1449.test tkt1473.test tkt1501.test tkt1512.test tkt1514.test
   370    tkt1536.test tkt1537.test tkt1567.test tkt1644.test tkt1667.test
   371    tkt1873.test tkt2141.test tkt2192.test tkt2213.test tkt2251.test
   372    tkt2285.test tkt2332.test tkt2339.test tkt2391.test tkt2409.test
   373    tkt2450.test tkt2565.test tkt2640.test tkt2643.test tkt2686.test
   374    tkt-26ff0c2d1e.test tkt2767.test tkt2817.test tkt2820.test tkt2822.test
   375    tkt2832.test tkt2854.test tkt2920.test tkt2927.test tkt2942.test
   376    tkt-2a5629202f.test tkt-2d1a5c67d.test tkt-2ea2425d34.test tkt3080.test
   377    tkt3093.test tkt3121.test tkt-31338dca7e.test tkt-313723c356.test
   378    tkt3201.test tkt3292.test tkt3298.test tkt3334.test tkt3346.test
   379    tkt3357.test tkt3419.test tkt3424.test tkt3442.test tkt3457.test
   380    tkt3461.test tkt3493.test tkt3508.test tkt3522.test tkt3527.test
   381    tkt3541.test tkt3554.test tkt3581.test tkt35xx.test tkt3630.test
   382    tkt3718.test tkt3731.test tkt3757.test tkt3761.test tkt3762.test
   383    tkt3773.test tkt3791.test tkt3793.test tkt3810.test tkt3824.test
   384    tkt3832.test tkt3838.test tkt3841.test tkt-385a5b56b9.test tkt3871.test
   385    tkt3879.test tkt-38cb5df375.test tkt3911.test tkt3918.test tkt3922.test
   386    tkt3929.test tkt3935.test tkt3992.test tkt3997.test tkt-3998683a16.test
   387    tkt-3a77c9714e.test tkt-3fe897352e.test tkt4018.test tkt-4a03edc4c8.test
   388    tkt-4dd95f6943.test tkt-54844eea3f.test tkt-5d863f876e.test
   389    tkt-5e10420e8d.test tkt-5ee23731f.test tkt-6bfb98dfc0.test
   390    tkt-752e1646fc.test tkt-78e04e52ea.test tkt-7a31705a7e6.test
   391    tkt-7bbfb7d442.test tkt-80ba201079.test tkt-80e031a00f.test
   392    tkt-8454a207b9.test tkt-91e2e8ba6f.test tkt-94c04eaadb.test
   393    tkt-9d68c883.test tkt-a7b7803e.test tkt-b1d3a2e531.test
   394    tkt-b351d95f9.test tkt-b72787b1.test tkt-bd484a090c.test
   395    tkt-bdc6bbbb38.test tkt-c48d99d690.test tkt-cbd054fa6b.test
   396    tkt-d11f09d36e.test tkt-d635236375.test tkt-d82e3f3721.test
   397    tkt-f3e5abed55.test tkt-f777251dc7a.test tkt-f7b4edec.test
   398    tkt-f973c7ac31.test tkt-fa7bf5ec.test tkt-fc62af4523.test
   399    tkt-fc7bd6358f.test trigger1.test trigger2.test trigger3.test
   400    trigger4.test trigger5.test trigger6.test trigger7.test trigger8.test
   401    trigger9.test triggerA.test triggerB.test triggerC.test triggerD.test
   402    types2.test types3.test types.test unique.test unordered.test
   403    update.test view.test vtab1.test vtab2.test vtab3.test vtab4.test
   404    vtab5.test vtab6.test vtab7.test vtab8.test vtab9.test vtab_alter.test
   405    vtabA.test vtabB.test vtabC.test vtabD.test vtabE.test
   406    vtabF.test where2.test where3.test where4.test where5.test where6.test
   407    where7.test where8m.test where8.test where9.test whereA.test whereB.test
   408    whereC.test whereD.test whereE.test whereF.test wherelimit.test
   409    where.test
   410  }
   411  
   412  test_suite "vfslog" -prefix "" -description {
   413    "Vfslog" quick test suite. Like "veryquick" except does not omits
   414    a few tests that do not work with a version 1 VFS. And the quota* tests,
   415    which do not work with a VFS that uses the pVfs argument passed to
   416    sqlite3_vfs methods.
   417  } -files [
   418    test_set $allquicktests -exclude *malloc* *ioerr* *fault* oserror.test \
   419    pager1.test syscall.test sysfault.test tkt3457.test quota* superlock* \
   420    wal* mmap*
   421  ]
   422  
   423  test_suite "atomic-batch-write" -prefix "" -description {
   424    Like veryquick.test, but must be run on a file-system that supports
   425    atomic-batch-writes. Tests that depend on the journal file being present
   426    are omitted.
   427  } -files [
   428    test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
   429        *fts5corrupt* *fts5big* *fts5aj*  \
   430        crash8.test delete_db.test        \
   431        exclusive.test journal3.test      \
   432        journal1.test                     \
   433        jrnlmode.test jrnlmode2.test      \
   434        lock4.test pager1.test            \
   435        pager3.test sharedA.test          \
   436        symlink.test stmt.test            \
   437        sync.test sync2.test              \
   438        tempdb.test tkt3457.test          \
   439        vacuum5.test wal2.test            \
   440        walmode.test zerodamage.test
   441  ] -initialize {
   442    if {[atomic_batch_write test.db]==0} {
   443      error "File system does NOT support atomic-batch-write"
   444    }
   445  }
   446  
   447  lappend ::testsuitelist xxx
   448  #-------------------------------------------------------------------------
   449  # Define the coverage related test suites:
   450  #
   451  #   coverage-wal
   452  #
   453  test_suite "coverage-wal" -description {
   454    Coverage tests for file wal.c.
   455  } -files {
   456    wal.test wal2.test wal3.test wal4.test wal5.test
   457    wal64k.test wal6.test wal7.test wal8.test wal9.test
   458    walbak.test walbig.test walblock.test walcksum.test walcrash2.test
   459    walcrash3.test walcrash4.test walcrash.test walfault.test walhook.test
   460    walmode.test walnoshm.test waloverwrite.test walpersist.test 
   461    walprotocol2.test walprotocol.test walro2.test walrofault.test 
   462    walro.test walshared.test walslow.test walvfs.test
   463    walfault2.test
   464    nockpt.test
   465  
   466    snapshot2.test snapshot3.test snapshot4.test
   467    snapshot_fault.test snapshot.test snapshot_up.test
   468  } 
   469  
   470  test_suite "coverage-pager" -description {
   471    Coverage tests for file pager.c.
   472  } -files {
   473    pager1.test    pager2.test  pagerfault.test  pagerfault2.test
   474    walfault.test  walbak.test  journal2.test    tkt-9d68c883.test
   475  } 
   476  
   477  test_suite "coverage-analyze" -description {
   478    Coverage tests for file analyze.c.
   479  } -files {
   480    analyze3.test analyze4.test analyze5.test analyze6.test
   481    analyze7.test analyze8.test analyze9.test
   482    analyze.test mallocA.test
   483  } 
   484  
   485  test_suite "coverage-sorter" -description {
   486    Coverage tests for file vdbesort.c.
   487  } -files {
   488    sort.test sortfault.test
   489  } 
   490  
   491  
   492  lappend ::testsuitelist xxx
   493  #-------------------------------------------------------------------------
   494  # Define the permutation test suites:
   495  #
   496  
   497  # Run some tests using pre-allocated page blocks.
   498  #
   499  # mmap1.test is excluded because a good number of its tests depend on 
   500  # the page-cache being larger than the database. But this permutation
   501  # causes the effective limit on the page-cache to be just 24 pages.
   502  #
   503  test_suite "memsubsys1" -description {
   504    Tests using pre-allocated page blocks
   505  } -files [
   506    test_set $::allquicktests -exclude ioerr5.test malloc5.test mmap1.test
   507  ] -initialize {
   508    test_set_config_pagecache 4096 24
   509    catch {db close}
   510    sqlite3_shutdown
   511    sqlite3_initialize
   512    autoinstall_test_functions
   513  } -shutdown {
   514    test_restore_config_pagecache
   515    catch {db close}
   516    sqlite3_shutdown
   517    sqlite3_initialize
   518    autoinstall_test_functions
   519  }
   520  
   521  # Run some tests using pre-allocated page blocks. This time
   522  # the allocations are too small to use in most cases.
   523  #
   524  # Both ioerr5.test and malloc5.test are excluded because they test the
   525  # sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality.
   526  # This functionality is disabled if a pre-allocated page block is provided.
   527  #
   528  test_suite "memsubsys2" -description {
   529    Tests using small pre-allocated page blocks
   530  } -files [
   531    test_set $::allquicktests -exclude ioerr5.test malloc5.test
   532  ] -initialize {
   533    test_set_config_pagecache 512 5
   534    catch {db close}
   535    sqlite3_shutdown
   536    sqlite3_initialize
   537    autoinstall_test_functions
   538  } -shutdown {
   539    test_restore_config_pagecache
   540    catch {db close}
   541    sqlite3_shutdown
   542    sqlite3_initialize
   543    autoinstall_test_functions
   544  }
   545  
   546  # Run all tests with the lookaside allocator disabled.
   547  #
   548  test_suite "nolookaside" -description {
   549    OOM tests with lookaside disabled
   550  } -initialize {
   551    catch {db close}
   552    sqlite3_shutdown
   553    sqlite3_config_lookaside 0 0
   554    sqlite3_initialize
   555    autoinstall_test_functions
   556  } -shutdown {
   557    catch {db close}
   558    sqlite3_shutdown
   559    sqlite3_config_lookaside 100 500
   560    sqlite3_initialize
   561    autoinstall_test_functions
   562  } -files $::allquicktests
   563  
   564  # Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
   565  #
   566  test_suite "singlethread" -description {
   567    Tests run in SQLITE_CONFIG_SINGLETHREAD mode
   568  } -initialize {
   569    catch {db close}
   570    sqlite3_shutdown
   571    catch {sqlite3_config singlethread}
   572    sqlite3_initialize
   573    autoinstall_test_functions
   574  } -files {
   575    delete.test   delete2.test  insert.test  rollback.test  select1.test
   576    select2.test  trans.test    update.test  vacuum.test    types.test
   577    types2.test   types3.test
   578  } -shutdown {
   579    catch {db close}
   580    sqlite3_shutdown
   581    catch {sqlite3_config serialized}
   582    sqlite3_initialize
   583    autoinstall_test_functions
   584  }
   585  
   586  test_suite "nomutex" -description {
   587    Tests run with the SQLITE_OPEN_MULTITHREADED flag passed to sqlite3_open().
   588  } -initialize {
   589    set ::G(perm:sqlite3_args) [list -fullmutex 0 -nomutex 1]
   590  } -files {
   591    delete.test   delete2.test  insert.test  rollback.test  select1.test
   592    select2.test  trans.test    update.test  vacuum.test    types.test
   593    types2.test   types3.test
   594  } 
   595  
   596  # Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
   597  #
   598  test_suite "multithread" -description {
   599    Tests run in SQLITE_CONFIG_MULTITHREAD mode
   600  } -initialize {
   601    catch {db close}
   602    sqlite3_shutdown
   603    catch {sqlite3_config multithread}
   604    sqlite3_initialize
   605    autoinstall_test_functions
   606  } -files {
   607    delete.test   delete2.test  insert.test  rollback.test  select1.test
   608    select2.test  trans.test    update.test  vacuum.test    types.test
   609    types2.test   types3.test   sort4.test
   610  } -shutdown {
   611    catch {db close}
   612    sqlite3_shutdown
   613    catch {sqlite3_config serialized}
   614    sqlite3_initialize
   615    autoinstall_test_functions
   616  }
   617  
   618  # Run some tests in SQLITE_OPEN_FULLMUTEX mode.
   619  #
   620  test_suite "fullmutex" -description {
   621    Tests run in SQLITE_OPEN_FULLMUTEX mode
   622  } -initialize {
   623    set ::G(perm:sqlite3_args) [list -nomutex 0 -fullmutex 1]
   624  } -files {
   625    delete.test   delete2.test  insert.test  rollback.test  select1.test
   626    select2.test  trans.test    update.test  vacuum.test    types.test
   627    types2.test   types3.test
   628  }
   629  
   630  # Run some tests using the "onefile" demo.
   631  #
   632  test_suite "onefile" -description {
   633    Run some tests using the "test_onefile.c" demo
   634  } -initialize {
   635    set ::G(perm:sqlite3_args) [list -vfs fs]
   636  } -files {
   637    conflict.test  insert.test   insert2.test  insert3.test
   638    rollback.test  select1.test  select2.test  select3.test
   639  }
   640  
   641  # Run some tests using UTF-16 databases.
   642  #
   643  test_suite "utf16" -description {
   644    Run tests using UTF-16 databases
   645  } -presql {
   646    pragma encoding = 'UTF-16'
   647  } -files {
   648      alter.test alter3.test
   649      analyze.test analyze3.test analyze4.test analyze5.test analyze6.test
   650      analyze7.test analyze8.test analyze9.test
   651      auth.test bind.test blob.test capi2.test capi3.test collate1.test
   652      collate2.test collate3.test collate4.test collate5.test collate6.test
   653      conflict.test date.test delete.test expr.test fkey1.test func.test
   654      hook.test index.test insert2.test insert.test interrupt.test in.test
   655      intpkey.test ioerr.test join2.test join.test lastinsert.test
   656      laststmtchanges.test limit.test lock2.test lock.test main.test 
   657      memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
   658      null.test progress.test quote.test rowid.test select1.test select2.test
   659      select3.test select4.test select5.test select6.test sort.test 
   660      subselect.test tableapi.test table.test temptable.test
   661      trace.test trigger1.test trigger2.test trigger3.test
   662      trigger4.test types2.test types.test unique.test update.test
   663      vacuum.test view.test where.test
   664      bestindex1.test
   665  }
   666  
   667  # Run some tests in exclusive locking mode.
   668  #
   669  test_suite "exclusive" -description {
   670    Run tests in exclusive locking mode.
   671  } -presql {
   672    pragma locking_mode = 'exclusive'
   673  } -files {
   674    rollback.test select1.test select2.test 
   675    malloc.test ioerr.test
   676  } 
   677  
   678  # Run some tests in exclusive locking mode with truncated journals.
   679  #
   680  test_suite "exclusive-truncate" -description {
   681    Run tests in exclusive locking mode and truncate journal mode.
   682  } -presql {
   683    pragma locking_mode = 'exclusive';
   684    pragma journal_mode = TRUNCATE;
   685  } -files {
   686    delete.test delete2.test insert.test rollback.test select1.test
   687    select2.test update.test malloc.test ioerr.test
   688  } 
   689  
   690  # Run some tests in persistent journal mode.
   691  #
   692  test_suite "persistent_journal" -description {
   693    Run tests in persistent-journal mode.
   694  } -presql {
   695    pragma journal_mode = persist
   696  } -files {
   697    delete.test delete2.test insert.test rollback.test select1.test
   698    select2.test trans.test update.test vacuum.test 
   699  }
   700  
   701  # Run some tests in truncating journal mode.
   702  #
   703  test_suite "truncate_journal" -description {
   704    Run tests in persistent-journal mode.
   705  } -presql {
   706    pragma journal_mode = truncate
   707  } -files {
   708    delete.test delete2.test insert.test rollback.test select1.test
   709    select2.test trans.test update.test vacuum.test 
   710    malloc.test ioerr.test
   711  }
   712  
   713  # Run some error tests in persistent journal mode.
   714  #
   715  test_suite "persistent_journal_error" -description {
   716    Run malloc.test and ioerr.test in persistent-journal mode.
   717  } -presql {
   718    pragma journal_mode = persist
   719  } -files {
   720    malloc.test ioerr.test
   721  }
   722  
   723  # Run some tests in no journal mode.
   724  #
   725  test_suite "no_journal" -description {
   726    Run tests in no-journal mode.
   727  } -presql {
   728    pragma journal_mode = persist
   729  } -files {
   730    delete.test delete2.test insert.test rollback.test select1.test
   731    select2.test trans.test update.test vacuum.test 
   732  }
   733  
   734  # Run some error tests in no journal mode.
   735  #
   736  test_suite "no_journal_error" -description {
   737    Run malloc.test and ioerr.test in no-journal mode.
   738  } -presql {
   739    pragma journal_mode = persist
   740  } -files {
   741    malloc.test ioerr.test
   742  }
   743  
   744  # Run some crash-tests in autovacuum mode.
   745  #
   746  test_suite "autovacuum_crash" -description {
   747    Run crash.test in autovacuum mode.
   748  } -presql {
   749    pragma auto_vacuum = 1
   750  } -files crash.test
   751  
   752  # Run some ioerr-tests in autovacuum mode.
   753  #
   754  test_suite "autovacuum_ioerr" -description {
   755    Run ioerr.test in autovacuum mode.
   756  } -presql {
   757    pragma auto_vacuum = 1
   758  } -files ioerr.test
   759  
   760  # Run tests with an in-memory journal.
   761  #
   762  test_suite "inmemory_journal" -description {
   763    Run tests with an in-memory journal file.
   764  } -presql {
   765    pragma journal_mode = 'memory'
   766  } -files [test_set $::allquicktests -exclude {
   767    # Exclude all tests that simulate IO errors.
   768    autovacuum_ioerr2.test cffault.test incrvacuum_ioerr.test ioerr.test
   769    ioerr.test ioerr2.test ioerr3.test ioerr4.test ioerr5.test
   770    vacuum3.test incrblob_err.test diskfull.test backup_ioerr.test
   771    e_fts3.test fts3cov.test fts3malloc.test fts3rnd.test
   772    fts3snippet.test mmapfault.test sessionfault.test sessionfault2.test
   773  
   774    # Exclude test scripts that use tcl IO to access journal files or count
   775    # the number of fsync() calls.
   776    pager.test exclusive.test jrnlmode.test sync.test misc1.test 
   777    journal1.test conflict.test crash8.test tkt3457.test io.test
   778    journal3.test 8_3_names.test shmlock.test
   779  
   780    pager1.test async4.test corrupt.test filefmt.test pager2.test
   781    corrupt5.test corruptA.test pageropt.test
   782  
   783    # Exclude stmt.test, which expects sub-journals to use temporary files.
   784    stmt.test symlink.test
   785  
   786    zerodamage.test
   787  
   788    # WAL mode is different.
   789    wal* tkt-2d1a5c67d.test backcompat.test e_wal* rowallock.test
   790  
   791    # This test does not work as the "PRAGMA journal_mode = memory"
   792    # statement switches the database out of wal mode at inopportune
   793    # times.
   794    snapshot_fault.test
   795    
   796    # This test assumes a journal file is created on disk.
   797    delete_db.test
   798    
   799    # This test depends on a successful recovery from the pager error 
   800    # state. Which is not possible with an in-memory journal
   801    fts5fault1.test
   802  }]
   803  
   804  ifcapable mem3 {
   805    test_suite "memsys3" -description {
   806      Run tests using the allocator in mem3.c.
   807    } -files [test_set $::allquicktests -exclude {
   808      autovacuum.test           delete3.test              manydb.test
   809      bigrow.test               incrblob2.test            memdb.test
   810      bitvec.test               index2.test               memsubsys1.test
   811      capi3c.test               ioerr.test                memsubsys2.test
   812      capi3.test                join3.test                pagesize.test
   813      collate5.test             limit.test                backup_ioerr.test
   814      backup_malloc.test
   815    }] -initialize {
   816      catch {db close}
   817      sqlite3_reset_auto_extension
   818      sqlite3_shutdown
   819      sqlite3_config_heap 25000000 0
   820      sqlite3_config_lookaside 0 0
   821      ifcapable mem5 {
   822        # If both memsys3 and memsys5 are enabled in the build, the call to
   823        # [sqlite3_config_heap] will initialize the system to use memsys5.
   824        # The following overrides this preference and installs the memsys3
   825        # allocator.
   826        sqlite3_install_memsys3
   827      }
   828      install_malloc_faultsim 1 
   829      sqlite3_initialize
   830      autoinstall_test_functions
   831    } -shutdown {
   832      catch {db close}
   833      sqlite3_shutdown
   834      sqlite3_config_heap 0 0
   835      sqlite3_config_lookaside 100 500
   836      install_malloc_faultsim 1 
   837      sqlite3_initialize
   838      autoinstall_test_functions
   839    }
   840  }
   841  
   842  ifcapable mem5 {
   843    test_suite "memsys5" -description {
   844      Run tests using the allocator in mem5.c.
   845    } -files [test_set $::allquicktests -exclude {
   846      autovacuum.test           delete3.test              manydb.test
   847      bigrow.test               incrblob2.test            memdb.test
   848      bitvec.test               index2.test               memsubsys1.test
   849      capi3c.test               ioerr.test                memsubsys2.test
   850      capi3.test                join3.test                pagesize.test
   851      collate5.test             limit.test                zeroblob.test
   852    }] -initialize {
   853      catch {db close}
   854      sqlite3_shutdown
   855      sqlite3_config_heap 25000000 64
   856      sqlite3_config_lookaside 0 0
   857      install_malloc_faultsim 1 
   858      sqlite3_initialize
   859      autoinstall_test_functions
   860    } -shutdown {
   861      catch {db close}
   862      sqlite3_shutdown
   863      sqlite3_config_heap 0 0
   864      sqlite3_config_lookaside 100 500
   865      install_malloc_faultsim 1 
   866      sqlite3_initialize
   867      autoinstall_test_functions
   868    }
   869  
   870    test_suite "memsys5-2" -description {
   871      Run tests using the allocator in mem5.c in a different configuration.
   872    } -files {
   873      select1.test 
   874    } -initialize {
   875      catch {db close}
   876      sqlite3_shutdown
   877      sqlite3_config_memstatus 0
   878      sqlite3_config_heap 40000000 16
   879      sqlite3_config_lookaside 0 0
   880      install_malloc_faultsim 1 
   881      sqlite3_initialize
   882      autoinstall_test_functions
   883    } -shutdown {
   884      catch {db close}
   885      sqlite3_shutdown
   886      sqlite3_config_heap 0 0
   887      sqlite3_config_lookaside 100 500
   888      install_malloc_faultsim 1 
   889      sqlite3_initialize
   890      autoinstall_test_functions
   891    }
   892  }
   893  
   894  ifcapable threadsafe {
   895    test_suite "no_mutex_try" -description {
   896       The sqlite3_mutex_try() interface always fails
   897    } -files [
   898      test_set $::allquicktests -exclude mutex1.test mutex2.test
   899    ] -initialize {
   900      catch {db close}
   901      sqlite3_shutdown
   902      install_mutex_counters 1
   903      set ::disable_mutex_try 1
   904      sqlite3_initialize
   905      autoinstall_test_functions
   906    } -shutdown {
   907      catch {db close}
   908      sqlite3_shutdown
   909      install_mutex_counters 0
   910      sqlite3_initialize
   911      autoinstall_test_functions
   912    }
   913  }
   914  
   915  # run_tests "crash_safe_append" -description {
   916  #   Run crash.test with persistent journals on a SAFE_APPEND file-system.
   917  # } -initialize {
   918  #   rename crashsql sa_crashsql
   919  #   proc crashsql {args} {
   920  #     set options [lrange $args 0 [expr {[llength $args]-2}]]
   921  #     lappend options -char safe_append
   922  #     set sql [lindex $args end]
   923  #     lappend options "
   924  #       PRAGMA journal_mode=persistent;
   925  #       $sql
   926  #     "
   927  #     set fd [open test.db-journal w]
   928  #     puts $fd [string repeat 1234567890 100000]
   929  #     close $fd
   930  #     eval sa_crashsql $options
   931  #   }
   932  # } -shutdown {
   933  #   rename crashsql {}
   934  #   rename sa_crashsql crashsql
   935  # } -files crash.test
   936  
   937  test_suite "safe_append" -description {
   938    Run some tests on a SAFE_APPEND file-system.
   939  } -initialize {
   940    set ::G(perm:sqlite3_args) [list -vfs devsym]
   941    sqlite3_simulate_device -char safe_append
   942  } -files [
   943    test_set $::allquicktests shared_err.test -exclude async3.test
   944  ]
   945  
   946  # The set of tests to run on the alternative-pcache
   947  set perm-alt-pcache-testset {
   948    async.test
   949    attach.test
   950    delete.test delete2.test
   951    index.test
   952    insert.test insert2.test
   953    join.test join2.test
   954    rollback.test
   955    select1.test select2.test
   956    trans.test
   957    update.test
   958  }
   959  
   960  foreach discard_rate {0 10 50 90 100} {
   961    test_suite "pcache${discard_rate}" -description "
   962      Alternative pcache implementation with ${discard_rate}% random discard
   963    " -initialize "
   964      catch {db close}
   965      sqlite3_shutdown
   966      sqlite3_config_alt_pcache 1 $discard_rate 1
   967      sqlite3_initialize
   968      autoinstall_test_functions
   969    " -shutdown {
   970      catch {db close}
   971      sqlite3_shutdown
   972      sqlite3_config_alt_pcache 0 0 0
   973      sqlite3_config_lookaside 100 500
   974      install_malloc_faultsim 1 
   975      sqlite3_initialize
   976      autoinstall_test_functions
   977    } -files ${perm-alt-pcache-testset}
   978  }
   979  
   980  test_suite "journaltest" -description {
   981    Check that pages are synced before being written (test_journal.c).
   982  } -initialize {
   983    catch {db close}
   984    register_jt_vfs -default ""
   985  } -shutdown {
   986    unregister_jt_vfs
   987  } -files [test_set $::allquicktests -exclude {
   988    wal* incrvacuum.test ioerr.test corrupt4.test io.test crash8.test 
   989    async4.test bigfile.test backcompat.test e_wal* fstat.test mmap2.test
   990    pager1.test syscall.test tkt3457.test *malloc* mmap* multiplex* nolock*
   991    pager2.test *fault* rowal* snapshot* superlock* symlink.test
   992    delete_db.test shmlock.test chunksize.test
   993    busy2.test avfs.test external_reader.test
   994  }]
   995  
   996  if {[info commands register_demovfs] != ""} {
   997    test_suite "demovfs" -description {
   998      Check that the demovfs (code in test_demovfs.c) more or less works.
   999    } -initialize {
  1000      register_demovfs
  1001    } -shutdown {
  1002      unregister_demovfs
  1003    } -files {
  1004      insert.test   insert2.test  insert3.test rollback.test 
  1005      select1.test  select2.test  select3.test
  1006    }
  1007  }
  1008  
  1009  test_suite "wal" -description {
  1010    Run tests with journal_mode=WAL
  1011  } -initialize {
  1012    set ::G(savepoint6_iterations) 100
  1013  } -shutdown {
  1014    unset -nocomplain ::G(savepoint6_iterations)
  1015  } -files {
  1016    savepoint.test     savepoint2.test     savepoint6.test
  1017    trans.test         avtrans.test
  1018  
  1019    fts3aa.test  fts3ab.test  fts3ac.test  fts3ad.test
  1020    fts3ae.test  fts3af.test  fts3ag.test  fts3ah.test
  1021    fts3ai.test  fts3aj.test  fts3ak.test  fts3al.test
  1022    fts3am.test  fts3an.test  fts3ao.test  fts3b.test
  1023    fts3c.test   fts3d.test   fts3e.test   fts3query.test 
  1024  }
  1025  
  1026  test_suite "rtree" -description {
  1027    All R-tree related tests. Provides coverage of source file rtree.c.
  1028  } -files [glob -nocomplain $::testdir/../ext/rtree/*.test]
  1029  
  1030  test_suite "session" -description {
  1031    All session module related tests. 
  1032  } -files [glob -nocomplain $::testdir/../ext/session/*.test]
  1033  
  1034  test_suite "session_eec" -description {
  1035    All session module related tests with sqlite3_extended_result_codes() set. 
  1036  } -files [
  1037    glob -nocomplain $::testdir/../ext/session/*.test
  1038  ] -dbconfig {
  1039    sqlite3_extended_result_codes $::dbhandle 1
  1040  }
  1041  
  1042  test_suite "session_strm" -description {
  1043    All session module related tests using the streaming APIs.
  1044  } -files [
  1045    glob -nocomplain $::testdir/../ext/session/*.test
  1046  ] -dbconfig {
  1047    set ::sqlite3session_streams 1
  1048  }
  1049  
  1050  test_suite "rbu" -description {
  1051    RBU tests.
  1052  } -files [
  1053    test_set [glob -nocomplain $::testdir/../ext/rbu/*.test] -exclude rbu.test
  1054  ]
  1055  
  1056  test_suite "no_optimization" -description {
  1057    Run test scripts with optimizations disabled using the
  1058    sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS) interface.
  1059  } -files [
  1060    test_set \
  1061      [glob -nocomplain $::testdir/window*.test]                       \
  1062      where.test where2.test where3.test where4.test where5.test       \
  1063      where6.test where7.test where8.test where9.test                  \
  1064      whereA.test whereB.test wherelimit.test                          \
  1065      select1.test select2.test select3.test select4.test select5.test \
  1066      select7.test select8.test selectA.test selectC.test              \
  1067      -exclude windowpushd.test
  1068  ] -dbconfig {
  1069    optimization_control $::dbhandle all 0
  1070  }
  1071  
  1072  test_suite "prepare" -description {
  1073    Run tests with the db connection using sqlite3_prepare() instead of _v2().
  1074  } -dbconfig {
  1075    $::dbhandle version -use-legacy-prepare 1
  1076    #$::dbhandle cache size 0
  1077  } -files [
  1078    test_set $allquicktests -exclude *malloc* *ioerr* *fault* \
  1079        stmtvtab1.test index9.test
  1080  ]
  1081  
  1082  test_suite "sorterref" -prefix "" -description {
  1083    Run the "veryquick" test suite with SQLITE_CONFIG_SORTERREF_SIZE set
  1084    to 0 so that sorter-references are used whenever possible.
  1085  } -files [
  1086    test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
  1087        *fts5corrupt* *fts5big* *fts5aj*
  1088  ] -initialize {
  1089    catch {db close}
  1090    sqlite3_shutdown
  1091    sqlite3_config_sorterref 0
  1092    sqlite3_initialize
  1093    autoinstall_test_functions
  1094  } -shutdown {
  1095    catch {db close}
  1096    sqlite3_shutdown
  1097    sqlite3_config_sorterref -1
  1098    sqlite3_initialize
  1099    autoinstall_test_functions
  1100  }
  1101  
  1102  test_suite "maindbname" -prefix "" -description {
  1103    Run the "veryquick" test suite with SQLITE_DBCONFIG_MAINDBNAME used to
  1104    set the name of database 0 to "icecube".
  1105  } -files [
  1106    test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
  1107        *fts5corrupt* *fts5big* *fts5aj*
  1108  ] -dbconfig {
  1109    dbconfig_maindbname_icecube $::dbhandle
  1110  }
  1111  
  1112  # End of tests
  1113  #############################################################################
  1114  
  1115  # run_tests NAME OPTIONS
  1116  #
  1117  # where available options are:  
  1118  #
  1119  #       -description TITLE
  1120  #       -initialize  SCRIPT
  1121  #       -shutdown    SCRIPT
  1122  #       -files       LIST-OF-FILES
  1123  #       -prefix      NAME
  1124  #       -dbconfig    SCRIPT
  1125  #
  1126  proc run_tests {name args} {
  1127    set options(-initialize) ""
  1128    set options(-shutdown) ""
  1129    set options(-prefix) ""
  1130    set options(-dbconfig) ""
  1131    set options(-presql) ""
  1132  
  1133    array set options $args
  1134  
  1135    set ::G(perm:name)         $name
  1136    set ::G(perm:prefix)       $options(-prefix)
  1137    set ::G(isquick)           1
  1138    set ::G(perm:dbconfig)     $options(-dbconfig)
  1139    set ::G(perm:presql)       $options(-presql)
  1140  
  1141    foreach file [lsort $options(-files)] {
  1142      if {[file tail $file] == $file} { set file [file join $::testdir $file] }
  1143  
  1144      if {[info exists ::env(SQLITE_TEST_PATTERN_LIST)]} {
  1145        set ok 0
  1146        foreach p $::env(SQLITE_TEST_PATTERN_LIST) {
  1147          set p [string map {% *} $p]
  1148          if {[string match $p [file tail $file]]} {set ok 1 ; break}
  1149        }
  1150        if {!$ok} continue
  1151      }
  1152  
  1153      uplevel $options(-initialize)
  1154      slave_test_file $file
  1155      uplevel $options(-shutdown)
  1156      unset -nocomplain ::G(perm:sqlite3_args)
  1157    }
  1158  
  1159    unset ::G(perm:name)
  1160    unset ::G(perm:prefix)
  1161    unset ::G(perm:dbconfig)
  1162    unset ::G(perm:presql)
  1163  }
  1164  
  1165  proc run_test_suite {name} {
  1166    if {[info exists ::testspec($name)]==0} {
  1167      error "No such test suite: $name"
  1168    }
  1169    uplevel run_tests $name $::testspec($name)
  1170  }
  1171  
  1172  proc help {} {
  1173    puts "Usage: $::argv0 TESTSUITE ?TESTFILE?"
  1174    puts ""
  1175    puts "Available test-suites are:"
  1176  
  1177    set iPos 0
  1178    foreach k $::testsuitelist {
  1179      if {[info exists ::testspec($k)]} {
  1180        switch $iPos {
  1181          0 {
  1182            puts ""
  1183            puts -nonewline "  [format %-30s $k]"
  1184          }
  1185  
  1186          1 {
  1187            puts -nonewline [format %-30s $k]
  1188          }
  1189  
  1190          2 {
  1191            puts -nonewline $k
  1192          }
  1193        }
  1194  
  1195        set iPos [expr (($iPos+1) % 3)]
  1196      }
  1197    }
  1198    puts ""
  1199    exit -1
  1200  }
  1201  
  1202  if {[file tail $argv0] == "permutations.test"} {
  1203    proc main {argv} {
  1204      if {[llength $argv]==0} {
  1205        help
  1206      } else {
  1207  
  1208        # See if the first argument is a named test-suite.
  1209        #
  1210        set suite [file tail [lindex $argv 0]]
  1211        if {[info exists ::testspec($suite)]} {
  1212          set S $::testspec($suite)
  1213          set i 1
  1214        } else {
  1215          set S [list]
  1216          set i 0
  1217        }
  1218  
  1219        set extra ""
  1220        if {$i < [llength $argv] && [string range [lindex $argv $i] 0 0]!="-" } {
  1221          set files [list]
  1222          for {} {$i < [llength $argv]} {incr i} {
  1223            set pattern [string map {% *} [lindex $argv $i]]
  1224            if {[string range $pattern 0 0]=="-"} break
  1225            foreach f $::alltests {
  1226              set tail [file tail $f]
  1227              if {[lsearch $files $f]<0 && [string match $pattern $tail]} {
  1228                lappend files $f
  1229              }
  1230            }
  1231          }
  1232          set extra [list -files $files]
  1233        }
  1234  
  1235        eval run_tests $suite $S $extra
  1236      }
  1237    }
  1238    main $argv
  1239    finish_test
  1240  }