# 2016 September 10
#
# The author disclaims copyright to this source code.  In place of
# a legal notice, here is a blessing:
#
#    May you do good and not evil.
#    May you find forgiveness for yourself and forgive others.
#    May you share freely, never taking more than you give.
#
#***********************************************************************
# This file implements regression tests for SQLite library.  The
# focus of this file is testing the code in test_delete.c (the
# sqlite3_delete_database() API).
#

set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix delete_db

proc delete_all {} {
  foreach f [glob -nocomplain test2*] { file delete $f }
  foreach f [glob -nocomplain test3*] { file delete $f }
}

proc copydb {} {
  foreach f [glob -nocomplain test3*] { file delete $f }
  foreach f [glob -nocomplain test2*] { 
    set p [string range $f 5 end]
    file copy "test2$p" "test3$p"
  }
}

proc files {} {
  lsort [glob -nocomplain test3*]
}

db close
delete_all
sqlite3 db test2.database

#-------------------------------------------------------------------------
#
# 1.1: Journal files.
# 1.2: Wal files.
# 1.3: Multiplexor with journal file.
# 1.4: Multiplexor with wal file.
#
# 2.* are a copy of 1.* with the multiplexor enabled.
#
# 3.* tests errors.
#

do_test 1.1.0 {
  execsql {
    CREATE TABLE t1(x, y);
    BEGIN;
      INSERT INTO t1 VALUES(1, 2);
  }
  copydb
  files
} {test3.database test3.database-journal}

do_test 1.1.1 {
  sqlite3_delete_database test3.database
  files
} {}

do_test 1.2.0 {
  execsql {
    COMMIT;
    PRAGMA journal_mode = wal;
    INSERT INTO t1 VALUES(3, 4);
  }
  copydb
  files
} {test3.database test3.database-shm test3.database-wal}
do_test 1.2.1 {
  sqlite3_delete_database test3.database
  files
} {}

db close
delete_all
sqlite3_multiplex_initialize "" 0
sqlite3 db test2.database -vfs multiplex
sqlite3_multiplex_control db "main" chunk_size 32768

do_test 1.3.0 {
  execsql { PRAGMA auto_vacuum = 0; }
  execsql {
    CREATE TABLE x1(a, b);
    WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<1000 )
    INSERT INTO x1 SELECT randomblob(100), randomblob(100) FROM s;
    BEGIN;
      UPDATE x1 SET a=randomblob(101)
  }
  copydb
  files
} [list {*}{
  test3.database test3.database-journal test3.database001 
  test3.database002 test3.database003
}]
do_test 1.3.1 {
  sqlite3_delete_database test3.database
  files
} {}


do_test 1.4.0 {
  execsql {
    COMMIT;
    PRAGMA journal_mode = wal;
    UPDATE x1 SET a=randomblob(102)
  }
  copydb
  files
} [list {*}{
  test3.database test3.database-shm test3.database-wal test3.database001 
  test3.database002 test3.database003
}]
do_test 1.4.1 {
  sqlite3_delete_database test3.database
  files
} {}


ifcapable 8_3_names {
  db close
  delete_all
  sqlite3 db file:test2.db?8_3_names=1 -uri 1

  do_test 2.1.0 {
    execsql {
      CREATE TABLE t1(x, y);
      BEGIN;
        INSERT INTO t1 VALUES(1, 2);
    }
    copydb
    files
  } {test3.db test3.nal}
  
  do_test 2.1.1 {
    sqlite3_delete_database test3.db
    files
  } {}
  
  do_test 2.2.0 {
    execsql {
      COMMIT;
      PRAGMA journal_mode = wal;
      INSERT INTO t1 VALUES(3, 4);
    }
    copydb
    files
  } {test3.db test3.shm test3.wal}
  do_test 2.2.1 {
    sqlite3_delete_database test3.db
    files
  } {}


  db close
  delete_all
  sqlite3_multiplex_initialize "" 0
  sqlite3 db file:test2.db?8_3_names=1 -uri 1 -vfs multiplex
  sqlite3_multiplex_control db "main" chunk_size 32768
  
  do_test 2.3.0 {
    execsql { PRAGMA auto_vacuum = 0; }
    execsql {
      CREATE TABLE x1(a, b);
      WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<1000 )
      INSERT INTO x1 SELECT randomblob(100), randomblob(100) FROM s;
      BEGIN;
        UPDATE x1 SET a=randomblob(101)
    }
    copydb
    files
  } [list {*}{
    test3.001 test3.002 test3.003 test3.db test3.nal 
  }]
  do_test 2.3.1 {
    sqlite3_delete_database test3.db
    files
  } {}
  
  
  do_test 2.4.0 {
    execsql {
      COMMIT;
      PRAGMA journal_mode = wal;
      UPDATE x1 SET a=randomblob(102)
    }
    copydb
    files
  } [list {*}{
    test3.001 test3.002 test3.003 test3.db test3.db-shm test3.wal 
  }]
  do_test 2.4.1 {
    sqlite3_delete_database test3.db
    files
  } {}
}

db close
delete_all
sqlite3_multiplex_shutdown 

do_test 3.0 {
  file mkdir dir2.db
  sqlite3_delete_database dir2.db
} {SQLITE_ERROR}
do_test 3.1 {
  sqlite3_delete_database dir2.db/test.db
} {SQLITE_OK}

finish_test
