| # 2015 June 02 |
| # |
| # 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 the sessions module. |
| # Specifically, it tests that tables appear in the correct order |
| # within changesets and patchsets. |
| # |
| |
| |
| |
| if {![info exists testdir]} { |
| set testdir [file join [file dirname [info script]] .. .. test] |
| } |
| source [file join [file dirname [info script]] session_common.tcl] |
| source $testdir/tester.tcl |
| ifcapable !session {finish_test; return} |
| set testprefix sessionF |
| |
| # |
| # Test plan: |
| # |
| # 1.*: Test that sqlite3session_changeset() and sqlite3session_patchset() |
| # output tables in the right order. |
| # |
| # 2.*: Test that sqlite3session_invert() does not modify the order of |
| # tables within a changeset. |
| # |
| # 3.*: Test that sqlite3session_concat outputs tables in the right order. |
| # |
| |
| # Create a db schema to use. |
| # |
| do_execsql_test 1.0 { |
| CREATE TABLE t3(e PRIMARY KEY, f); |
| CREATE TABLE t1(a PRIMARY KEY, b); |
| CREATE TABLE t2(c PRIMARY KEY, d); |
| } |
| |
| #----------------------------------------------------------------------- |
| # 1.* - changeset() and patchset(). |
| # |
| |
| foreach {tn setup result} { |
| 1 { |
| S attach * |
| } { |
| {INSERT t2 0 X. {} {i 2 t two}} |
| {INSERT t1 0 X. {} {i 1 t one}} |
| {INSERT t3 0 X. {} {i 3 t three}} |
| } |
| |
| 2 { |
| S attach t1 |
| S attach * |
| } { |
| {INSERT t1 0 X. {} {i 1 t one}} |
| {INSERT t2 0 X. {} {i 2 t two}} |
| {INSERT t3 0 X. {} {i 3 t three}} |
| } |
| |
| 3 { |
| S attach t3 |
| S attach t2 |
| S attach t1 |
| } { |
| {INSERT t3 0 X. {} {i 3 t three}} |
| {INSERT t2 0 X. {} {i 2 t two}} |
| {INSERT t1 0 X. {} {i 1 t one}} |
| } |
| } { |
| execsql { |
| DELETE FROM t1; |
| DELETE FROM t2; |
| DELETE FROM t3; |
| } |
| sqlite3session S db main |
| eval $setup |
| |
| do_execsql_test 1.$tn.1 { |
| INSERT INTO t2 VALUES(2, 'two'); |
| INSERT INTO t1 VALUES(1, 'one'); |
| INSERT INTO t3 VALUES(3, 'three'); |
| } |
| |
| do_changeset_test 1.1.$tn.2 S $result |
| do_patchset_test 1.1.$tn.3 S $result |
| |
| S delete |
| } |
| |
| foreach {tn setup result} { |
| 1 { |
| S attach * |
| } { |
| {INSERT t2 0 X. {} {i 4 t four}} |
| {INSERT t2 0 X. {} {i 5 t five}} |
| {INSERT t1 0 X. {} {i 1 t one}} |
| {INSERT t3 0 X. {} {i 6 t six}} |
| } |
| |
| 2 { |
| S attach t1 |
| S attach * |
| } { |
| {INSERT t1 0 X. {} {i 1 t one}} |
| {INSERT t2 0 X. {} {i 4 t four}} |
| {INSERT t2 0 X. {} {i 5 t five}} |
| {INSERT t3 0 X. {} {i 6 t six}} |
| } |
| |
| 3 { |
| S attach t3 |
| S attach t2 |
| S attach t1 |
| } { |
| {INSERT t3 0 X. {} {i 6 t six}} |
| {INSERT t2 0 X. {} {i 4 t four}} |
| {INSERT t2 0 X. {} {i 5 t five}} |
| {INSERT t1 0 X. {} {i 1 t one}} |
| } |
| } { |
| execsql { |
| DELETE FROM t1; |
| DELETE FROM t2; |
| DELETE FROM t3; |
| } |
| sqlite3session S db main |
| eval $setup |
| |
| do_execsql_test 1.$tn.1 { |
| INSERT INTO t2 VALUES(2, 'two'); |
| INSERT INTO t1 VALUES(1, 'one'); |
| DELETE FROM t2; |
| INSERT INTO t2 VALUES(4, 'four'); |
| INSERT INTO t2 VALUES(5, 'five'); |
| INSERT INTO t3 VALUES(6, 'six'); |
| } |
| |
| do_changeset_test 1.2.$tn.2 S $result |
| do_patchset_test 1.2.$tn.2 S $result |
| |
| S delete |
| } |
| |
| #------------------------------------------------------------------------- |
| # 2.* - invert() |
| # |
| |
| foreach {tn setup result} { |
| 1 { |
| S attach * |
| } { |
| {DELETE t2 0 X. {i 4 t four} {}} |
| {DELETE t2 0 X. {i 5 t five} {}} |
| {DELETE t1 0 X. {i 1 t one} {}} |
| {DELETE t3 0 X. {i 6 t six} {}} |
| } |
| |
| 2 { |
| S attach t1 |
| S attach * |
| } { |
| {DELETE t1 0 X. {i 1 t one} {}} |
| {DELETE t2 0 X. {i 4 t four} {}} |
| {DELETE t2 0 X. {i 5 t five} {}} |
| {DELETE t3 0 X. {i 6 t six} {}} |
| } |
| |
| 3 { |
| S attach t3 |
| S attach t2 |
| S attach t1 |
| } { |
| {DELETE t3 0 X. {i 6 t six} {}} |
| {DELETE t2 0 X. {i 4 t four} {}} |
| {DELETE t2 0 X. {i 5 t five} {}} |
| {DELETE t1 0 X. {i 1 t one} {}} |
| } |
| } { |
| execsql { |
| DELETE FROM t1; |
| DELETE FROM t2; |
| DELETE FROM t3; |
| } |
| sqlite3session S db main |
| eval $setup |
| |
| do_execsql_test 1.$tn.1 { |
| INSERT INTO t2 VALUES(2, 'two'); |
| INSERT INTO t1 VALUES(1, 'one'); |
| DELETE FROM t2; |
| INSERT INTO t2 VALUES(4, 'four'); |
| INSERT INTO t2 VALUES(5, 'five'); |
| INSERT INTO t3 VALUES(6, 'six'); |
| } |
| |
| do_changeset_invert_test 2.$tn.2 S $result |
| |
| S delete |
| } |
| |
| #------------------------------------------------------------------------- |
| # 3.* - concat() |
| # |
| foreach {tn setup1 sql1 setup2 sql2 result} { |
| 1 { |
| S attach * |
| } { |
| INSERT INTO t1 VALUES(1, 'one'); |
| INSERT INTO t2 VALUES(2, 'two'); |
| } { |
| S attach t2 |
| S attach t1 |
| } { |
| INSERT INTO t1 VALUES(3, 'three'); |
| INSERT INTO t2 VALUES(4, 'four'); |
| } { |
| {INSERT t1 0 X. {} {i 1 t one}} |
| {INSERT t1 0 X. {} {i 3 t three}} |
| {INSERT t2 0 X. {} {i 2 t two}} |
| {INSERT t2 0 X. {} {i 4 t four}} |
| } |
| |
| 1 { |
| S attach t2 |
| S attach t1 |
| } { |
| INSERT INTO t1 VALUES(1, 'one'); |
| INSERT INTO t2 VALUES(2, 'two'); |
| } { |
| S attach * |
| } { |
| INSERT INTO t1 VALUES(3, 'three'); |
| INSERT INTO t2 VALUES(4, 'four'); |
| } { |
| {INSERT t2 0 X. {} {i 2 t two}} |
| {INSERT t2 0 X. {} {i 4 t four}} |
| {INSERT t1 0 X. {} {i 1 t one}} |
| {INSERT t1 0 X. {} {i 3 t three}} |
| } |
| |
| 1 { |
| S attach * |
| } { |
| INSERT INTO t2 VALUES(2, 'two'); |
| } { |
| S attach * |
| } { |
| INSERT INTO t1 VALUES(3, 'three'); |
| INSERT INTO t2 VALUES(4, 'four'); |
| INSERT INTO t3 VALUES(5, 'five'); |
| } { |
| {INSERT t2 0 X. {} {i 2 t two}} |
| {INSERT t2 0 X. {} {i 4 t four}} |
| {INSERT t1 0 X. {} {i 3 t three}} |
| {INSERT t3 0 X. {} {i 5 t five}} |
| } |
| |
| } { |
| execsql { |
| DELETE FROM t1; |
| DELETE FROM t2; |
| DELETE FROM t3; |
| } |
| sqlite3session S db main |
| eval $setup1 |
| execsql $sql1 |
| set c1 [S changeset] |
| S delete |
| |
| sqlite3session S db main |
| eval $setup2 |
| execsql $sql2 |
| set c2 [S changeset] |
| S delete |
| |
| set res [list] |
| sqlite3session_foreach x [sqlite3changeset_concat $c1 $c2] { |
| lappend res $x |
| } |
| |
| do_test 3.$tn { set res } [list {*}$result] |
| } |
| |
| |
| finish_test |