107d0f15eSdan# 2015-07-31
207d0f15eSdan#
307d0f15eSdan# The author disclaims copyright to this source code.  In place of
407d0f15eSdan# a legal notice, here is a blessing:
507d0f15eSdan#
607d0f15eSdan#    May you do good and not evil.
707d0f15eSdan#    May you find forgiveness for yourself and forgive others.
807d0f15eSdan#    May you share freely, never taking more than you give.
907d0f15eSdan#
1007d0f15eSdan#***********************************************************************
1107d0f15eSdan#
1207d0f15eSdan# Tests for the [sqldiff --changeset] command.
1307d0f15eSdan#
1407d0f15eSdan#
1507d0f15eSdanif {![info exists testdir]} {
1607d0f15eSdan  set testdir [file join [file dirname [info script]] .. .. test]
1707d0f15eSdan}
1807d0f15eSdansource $testdir/tester.tcl
19*e46c63d5Sdrhifcapable !session {finish_test; return}
2007d0f15eSdanset testprefix sessiondiff
2107d0f15eSdan
2207d0f15eSdanset PROG [test_find_sqldiff]
2307d0f15eSdandb close
2407d0f15eSdan
2507d0f15eSdanproc sqlesc {id} {
2607d0f15eSdan  set ret "'[string map {' ''} $id]'"
2707d0f15eSdan  set ret
2807d0f15eSdan}
2907d0f15eSdan
3007d0f15eSdanproc database_cksum {db1} {
3107d0f15eSdan  set txt ""
3207d0f15eSdan
3307d0f15eSdan  sqlite3 dbtmp $db1
3407d0f15eSdan  foreach tbl [dbtmp eval {SELECT name FROM sqlite_master WHERE type='table'}] {
3507d0f15eSdan    set cols [list]
3607d0f15eSdan    dbtmp eval "PRAGMA table_info = [sqlesc $tbl]" {
3707d0f15eSdan      lappend cols "quote( $name )"
3807d0f15eSdan    }
3907d0f15eSdan    append txt [dbtmp eval \
4007d0f15eSdan      "SELECT [join $cols {||'.'||}] FROM [sqlesc $tbl] ORDER BY 1"
4107d0f15eSdan    ]
4207d0f15eSdan  }
4307d0f15eSdan  dbtmp close
4407d0f15eSdan
4507d0f15eSdan  md5 $txt
4607d0f15eSdan}
4707d0f15eSdan
4807d0f15eSdanproc readfile {filename} {
4907d0f15eSdan  set fd [open $filename]
5007d0f15eSdan  fconfigure $fd -translation binary -encoding binary
5107d0f15eSdan  set data [read $fd]
5207d0f15eSdan  close $fd
5307d0f15eSdan  set data
5407d0f15eSdan}
5507d0f15eSdan
5607d0f15eSdanproc get_changeset {db1 db2} {
5707d0f15eSdan  exec $::PROG --changeset changeset.bin $db1 $db2
5807d0f15eSdan  set bin [readfile changeset.bin]
5907d0f15eSdan  return $bin
6007d0f15eSdan}
6107d0f15eSdan
6207d0f15eSdanproc xConflict {args} {
6307d0f15eSdan  return ""
6407d0f15eSdan}
6507d0f15eSdan
6607d0f15eSdanproc do_changeset_test {tn sql1 sql2} {
6707d0f15eSdan  forcedelete test.db123 test.db124
6807d0f15eSdan
6907d0f15eSdan  sqlite3 db test.db123
7007d0f15eSdan  db eval $sql1
7107d0f15eSdan  db close
7207d0f15eSdan
7307d0f15eSdan  sqlite3 db test.db124
7407d0f15eSdan  db eval $sql2
7507d0f15eSdan
7607d0f15eSdan  set cs [get_changeset test.db124 test.db123]
7707d0f15eSdan  sqlite3changeset_apply db $cs xConflict
7807d0f15eSdan  db close
7907d0f15eSdan
8007d0f15eSdan  set database_cksum1 [database_cksum test.db123]
8107d0f15eSdan  set database_cksum2 [database_cksum test.db124]
8207d0f15eSdan
8307d0f15eSdan  uplevel [list \
8407d0f15eSdan      do_test $tn [list string compare $database_cksum1 $database_cksum2] 0
8507d0f15eSdan  ]
8607d0f15eSdan}
8707d0f15eSdan
8807d0f15eSdando_changeset_test 1.0 {
8907d0f15eSdan  CREATE TABLE t1(x PRIMARY KEY);
9007d0f15eSdan} {
9107d0f15eSdan  CREATE TABLE t1(x PRIMARY KEY);
9207d0f15eSdan}
9307d0f15eSdan
9407d0f15eSdando_changeset_test 1.1 {
9507d0f15eSdan  CREATE TABLE t1(x PRIMARY KEY);
9607d0f15eSdan  CREATE TABLE t2(x PRIMARY KEY, y);
9707d0f15eSdan  INSERT INTO t2 VALUES(1, 2);
9807d0f15eSdan} {
9907d0f15eSdan  CREATE TABLE t1(x PRIMARY KEY);
10007d0f15eSdan  CREATE TABLE t2(x PRIMARY KEY, y);
10107d0f15eSdan  INSERT INTO t2 VALUES(3, 4);
10207d0f15eSdan}
10307d0f15eSdan
10407d0f15eSdando_changeset_test 1.2 {
10507d0f15eSdan  CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c));
10607d0f15eSdan  INSERT INTO t2 VALUES(1, 2, 3);
10707d0f15eSdan  INSERT INTO t2 VALUES(4, 5, 6);
10807d0f15eSdan} {
10907d0f15eSdan  CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c));
11007d0f15eSdan  INSERT INTO t2 VALUES(1, 2, 11);
11107d0f15eSdan  INSERT INTO t2 VALUES(7, 8, 9);
11207d0f15eSdan}
11307d0f15eSdan
11407d0f15eSdanfinish_test
115