Skip to content

Commit

Permalink
Merge pull request #1127 from herwinw/thread_variables
Browse files Browse the repository at this point in the history
Expand specs for Thread variables
  • Loading branch information
andrykonchin authored Jun 26, 2024
2 parents e4d2612 + 89328e4 commit a57ed37
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 13 deletions.
32 changes: 30 additions & 2 deletions core/thread/thread_variable_get_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,40 @@
end

it "returns the value previously set by #thread_variable_set" do
@t.thread_variable_set :a, 49
@t.thread_variable_set(:a, 49)
@t.thread_variable_get(:a).should == 49
end

it "returns a value private to self" do
@t.thread_variable_set :thread_variable_get_spec, 82
@t.thread_variable_set(:thread_variable_get_spec, 82)
Thread.current.thread_variable_get(:thread_variable_get_spec).should be_nil
end

it "accepts String and Symbol keys interchangeably" do
@t.thread_variable_set("a", 49)
@t.thread_variable_get("a").should == 49
@t.thread_variable_get(:a).should == 49
end

it "converts a key that is neither String nor Symbol with #to_str" do
key = mock('key')
key.should_receive(:to_str).and_return('a')
@t.thread_variable_set(:a, 49)
@t.thread_variable_get(key).should == 49
end

it "does not raise FrozenError if the thread is frozen" do
@t.freeze
@t.thread_variable_get(:a).should be_nil
end

it "does not raise a TypeError if the key is neither Symbol nor String, nor responds to #to_str" do
@t.thread_variable_get(123).should be_nil
end

it "does not try to convert the key with #to_sym" do
key = mock('key')
key.should_not_receive(:to_sym)
@t.thread_variable_get(key).should be_nil
end
end
42 changes: 39 additions & 3 deletions core/thread/thread_variable_set_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,53 @@
end

it "returns the value set" do
(@t.thread_variable_set :a, 2).should == 2
@t.thread_variable_set(:a, 2).should == 2
end

it "sets a value that will be returned by #thread_variable_get" do
@t.thread_variable_set :a, 49
@t.thread_variable_set(:a, 49)
@t.thread_variable_get(:a).should == 49
end

it "sets a value private to self" do
@t.thread_variable_set :thread_variable_get_spec, 82
@t.thread_variable_set(:thread_variable_get_spec, 82)
@t.thread_variable_get(:thread_variable_get_spec).should == 82
Thread.current.thread_variable_get(:thread_variable_get_spec).should be_nil
end

it "accepts String and Symbol keys interchangeably" do
@t.thread_variable_set('a', 49)
@t.thread_variable_get('a').should == 49

@t.thread_variable_set(:a, 50)
@t.thread_variable_get('a').should == 50
end

it "converts a key that is neither String nor Symbol with #to_str" do
key = mock('key')
key.should_receive(:to_str).and_return('a')
@t.thread_variable_set(key, 49)
@t.thread_variable_get(:a).should == 49
end

it "removes a key if the value is nil" do
@t.thread_variable_set(:a, 52)
@t.thread_variable_set(:a, nil)
@t.thread_variable?(:a).should be_false
end

it "raises a FrozenError if the thread is frozen" do
@t.freeze
-> { @t.thread_variable_set(:a, 1) }.should raise_error(FrozenError, "can't modify frozen thread locals")
end

it "raises a TypeError if the key is neither Symbol nor String, nor responds to #to_str" do
-> { @t.thread_variable_set(123, 1) }.should raise_error(TypeError, '123 is not a symbol')
end

it "does not try to convert the key with #to_sym" do
key = mock('key')
key.should_not_receive(:to_sym)
-> { @t.thread_variable_set(key, 42) }.should raise_error(TypeError, "#{key.inspect} is not a symbol")
end
end
36 changes: 34 additions & 2 deletions core/thread/thread_variable_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,44 @@
end

it "returns false if the thread variables do not contain 'key'" do
@t.thread_variable_set :a, 2
@t.thread_variable_set(:a, 2)
@t.thread_variable?(:b).should be_false
end

it "returns true if the thread variables contain 'key'" do
@t.thread_variable_set :a, 2
@t.thread_variable_set(:a, 2)
@t.thread_variable?(:a).should be_true
end

it "accepts String and Symbol keys interchangeably" do
@t.thread_variable?('a').should be_false
@t.thread_variable?(:a).should be_false

@t.thread_variable_set(:a, 49)

@t.thread_variable?('a').should be_true
@t.thread_variable?(:a).should be_true
end

it "converts a key that is neither String nor Symbol with #to_str" do
key = mock('key')
key.should_receive(:to_str).and_return('a')
@t.thread_variable_set(:a, 49)
@t.thread_variable?(key).should be_true
end

it "does not raise FrozenError if the thread is frozen" do
@t.freeze
@t.thread_variable?(:a).should be_false
end

it "does not raise a TypeError if the key is neither Symbol nor String, nor responds to #to_str" do
@t.thread_variable?(123).should be_false
end

it "does not try to convert the key with #to_sym" do
key = mock('key')
key.should_not_receive(:to_sym)
@t.thread_variable?(key).should be_false
end
end
22 changes: 16 additions & 6 deletions core/thread/thread_variables_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,30 @@
end

it "returns the keys of all the values set" do
@t.thread_variable_set :a, 2
@t.thread_variable_set :b, 4
@t.thread_variable_set :c, 6
@t.thread_variable_set(:a, 2)
@t.thread_variable_set(:b, 4)
@t.thread_variable_set(:c, 6)
@t.thread_variables.sort.should == [:a, :b, :c]
end

it "sets a value private to self" do
@t.thread_variable_set :a, 82
@t.thread_variable_set :b, 82
it "returns the keys private to self" do
@t.thread_variable_set(:a, 82)
@t.thread_variable_set(:b, 82)
Thread.current.thread_variables.should_not include(:a, :b)
end

it "only contains user thread variables and is empty initially" do
Thread.current.thread_variables.should == []
@t.thread_variables.should == []
end

it "returns keys as Symbols" do
key = mock('key')
key.should_receive(:to_str).and_return('a')

@t.thread_variable_set(key, 49)
@t.thread_variable_set('b', 50)
@t.thread_variable_set(:c, 51)
@t.thread_variables.sort.should == [:a, :b, :c]
end
end

0 comments on commit a57ed37

Please sign in to comment.