Skip to content

Commit 9e3a27f

Browse files
committed
Obligation shared specs now called from IVar shared specs.
1 parent 49f6718 commit 9e3a27f

File tree

5 files changed

+52
-89
lines changed

5 files changed

+52
-89
lines changed

lib/concurrent/ivar.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ def add_observer(observer = nil, func = :update, &block)
102102
# @param [Object] value the value to store in the `IVar`
103103
# @raise [Concurrent::MultipleAssignmentError] if the `IVar` has already
104104
# been set or otherwise completed
105+
# @return [IVar] self
105106
def set(value = NO_VALUE)
106107
if (block_given? && value != NO_VALUE) || (!block_given? && value == NO_VALUE)
107108
raise ArgumentError.new('must set with either a value or a block')
@@ -122,6 +123,7 @@ def set(value = NO_VALUE)
122123
# @param [Object] reason for the failure
123124
# @raise [Concurrent::MultipleAssignmentError] if the `IVar` has already
124125
# been set or otherwise completed
126+
# @return [IVar] self
125127
def fail(reason = StandardError.new)
126128
set { raise reason }
127129
end

spec/concurrent/future_spec.rb

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
require_relative 'dereferenceable_shared'
22
require_relative 'ivar_shared'
3-
require_relative 'obligation_shared'
43
require_relative 'observable_shared'
54
require_relative 'thread_arguments_shared'
65

@@ -17,14 +16,26 @@ module Concurrent
1716
}.execute.tap{ sleep(0.1) }
1817
end
1918

20-
context 'manual completion' do
21-
subject { Future.new(executor: :immediate){ nil } }
22-
it_should_behave_like :ivar
19+
let!(:fulfilled_value) { 10 }
20+
let!(:rejected_reason) { StandardError.new('mojo jojo') }
21+
22+
let(:pending_subject) do
23+
Future.new(executor: executor){ sleep(0.1); fulfilled_value }.execute
2324
end
2425

25-
context 'behavior' do
26+
let(:fulfilled_subject) do
27+
Future.new(executor: executor){ fulfilled_value }.execute.tap{ sleep(0.1) }
28+
end
2629

27-
# thread_arguments
30+
let(:rejected_subject) do
31+
Future.new(executor: executor){ raise rejected_reason }.execute.tap{ sleep(0.1) }
32+
end
33+
34+
it_should_behave_like :ivar do
35+
subject { Future.new(executor: :immediate){ nil } }
36+
end
37+
38+
it_should_behave_like :thread_arguments do
2839

2940
def get_ivar_from_no_args
3041
Concurrent::Future.execute{|*args| args }
@@ -33,29 +44,9 @@ def get_ivar_from_no_args
3344
def get_ivar_from_args(opts)
3445
Concurrent::Future.execute(opts){|*args| args }
3546
end
47+
end
3648

37-
it_should_behave_like :thread_arguments
38-
39-
# obligation
40-
41-
let!(:fulfilled_value) { 10 }
42-
let!(:rejected_reason) { StandardError.new('mojo jojo') }
43-
44-
let(:pending_subject) do
45-
Future.new(executor: executor){ sleep(3); fulfilled_value }.execute
46-
end
47-
48-
let(:fulfilled_subject) do
49-
Future.new(executor: executor){ fulfilled_value }.execute.tap{ sleep(0.1) }
50-
end
51-
52-
let(:rejected_subject) do
53-
Future.new(executor: executor){ raise rejected_reason }.execute.tap{ sleep(0.1) }
54-
end
55-
56-
it_should_behave_like :obligation
57-
58-
# dereferenceable
49+
it_should_behave_like :dereferenceable do
5950

6051
def dereferenceable_subject(value, opts = {})
6152
opts = opts.merge(executor: executor)
@@ -71,19 +62,16 @@ def execute_dereferenceable(subject)
7162
subject.execute
7263
sleep(0.1)
7364
end
65+
end
7466

75-
it_should_behave_like :dereferenceable
76-
77-
# observable
67+
it_should_behave_like :observable do
7868

7969
subject{ Future.new{ nil } }
8070

8171
def trigger_observable(observable)
8272
observable.execute
8373
sleep(0.1)
8474
end
85-
86-
it_should_behave_like :observable
8775
end
8876

8977
context '#initialize' do

spec/concurrent/ivar_shared.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
require_relative 'obligation_shared'
2+
13
shared_examples :ivar do
24

5+
it_should_behave_like :obligation
6+
37
context 'initialization' do
48

59
it 'sets the state to incomplete' do

spec/concurrent/ivar_spec.rb

Lines changed: 22 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
require_relative 'dereferenceable_shared'
22
require_relative 'ivar_shared'
3-
require_relative 'obligation_shared'
43
require_relative 'observable_shared'
54

65
module Concurrent
@@ -9,48 +8,33 @@ module Concurrent
98

109
let!(:value) { 10 }
1110

12-
subject do
13-
i = IVar.new
14-
i.set(14)
15-
i
16-
end
17-
18-
context 'manual completion' do
19-
subject{ IVar.new }
20-
it_should_behave_like :ivar
21-
end
22-
23-
context 'behavior' do
24-
25-
# obligation
11+
let!(:fulfilled_value) { 10 }
12+
let(:rejected_reason) { StandardError.new('Boom!') }
2613

27-
let!(:fulfilled_value) { 10 }
28-
let(:rejected_reason) { StandardError.new('Boom!') }
14+
subject { IVar.new(value) }
2915

30-
let(:pending_subject) do
31-
@i = IVar.new
32-
Thread.new do
33-
sleep(3)
34-
@i.set(fulfilled_value)
35-
end
36-
@i
16+
let(:pending_subject) do
17+
ivar = IVar.new
18+
Thread.new do
19+
sleep(0.1)
20+
ivar.set(fulfilled_value)
3721
end
22+
ivar
23+
end
3824

39-
let(:fulfilled_subject) do
40-
i = IVar.new
41-
i.set(fulfilled_value)
42-
i
43-
end
25+
let(:fulfilled_subject) do
26+
IVar.new.set(fulfilled_value)
27+
end
4428

45-
let(:rejected_subject) do
46-
i = IVar.new
47-
i.fail(rejected_reason)
48-
i
49-
end
29+
let(:rejected_subject) do
30+
IVar.new.fail(rejected_reason)
31+
end
5032

51-
it_should_behave_like :obligation
33+
it_should_behave_like :ivar do
34+
subject{ IVar.new }
35+
end
5236

53-
# dereferenceable
37+
it_should_behave_like :dereferenceable do
5438

5539
def dereferenceable_subject(value, opts = {})
5640
IVar.new(value, opts)
@@ -63,18 +47,15 @@ def dereferenceable_observable(opts = {})
6347
def execute_dereferenceable(subject)
6448
subject.set('value')
6549
end
50+
end
6651

67-
it_should_behave_like :dereferenceable
68-
69-
# observable
52+
it_should_behave_like :observable do
7053

7154
subject{ IVar.new }
7255

7356
def trigger_observable(observable)
7457
observable.set('value')
7558
end
76-
77-
it_should_behave_like :observable
7859
end
7960

8061
context '#initialize' do
@@ -93,7 +74,6 @@ def trigger_observable(observable)
9374
i = IVar.new(14)
9475
expect(i).to be_complete
9576
end
96-
9777
end
9878

9979
context 'observation' do
@@ -154,7 +134,6 @@ def reentrant_observer(i)
154134
expect(obs.value).to eq 42
155135
end
156136
end
157-
158137
end
159138
end
160139
end

spec/concurrent/promise_spec.rb

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
require_relative 'ivar_shared'
2-
require_relative 'obligation_shared'
32
require_relative 'thread_arguments_shared'
43

54
module Concurrent
@@ -13,7 +12,7 @@ module Concurrent
1312
let!(:rejected_reason) { StandardError.new('mojo jojo') }
1413

1514
let(:pending_subject) do
16-
Promise.new(executor: executor){ sleep(0.3); fulfilled_value }.execute
15+
Promise.new(executor: executor){ sleep(0.1); fulfilled_value }.execute
1716
end
1817

1918
let(:fulfilled_subject) do
@@ -24,14 +23,11 @@ module Concurrent
2423
Promise.reject(rejected_reason, executor: executor)
2524
end
2625

27-
context 'manual completion' do
26+
it_should_behave_like :ivar do
2827
subject{ Promise.new(executor: :immediate) }
29-
it_should_behave_like :ivar
3028
end
3129

32-
context 'behavior' do
33-
34-
# thread_arguments
30+
it_should_behave_like :thread_arguments do
3531

3632
def get_ivar_from_no_args
3733
Concurrent::Promise.execute{|*args| args }
@@ -40,12 +36,6 @@ def get_ivar_from_no_args
4036
def get_ivar_from_args(opts)
4137
Concurrent::Promise.execute(opts){|*args| args }
4238
end
43-
44-
it_should_behave_like :thread_arguments
45-
46-
# obligation
47-
48-
it_should_behave_like :obligation
4939
end
5040

5141
it 'includes Dereferenceable' do

0 commit comments

Comments
 (0)