modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/session/sessionF.test (about)

     1  # 2015 June 02
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  #
    12  # This file implements regression tests for the sessions module.
    13  # Specifically, it tests that tables appear in the correct order
    14  # within changesets and patchsets.
    15  #
    16  
    17  
    18  
    19  if {![info exists testdir]} {
    20    set testdir [file join [file dirname [info script]] .. .. test]
    21  } 
    22  source [file join [file dirname [info script]] session_common.tcl]
    23  source $testdir/tester.tcl
    24  ifcapable !session {finish_test; return}
    25  set testprefix sessionF
    26  
    27  #
    28  # Test plan:
    29  #
    30  #    1.*: Test that sqlite3session_changeset() and sqlite3session_patchset()
    31  #         output tables in the right order.
    32  #
    33  #    2.*: Test that sqlite3session_invert() does not modify the order of
    34  #         tables within a changeset.
    35  #
    36  #    3.*: Test that sqlite3session_concat outputs tables in the right order.
    37  #
    38  
    39  # Create a db schema to use.
    40  #
    41  do_execsql_test 1.0 {
    42    CREATE TABLE t3(e PRIMARY KEY, f);
    43    CREATE TABLE t1(a PRIMARY KEY, b);
    44    CREATE TABLE t2(c PRIMARY KEY, d);
    45  }
    46  
    47  #-----------------------------------------------------------------------
    48  # 1.* - changeset() and patchset().
    49  #
    50  
    51  foreach {tn setup result} {
    52    1 {
    53      S attach *
    54    } {
    55      {INSERT t2 0 X. {} {i 2 t two}} 
    56      {INSERT t1 0 X. {} {i 1 t one}} 
    57      {INSERT t3 0 X. {} {i 3 t three}}
    58    }
    59  
    60    2 {
    61      S attach t1
    62      S attach *
    63    } {
    64      {INSERT t1 0 X. {} {i 1 t one}} 
    65      {INSERT t2 0 X. {} {i 2 t two}} 
    66      {INSERT t3 0 X. {} {i 3 t three}}
    67    }
    68  
    69    3 {
    70      S attach t3
    71      S attach t2
    72      S attach t1
    73    } {
    74      {INSERT t3 0 X. {} {i 3 t three}}
    75      {INSERT t2 0 X. {} {i 2 t two}} 
    76      {INSERT t1 0 X. {} {i 1 t one}} 
    77    }
    78  } {
    79    execsql {
    80      DELETE FROM t1;
    81      DELETE FROM t2;
    82      DELETE FROM t3;
    83    }
    84    sqlite3session S db main
    85    eval $setup
    86  
    87    do_execsql_test 1.$tn.1 {
    88      INSERT INTO t2 VALUES(2, 'two');
    89      INSERT INTO t1 VALUES(1, 'one');
    90      INSERT INTO t3 VALUES(3, 'three');
    91    }
    92  
    93    do_changeset_test 1.1.$tn.2 S $result
    94    do_patchset_test  1.1.$tn.3 S $result
    95  
    96    S delete
    97  }
    98  
    99  foreach {tn setup result} {
   100    1 {
   101      S attach *
   102    } {
   103      {INSERT t2 0 X. {} {i 4 t four}} 
   104      {INSERT t2 0 X. {} {i 5 t five}}
   105      {INSERT t1 0 X. {} {i 1 t one}} 
   106      {INSERT t3 0 X. {} {i 6 t six}}
   107    }
   108  
   109    2 {
   110      S attach t1
   111      S attach *
   112    } {
   113      {INSERT t1 0 X. {} {i 1 t one}} 
   114      {INSERT t2 0 X. {} {i 4 t four}} 
   115      {INSERT t2 0 X. {} {i 5 t five}}
   116      {INSERT t3 0 X. {} {i 6 t six}}
   117    }
   118  
   119    3 {
   120      S attach t3
   121      S attach t2
   122      S attach t1
   123    } {
   124      {INSERT t3 0 X. {} {i 6 t six}}
   125      {INSERT t2 0 X. {} {i 4 t four}} 
   126      {INSERT t2 0 X. {} {i 5 t five}}
   127      {INSERT t1 0 X. {} {i 1 t one}} 
   128    }
   129  } {
   130    execsql {
   131      DELETE FROM t1;
   132      DELETE FROM t2;
   133      DELETE FROM t3;
   134    }
   135    sqlite3session S db main
   136    eval $setup
   137  
   138    do_execsql_test 1.$tn.1 {
   139      INSERT INTO t2 VALUES(2, 'two');
   140      INSERT INTO t1 VALUES(1, 'one');
   141      DELETE FROM t2;
   142      INSERT INTO t2 VALUES(4, 'four');
   143      INSERT INTO t2 VALUES(5, 'five');
   144      INSERT INTO t3 VALUES(6, 'six');
   145    }
   146  
   147    do_changeset_test 1.2.$tn.2 S $result
   148    do_patchset_test 1.2.$tn.2 S $result
   149  
   150    S delete
   151  }
   152  
   153  #-------------------------------------------------------------------------
   154  # 2.* - invert()
   155  #
   156  
   157  foreach {tn setup result} {
   158    1 {
   159      S attach *
   160    } {
   161      {DELETE t2 0 X. {i 4 t four} {}} 
   162      {DELETE t2 0 X. {i 5 t five} {}} 
   163      {DELETE t1 0 X. {i 1 t one} {}}
   164      {DELETE t3 0 X. {i 6 t six} {}} 
   165    }
   166  
   167    2 {
   168      S attach t1
   169      S attach *
   170    } {
   171      {DELETE t1 0 X. {i 1 t one} {}}
   172      {DELETE t2 0 X. {i 4 t four} {}} 
   173      {DELETE t2 0 X. {i 5 t five} {}} 
   174      {DELETE t3 0 X. {i 6 t six} {}} 
   175    }
   176  
   177    3 {
   178      S attach t3
   179      S attach t2
   180      S attach t1
   181    } {
   182      {DELETE t3 0 X. {i 6 t six} {}} 
   183      {DELETE t2 0 X. {i 4 t four} {}} 
   184      {DELETE t2 0 X. {i 5 t five} {}} 
   185      {DELETE t1 0 X. {i 1 t one} {}}
   186    }
   187  } {
   188    execsql {
   189      DELETE FROM t1;
   190      DELETE FROM t2;
   191      DELETE FROM t3;
   192    }
   193    sqlite3session S db main
   194    eval $setup
   195  
   196    do_execsql_test 1.$tn.1 {
   197      INSERT INTO t2 VALUES(2, 'two');
   198      INSERT INTO t1 VALUES(1, 'one');
   199      DELETE FROM t2;
   200      INSERT INTO t2 VALUES(4, 'four');
   201      INSERT INTO t2 VALUES(5, 'five');
   202      INSERT INTO t3 VALUES(6, 'six');
   203    }
   204  
   205    do_changeset_invert_test 2.$tn.2 S $result
   206  
   207    S delete
   208  }
   209  
   210  #-------------------------------------------------------------------------
   211  # 3.* - concat()
   212  #
   213  foreach {tn setup1 sql1 setup2 sql2 result} {
   214    1 {
   215      S attach *
   216    } {
   217      INSERT INTO t1 VALUES(1, 'one');
   218      INSERT INTO t2 VALUES(2, 'two');
   219    } {
   220      S attach t2
   221      S attach t1
   222    } {
   223      INSERT INTO t1 VALUES(3, 'three');
   224      INSERT INTO t2 VALUES(4, 'four');
   225    } {
   226      {INSERT t1 0 X. {} {i 1 t one}} 
   227      {INSERT t1 0 X. {} {i 3 t three}} 
   228      {INSERT t2 0 X. {} {i 2 t two}}
   229      {INSERT t2 0 X. {} {i 4 t four}}
   230    }
   231  
   232    1 {
   233      S attach t2
   234      S attach t1
   235    } {
   236      INSERT INTO t1 VALUES(1, 'one');
   237      INSERT INTO t2 VALUES(2, 'two');
   238    } {
   239      S attach *
   240    } {
   241      INSERT INTO t1 VALUES(3, 'three');
   242      INSERT INTO t2 VALUES(4, 'four');
   243    } {
   244      {INSERT t2 0 X. {} {i 2 t two}}
   245      {INSERT t2 0 X. {} {i 4 t four}}
   246      {INSERT t1 0 X. {} {i 1 t one}} 
   247      {INSERT t1 0 X. {} {i 3 t three}} 
   248    }
   249  
   250    1 {
   251      S attach *
   252    } {
   253      INSERT INTO t2 VALUES(2, 'two');
   254    } {
   255      S attach *
   256    } {
   257      INSERT INTO t1 VALUES(3, 'three');
   258      INSERT INTO t2 VALUES(4, 'four');
   259      INSERT INTO t3 VALUES(5, 'five');
   260    } {
   261      {INSERT t2 0 X. {} {i 2 t two}}
   262      {INSERT t2 0 X. {} {i 4 t four}}
   263      {INSERT t1 0 X. {} {i 3 t three}} 
   264      {INSERT t3 0 X. {} {i 5 t five}} 
   265    }
   266  
   267  } {
   268    execsql {
   269      DELETE FROM t1;
   270      DELETE FROM t2;
   271      DELETE FROM t3;
   272    }
   273    sqlite3session S db main
   274    eval $setup1
   275    execsql $sql1
   276    set c1 [S changeset]
   277    S delete
   278  
   279    sqlite3session S db main
   280    eval $setup2
   281    execsql $sql2
   282    set c2 [S changeset]
   283    S delete
   284  
   285    set res [list]
   286    sqlite3session_foreach x [sqlite3changeset_concat $c1 $c2] {
   287      lappend res $x
   288    }
   289  
   290    do_test 3.$tn { set res } [list {*}$result]
   291  }
   292  
   293  
   294  finish_test
   295