# 2013 November 22
#
# 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 script is recovery from transient manditory locks
# that sometimes appear on database files due to anti-virus software.
#

if {$tcl_platform(platform)!="windows"} return

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

ifcapable !win32malloc {
  finish_test
  return
}

set testprefix win32heap

do_test 1.1 {
  catch {db close}
  sqlite3_shutdown
  sqlite3_config_heap_size 1048576
  sqlite3_initialize
} {SQLITE_OK}

do_test 1.2 {
  sqlite3 db test.db
  catchsql {
    CREATE TABLE t1(x);
  }
} {0 {}}

do_test 1.3 {
  catchsql {
    INSERT INTO t1 (x) VALUES(RANDOMBLOB(1048576));
  }
} {1 {out of memory}}

do_test 1.4 {
  catchsql {
    SELECT COUNT(*) FROM t1;
  }
} {0 0}

do_test 1.5 {
  catch {db close}
  sqlite3_shutdown
  sqlite3_config_heap_size 0
  sqlite3_initialize
} {SQLITE_OK}

do_test 1.6 {
  sqlite3 db test.db
  catchsql {
    INSERT INTO t1 (x) VALUES(RANDOMBLOB(1048576));
  }
} {0 {}}

do_test 1.7 {
  catchsql {
    SELECT COUNT(*) FROM t1;
  }
} {0 1}

finish_test
