diff options
author | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-07 12:04:49 +0000 |
---|---|---|
committer | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-07 12:04:49 +0000 |
commit | a3736e97a6ca517c2cd7d3d93a8f2ef86e39e5b5 (patch) | |
tree | 9eef7f720314ebaff56845a74e203770e62284e4 /spec/rubyspec/library/thread | |
parent | 52df1d0d3370919711c0577aaa42d1a864709885 (diff) | |
download | ruby-a3736e97a6ca517c2cd7d3d93a8f2ef86e39e5b5.tar.gz |
Add in-tree mspec and ruby/spec
* For easier modifications of ruby/spec by MRI developers.
* .gitignore: track changes under spec.
* spec/mspec, spec/rubyspec: add in-tree mspec and ruby/spec.
These files can therefore be updated like any other file in MRI.
Instructions are provided in spec/README.
[Feature #13156] [ruby-core:79246]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58595 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'spec/rubyspec/library/thread')
38 files changed, 475 insertions, 0 deletions
diff --git a/spec/rubyspec/library/thread/exclusive_spec.rb b/spec/rubyspec/library/thread/exclusive_spec.rb new file mode 100644 index 0000000000..9d30188976 --- /dev/null +++ b/spec/rubyspec/library/thread/exclusive_spec.rb @@ -0,0 +1,12 @@ +require File.expand_path('../../../spec_helper', __FILE__) +require 'thread' + +describe "Thread.exclusive" do + before :each do + ScratchPad.clear + end + + it "returns the result of yielding" do + Thread.exclusive { :result }.should == :result + end +end diff --git a/spec/rubyspec/library/thread/queue/append_spec.rb b/spec/rubyspec/library/thread/queue/append_spec.rb new file mode 100644 index 0000000000..8a9e6a21ec --- /dev/null +++ b/spec/rubyspec/library/thread/queue/append_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/enque', __FILE__) + +describe "Thread::Queue#<<" do + it_behaves_like :queue_enq, :<<, -> { Queue.new } +end diff --git a/spec/rubyspec/library/thread/queue/clear_spec.rb b/spec/rubyspec/library/thread/queue/clear_spec.rb new file mode 100644 index 0000000000..3272a5f3e0 --- /dev/null +++ b/spec/rubyspec/library/thread/queue/clear_spec.rb @@ -0,0 +1,9 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/clear', __FILE__) + +describe "Thread::Queue#clear" do + it_behaves_like :queue_clear, :clear, -> { Queue.new } + + # TODO: test for atomicity of Queue#clear +end diff --git a/spec/rubyspec/library/thread/queue/close_spec.rb b/spec/rubyspec/library/thread/queue/close_spec.rb new file mode 100644 index 0000000000..728fff1bfa --- /dev/null +++ b/spec/rubyspec/library/thread/queue/close_spec.rb @@ -0,0 +1,9 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/close', __FILE__) + +ruby_version_is "2.3" do + describe "Queue#close" do + it_behaves_like :queue_close, :close, -> { Queue.new } + end +end diff --git a/spec/rubyspec/library/thread/queue/closed_spec.rb b/spec/rubyspec/library/thread/queue/closed_spec.rb new file mode 100644 index 0000000000..98ce9c70e3 --- /dev/null +++ b/spec/rubyspec/library/thread/queue/closed_spec.rb @@ -0,0 +1,9 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/closed', __FILE__) + +ruby_version_is "2.3" do + describe "Queue#closed?" do + it_behaves_like :queue_closed?, :closed?, -> { Queue.new } + end +end diff --git a/spec/rubyspec/library/thread/queue/deq_spec.rb b/spec/rubyspec/library/thread/queue/deq_spec.rb new file mode 100644 index 0000000000..7b629bafce --- /dev/null +++ b/spec/rubyspec/library/thread/queue/deq_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/deque', __FILE__) + +describe "Thread::Queue#deq" do + it_behaves_like :queue_deq, :deq, -> { Queue.new } +end diff --git a/spec/rubyspec/library/thread/queue/empty_spec.rb b/spec/rubyspec/library/thread/queue/empty_spec.rb new file mode 100644 index 0000000000..dea7eb658e --- /dev/null +++ b/spec/rubyspec/library/thread/queue/empty_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/empty', __FILE__) + +describe "Thread::Queue#empty?" do + it_behaves_like :queue_empty?, :empty?, -> { Queue.new } +end diff --git a/spec/rubyspec/library/thread/queue/enq_spec.rb b/spec/rubyspec/library/thread/queue/enq_spec.rb new file mode 100644 index 0000000000..dc2508589e --- /dev/null +++ b/spec/rubyspec/library/thread/queue/enq_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/enque', __FILE__) + +describe "Thread::Queue#enq" do + it_behaves_like :queue_enq, :enq, -> { Queue.new } +end diff --git a/spec/rubyspec/library/thread/queue/length_spec.rb b/spec/rubyspec/library/thread/queue/length_spec.rb new file mode 100644 index 0000000000..f33e51a971 --- /dev/null +++ b/spec/rubyspec/library/thread/queue/length_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/length', __FILE__) + +describe "Thread::Queue#length" do + it_behaves_like :queue_length, :length, -> { Queue.new } +end diff --git a/spec/rubyspec/library/thread/queue/num_waiting_spec.rb b/spec/rubyspec/library/thread/queue/num_waiting_spec.rb new file mode 100644 index 0000000000..253ef8a476 --- /dev/null +++ b/spec/rubyspec/library/thread/queue/num_waiting_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/num_waiting', __FILE__) + +describe "Thread::Queue#num_waiting" do + it_behaves_like :queue_num_waiting, :num_waiting, -> { Queue.new } +end diff --git a/spec/rubyspec/library/thread/queue/pop_spec.rb b/spec/rubyspec/library/thread/queue/pop_spec.rb new file mode 100644 index 0000000000..e812e9442e --- /dev/null +++ b/spec/rubyspec/library/thread/queue/pop_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/deque', __FILE__) + +describe "Thread::Queue#pop" do + it_behaves_like :queue_deq, :pop, -> { Queue.new } +end diff --git a/spec/rubyspec/library/thread/queue/push_spec.rb b/spec/rubyspec/library/thread/queue/push_spec.rb new file mode 100644 index 0000000000..2f1a31315d --- /dev/null +++ b/spec/rubyspec/library/thread/queue/push_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/enque', __FILE__) + +describe "Thread::Queue#push" do + it_behaves_like :queue_enq, :push, -> { Queue.new } +end diff --git a/spec/rubyspec/library/thread/queue/shift_spec.rb b/spec/rubyspec/library/thread/queue/shift_spec.rb new file mode 100644 index 0000000000..16164a72ec --- /dev/null +++ b/spec/rubyspec/library/thread/queue/shift_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/deque', __FILE__) + +describe "Thread::Queue#shift" do + it_behaves_like :queue_deq, :shift, -> { Queue.new } +end diff --git a/spec/rubyspec/library/thread/queue/size_spec.rb b/spec/rubyspec/library/thread/queue/size_spec.rb new file mode 100644 index 0000000000..4b148aecd3 --- /dev/null +++ b/spec/rubyspec/library/thread/queue/size_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/length', __FILE__) + +describe "Thread::Queue#size" do + it_behaves_like :queue_length, :size, -> { Queue.new } +end diff --git a/spec/rubyspec/library/thread/shared/queue/clear.rb b/spec/rubyspec/library/thread/shared/queue/clear.rb new file mode 100644 index 0000000000..59ea37d615 --- /dev/null +++ b/spec/rubyspec/library/thread/shared/queue/clear.rb @@ -0,0 +1,10 @@ +describe :queue_clear, shared: true do + it "removes all objects from the queue" do + queue = @object.call + queue << Object.new + queue << 1 + queue.empty?.should be_false + queue.clear + queue.empty?.should be_true + end +end diff --git a/spec/rubyspec/library/thread/shared/queue/close.rb b/spec/rubyspec/library/thread/shared/queue/close.rb new file mode 100644 index 0000000000..4457f3ae8b --- /dev/null +++ b/spec/rubyspec/library/thread/shared/queue/close.rb @@ -0,0 +1,26 @@ +describe :queue_close, shared: true do + it "closes the queue and returns nil for further #pop" do + q = @object.call + q << 1 + q.close + q.pop.should == 1 + q.pop.should == nil + q.pop.should == nil + end + + it "prevents further #push" do + q = @object.call + q.close + lambda { + q << 1 + }.should raise_error(ClosedQueueError) + end + + it "may be called multiple times" do + q = @object.call + q.close + q.closed?.should be_true + q.close # no effect + q.closed?.should be_true + end +end diff --git a/spec/rubyspec/library/thread/shared/queue/closed.rb b/spec/rubyspec/library/thread/shared/queue/closed.rb new file mode 100644 index 0000000000..b3cea0c524 --- /dev/null +++ b/spec/rubyspec/library/thread/shared/queue/closed.rb @@ -0,0 +1,12 @@ +describe :queue_closed?, shared: true do + it "returns false initially" do + queue = @object.call + queue.closed?.should be_false + end + + it "returns true when the queue is closed" do + queue = @object.call + queue.close + queue.closed?.should be_true + end +end diff --git a/spec/rubyspec/library/thread/shared/queue/deque.rb b/spec/rubyspec/library/thread/shared/queue/deque.rb new file mode 100644 index 0000000000..1b06dffa2c --- /dev/null +++ b/spec/rubyspec/library/thread/shared/queue/deque.rb @@ -0,0 +1,37 @@ +describe :queue_deq, shared: true do + it "removes an item from the Queue" do + q = @object.call + q << Object.new + q.size.should == 1 + q.send(@method) + q.size.should == 0 + end + + it "returns items in the order they were added" do + q = @object.call + q << 1 + q << 2 + q.send(@method).should == 1 + q.send(@method).should == 2 + end + + it "blocks the thread until there are items in the queue" do + q = @object.call + v = 0 + + th = Thread.new do + q.send(@method) + v = 1 + end + + v.should == 0 + q << Object.new + th.join + v.should == 1 + end + + it "raises a ThreadError if Queue is empty" do + q = @object.call + lambda { q.send(@method,true) }.should raise_error(ThreadError) + end +end diff --git a/spec/rubyspec/library/thread/shared/queue/empty.rb b/spec/rubyspec/library/thread/shared/queue/empty.rb new file mode 100644 index 0000000000..4acd831d48 --- /dev/null +++ b/spec/rubyspec/library/thread/shared/queue/empty.rb @@ -0,0 +1,12 @@ +describe :queue_empty?, shared: true do + it "returns true on an empty Queue" do + queue = @object.call + queue.empty?.should be_true + end + + it "returns false when Queue is not empty" do + queue = @object.call + queue << Object.new + queue.empty?.should be_false + end +end diff --git a/spec/rubyspec/library/thread/shared/queue/enque.rb b/spec/rubyspec/library/thread/shared/queue/enque.rb new file mode 100644 index 0000000000..36b98d3a07 --- /dev/null +++ b/spec/rubyspec/library/thread/shared/queue/enque.rb @@ -0,0 +1,10 @@ +describe :queue_enq, shared: true do + it "adds an element to the Queue" do + q = @object.call + q.size.should == 0 + q.send(@method, Object.new) + q.size.should == 1 + q.send(@method, Object.new) + q.size.should == 2 + end +end diff --git a/spec/rubyspec/library/thread/shared/queue/length.rb b/spec/rubyspec/library/thread/shared/queue/length.rb new file mode 100644 index 0000000000..a0143a4e19 --- /dev/null +++ b/spec/rubyspec/library/thread/shared/queue/length.rb @@ -0,0 +1,9 @@ +describe :queue_length, shared: true do + it "returns the number of elements" do + q = @object.call + q.send(@method).should == 0 + q << Object.new + q << Object.new + q.send(@method).should == 2 + end +end diff --git a/spec/rubyspec/library/thread/shared/queue/num_waiting.rb b/spec/rubyspec/library/thread/shared/queue/num_waiting.rb new file mode 100644 index 0000000000..b054951e45 --- /dev/null +++ b/spec/rubyspec/library/thread/shared/queue/num_waiting.rb @@ -0,0 +1,16 @@ +describe :queue_num_waiting, shared: true do + it "reports the number of threads waiting on the queue" do + q = @object.call + threads = [] + + 5.times do |i| + q.num_waiting.should == i + t = Thread.new { q.deq } + Thread.pass until q.num_waiting == i+1 + threads << t + end + + threads.each { q.enq Object.new } + threads.each {|t| t.join } + end +end diff --git a/spec/rubyspec/library/thread/sizedqueue/append_spec.rb b/spec/rubyspec/library/thread/sizedqueue/append_spec.rb new file mode 100644 index 0000000000..2799472767 --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/append_spec.rb @@ -0,0 +1,12 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/enque', __FILE__) +require File.expand_path('../shared/enque', __FILE__) + +describe "Thread::SizedQueue#<<" do + it_behaves_like :queue_enq, :<<, -> { SizedQueue.new(10) } +end + +describe "Thread::SizedQueue#<<" do + it_behaves_like :sizedqueue_enq, :<< +end diff --git a/spec/rubyspec/library/thread/sizedqueue/clear_spec.rb b/spec/rubyspec/library/thread/sizedqueue/clear_spec.rb new file mode 100644 index 0000000000..7dc328803a --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/clear_spec.rb @@ -0,0 +1,9 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/clear', __FILE__) + +describe "Thread::SizedQueue#clear" do + it_behaves_like :queue_clear, :clear, -> { SizedQueue.new(10) } + + # TODO: test for atomicity of Queue#clear +end diff --git a/spec/rubyspec/library/thread/sizedqueue/close_spec.rb b/spec/rubyspec/library/thread/sizedqueue/close_spec.rb new file mode 100644 index 0000000000..465b9ea091 --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/close_spec.rb @@ -0,0 +1,9 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/close', __FILE__) + +ruby_version_is "2.3" do + describe "SizedQueue#close" do + it_behaves_like :queue_close, :close, -> { SizedQueue.new(10) } + end +end diff --git a/spec/rubyspec/library/thread/sizedqueue/closed_spec.rb b/spec/rubyspec/library/thread/sizedqueue/closed_spec.rb new file mode 100644 index 0000000000..9ec72c1aa7 --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/closed_spec.rb @@ -0,0 +1,9 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/closed', __FILE__) + +ruby_version_is "2.3" do + describe "SizedQueue#closed?" do + it_behaves_like :queue_closed?, :closed?, -> { SizedQueue.new(10) } + end +end diff --git a/spec/rubyspec/library/thread/sizedqueue/deq_spec.rb b/spec/rubyspec/library/thread/sizedqueue/deq_spec.rb new file mode 100644 index 0000000000..cc11319d22 --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/deq_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/deque', __FILE__) + +describe "Thread::SizedQueue#deq" do + it_behaves_like :queue_deq, :deq, -> { SizedQueue.new(10) } +end diff --git a/spec/rubyspec/library/thread/sizedqueue/empty_spec.rb b/spec/rubyspec/library/thread/sizedqueue/empty_spec.rb new file mode 100644 index 0000000000..368bb00d5f --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/empty_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/empty', __FILE__) + +describe "Thread::SizedQueue#empty?" do + it_behaves_like :queue_empty?, :empty?, -> { SizedQueue.new(10) } +end diff --git a/spec/rubyspec/library/thread/sizedqueue/enq_spec.rb b/spec/rubyspec/library/thread/sizedqueue/enq_spec.rb new file mode 100644 index 0000000000..a0be7bbf05 --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/enq_spec.rb @@ -0,0 +1,12 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/enque', __FILE__) +require File.expand_path('../shared/enque', __FILE__) + +describe "Thread::SizedQueue#enq" do + it_behaves_like :queue_enq, :enq, -> { SizedQueue.new(10) } +end + +describe "Thread::SizedQueue#enq" do + it_behaves_like :sizedqueue_enq, :enq +end diff --git a/spec/rubyspec/library/thread/sizedqueue/length_spec.rb b/spec/rubyspec/library/thread/sizedqueue/length_spec.rb new file mode 100644 index 0000000000..c292883a8e --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/length_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/length', __FILE__) + +describe "Thread::SizedQueue#length" do + it_behaves_like :queue_length, :length, -> { SizedQueue.new(10) } +end diff --git a/spec/rubyspec/library/thread/sizedqueue/max_spec.rb b/spec/rubyspec/library/thread/sizedqueue/max_spec.rb new file mode 100644 index 0000000000..337404d821 --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/max_spec.rb @@ -0,0 +1,52 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' + +describe "Thread::SizedQueue#max" do + before :each do + @sized_queue = SizedQueue.new(5) + end + + it "returns the size of the queue" do + @sized_queue.max.should == 5 + end +end + +describe "Thread::SizedQueue#max=" do + before :each do + @sized_queue = SizedQueue.new(5) + end + + it "sets the size of the queue" do + @sized_queue.max.should == 5 + @sized_queue.max = 10 + @sized_queue.max.should == 10 + end + + it "does not remove items already in the queue beyond the maximum" do + @sized_queue.enq 1 + @sized_queue.enq 2 + @sized_queue.enq 3 + @sized_queue.max = 2 + (@sized_queue.size > @sized_queue.max).should be_true + @sized_queue.deq.should == 1 + @sized_queue.deq.should == 2 + @sized_queue.deq.should == 3 + end + + it "raises a TypeError when given a non-numeric value" do + lambda { @sized_queue.max = "foo" }.should raise_error(TypeError) + lambda { @sized_queue.max = Object.new }.should raise_error(TypeError) + end + + it "raises an argument error when set to zero" do + @sized_queue.max.should == 5 + lambda { @sized_queue.max = 0 }.should raise_error(ArgumentError) + @sized_queue.max.should == 5 + end + + it "raises an argument error when set to a negative number" do + @sized_queue.max.should == 5 + lambda { @sized_queue.max = -1 }.should raise_error(ArgumentError) + @sized_queue.max.should == 5 + end +end diff --git a/spec/rubyspec/library/thread/sizedqueue/new_spec.rb b/spec/rubyspec/library/thread/sizedqueue/new_spec.rb new file mode 100644 index 0000000000..a36aa5ed18 --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/new_spec.rb @@ -0,0 +1,25 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' + +describe "Thread::SizedQueue#new" do + it "returns a new SizedQueue" do + SizedQueue.new(1).should be_kind_of(SizedQueue) + end + + it "raises a TypeError when the given argument is not Numeric" do + lambda { SizedQueue.new("foo") }.should raise_error(TypeError) + lambda { SizedQueue.new(Object.new) }.should raise_error(TypeError) + end + + it "raises an argument error when no argument is given" do + lambda { SizedQueue.new }.should raise_error(ArgumentError) + end + + it "raises an argument error when the given argument is zero" do + lambda { SizedQueue.new(0) }.should raise_error(ArgumentError) + end + + it "raises an argument error when the given argument is negative" do + lambda { SizedQueue.new(-1) }.should raise_error(ArgumentError) + end +end diff --git a/spec/rubyspec/library/thread/sizedqueue/num_waiting_spec.rb b/spec/rubyspec/library/thread/sizedqueue/num_waiting_spec.rb new file mode 100644 index 0000000000..2ce53875cc --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/num_waiting_spec.rb @@ -0,0 +1,18 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/num_waiting', __FILE__) + +describe "Thread::SizedQueue#num_waiting" do + it_behaves_like :queue_num_waiting, :num_waiting, -> { SizedQueue.new(10) } + + it "reports the number of threads waiting to push" do + q = SizedQueue.new(1) + q.push(1) + t = Thread.new { q.push(2) } + sleep 0.05 until t.stop? + q.num_waiting.should == 1 + + q.pop + t.join + end +end diff --git a/spec/rubyspec/library/thread/sizedqueue/pop_spec.rb b/spec/rubyspec/library/thread/sizedqueue/pop_spec.rb new file mode 100644 index 0000000000..a83ea6406a --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/pop_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/deque', __FILE__) + +describe "Thread::SizedQueue#pop" do + it_behaves_like :queue_deq, :pop, -> { SizedQueue.new(10) } +end diff --git a/spec/rubyspec/library/thread/sizedqueue/push_spec.rb b/spec/rubyspec/library/thread/sizedqueue/push_spec.rb new file mode 100644 index 0000000000..6021a043c9 --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/push_spec.rb @@ -0,0 +1,12 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/enque', __FILE__) +require File.expand_path('../shared/enque', __FILE__) + +describe "Thread::SizedQueue#push" do + it_behaves_like :queue_enq, :push, -> { SizedQueue.new(10) } +end + +describe "Thread::SizedQueue#push" do + it_behaves_like :sizedqueue_enq, :push +end diff --git a/spec/rubyspec/library/thread/sizedqueue/shared/enque.rb b/spec/rubyspec/library/thread/sizedqueue/shared/enque.rb new file mode 100644 index 0000000000..627f8bd745 --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/shared/enque.rb @@ -0,0 +1,34 @@ +describe :sizedqueue_enq, shared: true do + it "blocks if queued elements exceed size" do + q = SizedQueue.new(1) + + q.size.should == 0 + q.send(@method, :first_element) + q.size.should == 1 + + blocked_thread = Thread.new { q.send(@method, :second_element) } + sleep 0.01 until blocked_thread.stop? + + q.size.should == 1 + q.pop.should == :first_element + + blocked_thread.join + q.size.should == 1 + q.pop.should == :second_element + q.size.should == 0 + end + + it "raises a ThreadError if queued elements exceed size when not blocking" do + q = SizedQueue.new(2) + + non_blocking = true + add_to_queue = lambda { q.send(@method, Object.new, non_blocking) } + + q.size.should == 0 + add_to_queue.call + q.size.should == 1 + add_to_queue.call + q.size.should == 2 + add_to_queue.should raise_error(ThreadError) + end +end diff --git a/spec/rubyspec/library/thread/sizedqueue/shift_spec.rb b/spec/rubyspec/library/thread/sizedqueue/shift_spec.rb new file mode 100644 index 0000000000..89345718df --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/shift_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/deque', __FILE__) + +describe "Thread::SizedQueue#shift" do + it_behaves_like :queue_deq, :shift, -> { SizedQueue.new(10) } +end diff --git a/spec/rubyspec/library/thread/sizedqueue/size_spec.rb b/spec/rubyspec/library/thread/sizedqueue/size_spec.rb new file mode 100644 index 0000000000..7ab72d91b1 --- /dev/null +++ b/spec/rubyspec/library/thread/sizedqueue/size_spec.rb @@ -0,0 +1,7 @@ +require File.expand_path('../../../../spec_helper', __FILE__) +require 'thread' +require File.expand_path('../../shared/queue/length', __FILE__) + +describe "Thread::SizedQueue#size" do + it_behaves_like :queue_length, :size, -> { SizedQueue.new(10) } +end |