Class: Properb::Generators::TupleGenerator

Inherits:
Properb::Generator show all
Defined in:
lib/properb/generators/tuple_generator.rb

Instance Method Summary collapse

Methods inherited from Properb::Generator

#map, #or, #reject, #select, #sized, #to_properb_generator

Constructor Details

#initialize(generators) ⇒ TupleGenerator

Returns a new instance of TupleGenerator.



4
5
6
# File 'lib/properb/generators/tuple_generator.rb', line 4

def initialize(generators)
  @generators = generators
end

Instance Method Details

#generate_value(random, size) ⇒ Object



8
9
10
11
# File 'lib/properb/generators/tuple_generator.rb', line 8

def generate_value(random, size)
  values = @generators.map { _1.generate_value(random, size) }
  ShrinkTree.new(values.map(&:value), shrink(values))
end

#shrink(values) ⇒ Object



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
# File 'lib/properb/generators/tuple_generator.rb', line 13

def shrink(values)
  Enumerator.new do |out|
    # Try shrinking the individual items in the vector
    (0...values.length).each do |i|
      values[i].children.each do |value|
        new_values = values[0...i] + [value] + values[i + 1...]
        out << ShrinkTree.new(new_values.map(&:value), shrink(new_values))
      end
    end
    # Try shrinking pairs of items in the vector
    (0...values.length).each do |i|
      values[i].children.each do |value|
        new_values = values[0...i] + [value] + values[i + 1...]
        (0...values.length).each do |j|
          new_values[j].children.each do |value|
            newer_values = new_values[0...j] + [value] + new_values[j + 1...]
            out << ShrinkTree.new(
              newer_values.map(&:value),
              shrink(newer_values)
            )
          end
        end
      end
    end
  end
end