Skip to content

Instantly share code, notes, and snippets.

@tomoya55
Created December 19, 2009 06:20
Show Gist options
  • Select an option

  • Save tomoya55/259982 to your computer and use it in GitHub Desktop.

Select an option

Save tomoya55/259982 to your computer and use it in GitHub Desktop.
require "lru_cache"
describe Array do
it "指定された値を末尾に移動させる" do
arr = [:a, :b, :c]
arr.move_to_last(:a)
arr.last.should eql :a
end
end
describe LRUCache do
before :each do
@cache_size = rand(100) + 1
@lru = LRUCache.new(:cache_size => @cache_size)
end
describe "get_put" do
it "should have a value when called put with a new value" do
@lru.put(:key, 'value')
@lru.get(:key).should eql 'value'
end
it "サイズが2の場合、一つも使われていない場合は最初に追加したものから消える" do
@cache_size.times do |n|
@lru.put(n, "data#{n}")
end
@lru.put(:c, "dataC")
@lru.get(0).should be_nil
end
it "getされたら使われたとみなす" do
@cache_size.times do |n|
@lru.put(n, "data#{n}")
end
@lru.get(0).should eql 'data0'
@lru.put(:c, "dataC")
@lru.get(1).should be_nil
end
it "get_itemを呼んだら、itemを返す" do
@lru.put(:a, "dataA")
@lru.send(:get_item, :a)[0].should eql :a
@lru.send(:get_item, :a)[1].should be_a_kind_of Time
@lru.send(:get_item, :a)[2].should eql 'dataA'
end
it "keyが重複した場合上書きを行う" do
@lru.put(:a, "dataA")
@lru.put(:a, "dataB")
@lru.get(:a).should eql 'dataB'
end
it "keyが重複して挿入できる" do
@lru.put(0, "data100")
@cache_size.times do |n|
@lru.put(n, "data#{n}")
end
@lru.put(:c, "dataC")
@lru.get(0).should be_nil
end
it "重複したkeyを入力した場合、使われたと見なす" do
@cache_size.times do |n|
@lru.put(n, "data#{n}")
end
@lru.put(0, "data100")
@lru.put(:c, "dataC")
@lru.get(1).should be_nil
end
end
describe 'initialize' do
it "cache_sizeが0の場合"
it "初期化されるときに、キャッシュサイズを指定できる" do
lambda { LRUCache.new(:cache_size => rand(100)) }.should_not raise_error
end
it "初期化されるときに、保存時間を指定できる" do
lambda { LRUCache.new(:store_seconds => rand(100)) }.should_not raise_error
end
end
describe 'cache_size' do
it "キャッシュサイズが正しく指定できる" do
@lru.cache_size.should eql @cache_size
end
it "キャッシュサイズを変更できる" do
@lru.cache_size = 3
@lru.cache_size.should eql 3
end
it "キャッシュサイズが増えた場合、新しいサイズがフルになるまで新たにputできる" do
@cache_size.times do |n|
@lru.put(n, "data#{n}")
end
@lru.cache_size = @cache_size + 1
@lru.put(:c, "dataC")
@lru.get(0).should eql 'data0'
end
it "キャッシュサイズを1つ減らした場合、もっとも古いものが削除される" do
@cache_size.times do |n|
@lru.put(n, "data#{n}")
end
@lru.cache_size = @cache_size - 1
@lru.get(0).should be_nil
end
it "キャッシュサイズを1に減らした場合、最新のもの以外すべて削除される" do
@cache_size.times do |n|
@lru.put(n, "data#{n}")
end
@lru.cache_size = 1
(@cache_size-1).times do |n|
@lru.get(n).should be_nil
end
@lru.get(@cache_size-1).should eql "data#{@cache_size-1}"
end
end
describe '一定時間経ったデータは消える' do
it "保存する時間を指定できる" do
@lru.store_seconds = 10
@lru.store_seconds.should eql 10
end
it "アクセスタイムを見られる" do
@lru.put(:key, 'value')
@lru.send(:get_atime, :key).should be_a_kind_of Time
end
it "一定時間経ったデータは消える" do
@lru.store_seconds = 1
@lru.put(:key, 'value')
sleep(2)
@lru.get(:key).should be_nil
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment