# 2014 August 30
#
# 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 contains tests for the RBU module. More specifically, it
# contains tests to ensure that RBU works with FTS tables.
#

if {![info exists testdir]} {
  set testdir [file join [file dirname [info script]] .. .. test]
}
source $testdir/tester.tcl
set ::testprefix rbufts

ifcapable !fts3 {
  finish_test
  return
}

proc step_rbu {target rbu} {
  while 1 {
    sqlite3rbu rbu $target $rbu
    set rc [rbu step]
    rbu close
    if {$rc != "SQLITE_OK"} break
  }
  set rc
}

do_execsql_test 1.0 {
  CREATE TABLE t1(i INTEGER PRIMARY KEY, a, b);
  CREATE VIRTUAL TABLE xx USING fts4(content=t1, a, b);
  INSERT INTO t1(rowid, a, b) VALUES(10, 'a b c', 'c b a');
  INSERT INTO t1(rowid, a, b) VALUES(20, 'a b c', 'd e f');
  INSERT INTO t1(rowid, a, b) VALUES(30, 'd e f', 'a b c');
  INSERT INTO t1(rowid, a, b) VALUES(40, 'd e f', 'd e f');
}

do_execsql_test 1.1 {
  INSERT INTO xx(xx) VALUES('rebuild');
  INSERT INTO xx(xx) VALUES('integrity-check');
}

forcedelete rbu.db
do_test 2.0 {
  sqlite3 dbrbu rbu.db
  dbrbu eval {
    CREATE TABLE data_t1(i, a, b, rbu_control);
    INSERT INTO data_t1 VALUES(20, NULL, NULL, 1);        -- delete
    INSERT INTO data_t1 VALUES(30, 'x y z', NULL, '.x.'); -- update
    INSERT INTO data_t1 VALUES(50, '1 2 3', 'x y z', 0);  -- insert

    CREATE VIEW data0_xx AS 
    SELECT i AS rbu_rowid, a, b, 
    CASE WHEN rbu_control IN (0, 1) 
    THEN rbu_control ELSE substr(rbu_control, 2) END AS rbu_control
    FROM data_t1;

  }
  dbrbu close

  step_rbu test.db rbu.db
} {SQLITE_DONE}

do_execsql_test 2.1 {
  INSERT INTO xx(xx) VALUES('integrity-check');
}




finish_test

