1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
# frozen_string_literal: true
require 'set'
RSpec.describe 'shrinking' do
include Hypothesis::Debug
it 'finds lower bounds on integers' do
n, = find { any(integers) >= 10 }
expect(n).to eq(10)
end
it 'iterates to a fixed point' do
@original = nil
a, b = find do
m = any integers
n = any integers
m > n && n > 0
end
expect(a).to eq(2)
expect(b).to eq(1)
end
it 'can shrink through a chain' do
ls, = find do
x = any built_as do
n = any integers(min: 1, max: 100)
any arrays(of: integers(min: 0, max: 10), min_size: n, max_size: n)
end
x.sum >= 50
end
expect(ls).to_not include(0)
end
it 'can shrink through a chain without deleting first element' do
10.times do
ls, = find do
x = any built_as do
n = any integers(min: 1, max: 100)
any arrays(of: integers(min: 0, max: 10), min_size: n, max_size: n)
end
assume x[0] > 0
x.sum >= 50
end
expect(ls).to_not include(0)
end
end
it 'can shrink duplicate elements' do
10.times do
ls, = find do
x = any array(of: integers(min: 0, max: 100))
significant = x.select { |n| n > 0 }
Set.new(significant).length < significant.length
end
expect(ls).to eq([1, 1])
end
end
end
|