cucumber-core 5.0.2 → 6.0.0
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/CHANGELOG.md +22 -0
- data/lib/cucumber/core.rb +8 -6
- data/lib/cucumber/core/compiler.rb +34 -13
- data/lib/cucumber/core/event.rb +0 -2
- data/lib/cucumber/core/events.rb +25 -0
- data/lib/cucumber/core/gherkin/parser.rb +9 -6
- data/lib/cucumber/core/test/case.rb +5 -4
- data/lib/cucumber/core/test/data_table.rb +5 -9
- data/lib/cucumber/core/test/doc_string.rb +3 -6
- data/lib/cucumber/core/test/result.rb +64 -3
- data/lib/cucumber/core/test/step.rb +6 -5
- data/lib/cucumber/core/version.rb +1 -1
- data/spec/cucumber/core/compiler_spec.rb +66 -3
- data/spec/cucumber/core/gherkin/parser_spec.rb +17 -1
- data/spec/cucumber/core/test/case_spec.rb +3 -2
- data/spec/cucumber/core/test/data_table_spec.rb +10 -12
- data/spec/cucumber/core/test/doc_string_spec.rb +8 -11
- data/spec/cucumber/core/test/result_spec.rb +31 -1
- data/spec/cucumber/core/test/runner_spec.rb +23 -21
- data/spec/cucumber/core/test/step_spec.rb +10 -9
- data/spec/cucumber/core_spec.rb +1 -1
- metadata +57 -37
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 1b9ecd1991c28bb04a27496f473972f9da886f102c94ac5a6176d4167773afb3
         | 
| 4 | 
            +
              data.tar.gz: f833220cdb22fd26e68b3457c0c8ced6cc574227c8dc6dd30a540680a09ea8d2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: d720066139dee301d46a5bb64e2c9e630d599d4750ca5026a40e70cb5c547b14301aee31bdbe12627f043d9df0b427c87444adfa24b2d01c463e484feba2e724
         | 
| 7 | 
            +
              data.tar.gz: 9d7e4f57de2b4c84c2e8a94bf68bc22aea34d058c8ef6bead5e975866a0bcaed53d5d987c0884d6db42e496eddf46273a946aba13565f78ba34b2eb9d22df265
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,27 @@ | |
| 1 1 | 
             
            Please see [CONTRIBUTING.md](https://github.com/cucumber/cucumber/blob/master/CONTRIBUTING.md) on how to contribute to Cucumber.
         | 
| 2 2 |  | 
| 3 | 
            +
            ## [6.0.0](https://github.com/cucumber/cucumber-ruby-core/compare/v5.0.2...v6.0.0)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ### Changed
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            * Update to Gherkin 10
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            ### Added
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            * Add `envelope` event, which are used when emitting `Cucumber::Messages`
         | 
| 12 | 
            +
            * Add `TestCaseCreated` and `TestStepCreated` events, emitted when compiling a `Pickle`
         | 
| 13 | 
            +
            * Add `Id` field to `TestCase` and `TestStep`
         | 
| 14 | 
            +
            * Added rubocop (with todo file), and removed backports gems
         | 
| 15 | 
            +
              ([#186](https://github.com/cucumber/cucumber-ruby-core/pull/186),
         | 
| 16 | 
            +
              [#182](https://github.com/cucumber/cucumber-ruby-core/issues/182)
         | 
| 17 | 
            +
              [tas50](https://github.com/tas50),
         | 
| 18 | 
            +
              [luke-hill](https://github.com/luke-hill))
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            ### Removed
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            * Remove location for MultiLine arguments
         | 
| 23 | 
            +
             | 
| 24 | 
            +
             | 
| 3 25 | 
             
            ## [5.0.2](https://github.com/cucumber/cucumber-ruby-core/compare/v5.0.1...v5.0.2)
         | 
| 4 26 |  | 
| 5 27 | 
             
            ### Changed
         | 
    
        data/lib/cucumber/core.rb
    CHANGED
    
    | @@ -4,6 +4,8 @@ require 'cucumber/core/gherkin/parser' | |
| 4 4 | 
             
            require 'cucumber/core/gherkin/document'
         | 
| 5 5 | 
             
            require 'cucumber/core/compiler'
         | 
| 6 6 | 
             
            require 'cucumber/core/test/runner'
         | 
| 7 | 
            +
            require 'cucumber/messages'
         | 
| 8 | 
            +
            require 'gherkin/query'
         | 
| 7 9 |  | 
| 8 10 | 
             
            module Cucumber
         | 
| 9 11 | 
             
              module Core
         | 
| @@ -11,21 +13,22 @@ module Cucumber | |
| 11 13 | 
             
                def execute(gherkin_documents, filters = [], event_bus = EventBus.new)
         | 
| 12 14 | 
             
                  yield event_bus if block_given?
         | 
| 13 15 | 
             
                  receiver = Test::Runner.new(event_bus)
         | 
| 14 | 
            -
                  compile gherkin_documents, receiver, filters
         | 
| 16 | 
            +
                  compile gherkin_documents, receiver, filters, event_bus
         | 
| 15 17 | 
             
                  self
         | 
| 16 18 | 
             
                end
         | 
| 17 19 |  | 
| 18 20 | 
             
                def compile(gherkin_documents, last_receiver, filters = [], event_bus = EventBus.new)
         | 
| 19 21 | 
             
                  first_receiver = compose(filters, last_receiver)
         | 
| 20 | 
            -
                   | 
| 21 | 
            -
                   | 
| 22 | 
            +
                  gherkin_query = ::Gherkin::Query.new
         | 
| 23 | 
            +
                  compiler = Compiler.new(first_receiver, gherkin_query, event_bus)
         | 
| 24 | 
            +
                  parse gherkin_documents, compiler, event_bus, gherkin_query
         | 
| 22 25 | 
             
                  self
         | 
| 23 26 | 
             
                end
         | 
| 24 27 |  | 
| 25 28 | 
             
                private
         | 
| 26 29 |  | 
| 27 | 
            -
                def parse(gherkin_documents, compiler, event_bus)
         | 
| 28 | 
            -
                  parser = Core::Gherkin::Parser.new(compiler, event_bus)
         | 
| 30 | 
            +
                def parse(gherkin_documents, compiler, event_bus, gherkin_query)
         | 
| 31 | 
            +
                  parser = Core::Gherkin::Parser.new(compiler, event_bus, gherkin_query)
         | 
| 29 32 | 
             
                  gherkin_documents.each do |document|
         | 
| 30 33 | 
             
                    parser.document document
         | 
| 31 34 | 
             
                  end
         | 
| @@ -38,6 +41,5 @@ module Cucumber | |
| 38 41 | 
             
                    filter.with_receiver(receiver)
         | 
| 39 42 | 
             
                  end
         | 
| 40 43 | 
             
                end
         | 
| 41 | 
            -
             | 
| 42 44 | 
             
              end
         | 
| 43 45 | 
             
            end
         | 
| @@ -6,16 +6,20 @@ require 'cucumber/core/test/tag' | |
| 6 6 | 
             
            require 'cucumber/core/test/doc_string'
         | 
| 7 7 | 
             
            require 'cucumber/core/test/data_table'
         | 
| 8 8 | 
             
            require 'cucumber/core/test/empty_multiline_argument'
         | 
| 9 | 
            +
            require 'cucumber/messages'
         | 
| 9 10 |  | 
| 10 11 | 
             
            module Cucumber
         | 
| 11 12 | 
             
              module Core
         | 
| 12 13 | 
             
                # Compiles the Pickles into test cases
         | 
| 13 14 | 
             
                class Compiler
         | 
| 14 | 
            -
                  attr_reader :receiver
         | 
| 15 | 
            -
                  private     :receiver
         | 
| 15 | 
            +
                  attr_reader :receiver, :gherkin_query, :id_generator
         | 
| 16 | 
            +
                  private     :receiver, :gherkin_query, :id_generator
         | 
| 16 17 |  | 
| 17 | 
            -
                  def initialize(receiver)
         | 
| 18 | 
            +
                  def initialize(receiver, gherkin_query, event_bus = nil)
         | 
| 18 19 | 
             
                    @receiver = receiver
         | 
| 20 | 
            +
                    @id_generator = Cucumber::Messages::IdGenerator::UUID.new
         | 
| 21 | 
            +
                    @gherkin_query = gherkin_query
         | 
| 22 | 
            +
                    @event_bus = event_bus
         | 
| 19 23 | 
             
                  end
         | 
| 20 24 |  | 
| 21 25 | 
             
                  def pickle(pickle)
         | 
| @@ -33,15 +37,19 @@ module Cucumber | |
| 33 37 | 
             
                  def create_test_case(pickle)
         | 
| 34 38 | 
             
                    uri = pickle.uri
         | 
| 35 39 | 
             
                    test_steps = pickle.steps.map { |step| create_test_step(step, uri) }
         | 
| 36 | 
            -
                    lines = pickle. | 
| 37 | 
            -
                    tags = pickle.tags.map { |tag| Test::Tag.new(Test::Location.new(uri, tag | 
| 38 | 
            -
                    Test::Case.new(pickle.name, test_steps, Test::Location.new(uri, lines), tags, pickle.language)
         | 
| 40 | 
            +
                    lines = source_lines_for_pickle(pickle).sort.reverse
         | 
| 41 | 
            +
                    tags = pickle.tags.map { |tag| Test::Tag.new(Test::Location.new(uri, source_line_for_pickle_tag(tag)), tag.name) }
         | 
| 42 | 
            +
                    test_case = Test::Case.new(id_generator.new_id, pickle.name, test_steps, Test::Location.new(uri, lines), tags, pickle.language)
         | 
| 43 | 
            +
                    @event_bus.test_case_created(test_case, pickle) unless @event_bus.nil?
         | 
| 44 | 
            +
                    test_case
         | 
| 39 45 | 
             
                  end
         | 
| 40 46 |  | 
| 41 47 | 
             
                  def create_test_step(pickle_step, uri)
         | 
| 42 | 
            -
                    lines = pickle_step. | 
| 48 | 
            +
                    lines = source_lines_for_pickle_step(pickle_step).sort.reverse
         | 
| 43 49 | 
             
                    multiline_arg = create_multiline_arg(pickle_step, uri)
         | 
| 44 | 
            -
                    Test::Step.new(pickle_step.text, Test::Location.new(uri, lines), multiline_arg)
         | 
| 50 | 
            +
                    step = Test::Step.new(id_generator.new_id, pickle_step.text, Test::Location.new(uri, lines), multiline_arg)
         | 
| 51 | 
            +
                    @event_bus.test_step_created(step, pickle_step) unless @event_bus.nil?
         | 
| 52 | 
            +
                    step
         | 
| 45 53 | 
             
                  end
         | 
| 46 54 |  | 
| 47 55 | 
             
                  def create_multiline_arg(pickle_step, uri)
         | 
| @@ -50,21 +58,34 @@ module Cucumber | |
| 50 58 | 
             
                        doc_string = pickle_step.argument.doc_string
         | 
| 51 59 | 
             
                        Test::DocString.new(
         | 
| 52 60 | 
             
                          doc_string.content,
         | 
| 53 | 
            -
                          doc_string. | 
| 54 | 
            -
                          Test::Location.new(uri, doc_string.location.line)
         | 
| 61 | 
            +
                          doc_string.media_type
         | 
| 55 62 | 
             
                        )
         | 
| 56 63 | 
             
                      elsif pickle_step.argument.data_table
         | 
| 57 64 | 
             
                        data_table = pickle_step.argument.data_table
         | 
| 58 | 
            -
                        first_cell = data_table.rows.first.cells.first
         | 
| 59 65 | 
             
                        Test::DataTable.new(
         | 
| 60 | 
            -
                          data_table.rows.map { |row| row.cells.map { |cell| cell.value } } | 
| 61 | 
            -
                          Test::Location.new(uri, first_cell.location.line)
         | 
| 66 | 
            +
                          data_table.rows.map { |row| row.cells.map { |cell| cell.value } }
         | 
| 62 67 | 
             
                        )
         | 
| 63 68 | 
             
                      end
         | 
| 64 69 | 
             
                    else
         | 
| 65 70 | 
             
                      Test::EmptyMultilineArgument.new
         | 
| 66 71 | 
             
                    end
         | 
| 67 72 | 
             
                  end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  def source_lines_for_pickle(pickle)
         | 
| 75 | 
            +
                    pickle.ast_node_ids.map { |id| source_line(id) }
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                  def source_lines_for_pickle_step(pickle_step)
         | 
| 79 | 
            +
                    pickle_step.ast_node_ids.map { |id| source_line(id) }
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                  def source_line_for_pickle_tag(tag)
         | 
| 83 | 
            +
                    source_line(tag.ast_node_id)
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                  def source_line(id)
         | 
| 87 | 
            +
                    gherkin_query.location(id).line
         | 
| 88 | 
            +
                  end
         | 
| 68 89 | 
             
                end
         | 
| 69 90 | 
             
              end
         | 
| 70 91 | 
             
            end
         | 
    
        data/lib/cucumber/core/event.rb
    CHANGED
    
    
    
        data/lib/cucumber/core/events.rb
    CHANGED
    
    | @@ -5,6 +5,10 @@ module Cucumber | |
| 5 5 | 
             
              module Core
         | 
| 6 6 | 
             
                module Events
         | 
| 7 7 |  | 
| 8 | 
            +
                  class Envelope < Event.new(:envelope)
         | 
| 9 | 
            +
                    attr_reader :envelope
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 8 12 | 
             
                  # Signals that a gherkin source has been parsed
         | 
| 9 13 | 
             
                  class GherkinSourceParsed < Event.new(:gherkin_document)
         | 
| 10 14 | 
             
                    # @return [GherkinDocument] the GherkinDocument Ast Node
         | 
| @@ -12,6 +16,24 @@ module Cucumber | |
| 12 16 |  | 
| 13 17 | 
             
                  end
         | 
| 14 18 |  | 
| 19 | 
            +
                  # Signals that a Test::Step was created from a PickleStep
         | 
| 20 | 
            +
                  class TestStepCreated < Event.new(:test_step, :pickle_step)
         | 
| 21 | 
            +
                    # The created test step
         | 
| 22 | 
            +
                    attr_reader :test_step
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    # The source pickle step
         | 
| 25 | 
            +
                    attr_reader :pickle_step
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  # Signals that a Test::Case was created from a Pickle
         | 
| 29 | 
            +
                  class TestCaseCreated < Event.new(:test_case, :pickle)
         | 
| 30 | 
            +
                    # The created test step
         | 
| 31 | 
            +
                    attr_reader :test_case
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    # The source pickle step
         | 
| 34 | 
            +
                    attr_reader :pickle
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 15 37 | 
             
                  # Signals that a {Test::Case} is about to be executed
         | 
| 16 38 | 
             
                  class TestCaseStarted < Event.new(:test_case)
         | 
| 17 39 |  | 
| @@ -55,7 +77,10 @@ module Cucumber | |
| 55 77 | 
             
                  # that will be used by the {EventBus} by default.
         | 
| 56 78 | 
             
                  def self.registry
         | 
| 57 79 | 
             
                    build_registry(
         | 
| 80 | 
            +
                      Envelope,
         | 
| 58 81 | 
             
                      GherkinSourceParsed,
         | 
| 82 | 
            +
                      TestStepCreated,
         | 
| 83 | 
            +
                      TestCaseCreated,
         | 
| 59 84 | 
             
                      TestCaseStarted,
         | 
| 60 85 | 
             
                      TestStepStarted,
         | 
| 61 86 | 
             
                      TestStepFinished,
         | 
| @@ -7,24 +7,27 @@ module Cucumber | |
| 7 7 | 
             
                  ParseError = Class.new(StandardError)
         | 
| 8 8 |  | 
| 9 9 | 
             
                  class Parser
         | 
| 10 | 
            -
                    attr_reader :receiver, :event_bus
         | 
| 11 | 
            -
                    private     :receiver, :event_bus
         | 
| 10 | 
            +
                    attr_reader :receiver, :event_bus, :gherkin_query
         | 
| 11 | 
            +
                    private     :receiver, :event_bus, :gherkin_query
         | 
| 12 12 |  | 
| 13 | 
            -
                    def initialize(receiver, event_bus)
         | 
| 13 | 
            +
                    def initialize(receiver, event_bus, gherkin_query)
         | 
| 14 14 | 
             
                      @receiver = receiver
         | 
| 15 15 | 
             
                      @event_bus = event_bus
         | 
| 16 | 
            +
                      @gherkin_query = gherkin_query
         | 
| 16 17 | 
             
                    end
         | 
| 17 18 |  | 
| 18 19 | 
             
                    def document(document)
         | 
| 19 20 | 
             
                      messages = ::Gherkin.from_source(document.uri, document.body, gherkin_options(document))
         | 
| 20 21 | 
             
                      messages.each do |message|
         | 
| 21 | 
            -
                         | 
| 22 | 
            -
             | 
| 22 | 
            +
                        event_bus.envelope(message)
         | 
| 23 | 
            +
                        gherkin_query.update(message)
         | 
| 24 | 
            +
                        if !message.gherkin_document.nil?
         | 
| 25 | 
            +
                          event_bus.gherkin_source_parsed(message.gherkin_document)
         | 
| 23 26 | 
             
                        elsif !message.pickle.nil?
         | 
| 24 27 | 
             
                          receiver.pickle(message.pickle)
         | 
| 25 28 | 
             
                        elsif !message.attachment.nil?
         | 
| 26 29 | 
             
                          # Parse error
         | 
| 27 | 
            -
                          raise Core::Gherkin::ParseError.new("#{document.uri}: #{message.attachment. | 
| 30 | 
            +
                          raise Core::Gherkin::ParseError.new("#{document.uri}: #{message.attachment.text}")
         | 
| 28 31 | 
             
                        else
         | 
| 29 32 | 
             
                          raise "Unknown message: #{message.to_hash}"
         | 
| 30 33 | 
             
                        end
         | 
| @@ -7,10 +7,11 @@ module Cucumber | |
| 7 7 | 
             
              module Core
         | 
| 8 8 | 
             
                module Test
         | 
| 9 9 | 
             
                  class Case
         | 
| 10 | 
            -
                    attr_reader :name, :test_steps, :location, :tags, :language, :around_hooks
         | 
| 10 | 
            +
                    attr_reader :id, :name, :test_steps, :location, :tags, :language, :around_hooks
         | 
| 11 11 |  | 
| 12 | 
            -
                    def initialize(name, test_steps, location, tags, language, around_hooks = [])
         | 
| 12 | 
            +
                    def initialize(id, name, test_steps, location, tags, language, around_hooks = [])
         | 
| 13 13 | 
             
                      raise ArgumentError.new("test_steps should be an Array but is a #{test_steps.class}") unless test_steps.is_a?(Array)
         | 
| 14 | 
            +
                      @id = id
         | 
| 14 15 | 
             
                      @name = name
         | 
| 15 16 | 
             
                      @test_steps = test_steps
         | 
| 16 17 | 
             
                      @location = location
         | 
| @@ -35,11 +36,11 @@ module Cucumber | |
| 35 36 | 
             
                    end
         | 
| 36 37 |  | 
| 37 38 | 
             
                    def with_steps(test_steps)
         | 
| 38 | 
            -
                      self.class.new(name, test_steps, location, tags, language, around_hooks)
         | 
| 39 | 
            +
                      self.class.new(id, name, test_steps, location, tags, language, around_hooks)
         | 
| 39 40 | 
             
                    end
         | 
| 40 41 |  | 
| 41 42 | 
             
                    def with_around_hooks(around_hooks)
         | 
| 42 | 
            -
                      self.class.new(name, test_steps, location, tags, language, around_hooks)
         | 
| 43 | 
            +
                      self.class.new(id, name, test_steps, location, tags, language, around_hooks)
         | 
| 43 44 | 
             
                    end
         | 
| 44 45 |  | 
| 45 46 | 
             
                    def match_tags?(*expressions)
         | 
| @@ -1,5 +1,4 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 | 
            -
            require 'cucumber/core/test/location'
         | 
| 3 2 |  | 
| 4 3 | 
             
            module Cucumber
         | 
| 5 4 | 
             
              module Core
         | 
| @@ -24,18 +23,15 @@ module Cucumber | |
| 24 23 | 
             
                  # This will store <tt>[['a', 'b'], ['c', 'd']]</tt> in the <tt>data</tt> variable.
         | 
| 25 24 | 
             
                  #
         | 
| 26 25 | 
             
                  class DataTable
         | 
| 27 | 
            -
                    include HasLocation
         | 
| 28 | 
            -
             | 
| 29 26 | 
             
                    # Creates a new instance. +raw+ should be an Array of Array of String
         | 
| 30 27 | 
             
                    # or an Array of Hash
         | 
| 31 28 | 
             
                    # You don't typically create your own DataTable objects - Cucumber will do
         | 
| 32 29 | 
             
                    # it internally and pass them to your Step Definitions.
         | 
| 33 30 | 
             
                    #
         | 
| 34 | 
            -
                    def initialize(rows | 
| 31 | 
            +
                    def initialize(rows)
         | 
| 35 32 | 
             
                      raw = ensure_array_of_array(rows)
         | 
| 36 33 | 
             
                      verify_rows_are_same_length(raw)
         | 
| 37 34 | 
             
                      @raw = raw.freeze
         | 
| 38 | 
            -
                      @location = location
         | 
| 39 35 | 
             
                    end
         | 
| 40 36 | 
             
                    attr_reader :raw
         | 
| 41 37 |  | 
| @@ -58,7 +54,7 @@ module Cucumber | |
| 58 54 | 
             
                    # Creates a copy of this table
         | 
| 59 55 | 
             
                    #
         | 
| 60 56 | 
             
                    def dup
         | 
| 61 | 
            -
                      self.class.new(raw.dup | 
| 57 | 
            +
                      self.class.new(raw.dup)
         | 
| 62 58 | 
             
                    end
         | 
| 63 59 |  | 
| 64 60 | 
             
                    # Returns a new, transposed table. Example:
         | 
| @@ -73,7 +69,7 @@ module Cucumber | |
| 73 69 | 
             
                    #   | 4 | 2 |
         | 
| 74 70 | 
             
                    #
         | 
| 75 71 | 
             
                    def transpose
         | 
| 76 | 
            -
                      self.class.new(raw.transpose | 
| 72 | 
            +
                      self.class.new(raw.transpose)
         | 
| 77 73 | 
             
                    end
         | 
| 78 74 |  | 
| 79 75 | 
             
                    def map(&block)
         | 
| @@ -81,7 +77,7 @@ module Cucumber | |
| 81 77 | 
             
                        row.map(&block)
         | 
| 82 78 | 
             
                      end
         | 
| 83 79 |  | 
| 84 | 
            -
                      self.class.new(new_raw | 
| 80 | 
            +
                      self.class.new(new_raw)
         | 
| 85 81 | 
             
                    end
         | 
| 86 82 |  | 
| 87 83 | 
             
                    def ==(other)
         | 
| @@ -89,7 +85,7 @@ module Cucumber | |
| 89 85 | 
             
                    end
         | 
| 90 86 |  | 
| 91 87 | 
             
                    def inspect
         | 
| 92 | 
            -
                      %{#<#{self.class} #{raw.inspect} | 
| 88 | 
            +
                      %{#<#{self.class} #{raw.inspect})>}
         | 
| 93 89 | 
             
                    end
         | 
| 94 90 |  | 
| 95 91 | 
             
                    private
         | 
| @@ -20,14 +20,11 @@ module Cucumber | |
| 20 20 | 
             
                  # Note how the indentation from the source is stripped away.
         | 
| 21 21 | 
             
                  #
         | 
| 22 22 | 
             
                  class DocString < SimpleDelegator
         | 
| 23 | 
            -
                    include HasLocation
         | 
| 24 | 
            -
             | 
| 25 23 | 
             
                    attr_reader :content_type, :content
         | 
| 26 24 |  | 
| 27 | 
            -
                    def initialize(content, content_type | 
| 25 | 
            +
                    def initialize(content, content_type)
         | 
| 28 26 | 
             
                      @content = content
         | 
| 29 27 | 
             
                      @content_type = content_type
         | 
| 30 | 
            -
                      @location = location
         | 
| 31 28 | 
             
                      super @content
         | 
| 32 29 | 
             
                    end
         | 
| 33 30 |  | 
| @@ -46,7 +43,7 @@ module Cucumber | |
| 46 43 | 
             
                    def map
         | 
| 47 44 | 
             
                      raise ArgumentError, "No block given" unless block_given?
         | 
| 48 45 | 
             
                      new_content = yield content
         | 
| 49 | 
            -
                      self.class.new(new_content, content_type | 
| 46 | 
            +
                      self.class.new(new_content, content_type)
         | 
| 50 47 | 
             
                    end
         | 
| 51 48 |  | 
| 52 49 | 
             
                    def to_step_definition_arg
         | 
| @@ -65,7 +62,7 @@ module Cucumber | |
| 65 62 |  | 
| 66 63 | 
             
                    def inspect
         | 
| 67 64 | 
             
                      [
         | 
| 68 | 
            -
                        %{#<#{self.class} | 
| 65 | 
            +
                        %{#<#{self.class}},
         | 
| 69 66 | 
             
                        %{  """#{content_type}},
         | 
| 70 67 | 
             
                        %{  #{@content}},
         | 
| 71 68 | 
             
                        %{  """>}
         | 
| @@ -9,7 +9,6 @@ module Cucumber | |
| 9 9 | 
             
                    STRICT_AFFECTED_TYPES = [:flaky, :undefined, :pending].freeze
         | 
| 10 10 |  | 
| 11 11 | 
             
                    def self.ok?(type, be_strict = StrictConfiguration.new)
         | 
| 12 | 
            -
                      private
         | 
| 13 12 | 
             
                      class_name = type.to_s.slice(0, 1).capitalize + type.to_s.slice(1..-1)
         | 
| 14 13 | 
             
                      const_get(class_name).ok?(be_strict.strict?(type))
         | 
| 15 14 | 
             
                    end
         | 
| @@ -43,6 +42,13 @@ module Cucumber | |
| 43 42 | 
             
                      def with_filtered_backtrace(filter)
         | 
| 44 43 | 
             
                        self
         | 
| 45 44 | 
             
                      end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                      def to_message
         | 
| 47 | 
            +
                        Cucumber::Messages::TestStepResult.new(
         | 
| 48 | 
            +
                          status: Cucumber::Messages::TestStepResult::Status::UNKNOWN,
         | 
| 49 | 
            +
                          duration: UnknownDuration.new.to_message_duration
         | 
| 50 | 
            +
                        )
         | 
| 51 | 
            +
                      end
         | 
| 46 52 | 
             
                    end
         | 
| 47 53 |  | 
| 48 54 | 
             
                    class Passed
         | 
| @@ -68,6 +74,13 @@ module Cucumber | |
| 68 74 | 
             
                        "✓"
         | 
| 69 75 | 
             
                      end
         | 
| 70 76 |  | 
| 77 | 
            +
                      def to_message
         | 
| 78 | 
            +
                        Cucumber::Messages::TestStepResult.new(
         | 
| 79 | 
            +
                          status: Cucumber::Messages::TestStepResult::Status::PASSED,
         | 
| 80 | 
            +
                          duration: duration.to_message_duration
         | 
| 81 | 
            +
                        )
         | 
| 82 | 
            +
                      end
         | 
| 83 | 
            +
             | 
| 71 84 | 
             
                      def ok?(be_strict = nil)
         | 
| 72 85 | 
             
                        self.class.ok?
         | 
| 73 86 | 
             
                      end
         | 
| @@ -83,6 +96,7 @@ module Cucumber | |
| 83 96 |  | 
| 84 97 | 
             
                    class Failed
         | 
| 85 98 | 
             
                      include Result.query_methods :failed
         | 
| 99 | 
            +
             | 
| 86 100 | 
             
                      attr_reader :duration, :exception
         | 
| 87 101 |  | 
| 88 102 | 
             
                      def self.ok?(be_strict = false)
         | 
| @@ -107,6 +121,20 @@ module Cucumber | |
| 107 121 | 
             
                        "✗"
         | 
| 108 122 | 
             
                      end
         | 
| 109 123 |  | 
| 124 | 
            +
                      def to_message
         | 
| 125 | 
            +
                        begin
         | 
| 126 | 
            +
                          message = exception.backtrace.join("\n")
         | 
| 127 | 
            +
                        rescue NoMethodError
         | 
| 128 | 
            +
                          message = ""
         | 
| 129 | 
            +
                        end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                        Cucumber::Messages::TestStepResult.new(
         | 
| 132 | 
            +
                          status: Cucumber::Messages::TestStepResult::Status::FAILED,
         | 
| 133 | 
            +
                          duration: duration.to_message_duration,
         | 
| 134 | 
            +
                          message: message
         | 
| 135 | 
            +
                        )
         | 
| 136 | 
            +
                      end
         | 
| 137 | 
            +
             | 
| 110 138 | 
             
                      def ok?(be_strict = nil)
         | 
| 111 139 | 
             
                        self.class.ok?
         | 
| 112 140 | 
             
                      end
         | 
| @@ -186,6 +214,13 @@ module Cucumber | |
| 186 214 | 
             
                      def to_s
         | 
| 187 215 | 
             
                        "?"
         | 
| 188 216 | 
             
                      end
         | 
| 217 | 
            +
             | 
| 218 | 
            +
                      def to_message
         | 
| 219 | 
            +
                        Cucumber::Messages::TestStepResult.new(
         | 
| 220 | 
            +
                          status: Cucumber::Messages::TestStepResult::Status::UNDEFINED,
         | 
| 221 | 
            +
                          duration: duration.to_message_duration
         | 
| 222 | 
            +
                        )
         | 
| 223 | 
            +
                      end
         | 
| 189 224 | 
             
                    end
         | 
| 190 225 |  | 
| 191 226 | 
             
                    class Skipped < Raisable
         | 
| @@ -204,6 +239,13 @@ module Cucumber | |
| 204 239 | 
             
                      def to_s
         | 
| 205 240 | 
             
                        "-"
         | 
| 206 241 | 
             
                      end
         | 
| 242 | 
            +
             | 
| 243 | 
            +
                      def to_message
         | 
| 244 | 
            +
                        Cucumber::Messages::TestStepResult.new(
         | 
| 245 | 
            +
                          status: Cucumber::Messages::TestStepResult::Status::SKIPPED,
         | 
| 246 | 
            +
                          duration: duration.to_message_duration
         | 
| 247 | 
            +
                        )
         | 
| 248 | 
            +
                      end
         | 
| 207 249 | 
             
                    end
         | 
| 208 250 |  | 
| 209 251 | 
             
                    class Pending < Raisable
         | 
| @@ -222,6 +264,13 @@ module Cucumber | |
| 222 264 | 
             
                      def to_s
         | 
| 223 265 | 
             
                        "P"
         | 
| 224 266 | 
             
                      end
         | 
| 267 | 
            +
             | 
| 268 | 
            +
                      def to_message
         | 
| 269 | 
            +
                        Cucumber::Messages::TestStepResult.new(
         | 
| 270 | 
            +
                          status: Cucumber::Messages::TestStepResult::Status::PENDING,
         | 
| 271 | 
            +
                          duration: duration.to_message_duration
         | 
| 272 | 
            +
                        )
         | 
| 273 | 
            +
                      end
         | 
| 225 274 | 
             
                    end
         | 
| 226 275 |  | 
| 227 276 | 
             
                    # Handles the strict settings for the result types that are
         | 
| @@ -229,7 +278,7 @@ module Cucumber | |
| 229 278 | 
             
                    class StrictConfiguration
         | 
| 230 279 | 
             
                      attr_accessor :settings
         | 
| 231 280 | 
             
                      private :settings
         | 
| 232 | 
            -
             | 
| 281 | 
            +
             | 
| 233 282 | 
             
                      def initialize(strict_types = [])
         | 
| 234 283 | 
             
                        @settings = Hash[STRICT_AFFECTED_TYPES.map { |t| [t, :default] }]
         | 
| 235 284 | 
             
                        strict_types.each do |type|
         | 
| @@ -329,7 +378,7 @@ module Cucumber | |
| 329 378 | 
             
                      def decrement_failed
         | 
| 330 379 | 
             
                        @totals[:failed] -= 1
         | 
| 331 380 | 
             
                      end
         | 
| 332 | 
            -
             | 
| 381 | 
            +
             | 
| 333 382 | 
             
                      private
         | 
| 334 383 |  | 
| 335 384 | 
             
                      def get_total(method_name)
         | 
| @@ -344,14 +393,22 @@ module Cucumber | |
| 344 393 | 
             
                    end
         | 
| 345 394 |  | 
| 346 395 | 
             
                    class Duration
         | 
| 396 | 
            +
                      include Cucumber::Messages::TimeConversion
         | 
| 397 | 
            +
             | 
| 347 398 | 
             
                      attr_reader :nanoseconds
         | 
| 348 399 |  | 
| 349 400 | 
             
                      def initialize(nanoseconds)
         | 
| 350 401 | 
             
                        @nanoseconds = nanoseconds
         | 
| 351 402 | 
             
                      end
         | 
| 403 | 
            +
             | 
| 404 | 
            +
                      def to_message_duration
         | 
| 405 | 
            +
                        seconds_to_duration(nanoseconds.to_f / NANOSECONDS_PER_SECOND)
         | 
| 406 | 
            +
                      end
         | 
| 352 407 | 
             
                    end
         | 
| 353 408 |  | 
| 354 409 | 
             
                    class UnknownDuration
         | 
| 410 | 
            +
                      include Cucumber::Messages::TimeConversion
         | 
| 411 | 
            +
             | 
| 355 412 | 
             
                      def tap(&block)
         | 
| 356 413 | 
             
                        self
         | 
| 357 414 | 
             
                      end
         | 
| @@ -359,6 +416,10 @@ module Cucumber | |
| 359 416 | 
             
                      def nanoseconds
         | 
| 360 417 | 
             
                        raise "#nanoseconds only allowed to be used in #tap block"
         | 
| 361 418 | 
             
                      end
         | 
| 419 | 
            +
             | 
| 420 | 
            +
                      def to_message_duration
         | 
| 421 | 
            +
                        seconds_to_duration(0)
         | 
| 422 | 
            +
                      end
         | 
| 362 423 | 
             
                    end
         | 
| 363 424 | 
             
                  end
         | 
| 364 425 | 
             
                end
         |