lib/cucumber/core/compiler.rb
# frozen_string_literal: true require 'cucumber/core/test/case' require 'cucumber/core/test/step' require 'cucumber/core/test/tag' require 'cucumber/core/test/doc_string' require 'cucumber/core/test/data_table' require 'cucumber/core/test/empty_multiline_argument' module Cucumber module Core # Compiles the Pickles into test cases class Compiler attr_reader :receiver private :receiver def initialize(receiver) @receiver = receiver end def pickle(pickle) test_case = create_test_case(pickle) test_case.describe_to(receiver) end def done receiver.done self end private def create_test_case(pickle) uri = pickle.uri test_steps = pickle.steps.map { |step| create_test_step(step, uri) } lines = pickle.locations.map { |location| location.line }.sort.reverse tags = pickle.tags.map { |tag| Test::Tag.new(Test::Location.new(uri, tag.location.line), tag.name) } Test::Case.new(pickle.name, test_steps, Test::Location.new(uri, lines), tags, pickle.language) end def create_test_step(pickle_step, uri) lines = pickle_step.locations.map { |location| location.line }.sort.reverse multiline_arg = create_multiline_arg(pickle_step, uri) Test::Step.new(pickle_step.text, Test::Location.new(uri, lines), multiline_arg) end def create_multiline_arg(pickle_step, uri) if pickle_step.argument if pickle_step.argument.doc_string doc_string = pickle_step.argument.doc_string Test::DocString.new( doc_string.content, doc_string.contentType, Test::Location.new(uri, doc_string.location.line) ) elsif pickle_step.argument.data_table data_table = pickle_step.argument.data_table first_cell = data_table.rows.first.cells.first Test::DataTable.new( data_table.rows.map { |row| row.cells.map { |cell| cell.value } }, Test::Location.new(uri, first_cell.location.line) ) end else Test::EmptyMultilineArgument.new end end end end end