Class: Hegel::Generators::SetGenerator

Inherits:
Hegel::Generator show all
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

Methods inherited from Hegel::Generator

#filter, #map

Constructor Details

#initialize(elements, min_size:, max_size:) ⇒ SetGenerator

Returns a new instance of SetGenerator.

Parameters:

  • elements (Generator)
  • min_size: (Integer)
  • max_size: (Integer, nil)


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]

Parameters:

  • tc (Object)

Returns:

  • (Set[untyped])

Raises:



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

Parameters:

  • tc (Object)

Returns:

  • (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).

Parameters:

  • tc (Object)
  • max_size (Integer)

Returns:

  • (Set[untyped])


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