Module: Quick::Sampler::DSL::SimpleCombinators
- Included in:
- Quick::Sampler::DSL
- Defined in:
- lib/quick/sampler/dsl/simple_combinators.rb
Overview
DSL methods that allow to combine samplers in various ways.
Recursive samplers
Some of the combinators are recursive: given a nested structure of Arrays and Hashes
containing samplers and non-sampler values they would produce an analogous structure
where samplers are replaced by their #next value.
Instance Method Summary collapse
-
#hash_like(template) ⇒ Quick::Sampler<Hash>
Sampler of hashe's that in turn may contain
Arrays,Hashes andQuick::Samplers. -
#list_like(*args) ⇒ Quick::Sampler
Sampler of arbitrary nested structures made up of
Arrays,Hashes,Quick::Samplers and non-sampler values. -
#list_of(sampler, size: 1..10) ⇒ Quick::Sampler
Sampler of uniform arrays.
-
#object_like(the_class, *args) ⇒ Object
Arbitrary object sampler.
-
#one_of(*args) ⇒ Quick::Sampler
A sampler that recursively samples on of the arguments at random.
-
#one_of_weighted(expression_weights) ⇒ Quick::Sampler
A sampler that recursively samples on of the expressions at random, with likelyhood of picking one of the expressions depends on its weight.
-
#pick_from(source) ⇒ Quick::Sampler
A sampler producing values from the range or array.
-
#send_to(*args) ⇒ Quick::Sampler
Sampler of arbitrary message send ("method call") results.
-
#vector_of(size, sampler) ⇒ Quick::Sampler
Sampler of uniform fixed size arrays.
Instance Method Details
#hash_like(template) ⇒ Quick::Sampler<Hash>
Sampler of hashe's that in turn may contain Arrays, Hashes and Quick::Samplers.
89 90 91 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 89 def hash_like template send_to list_like(template), :first end |
#list_like(*args) ⇒ Quick::Sampler
Sampler of arbitrary nested structures made up of Arrays, Hashes, Quick::Samplers and
non-sampler values
80 81 82 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 80 def list_like *args feed { args.map { |arg| recursive_sample(arg) } } end |
#list_of(sampler, size: 1..10) ⇒ Quick::Sampler
Sampler of uniform arrays
Rosetta stone the single argument version corresponds to QuickCheck's listOf.
Passing non_empty: true turns it into QuickCheck's listOf1.
55 56 57 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 55 def list_of sampler, size: 1..10 send_to(sampler, :first, size) end |
#object_like(the_class, *args) ⇒ Object
Arbitrary object sampler.
127 128 129 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 127 def object_like the_class, *args send_to(the_class, :new, *args) end |
#one_of(*args) ⇒ Quick::Sampler
Returns a sampler that recursively samples on of the arguments at random.
25 26 27 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 25 def one_of *args feed { recursive_sample(args.sample) } end |
#one_of_weighted(expression_weights) ⇒ Quick::Sampler
Returns a sampler that recursively samples on of the expressions at random, with likelyhood of picking one of the expressions depends on its weight.
32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 32 def one_of_weighted expression_weights total_weight, expressions = expression_weights .reduce([0, {}]) { |(total_weight, expressions), (expression, weight)| total_weight += weight [total_weight, expressions.merge(total_weight => expression)] } feed { dice = rand * total_weight weight_class = expressions.keys.find{|w| dice < w} recursive_sample(expressions[weight_class]) } end |
#pick_from(source) ⇒ Quick::Sampler
Returns a sampler producing values from the range or array.
14 15 16 17 18 19 20 21 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 14 def pick_from source case source when Range feed { rand(source) } else feed { source.to_a.sample } end end |
#send_to(recipient, message, *args) ⇒ Quick::Sampler #send_to(sampler) ⇒ Quick::Sampler
Sampler of arbitrary message send ("method call") results
109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 109 def send_to *args call_sampler = if args.count > 1 list_like *args else args.first end feed { object, , *args = call_sampler.next object.send( , *args ) } end |
#vector_of(size, sampler) ⇒ Quick::Sampler
Sampler of uniform fixed size arrays
Rosetta stone this sampler corresponds to QuickCheck's vectorOf.
69 70 71 |
# File 'lib/quick/sampler/dsl/simple_combinators.rb', line 69 def vector_of size, sampler feed { sampler.take(size).force } end |