Module: Properb::Generators

Extended by:
Generators
Included in:
Generators
Defined in:
lib/properb/generators.rb,
lib/properb/generators/array_generator.rb,
lib/properb/generators/sized_generator.rb,
lib/properb/generators/tuple_generator.rb,
lib/properb/generators/choice_generator.rb,
lib/properb/generators/mapped_generator.rb,
lib/properb/generators/integer_generator.rb,
lib/properb/generators/constant_generator.rb,
lib/properb/generators/deferred_generator.rb,
lib/properb/generators/selected_generator.rb,
lib/properb/generators/recursive_generator.rb,
lib/properb/generators/frequencies_generator.rb

Defined Under Namespace

Classes: ArrayGenerator, ChoiceGenerator, ConstantGenerator, DeferredGenerator, FrequenciesGenerator, IntegerGenerator, MappedGenerator, RecursiveGenerator, SelectedGenerator, SizedGenerator, TupleGenerator

Instance Method Summary collapse

Instance Method Details

#array(generator, length: 0) ⇒ Object



58
59
60
# File 'lib/properb/generators.rb', line 58

def array(generator, length: 0..)
  ArrayGenerator.new(gen(generator), length: length)
end

#booleanObject



46
47
48
# File 'lib/properb/generators.rb', line 46

def boolean
  const(false).or(const(true))
end

#const(value) ⇒ Object



42
43
44
# File 'lib/properb/generators.rb', line 42

def const(value)
  ConstantGenerator.new(value)
end

#defer(&block) ⇒ Object



17
18
19
# File 'lib/properb/generators.rb', line 17

def defer(&block)
  DeferredGenerator.new(&block)
end

#frequencies(**generators_and_weights) ⇒ Object



54
55
56
# File 'lib/properb/generators.rb', line 54

def frequencies(**generators_and_weights)
  FrequenciesGenerator.new(generators_and_weights.transform_values { gen(_1) })
end

#gen(object) ⇒ Object



21
22
23
24
25
26
27
# File 'lib/properb/generators.rb', line 21

def gen(object)
  if object.respond_to?(:to_properb_generator)
    object.to_properb_generator
  else
    const(object)
  end
end

#hashmap(key_generator, value_generator = nil) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/properb/generators.rb', line 66

def hashmap(key_generator, value_generator = nil)
  if value_generator.nil?
    unless key_generator.is_a?(Hash)
      raise "Single argument to `hashmap' must be a hash with generator values, not #{key_generator || "nil"}"
    end

    tuple(*key_generator.values.map { gen(_1) })
      .map { key_generator.keys.zip(_1).to_h }
  else
    array(tuple(key_generator, value_generator)).map(&:to_h)
  end
end

#int(range = 0..(2 << 32)) ⇒ Object



33
34
35
# File 'lib/properb/generators.rb', line 33

def int(range = 0..(2 << 32))
  IntegerGenerator.new(range)
end

#maybe(generator) ⇒ Object



50
51
52
# File 'lib/properb/generators.rb', line 50

def maybe(generator)
  ChoiceGenerator.new([const(nil), gen(generator)])
end

#one_of(*options) ⇒ Object



29
30
31
# File 'lib/properb/generators.rb', line 29

def one_of(*options)
  ChoiceGenerator.new(options.map { gen(_1) })
end

#recursive(&block) ⇒ Object



79
80
81
# File 'lib/properb/generators.rb', line 79

def recursive(&block)
  RecursiveGenerator.new(&block)
end

#string(char_generator = int(32..126).map { _1.chr }, length: 0) ⇒ Object

By default, generate printable ASCII characters



38
39
40
# File 'lib/properb/generators.rb', line 38

def string(char_generator = int(32..126).map { _1.chr }, length: 0..)
  array(char_generator, length: length).map { _1.join }
end

#tuple(*generators) ⇒ Object



62
63
64
# File 'lib/properb/generators.rb', line 62

def tuple(*generators)
  TupleGenerator.new(generators.map { gen(_1) })
end