# 2015-07-31
#
# 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.
#
#***********************************************************************
#
# Tests for the [sqldiff --changeset] command.
#
#
if {![info exists testdir]} {
  set testdir [file join [file dirname [info script]] .. .. test]
}
source $testdir/tester.tcl
ifcapable !session {finish_test; return}
set testprefix sessiondiff

set PROG [test_find_sqldiff]
db close

proc sqlesc {id} {
  set ret "'[string map {' ''} $id]'"
  set ret
}

proc database_cksum {db1} {
  set txt ""

  sqlite3 dbtmp $db1
  foreach tbl [dbtmp eval {SELECT name FROM sqlite_master WHERE type='table'}] {
    set cols [list]
    dbtmp eval "PRAGMA table_info = [sqlesc $tbl]" { 
      lappend cols "quote( $name )" 
    }
    append txt [dbtmp eval \
      "SELECT [join $cols {||'.'||}] FROM [sqlesc $tbl] ORDER BY 1"
    ]
  }
  dbtmp close

  md5 $txt
}

proc readfile {filename} {
  set fd [open $filename]
  fconfigure $fd -translation binary -encoding binary
  set data [read $fd]
  close $fd
  set data
}

proc get_changeset {db1 db2} {
  exec $::PROG --changeset changeset.bin $db1 $db2
  set bin [readfile changeset.bin]
  return $bin
}

proc xConflict {args} { 
  return "" 
}

proc do_changeset_test {tn sql1 sql2} {
  forcedelete test.db123 test.db124 

  sqlite3 db test.db123
  db eval $sql1
  db close

  sqlite3 db test.db124
  db eval $sql2

  set cs [get_changeset test.db124 test.db123]
  sqlite3changeset_apply db $cs xConflict
  db close

  set database_cksum1 [database_cksum test.db123]
  set database_cksum2 [database_cksum test.db124]

  uplevel [list \
      do_test $tn [list string compare $database_cksum1 $database_cksum2] 0
  ]
}

do_changeset_test 1.0 {
  CREATE TABLE t1(x PRIMARY KEY);
} {
  CREATE TABLE t1(x PRIMARY KEY);
}

do_changeset_test 1.1 {
  CREATE TABLE t1(x PRIMARY KEY);
  CREATE TABLE t2(x PRIMARY KEY, y);
  INSERT INTO t2 VALUES(1, 2);
} {
  CREATE TABLE t1(x PRIMARY KEY);
  CREATE TABLE t2(x PRIMARY KEY, y);
  INSERT INTO t2 VALUES(3, 4);
}

do_changeset_test 1.2 {
  CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c));
  INSERT INTO t2 VALUES(1, 2, 3);
  INSERT INTO t2 VALUES(4, 5, 6);
} {
  CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c));
  INSERT INTO t2 VALUES(1, 2, 11);
  INSERT INTO t2 VALUES(7, 8, 9);
}

finish_test
