github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/bitvec.test (about)

     1  # 2008 February 18
     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  # Unit testing of the Bitvec object.
    13  #
    14  # $Id: bitvec.test,v 1.4 2009/04/01 23:49:04 drh Exp $
    15  #
    16  
    17  set testdir [file dirname $argv0]
    18  source $testdir/tester.tcl
    19  
    20  # The built-in test logic must be operational in order for
    21  # this test to work.
    22  ifcapable !builtin_test {
    23    finish_test
    24    return
    25  }
    26  
    27  # Test that sqlite3BitvecBuiltinTest correctly reports errors
    28  # that are deliberately introduced.
    29  #
    30  do_test bitvec-1.0.1 {
    31    sqlite3BitvecBuiltinTest 400 {5 1 1 1 0}
    32  } 1
    33  do_test bitvec-1.0.2 {
    34    sqlite3BitvecBuiltinTest 400 {5 1 234 1 0}
    35  } 234
    36  
    37  # Run test cases that set every bit in vectors of various sizes.
    38  # for larger cases, this should cycle the bit vector representation
    39  # from hashing into subbitmaps.  The subbitmaps should start as
    40  # hashes then change to either subbitmaps or linear maps, depending
    41  # on their size.
    42  #
    43  do_test bitvec-1.1 {
    44    sqlite3BitvecBuiltinTest 400 {1 400 1 1 0}
    45  } 0
    46  do_test bitvec-1.2 {
    47    sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 0}
    48  } 0
    49  do_test bitvec-1.3 {
    50    sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 0}
    51  } 0
    52  do_test bitvec-1.4 {
    53    sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 0}
    54  } 0
    55  
    56  # By specifying a larger increments, we spread the load around.
    57  #
    58  do_test bitvec-1.5 {
    59    sqlite3BitvecBuiltinTest 400 {1 400 1 7 0}
    60  } 0
    61  do_test bitvec-1.6 {
    62    sqlite3BitvecBuiltinTest 4000 {1 4000 1 7 0}
    63  } 0
    64  do_test bitvec-1.7 {
    65    sqlite3BitvecBuiltinTest 40000 {1 40000 1 7 0}
    66  } 0
    67  do_test bitvec-1.8 {
    68    sqlite3BitvecBuiltinTest 400000 {1 400000 1 7 0}
    69  } 0
    70  
    71  # First fill up the bitmap with ones,  then go through and
    72  # clear all the bits.  This will stress the clearing mechanism.
    73  #
    74  do_test bitvec-1.9 {
    75    sqlite3BitvecBuiltinTest 400 {1 400 1 1 2 400 1 1 0}
    76  } 0
    77  do_test bitvec-1.10 {
    78    sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 2 4000 1 1 0}
    79  } 0
    80  do_test bitvec-1.11 {
    81    sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 2 40000 1 1 0}
    82  } 0
    83  do_test bitvec-1.12 {
    84    sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 2 400000 1 1 0}
    85  } 0
    86  
    87  do_test bitvec-1.13 {
    88    sqlite3BitvecBuiltinTest 400 {1 400 1 1 2 400 1 7 0}
    89  } 0
    90  do_test bitvec-1.15 {
    91    sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 2 4000 1 7 0}
    92  } 0
    93  do_test bitvec-1.16 {
    94    sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 2 40000 1 77 0}
    95  } 0
    96  do_test bitvec-1.17 {
    97    sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 2 400000 1 777 0}
    98  } 0
    99  
   100  do_test bitvec-1.18 {
   101    sqlite3BitvecBuiltinTest 400000 {1 5000 100000 1 2 400000 1 37 0}
   102  } 0
   103  
   104  # Attempt to induce hash collisions.  
   105  #
   106  unset -nocomplain start
   107  unset -nocomplain incr
   108  foreach start {1 2 3 4 5 6 7 8} {
   109    foreach incr {124 125} {
   110      do_test bitvec-1.20.$start.$incr {
   111        set prog [list 1 60 $::start $::incr 2 5000 1 1 0]
   112        sqlite3BitvecBuiltinTest 5000 $prog
   113      } 0
   114    }
   115  }
   116  
   117  do_test bitvec-1.30.big_and_slow {
   118    sqlite3BitvecBuiltinTest 17000000 {1 17000000 1 1 2 17000000 1 1 0}
   119  } 0
   120  
   121  
   122  # Test setting and clearing a random subset of bits.
   123  #
   124  do_test bitvec-2.1 {
   125    sqlite3BitvecBuiltinTest 4000 {3 2000 4 2000 0}
   126  } 0
   127  do_test bitvec-2.2 {
   128    sqlite3BitvecBuiltinTest 4000 {3 1000 4 1000 3 1000 4 1000 3 1000 4 1000
   129                                   3 1000 4 1000 3 1000 4 1000 3 1000 4 1000 0}
   130  } 0
   131  do_test bitvec-2.3 {
   132    sqlite3BitvecBuiltinTest 400000 {3 10 0}
   133  } 0
   134  do_test bitvec-2.4 {
   135    sqlite3BitvecBuiltinTest 4000 {3 10 2 4000 1 1 0}
   136  } 0
   137  do_test bitvec-2.5 {
   138    sqlite3BitvecBuiltinTest 5000 {3 20 2 5000 1 1 0}
   139  } 0
   140  do_test bitvec-2.6 {
   141    sqlite3BitvecBuiltinTest 50000 {3 60 2 50000 1 1 0}
   142  } 0
   143  do_test bitvec-2.7 {
   144    sqlite3BitvecBuiltinTest 5000 {
   145            1 25 121 125
   146            1 50 121 125
   147            2 25 121 125
   148            0
   149    }
   150  } 0
   151  
   152  # This procedure runs sqlite3BitvecBuiltinTest with argments "n" and
   153  # "program".  But it also causes a malloc error to occur after the
   154  # "failcnt"-th malloc.  The result should be "0" if no malloc failure
   155  # occurs or "-1" if there is a malloc failure.
   156  #
   157  proc bitvec_malloc_test {label failcnt n program} {
   158    do_test $label [subst {
   159      sqlite3_memdebug_fail $failcnt
   160      set x \[sqlite3BitvecBuiltinTest $n [list $program]\]
   161      set nFail \[sqlite3_memdebug_fail -1\]
   162      if {\$nFail==0} {
   163        set ::go 0
   164        set x -1
   165      }
   166      set x
   167    }] -1
   168  }
   169  
   170  # Make sure malloc failures are handled sanily.
   171  #
   172  unset -nocomplain n
   173  unset -nocomplain go
   174  set go 1
   175  save_prng_state
   176  for {set n 0} {$go} {incr n} {
   177    restore_prng_state
   178    bitvec_malloc_test bitvec-3.1.$n $n 5000 {
   179        3 60 2 5000 1 1 3 60 2 5000 1 1 3 60 2 5000 1 1 0
   180    }
   181  }
   182  set go 1
   183  for {set n 0} {$go} {incr n} {
   184    restore_prng_state
   185    bitvec_malloc_test bitvec-3.2.$n $n 5000 {
   186        3 600 2 5000 1 1 3 600 2 5000 1 1 3 600 2 5000 1 1 0
   187    }
   188  }
   189  set go 1
   190  for {set n 1} {$go} {incr n} {
   191    bitvec_malloc_test bitvec-3.3.$n $n 50000 {1 50000 1 1 0}
   192  }
   193  
   194  finish_test
   195  return