include :assert

setup name: "test gdbm" {
	include :gdbm
  include :file
		
  test "gdbm.closed?" {
		db = gdbm.open "test.gdbm"
		assert_false db.closed?
		db.close
		assert db.closed?

		file.delete "test.gdbm"
	}

  test "gdbm.delete" {
    db = gdbm.open "test.gdbm" "wc"

    db["hello"] = "ciao!"
    assert_equal db["hello"], "ciao!"
    db.delete "hello"
    assert_null db["hello"]

    db.close
    file.delete "test.gdbm"
  }

  test "gdbm.each" {
    dessert = [:jello :pudding :cake :pie :ice_cream].sort

    db = gdbm.open "test.gdbm" "wc"
    dessert.each { v |
      db[v] = v
    }

    h = [:]
    
    db.each { k, v |
      h[k] = v
    }

    db.close

    assert_equal dessert, h.keys.sort
    assert_equal dessert, h.values.sort

    file.delete "test.gdbm"
  }

  test "gdbm.each_key" {
    dessert = [:jello :pudding :cake :pie :ice_cream].sort

    db = gdbm.open "test.gdbm" "wc"
    dessert.each { v |
      db[v] = v
    }

    h = []
    
    db.each_key { k |
      h << k
    }

    db.close

    assert_equal dessert, h.sort

    file.delete "test.gdbm"
  }

  test "gdbm.each_value" {
    dessert = [:jello :pudding :cake :pie :ice_cream].sort

    db = gdbm.open "test.gdbm" "wc"
    dessert.each { v |
      db[v] = v
    }

    h = []
    
    db.each_value { v |
      h << v
    }

    db.close

    assert_equal dessert, h.sort

    file.delete "test.gdbm"
  }

  test "gdbm.key?" {
    db = gdbm.open "test.gdbm" "wc"
    
    assert_false db.key? :teest
    db[:teest] = :yup
    assert db.key? :teest

    db.close
    file.delete "test.gdbm"
  }

  test "gdbm.keys" {
    db = gdbm.open "test.gdbm" "wc"
    db[:hello] = :world
    db[:goodbye] = :moon
    keys = db.keys
    db.close

    assert_equal [:goodbye :hello] keys.sort

    file.delete "test.gdbm"
  }

  test "gdbm.values" {
    db = gdbm.open "test.gdbm" "wc"
    db[:hello] = :world
    db[:goodbye] = :moon
    values = db.values
    db.close

    assert_equal [:moon :world] values.sort

    file.delete "test.gdbm"
  }
}