diff options
Diffstat (limited to 'spec/ruby/library/thread/sizedqueue')
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/append_spec.rb | 12 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/clear_spec.rb | 9 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/close_spec.rb | 9 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/closed_spec.rb | 9 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/deq_spec.rb | 7 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/empty_spec.rb | 7 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/enq_spec.rb | 12 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/length_spec.rb | 7 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/max_spec.rb | 52 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/new_spec.rb | 25 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/num_waiting_spec.rb | 18 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/pop_spec.rb | 7 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/push_spec.rb | 12 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/shared/enque.rb | 34 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/shift_spec.rb | 7 | ||||
-rw-r--r-- | spec/ruby/library/thread/sizedqueue/size_spec.rb | 7 |
16 files changed, 234 insertions, 0 deletions
diff --git a/spec/ruby/library/thread/sizedqueue/append_spec.rb b/spec/ruby/library/thread/sizedqueue/append_spec.rb new file mode 100644 index 0000000000..2799472767 --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/clear_spec.rb b/spec/ruby/library/thread/sizedqueue/clear_spec.rb new file mode 100644 index 0000000000..7dc328803a --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/close_spec.rb b/spec/ruby/library/thread/sizedqueue/close_spec.rb new file mode 100644 index 0000000000..465b9ea091 --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/closed_spec.rb b/spec/ruby/library/thread/sizedqueue/closed_spec.rb new file mode 100644 index 0000000000..9ec72c1aa7 --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/deq_spec.rb b/spec/ruby/library/thread/sizedqueue/deq_spec.rb new file mode 100644 index 0000000000..cc11319d22 --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/empty_spec.rb b/spec/ruby/library/thread/sizedqueue/empty_spec.rb new file mode 100644 index 0000000000..368bb00d5f --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/enq_spec.rb b/spec/ruby/library/thread/sizedqueue/enq_spec.rb new file mode 100644 index 0000000000..a0be7bbf05 --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/length_spec.rb b/spec/ruby/library/thread/sizedqueue/length_spec.rb new file mode 100644 index 0000000000..c292883a8e --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/max_spec.rb b/spec/ruby/library/thread/sizedqueue/max_spec.rb new file mode 100644 index 0000000000..54cc6351bd --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/new_spec.rb b/spec/ruby/library/thread/sizedqueue/new_spec.rb new file mode 100644 index 0000000000..a36aa5ed18 --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/num_waiting_spec.rb b/spec/ruby/library/thread/sizedqueue/num_waiting_spec.rb new file mode 100644 index 0000000000..2ce53875cc --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/pop_spec.rb b/spec/ruby/library/thread/sizedqueue/pop_spec.rb new file mode 100644 index 0000000000..a83ea6406a --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/push_spec.rb b/spec/ruby/library/thread/sizedqueue/push_spec.rb new file mode 100644 index 0000000000..6021a043c9 --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/shared/enque.rb b/spec/ruby/library/thread/sizedqueue/shared/enque.rb new file mode 100644 index 0000000000..627f8bd745 --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/shift_spec.rb b/spec/ruby/library/thread/sizedqueue/shift_spec.rb new file mode 100644 index 0000000000..89345718df --- /dev/null +++ b/spec/ruby/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/ruby/library/thread/sizedqueue/size_spec.rb b/spec/ruby/library/thread/sizedqueue/size_spec.rb new file mode 100644 index 0000000000..7ab72d91b1 --- /dev/null +++ b/spec/ruby/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 |