Skip to content
This repository was archived by the owner on Nov 30, 2024. It is now read-only.

Commit d11b9a6

Browse files
committed
Add delayed ordering strategy
1 parent 070540b commit d11b9a6

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

lib/rspec/core/ordering.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,30 @@ def order(list)
7878
end
7979
end
8080

81+
# @private
82+
# A strategy which delays looking up the ordering until needed
83+
class Delayed
84+
def initialize(registry, name)
85+
@registry = registry
86+
@name = name
87+
end
88+
89+
def order(list)
90+
strategy.order(list)
91+
end
92+
93+
private
94+
95+
def strategy
96+
@strategy ||= lookup_strategy
97+
end
98+
99+
def lookup_strategy
100+
raise "Undefined ordering strategy #{@name.inspect}" unless @registry.has_strategy?(@name)
101+
@registry.fetch(@name)
102+
end
103+
end
104+
81105
# @private
82106
# Stores the different ordering strategies.
83107
class Registry

spec/rspec/core/ordering_spec.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,18 @@ def order_with(seed)
104104
end
105105
end
106106

107+
RSpec.describe Delayed do
108+
let(:registry) { Registry.new(Configuration.new) }
109+
110+
it 'looks up a strategy to order the list later on' do
111+
strategy = Delayed.new(registry, :reverse)
112+
expect { strategy.order([1, 2, 3, 4]) }.to raise_error("Undefined ordering strategy :reverse")
113+
114+
registry.register(:reverse, Custom.new(proc { |list| list.reverse }))
115+
expect(strategy.order([1, 2, 3, 4])).to eq([4, 3, 2, 1])
116+
end
117+
end
118+
107119
RSpec.describe Registry do
108120
let(:configuration) { Configuration.new }
109121
subject(:registry) { Registry.new(configuration) }

0 commit comments

Comments
 (0)