# 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
  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
