#!/usr/bin/ruby $LOAD_PATH.unshift *%w{../src src tests} require 'bdb' require 'runit_' $VERBOSE = nil module BDB class BTCompare < Btree def bdb_bt_compare(a, b) a <=> b end end class AZ < Btree def bdb_store_key(a) "xx_" + a end def bdb_fetch_key(a) a.sub(/^xx_/, '') end def bdb_store_value(a) "yy_" + a end def bdb_fetch_value(a) a.sub(/^yy_/, '') end end end def clean Dir.foreach('tmp') do |x| if FileTest.file?("tmp/#{x}") File.unlink("tmp/#{x}") end end end $bdb, $env = nil, nil clean print "\nVERSION of BDB is #{BDB::VERSION}\n" Inh = defined?(RUNIT) ? RUNIT : Test::Unit class TestBtree < Inh::TestCase def test_00_error assert_raises(BDB::Fatal, "invalid name") do BDB::Btree.new(".", nil, "a") end assert_raises(BDB::Fatal, "invalid Env") do BDB::Btree.open("tmp/aa", nil, "env" => 1) end assert_raises(TypeError) { BDB::Btree.new("tmp/aa", nil, "set_cachesize" => "a") } assert_raises(TypeError) { BDB::Btree.new("tmp/aa", nil, "set_pagesize" => "a") } assert_raises(TypeError) { BDB::Btree.new("tmp/aa", nil, "set_bt_minkey" => "a") } assert_raises(BDB::Fatal) { BDB::Btree.new("tmp/aa", nil, "set_bt_compare" => "a") } assert_raises(BDB::Fatal) { BDB::Btree.new("tmp/aa", nil, "set_bt_prefix" => "a") } assert_raises(BDB::Fatal) { BDB::Btree.new("tmp/aa", nil, "set_fetch_key" => "a") } assert_raises(BDB::Fatal) { BDB::Btree.new("tmp/aa", nil, "set_store_key" => "a") } assert_raises(BDB::Fatal) { BDB::Btree.new("tmp/aa", nil, "set_fetch_value" => "a") } assert_raises(BDB::Fatal) { BDB::Btree.new("tmp/aa", nil, "set_store_value" => "a") } assert_raises(TypeError) { BDB::Btree.new("tmp/aa", nil, "set_lorder" => "a") } end def test_01_init assert_kind_of(BDB::Btree, $bdb = BDB::Btree.new("tmp/aa", nil, "a"), "") end def test_02_get_set assert_equal(true, $bdb.empty?, "") assert_equal("alpha", $bdb["alpha"] = "alpha", "") assert_equal("alpha", $bdb["alpha"], "") assert_equal(nil, $bdb["gamma"] = nil, "") assert_equal(nil, $bdb["gamma"], "") assert($bdb.key?("alpha"), "") assert_equal(false, $bdb.key?("unknown"), "") assert($bdb.value?("alpha"), "") assert_equal(false, $bdb.value?("unknown"), "") assert_equal(false, $bdb.put("alpha", "gamma", BDB::NOOVERWRITE), "") assert_equal("beta", $bdb.fetch("xxx", "beta"), "") assert_equal("xxx", $bdb.fetch("xxx") {|x| x}, "") assert_raises(IndexError) { $bdb.fetch("xxx") } assert_raises(ArgumentError) { $bdb.fetch("xxx", "beta") {} } assert_equal("alpha", $bdb["alpha"], "") assert($bdb.both?("alpha", "alpha"), "") assert_equal(["alpha", "alpha"], $bdb.get("alpha", "alpha", BDB::GET_BOTH), "") assert(! $bdb.both?("alpha", "beta"), "") assert(! $bdb.get("alpha", "beta", BDB::GET_BOTH), "") assert(! $bdb.both?("unknown", "alpha"), "") assert_equal([1, 2, 3], $bdb["array"] = [1, 2, 3], "") assert_equal([1, 2, 3].to_s, $bdb["array"], "") assert_equal({"a" => "b"}, $bdb["hash"] = {"a" => "b"}, "") assert_equal({"a" => "b"}.to_s, $bdb["hash"], "") assert($bdb.sync, "") end def test_03_delete size = $bdb.size i = 0 $bdb.each do |key, value| assert_equal($bdb, $bdb.delete(key), "") i += 1 end assert(size == i, "") assert_equal(0, $bdb.size, "") $hash = {} (33 .. 126).each do |i| key = i.to_s * 5 $bdb[key] = i.to_s * 7 $hash[key] = i.to_s * 7 assert_equal($bdb[key], $hash[key], "") end assert_equal($bdb.size, $hash.size, "") assert_raises(ArgumentError) { $bdb.select("xxx") {}} assert_equal([], $bdb.select { false }, "") arr0 = [] $bdb.each_key {|key| arr0 << key } assert_equal($hash.keys.sort, arr0.sort, "") arr1 = [] $bdb.reverse_each_key {|key| arr1 << key } assert_equal($hash.keys.sort, arr1.sort, "") assert_equal(arr0, arr1.reverse, "") assert_equal($hash.invert, $bdb.invert, "") $bdb.each do |key, value| if rand > 0.5 assert_equal($bdb, $bdb.delete(key), "") $hash.delete(key) end end assert_equal($bdb.size, $hash.size, "") $bdb.each do |key, value| assert_equal($hash[key], value, "") end $hash.each do |key, value| assert($bdb.key?(key), "") assert_equal($bdb, $bdb.delete(key), "") end end def test_04_cursor array = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] array.each do |x| assert_equal(x, $bdb[x] = x, "") end assert(array.size == $bdb.size, "") arr = [] $bdb.each_value do |x| arr << x end assert_equal(array, arr.sort, "") arr = [] $bdb.reverse_each_value do |x| arr << x end assert_equal(array, arr.sort, "") arr = [] $bdb.each_value("d") do |x| arr << x end assert_equal(array - ["a", "b", "c"], arr.sort, "") arr = [] $bdb.reverse_each_value("g") do |x| arr << x end assert_equal(array - ["h", "i"], arr.sort, "") arr = $bdb.reject {|k, v| k == "e" || v == "i" } has = array.reject {|k, v| k == "e" || k == "i" } assert_equal(has, arr.keys.sort, "") $bdb.reject! {|k, v| k == "e" || v == "i" } array.reject! {|k, v| k == "e" || k == "i" } assert_equal(array, $bdb.keys.sort, "") assert_equal(array, $bdb.values.sort, "") end def test_05_reopen assert_equal(nil, $bdb.close, "") assert_kind_of(BDB::Btree, $bdb = BDB::Btree.open("tmp/aa", nil, "w", "set_flags" => BDB::DUP, "set_dup_compare" => lambda {|a, b| a <=> b}), "") assert_equal(0, $bdb.size, "") end def test_06_dup assert_equal("a", $bdb["0"] = "a", "") assert_equal("b", $bdb["0"] = "b", "") assert_equal("c", $bdb["0"] = "c", "") assert_equal("d", $bdb["0"] = "d", "") assert_equal("aa", $bdb["1"] = "aa", "") assert_equal("bb", $bdb["1"] = "bb", "") assert_equal("cc", $bdb["1"] = "cc", "") assert_equal("aaa", $bdb["2"] = "aaa", "") assert_equal("bbb", $bdb["2"] = "bbb", "") assert_equal("aaaa", $bdb["3"] = "aaaa", "") rep = [["a", "b", "c", "d"], ['aa', 'bb', 'cc'], ['aaa', 'bbb'], ['aaaa']] if BDB::VERSION_MAJOR > 2 || BDB::VERSION_MINOR >= 6 for i in [0, 1, 2, 3] k0, v0 = [], [] $bdb.duplicates(i.to_s).each {|v| v0 << v} assert_equal(v0.sort, rep[i], "") k0, v0 = [], [] $bdb.each_dup(i.to_s) {|k, v| k0 << k; v0 << v} assert_equal(k0, [i.to_s] * (4 - i), "") assert_equal(v0.sort, rep[i], "") v0 = [] $bdb.each_dup_value(i.to_s) {|v| v0 << v} assert_equal(v0.sort, rep[i], "") end assert_equal(4, $bdb.count("0"), "") assert_equal(3, $bdb.count("1"), "") assert_equal(2, $bdb.count("2"), "") assert_equal(1, $bdb.count("3"), "") assert_equal(0, $bdb.count("4"), "") assert_equal(["a", "b", "c", "d"], $bdb.get_dup("0").sort, "") assert_equal(["aa", "bb", "cc"], $bdb.get_dup("1").sort, "") assert_equal(["aaa", "bbb"], $bdb.get_dup("2").sort, "") assert_equal(["aaaa"], $bdb.get_dup("3"), "") assert_equal([], $bdb.get_dup("4"), "") end end def test_07_in_memory assert_equal(nil, $bdb.close, "") assert_kind_of(BDB::Btree, $bdb = BDB::Btree.open, "") assert_equal(0, $bdb.size, "") end def test_08_in_memory_get_set assert_equal("aa", $bdb["bb"] = "aa", "") assert_equal("cc", $bdb["bb"] = "cc", "") assert_equal("cc", $bdb["bb"], "") assert_equal(nil, $bdb.close, "") end def test_09_partial_get assert_kind_of(BDB::Btree, $bdb = BDB::Btree.open("tmp/aa", nil, "w"), "") { "red" => "boat", "green"=> "house", "blue" => "sea", }.each do |x, y| assert_equal(y, $bdb[x] = y, "") end pon, off, len = $bdb.set_partial(0, 2) assert_equal(false, pon, "") assert_equal(0, off, "") assert_equal(0, len, "") assert_equal("bo", $bdb["red"], "") assert_equal("ho", $bdb["green"], "") assert_equal("se", $bdb["blue"], "") pon, off, len = $bdb.set_partial(3, 2) assert(pon, "") assert_equal(0, off, "") assert_equal(2, len, "") assert_equal("t", $bdb["red"], "") assert_equal("se", $bdb["green"], "") assert_equal(nil, $bdb["blue"], "") pon, off, len = $bdb.partial_clear assert(pon, "") assert_equal(3, off, "") assert_equal(2, len, "") assert_equal("boat", $bdb["red"], "") assert_equal("house", $bdb["green"], "") assert_equal("sea", $bdb["blue"], "") end def test_10_partial_set $bdb.set_partial(0, 2) assert_equal("", $bdb["red"] = "", "") assert_equal("AB", $bdb["green"] = "AB", "") assert_equal("XYZ", $bdb["blue"] = "XYZ", "") assert_equal("KLM", $bdb["yellow"] = "KLM", "") pon, off, len = $bdb.clear_partial assert(pon, "") assert_equal(0, off, "") assert_equal(2, len, "") assert_equal("at", $bdb["red"], "") assert_equal("ABuse", $bdb["green"], "") assert_equal("XYZa", $bdb["blue"], "") assert_equal("KLM", $bdb["yellow"], "") pon, off, len = $bdb.set_partial(3, 2) assert(!pon, "") assert_equal(0, off, "") assert_equal(0, len, "") assert_equal("PPP", $bdb["red"] = "PPP", "") assert_equal("Q", $bdb["green"] = "Q", "") assert_equal("XYZ", $bdb["blue"] = "XYZ", "") assert_equal("TU", $bdb["yellow"] = "TU", "") pon, off, len = $bdb.clear_partial assert(pon, "") assert_equal(3, off, "") assert_equal(2, len, "") assert_equal("at\0PPP", $bdb["red"], "") assert_equal("ABuQ", $bdb["green"], "") assert_equal("XYZXYZ", $bdb["blue"], "") assert_equal("KLMTU", $bdb["yellow"], "") $bdb.close end def test_11_recnum assert_kind_of(BDB::Btree, $bdb = BDB::Btree.open("tmp/aa", nil, "w", "set_flags" => BDB::RECNUM), "") assert_equal(0, $bdb.size, "") arr = ["A 0", "B 1", "C 2", "D 3", "E 4", "F 5", "G 6"] i = 0 arr.each do |x| assert_equal(x, $bdb[i] = x, "") i += 1; end i = 0 $bdb.each_value do |x| assert_equal(arr[i], x, "") i += 1 end $bdb.delete(3); assert_equal(arr.size - 1, $bdb.size, "") assert_equal(nil, $bdb[3], "") $bdb.close end def test_12_unknown $bdb = nil assert_kind_of(BDB::Btree, unknown = BDB::Unknown.open("tmp/aa", nil, "r"), "") unknown.close end def test_13_env clean assert_kind_of(BDB::Env, $env = BDB::Env.open("tmp", BDB::CREATE|BDB::INIT_TRANSACTION)) assert_kind_of(BDB::Btree, $bdb = BDB::Btree.open("aa", nil, "a", "env" => $env), "") end def test_14_txn_commit assert_kind_of(BDB::Txn, txn = $env.begin, "") assert_kind_of(BDB::Btree, db = txn.assoc($bdb), "") assert_equal("aa", db["aa"] = "aa", "") assert_equal("bb", db["bb"] = "bb", "") assert_equal("cc", db["cc"] = "cc", "") assert_equal(3, db.size, "") assert(txn.commit, "") assert_equal(3, $bdb.size, "") end def test_15_txn_abort assert_kind_of(BDB::Txn, txn = $env.begin, "") assert_kind_of(BDB::Btree, db = txn.assoc($bdb), "") assert_equal("aa", db["aa1"] = "aa", "") assert_equal("bb", db["bb1"] = "bb", "") assert_equal("cc", db["cc1"] = "cc", "") assert_equal(6, db.size, "") assert(txn.abort, "") assert_equal(3, $bdb.size, "") end def test_16_txn_abort2 if BDB::VERSION_MAJOR == 2 && BDB::VERSION_MINOR < 7 $stderr.print "skipping test for this version" return "pass" end $env.begin($bdb) do |txn, db| db["aa1"] = "aa" db["bb1"] = "bb" assert_equal(5, db.size, "") txn.begin(db) do |txn1, db1| db1["cc1"] = "cc" assert_equal(6, db1.size, "") txn.abort assert_fail("") end assert_fail("") end assert_equal(3, $bdb.size, "") end def test_17_txn_commit2 if BDB::VERSION_MAJOR == 2 && BDB::VERSION_MINOR < 7 $stderr.print "skipping test for this version" return "pass" end $env.begin($bdb) do |txn, db| db["aa1"] = "aa" db["bb1"] = "bb" assert_equal(5, db.size, "") txn.begin(db) do |txn1, db1| db1["cc1"] = "cc" assert_equal(6, db1.size, "") txn.commit assert_fail("") end assert_fail("") end assert_equal(6, $bdb.size, "") assert_equal(nil, $bdb.close, "") $env.close end def intern_btree_delete $hash = {} File.foreach("examples/wordtest") do |line| line.chomp! $hash[line] = line.reverse $bdb[line] = line.reverse end $bdb.each do |k, v| assert_equal($hash[k], v, "") end $bdb.delete_if {|k, v| k[0] == ?a} $hash.delete_if {|k, v| k[0] == ?a} assert_equal($bdb.size, $hash.size, "") $bdb.each do |k, v| assert_equal($hash[k], v, "") end end def test_18_btree_delete clean assert_kind_of(BDB::BTCompare, $bdb = BDB::BTCompare.open("tmp/aa", nil, "w", "set_pagesize" => 1024, "set_cachesize" => [0, 32 * 1024, 0]), "") intern_btree_delete $bdb.close end def test_19_btree_delete clean assert_kind_of(BDB::Btree, $bdb = BDB::Btree.open("tmp/aa", nil, "w", "set_bt_compare" => proc {|a, b| a <=> b}, "set_pagesize" => 1024, "set_cachesize" => [0, 32 * 1024, 0]), "") intern_btree_delete end def test_20_index lines = $hash.keys array = [] 10.times do h = lines[rand(lines.size - 1)] array.push h assert_equal($hash.index(h.reverse), $bdb.index(h.reverse), "") end assert_equal($hash.indexes(array), $bdb.indexes(array), "") array.each do |k| assert($bdb.has_both?(k, k.reverse), "") end end def test_21_convert h = $bdb.to_hash h.each do |k, v| assert_equal(v, $hash[k], "") end $hash.each do |k, v| assert_equal(v, h[k], "") end h1 = $hash.to_a h2 = $bdb.to_a assert_equal(h1.size, h2.size, "") h1.each do |k| assert(h2.include?(k), "") end end if BDB::VERSION_MAJOR == 3 && BDB::VERSION_MINOR >= 3 def test_22_blurb $bdb.each(nil, 10) do |k, v| assert_equal($hash[k], v, "") end $bdb.each_key(nil, 10) do |k| assert($hash.key?(k), "") end $hash.each_key do |k| assert(!!$bdb.key?(k), "") end end end def test_23_sh val = 'a' .. 'zz' assert_equal(nil, $bdb.close, "") File::unlink('tmp/aa') if FileTest.file?('tmp/aa') assert_kind_of(BDB::Btree, $bdb = BDB::AZ.open("tmp/aa", nil, "w"), "") val.each do |l| assert_equal(l, $bdb[l] = l, "") end $bdb.each do |k, v| assert_equal(k, v, "") end assert_equal(nil, $bdb.close, "") assert_kind_of(BDB::Btree, $bdb = BDB::Btree.open("tmp/aa"), "") val.each do |l| assert_equal("yy_#{l}", $bdb["xx_#{l}"], "") end $bdb.each do |k, v| assert_equal("xx_", k[0, 3], "") assert_equal("yy_", v[0, 3], "") end assert_equal(nil, $bdb.close, "") clean end end if defined?(RUNIT) RUNIT::CUI::TestRunner.run(TestBtree.suite) end