Class: Hegel::Generators::SetGenerator
- Inherits:
-
Hegel::Generator
- Object
- Hegel::Generator
- Hegel::Generators::SetGenerator
- Defined in:
- lib/hegel/generators.rb,
sig/hegel.rbs
Overview
Hegel::Syntax::Methods#sets. A Set of values from elements, with
[min_size, max_size] entries, unbounded above by default.
Instance Method Summary collapse
- #do_draw(tc) ⇒ Set[untyped]
- #draw_element(tc) ⇒ Object
-
#draw_elements(tc, max_size) ⇒ Set[untyped]
Set, unlike Array, cannot hold a duplicate: every #collection_more loop iteration that draws a value already in
resultcalls #collection_reject instead of adding it, so libhegel offers the same slot another attempt rather than counting a discarded duplicate toward min_size (see Hegel::TestCase#collection_reject). -
#initialize(elements, min_size:, max_size:) ⇒ SetGenerator
constructor
A new instance of SetGenerator.
Methods inherited from Hegel::Generator
Constructor Details
#initialize(elements, min_size:, max_size:) ⇒ SetGenerator
Returns a new instance of SetGenerator.
290 291 292 293 294 295 |
# File 'lib/hegel/generators.rb', line 290 def initialize(elements, min_size:, max_size:) super() @elements = elements @min_size = min_size @max_size = max_size end |
Instance Method Details
#do_draw(tc) ⇒ Set[untyped]
297 298 299 300 301 302 303 304 305 306 307 308 309 |
# File 'lib/hegel/generators.rb', line 297 def do_draw(tc) raise Hegel::Error, "sets: min_size must not be negative" if @min_size.negative? max_size = @max_size || LibHegel::HEGEL_COLLECTION_MAX_SIZE_UNBOUNDED raise Hegel::Error, "sets: max_size < min_size" if max_size < @min_size tc.start_span(LibHegel::HEGEL_LABEL_SET) begin draw_elements(tc, max_size) ensure tc.stop_span(discard: false) end end |
#draw_element(tc) ⇒ Object
336 337 338 339 340 341 |
# File 'lib/hegel/generators.rb', line 336 def draw_element(tc) tc.start_span(LibHegel::HEGEL_LABEL_SET_ELEMENT) @elements.do_draw(tc) ensure tc.stop_span(discard: false) end |
#draw_elements(tc, max_size) ⇒ Set[untyped]
Set, unlike Array, cannot hold a duplicate: every #collection_more
loop iteration that draws a value already in result calls
#collection_reject instead of adding it, so libhegel offers the
same slot another attempt rather than counting a discarded
duplicate toward min_size (see Hegel::TestCase#collection_reject).
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 |
# File 'lib/hegel/generators.rb', line 318 def draw_elements(tc, max_size) collection = tc.new_collection(@min_size, max_size) begin result = Set.new while tc.collection_more(collection) value = draw_element(tc) if result.include?(value) tc.collection_reject(collection) else result << value end end result ensure tc.collection_free(collection) end end |