test_bench 1.2.0.9 → 2.0.0.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/test_bench/cli.rb +268 -18
- data/lib/test_bench/controls/file.rb +5 -0
- data/lib/test_bench/controls/path.rb +1 -11
- data/lib/test_bench/controls/random.rb +7 -0
- data/lib/test_bench/controls/result.rb +1 -1
- data/lib/test_bench/controls/stdin.rb +27 -0
- data/lib/test_bench/controls.rb +7 -24
- data/lib/test_bench/test_bench.rb +23 -77
- data/lib/test_bench.rb +1 -35
- metadata +15 -54
- data/lib/test_bench/cli/parse_arguments.rb +0 -181
- data/lib/test_bench/controls/caller_location.rb +0 -5
- data/lib/test_bench/controls/depth.rb +0 -21
- data/lib/test_bench/controls/device.rb +0 -27
- data/lib/test_bench/controls/directory.rb +0 -15
- data/lib/test_bench/controls/error.rb +0 -35
- data/lib/test_bench/controls/fixture.rb +0 -29
- data/lib/test_bench/controls/output/batch_data.rb +0 -52
- data/lib/test_bench/controls/output/detail_setting.rb +0 -29
- data/lib/test_bench/controls/output/escape_code.rb +0 -23
- data/lib/test_bench/controls/output/exercise.rb +0 -7
- data/lib/test_bench/controls/output/log_level.rb +0 -7
- data/lib/test_bench/controls/output/newline_character.rb +0 -16
- data/lib/test_bench/controls/output/print_error.rb +0 -19
- data/lib/test_bench/controls/output/styling.rb +0 -29
- data/lib/test_bench/controls/output/summary/error.rb +0 -28
- data/lib/test_bench/controls/output/summary/session.rb +0 -20
- data/lib/test_bench/controls/pattern.rb +0 -33
- data/lib/test_bench/controls/test_file.rb +0 -5
- data/lib/test_bench/controls/time.rb +0 -89
- data/lib/test_bench/deactivation_variants.rb +0 -11
- data/lib/test_bench/environment/boolean.rb +0 -40
- data/lib/test_bench/fixtures/configure_receiver.rb +0 -80
- data/lib/test_bench/fixtures.rb +0 -5
- data/lib/test_bench/output/batch_data.rb +0 -17
- data/lib/test_bench/output/buffer.rb +0 -114
- data/lib/test_bench/output/log.rb +0 -27
- data/lib/test_bench/output/print_error.rb +0 -163
- data/lib/test_bench/output/raw.rb +0 -363
- data/lib/test_bench/output/summary/session.rb +0 -94
- data/lib/test_bench/output/summary.rb +0 -146
- data/lib/test_bench/output/timer/substitute.rb +0 -45
- data/lib/test_bench/output/timer.rb +0 -75
- data/lib/test_bench/output/writer/dependency.rb +0 -12
- data/lib/test_bench/output/writer/sgr.rb +0 -54
- data/lib/test_bench/output/writer/substitute.rb +0 -38
- data/lib/test_bench/output/writer.rb +0 -192
- data/lib/test_bench/output.rb +0 -21
- data/lib/test_bench/run/substitute.rb +0 -36
- data/lib/test_bench/run.rb +0 -113
- data/script/bench +0 -19
| @@ -1,33 +0,0 @@ | |
| 1 | 
            -
            module TestBench
         | 
| 2 | 
            -
              module Controls
         | 
| 3 | 
            -
                module Pattern
         | 
| 4 | 
            -
                  def self.example(text=nil)
         | 
| 5 | 
            -
                    text ||= self.text
         | 
| 6 | 
            -
             | 
| 7 | 
            -
                    escaped_text = Regexp.escape(text)
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                    Regexp.new(escaped_text)
         | 
| 10 | 
            -
                  end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                  def self.text
         | 
| 13 | 
            -
                    'some-pattern'
         | 
| 14 | 
            -
                  end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                  module None
         | 
| 17 | 
            -
                    def self.example
         | 
| 18 | 
            -
                      /#{text}/
         | 
| 19 | 
            -
                    end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                    def self.text
         | 
| 22 | 
            -
                      '\z.'
         | 
| 23 | 
            -
                    end
         | 
| 24 | 
            -
                  end
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                  module Invalid
         | 
| 27 | 
            -
                    def self.text
         | 
| 28 | 
            -
                      '('
         | 
| 29 | 
            -
                    end
         | 
| 30 | 
            -
                  end
         | 
| 31 | 
            -
                end
         | 
| 32 | 
            -
              end
         | 
| 33 | 
            -
            end
         | 
| @@ -1,89 +0,0 @@ | |
| 1 | 
            -
            module TestBench
         | 
| 2 | 
            -
              module Controls
         | 
| 3 | 
            -
                module Time
         | 
| 4 | 
            -
                  def self.example(seconds_offset: nil)
         | 
| 5 | 
            -
                    seconds_offset ||= 0
         | 
| 6 | 
            -
             | 
| 7 | 
            -
                    year = self.year
         | 
| 8 | 
            -
                    month = self.month
         | 
| 9 | 
            -
                    day = self.day
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                    hours = self.hours
         | 
| 12 | 
            -
                    minutes = self.minutes
         | 
| 13 | 
            -
                    seconds = self.seconds + seconds_offset
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                    if not RUBY_ENGINE == 'mruby'
         | 
| 16 | 
            -
                      tz_offset = self.tz_offset
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                      final_argument = tz_offset
         | 
| 19 | 
            -
                    else
         | 
| 20 | 
            -
                      seconds, subseconds = seconds.divmod(1)
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                      microseconds = subseconds * 1_000_000
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                      final_argument = microseconds
         | 
| 25 | 
            -
                    end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                    ::Time.new(year, month, day, hours, minutes, seconds, final_argument)
         | 
| 28 | 
            -
                  end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                  def self.year
         | 
| 31 | 
            -
                    2000
         | 
| 32 | 
            -
                  end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                  def self.month
         | 
| 35 | 
            -
                    1
         | 
| 36 | 
            -
                  end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                  def self.day
         | 
| 39 | 
            -
                    1
         | 
| 40 | 
            -
                  end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                  def self.hours
         | 
| 43 | 
            -
                    11
         | 
| 44 | 
            -
                  end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                  def self.minutes
         | 
| 47 | 
            -
                    11
         | 
| 48 | 
            -
                  end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                  def self.seconds
         | 
| 51 | 
            -
                    11.0
         | 
| 52 | 
            -
                  end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                  def self.tz_offset
         | 
| 55 | 
            -
                    0
         | 
| 56 | 
            -
                  end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                  module Elapsed
         | 
| 59 | 
            -
                    def self.example
         | 
| 60 | 
            -
                      1.111
         | 
| 61 | 
            -
                    end
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                    module Text
         | 
| 64 | 
            -
                      def self.example
         | 
| 65 | 
            -
                        "1.111s"
         | 
| 66 | 
            -
                      end
         | 
| 67 | 
            -
                    end
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                    module PerSecond
         | 
| 70 | 
            -
                      def self.example
         | 
| 71 | 
            -
                        elapsed_time = Elapsed.example
         | 
| 72 | 
            -
             | 
| 73 | 
            -
                        Rational(ocurrences, elapsed_time)
         | 
| 74 | 
            -
                      end
         | 
| 75 | 
            -
             | 
| 76 | 
            -
                      def self.ocurrences
         | 
| 77 | 
            -
                        1
         | 
| 78 | 
            -
                      end
         | 
| 79 | 
            -
             | 
| 80 | 
            -
                      module Text
         | 
| 81 | 
            -
                        def self.example
         | 
| 82 | 
            -
                          "0.9"
         | 
| 83 | 
            -
                        end
         | 
| 84 | 
            -
                      end
         | 
| 85 | 
            -
                    end
         | 
| 86 | 
            -
                  end
         | 
| 87 | 
            -
                end
         | 
| 88 | 
            -
              end
         | 
| 89 | 
            -
            end
         | 
| @@ -1,40 +0,0 @@ | |
| 1 | 
            -
            module TestBench
         | 
| 2 | 
            -
              module Environment
         | 
| 3 | 
            -
                module Boolean
         | 
| 4 | 
            -
                  Error = Class.new(RuntimeError)
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                  def self.fetch(env_var, default_value=nil, env: nil)
         | 
| 7 | 
            -
                    value = get(env_var, env: env)
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                    return default_value if value.nil?
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                    value
         | 
| 12 | 
            -
                  end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  def self.get(env_var, env: nil)
         | 
| 15 | 
            -
                    env ||= ::ENV
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                    return nil unless env.key?(env_var)
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                    text_value = env.fetch(env_var)
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                    case text_value
         | 
| 22 | 
            -
                    when true_pattern
         | 
| 23 | 
            -
                      true
         | 
| 24 | 
            -
                    when false_pattern
         | 
| 25 | 
            -
                      false
         | 
| 26 | 
            -
                    else
         | 
| 27 | 
            -
                      raise Error, "Invalid boolean value for ENV variable #{env_var.inspect} (Value: #{text_value.inspect})"
         | 
| 28 | 
            -
                    end
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  def self.true_pattern
         | 
| 32 | 
            -
                    @true_pattern ||= %r{\A(?:on|yes|y|true|t|1)\z}ni
         | 
| 33 | 
            -
                  end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                  def self.false_pattern
         | 
| 36 | 
            -
                    @false_pattern ||= %r{\A(?:off|no|n|false|f|0)\z}ni
         | 
| 37 | 
            -
                  end
         | 
| 38 | 
            -
                end
         | 
| 39 | 
            -
              end
         | 
| 40 | 
            -
            end
         | 
| @@ -1,80 +0,0 @@ | |
| 1 | 
            -
            module TestBench
         | 
| 2 | 
            -
              module Fixtures
         | 
| 3 | 
            -
                class ConfigureReceiver
         | 
| 4 | 
            -
                  include TestBench::Fixture
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                  attr_reader :cls
         | 
| 7 | 
            -
                  attr_reader :default_attr_name
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                  def args
         | 
| 10 | 
            -
                    @args ||= []
         | 
| 11 | 
            -
                  end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                  def kwargs
         | 
| 14 | 
            -
                    @kwargs ||= {}
         | 
| 15 | 
            -
                  end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                  def initialize(cls, default_attr_name, args=nil, kwargs=nil)
         | 
| 18 | 
            -
                    @cls = cls
         | 
| 19 | 
            -
                    @default_attr_name = default_attr_name
         | 
| 20 | 
            -
                    @args = args
         | 
| 21 | 
            -
                    @kwargs = kwargs
         | 
| 22 | 
            -
                  end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                  def self.build(cls, *args, attr_name:, **kwargs)
         | 
| 25 | 
            -
                    new(cls, attr_name, args, kwargs)
         | 
| 26 | 
            -
                  end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                  def call
         | 
| 29 | 
            -
                    test "Responds to configure" do
         | 
| 30 | 
            -
                      assert(cls.respond_to?(:configure))
         | 
| 31 | 
            -
                    end or return
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                    context do
         | 
| 34 | 
            -
                      receiver = OpenStruct.new
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                      instance = configure(receiver)
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                      test "Attribute is set on receiver" do
         | 
| 39 | 
            -
                        refute(receiver.public_send(default_attr_name).nil?)
         | 
| 40 | 
            -
                      end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                      test "Returns the instance that was assigned" do
         | 
| 43 | 
            -
                        assert(receiver.public_send(default_attr_name).equal?(instance))
         | 
| 44 | 
            -
                      end
         | 
| 45 | 
            -
                    end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                    context "Optional Attribute Name" do
         | 
| 48 | 
            -
                      context "Given" do
         | 
| 49 | 
            -
                        receiver = OpenStruct.new
         | 
| 50 | 
            -
                        attr_name = :given_attr_name
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                        configure(receiver, attr_name: attr_name)
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                        test "Given attribute is set on receiver (Attribute: #{attr_name})" do
         | 
| 55 | 
            -
                          refute(receiver.public_send(attr_name).nil?)
         | 
| 56 | 
            -
                        end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                        test "Default attribute is not set on receiver" do
         | 
| 59 | 
            -
                          assert(receiver.public_send(default_attr_name).nil?)
         | 
| 60 | 
            -
                        end
         | 
| 61 | 
            -
                      end
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                      context "Omitted" do
         | 
| 64 | 
            -
                        receiver = OpenStruct.new
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                        configure(receiver)
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                        test "Default attribute is set on receiver (Attribute: #{default_attr_name})" do
         | 
| 69 | 
            -
                          refute(receiver.public_send(default_attr_name).nil?)
         | 
| 70 | 
            -
                        end
         | 
| 71 | 
            -
                      end
         | 
| 72 | 
            -
                    end
         | 
| 73 | 
            -
                  end
         | 
| 74 | 
            -
             | 
| 75 | 
            -
                  def configure(receiver, attr_name: nil)
         | 
| 76 | 
            -
                    cls.configure(receiver, *args, attr_name: attr_name, **kwargs)
         | 
| 77 | 
            -
                  end
         | 
| 78 | 
            -
                end
         | 
| 79 | 
            -
              end
         | 
| 80 | 
            -
            end
         | 
    
        data/lib/test_bench/fixtures.rb
    DELETED
    
    
| @@ -1,114 +0,0 @@ | |
| 1 | 
            -
            module TestBench
         | 
| 2 | 
            -
              module Output
         | 
| 3 | 
            -
                class Buffer < Fixture::Output::Capture
         | 
| 4 | 
            -
                  attr_accessor :writer
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                  def raw_output
         | 
| 7 | 
            -
                    @raw_output ||= Raw.new
         | 
| 8 | 
            -
                  end
         | 
| 9 | 
            -
                  attr_writer :raw_output
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                  def stack
         | 
| 12 | 
            -
                    @stack ||= []
         | 
| 13 | 
            -
                  end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                  def self.build(verbose: nil, detail: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil, writer: nil, device: nil, styling: nil)
         | 
| 16 | 
            -
                    instance = new
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                    raw_output = Raw.configure(instance, verbose: verbose, detail: detail, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces, writer: writer, device: device, styling: styling)
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                    instance.writer = raw_output.writer
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                    instance
         | 
| 23 | 
            -
                  end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                  def exit_context(*)
         | 
| 26 | 
            -
                    super
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                    flush unless buffering?
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  def finish_test(*)
         | 
| 32 | 
            -
                    super
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                    flush unless buffering?
         | 
| 35 | 
            -
                  end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                  def finish_fixture(*)
         | 
| 38 | 
            -
                    super
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                    flush unless buffering?
         | 
| 41 | 
            -
                  end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                  def new_record(signal, data)
         | 
| 44 | 
            -
                    record = super
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                    record.extend(Record)
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                    case signal
         | 
| 49 | 
            -
                    when :enter_context, :start_test, :start_fixture
         | 
| 50 | 
            -
                      start_batch(record)
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                    when :exit_context, :finish_test, :finish_fixture
         | 
| 53 | 
            -
                      result = record.data.last
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                      finish_batch(record, result)
         | 
| 56 | 
            -
                    end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                    record
         | 
| 59 | 
            -
                  end
         | 
| 60 | 
            -
             | 
| 61 | 
            -
                  def start_batch(record)
         | 
| 62 | 
            -
                    record.start_batch(stack_depth)
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                    stack.push(record)
         | 
| 65 | 
            -
                  end
         | 
| 66 | 
            -
             | 
| 67 | 
            -
                  def finish_batch(final_record, result)
         | 
| 68 | 
            -
                    first_record = stack.pop
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                    batch_data = first_record.batch_data
         | 
| 71 | 
            -
                    batch_data.result = result
         | 
| 72 | 
            -
             | 
| 73 | 
            -
                    final_record.batch_data = first_record.batch_data
         | 
| 74 | 
            -
                  end
         | 
| 75 | 
            -
             | 
| 76 | 
            -
                  def flush
         | 
| 77 | 
            -
                    records.each do |record|
         | 
| 78 | 
            -
                      record.forward(raw_output)
         | 
| 79 | 
            -
                    end
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                    records.clear
         | 
| 82 | 
            -
                  end
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                  def buffering?
         | 
| 85 | 
            -
                    stack_depth.nonzero?
         | 
| 86 | 
            -
                  end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                  def stack_depth
         | 
| 89 | 
            -
                    stack.length
         | 
| 90 | 
            -
                  end
         | 
| 91 | 
            -
             | 
| 92 | 
            -
                  module Record
         | 
| 93 | 
            -
                    attr_accessor :batch_data
         | 
| 94 | 
            -
             | 
| 95 | 
            -
                    def forward(raw_output)
         | 
| 96 | 
            -
                      return super if batch_data.nil?
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                      raw_output.public_send(signal, *data, batch_data: batch_data)
         | 
| 99 | 
            -
                    end
         | 
| 100 | 
            -
             | 
| 101 | 
            -
                    def start_batch(depth)
         | 
| 102 | 
            -
                      batch_data = Output::BatchData.new
         | 
| 103 | 
            -
                      batch_data.depth = depth
         | 
| 104 | 
            -
             | 
| 105 | 
            -
                      self.batch_data = batch_data
         | 
| 106 | 
            -
                    end
         | 
| 107 | 
            -
             | 
| 108 | 
            -
                    def finish_batch(result)
         | 
| 109 | 
            -
                      batch_data.result = result
         | 
| 110 | 
            -
                    end
         | 
| 111 | 
            -
                  end
         | 
| 112 | 
            -
                end
         | 
| 113 | 
            -
              end
         | 
| 114 | 
            -
            end
         | 
| @@ -1,27 +0,0 @@ | |
| 1 | 
            -
            module TestBench
         | 
| 2 | 
            -
              module Output
         | 
| 3 | 
            -
                module Log
         | 
| 4 | 
            -
                  def self.build(device=nil, level: nil)
         | 
| 5 | 
            -
                    level ||= Defaults.level
         | 
| 6 | 
            -
             | 
| 7 | 
            -
                    Fixture::Output::Log.build(device, level: level)
         | 
| 8 | 
            -
                  end
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                  def self.default_level
         | 
| 11 | 
            -
                    :fatal
         | 
| 12 | 
            -
                  end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  module Defaults
         | 
| 15 | 
            -
                    def self.level
         | 
| 16 | 
            -
                      level_text = ::ENV['TEST_BENCH_LOG_LEVEL']
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                      if level_text.nil?
         | 
| 19 | 
            -
                        Log.default_level
         | 
| 20 | 
            -
                      else
         | 
| 21 | 
            -
                        level_text.to_sym
         | 
| 22 | 
            -
                      end
         | 
| 23 | 
            -
                    end
         | 
| 24 | 
            -
                  end
         | 
| 25 | 
            -
                end
         | 
| 26 | 
            -
              end
         | 
| 27 | 
            -
            end
         | 
| @@ -1,163 +0,0 @@ | |
| 1 | 
            -
            module TestBench
         | 
| 2 | 
            -
              module Output
         | 
| 3 | 
            -
                module PrintError
         | 
| 4 | 
            -
                  include Writer::Dependency
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                  def omit_backtrace_pattern
         | 
| 7 | 
            -
                    @omit_backtrace_pattern ||= Defaults.omit_backtrace_pattern
         | 
| 8 | 
            -
                  end
         | 
| 9 | 
            -
                  attr_writer :omit_backtrace_pattern
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                  def reverse_backtraces
         | 
| 12 | 
            -
                    instance_variable_defined?(:@reverse_backtraces) ?
         | 
| 13 | 
            -
                      @reverse_backtraces :
         | 
| 14 | 
            -
                      @reverse_backtraces = Defaults.reverse_backtraces
         | 
| 15 | 
            -
                  end
         | 
| 16 | 
            -
                  attr_writer :reverse_backtraces
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                  def print_error(error)
         | 
| 19 | 
            -
                    PrintError.(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
         | 
| 20 | 
            -
                  end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  def self.call(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil)
         | 
| 23 | 
            -
                    writer ||= Writer.build
         | 
| 24 | 
            -
                    omit_backtrace_pattern ||= Defaults.omit_backtrace_pattern
         | 
| 25 | 
            -
                    reverse_backtraces = Defaults.reverse_backtraces if reverse_backtraces.nil?
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                    writer.escape_code(:red)
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                    if reverse_backtraces && error.backtrace.length > 1
         | 
| 30 | 
            -
                      writer
         | 
| 31 | 
            -
                        .indent
         | 
| 32 | 
            -
                        .escape_code(:bold)
         | 
| 33 | 
            -
                        .text("Traceback")
         | 
| 34 | 
            -
                        .escape_code(:reset_intensity)
         | 
| 35 | 
            -
                        .text(" (most recent call last):")
         | 
| 36 | 
            -
                        .newline
         | 
| 37 | 
            -
                    end
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                    error(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                    writer
         | 
| 42 | 
            -
                      .escape_code(:reset_fg)
         | 
| 43 | 
            -
                      .sync
         | 
| 44 | 
            -
                  end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                  def self.error(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil)
         | 
| 47 | 
            -
                    reverse_backtraces = self.reverse_backtraces if reverse_backtraces.nil?
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                    if reverse_backtraces
         | 
| 50 | 
            -
                      error_cause(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
         | 
| 51 | 
            -
                      error_backtrace(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
         | 
| 52 | 
            -
                      error_message(error, writer: writer)
         | 
| 53 | 
            -
                    else
         | 
| 54 | 
            -
                      error_message(error, writer: writer)
         | 
| 55 | 
            -
                      error_backtrace(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
         | 
| 56 | 
            -
                      error_cause(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
         | 
| 57 | 
            -
                    end
         | 
| 58 | 
            -
                  end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                  def self.error_cause(error, **args)
         | 
| 61 | 
            -
                    error(error.cause, **args) unless error.cause.nil?
         | 
| 62 | 
            -
                  end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                  def self.error_message(error, writer: nil)
         | 
| 65 | 
            -
                    caller_location = error.backtrace[0]
         | 
| 66 | 
            -
             | 
| 67 | 
            -
                    message = error.message
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                    error_class = error.class.name
         | 
| 70 | 
            -
             | 
| 71 | 
            -
                    writer
         | 
| 72 | 
            -
                      .indent
         | 
| 73 | 
            -
                      .text("#{caller_location}: ")
         | 
| 74 | 
            -
                      .escape_code(:bold)
         | 
| 75 | 
            -
                      .text("#{message} (")
         | 
| 76 | 
            -
                      .escape_code(:underline)
         | 
| 77 | 
            -
                      .text(error_class)
         | 
| 78 | 
            -
                      .escape_code(:reset_underline)
         | 
| 79 | 
            -
                      .text(")")
         | 
| 80 | 
            -
                      .escape_code(:reset_intensity)
         | 
| 81 | 
            -
                      .newline
         | 
| 82 | 
            -
                  end
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                  def self.error_backtrace(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil)
         | 
| 85 | 
            -
                    writer ||= self.writer
         | 
| 86 | 
            -
                    omit_backtrace_pattern ||= self.omit_backtrace_pattern
         | 
| 87 | 
            -
                    reverse_backtraces = self.reverse_backtraces if reverse_backtraces.nil?
         | 
| 88 | 
            -
             | 
| 89 | 
            -
                    omitting = false
         | 
| 90 | 
            -
             | 
| 91 | 
            -
                    backtrace = error.backtrace[1..-1]
         | 
| 92 | 
            -
             | 
| 93 | 
            -
                    unless reverse_backtraces
         | 
| 94 | 
            -
                      backtrace_iterator = backtrace.each.with_index
         | 
| 95 | 
            -
                    else
         | 
| 96 | 
            -
                      frame_count = backtrace.count
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                      number_width = frame_count.to_s.each_char.count
         | 
| 99 | 
            -
             | 
| 100 | 
            -
                      backtrace_iterator = backtrace.reverse_each.map.with_index do |location, index|
         | 
| 101 | 
            -
                        ordinal = frame_count - index
         | 
| 102 | 
            -
             | 
| 103 | 
            -
                        ordinal = ordinal.to_s.rjust(number_width, ' ')
         | 
| 104 | 
            -
             | 
| 105 | 
            -
                        [location, ordinal]
         | 
| 106 | 
            -
                      end
         | 
| 107 | 
            -
                    end
         | 
| 108 | 
            -
             | 
| 109 | 
            -
                    backtrace_iterator.each do |location, ordinal|
         | 
| 110 | 
            -
                      omit = omit_backtrace_pattern.match?(location)
         | 
| 111 | 
            -
             | 
| 112 | 
            -
                      next if omit && omitting
         | 
| 113 | 
            -
             | 
| 114 | 
            -
                      writer
         | 
| 115 | 
            -
                        .text("\t")
         | 
| 116 | 
            -
                        .indent
         | 
| 117 | 
            -
             | 
| 118 | 
            -
                      if omit
         | 
| 119 | 
            -
                        omitting = true
         | 
| 120 | 
            -
             | 
| 121 | 
            -
                        if reverse_backtraces
         | 
| 122 | 
            -
                          ordinal.gsub!(/[[:digit:]]/, '?')
         | 
| 123 | 
            -
             | 
| 124 | 
            -
                          writer.text("#{ordinal}: ")
         | 
| 125 | 
            -
                        end
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                        writer
         | 
| 128 | 
            -
                          .escape_code(:faint)
         | 
| 129 | 
            -
                          .escape_code(:italic)
         | 
| 130 | 
            -
                          .text('*omitted*')
         | 
| 131 | 
            -
                          .escape_code(:reset_italic)
         | 
| 132 | 
            -
                          .escape_code(:reset_intensity)
         | 
| 133 | 
            -
             | 
| 134 | 
            -
                      else
         | 
| 135 | 
            -
                        omitting = false
         | 
| 136 | 
            -
             | 
| 137 | 
            -
                        if reverse_backtraces
         | 
| 138 | 
            -
                          writer.text("#{ordinal}: ")
         | 
| 139 | 
            -
                        end
         | 
| 140 | 
            -
             | 
| 141 | 
            -
                        writer.text("from #{location}")
         | 
| 142 | 
            -
                      end
         | 
| 143 | 
            -
             | 
| 144 | 
            -
                      writer.newline
         | 
| 145 | 
            -
                    end
         | 
| 146 | 
            -
                  end
         | 
| 147 | 
            -
             | 
| 148 | 
            -
                  module Defaults
         | 
| 149 | 
            -
                    def self.omit_backtrace_pattern
         | 
| 150 | 
            -
                      pattern = ENV.fetch('TEST_BENCH_OMIT_BACKTRACE_PATTERN') do
         | 
| 151 | 
            -
                        'test_bench'
         | 
| 152 | 
            -
                      end
         | 
| 153 | 
            -
             | 
| 154 | 
            -
                      Regexp.new(pattern)
         | 
| 155 | 
            -
                    end
         | 
| 156 | 
            -
             | 
| 157 | 
            -
                    def self.reverse_backtraces
         | 
| 158 | 
            -
                      Environment::Boolean.fetch('TEST_BENCH_REVERSE_BACKTRACES', false)
         | 
| 159 | 
            -
                    end
         | 
| 160 | 
            -
                  end
         | 
| 161 | 
            -
                end
         | 
| 162 | 
            -
              end
         | 
| 163 | 
            -
            end
         |