Sha256: 3f85b1dffebdf5d326989f1d23e5b780cd946f52e3af2fc2107b7117dfbf032b

Contents?: true

Size: 941 Bytes

Versions: 1

Compression:

Stored size: 941 Bytes

Contents

# frozen_string_literal: true

module Pbt
  class Runner
    CASE_COUNT = 100
    Case = Struct.new(:val, :ractor, :exception)
    private_constant :CASE_COUNT, :Case

    def initialize(generator, &block)
      @generator = generator
      @block = block
    end

    def run
      cases = []
      CASE_COUNT.times do
        val = @generator.call
        ractor = Ractor.new(val, &@block)
        cases << Case.new(val:, ractor:, exception: nil)
      end

      failures = []
      cases.each do |c|
        c.ractor.take
      rescue => e
        failures << c.with(exception: e.cause)
      end

      message = []
      failures.group_by { _1.exception.class }.each do |exception_class, failures|
        message << <<~EOS
          #{exception_class}:
            Failed on:
              #{failures.map(&:val).join("\n    ")}
        EOS
      end

      raise CaseFailure, message.join("\n") if failures.size > 0
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pbt-0.0.1 lib/pbt/runner.rb