Fix oversight in Result#[] length optimization

This commit is contained in:
Thomas Walpole 2018-05-11 15:39:34 -07:00
parent 82b50770b1
commit bda90bb504
2 changed files with 12 additions and 3 deletions

View File

@ -62,11 +62,12 @@ module Capybara
if max_idx.nil?
full_results[*args]
else
@result_cache << @results_enum.next while @result_cache.size <= max_idx
loop do
break if @result_cache.size > max_idx
@result_cache << @results_enum.next
end
@result_cache[*args]
end
rescue StopIteration
return nil
end
alias :at :[]

View File

@ -70,6 +70,8 @@ RSpec.describe Capybara::Result do
expect(result[0, 2].map(&:text)).to eq %w[Alpha Beta]
expect(result[1..3].map(&:text)).to eq %w[Beta Gamma Delta]
expect(result[-1].text).to eq 'Delta'
expect(result[-2, 3].map(&:text)).to eq %w[Gamma Delta]
expect(result[1..7].map(&:text)).to eq %w[Beta Gamma Delta]
end
it 'works with filter blocks' do
@ -122,12 +124,18 @@ RSpec.describe Capybara::Result do
skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
result[0..1]
expect(result.instance_variable_get('@result_cache').size).to be 2
expect(result[0..7].size).to eq 4
expect(result.instance_variable_get('@result_cache').size).to be 4
end
it "should evaluate filters lazily for idx and length" do
skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
result[1, 2]
expect(result.instance_variable_get('@result_cache').size).to be 3
expect(result[2, 5].size).to eq 2
expect(result.instance_variable_get('@result_cache').size).to be 4
end
it "should evaluate all elements when #to_a called" do