class Cucumber::Formatter::Json

The formatter used for --format json

Public Class Methods

new(runtime, io, _options) click to toggle source
# File lib/cucumber/formatter/json.rb, line 12
def initialize(runtime, io, _options)
  @runtime = runtime
  @io = ensure_io(io)
  @feature_hashes = []
end

Public Instance Methods

after_test_case(test_case, result) click to toggle source
# File lib/cucumber/formatter/json.rb, line 58
def after_test_case(test_case, result)
  add_failed_around_hook(result) if result.failed? && !@any_step_failed
end
after_test_step(test_step, result) click to toggle source
# File lib/cucumber/formatter/json.rb, line 52
def after_test_step(test_step, result)
  return if internal_hook?(test_step)
  add_match_and_result(test_step, result)
  @any_step_failed = true if result.failed?
end
before_test_case(test_case) click to toggle source
# File lib/cucumber/formatter/json.rb, line 18
def before_test_case(test_case)
  builder = Builder.new(test_case)
  unless same_feature_as_previous_test_case?(test_case.feature)
    @feature_hash = builder.feature_hash
    @feature_hashes << @feature_hash
  end
  @test_case_hash = builder.test_case_hash
  if builder.background?
    feature_elements << builder.background_hash
    @element_hash = builder.background_hash
  else
    feature_elements << @test_case_hash
    @element_hash = @test_case_hash
  end
  @any_step_failed = false
end
before_test_step(test_step) click to toggle source
# File lib/cucumber/formatter/json.rb, line 35
def before_test_step(test_step)
  return if internal_hook?(test_step)
  hook_query = HookQueryVisitor.new(test_step)
  if hook_query.hook?
    @step_or_hook_hash = {}
    hooks_of_type(hook_query) << @step_or_hook_hash
    return
  end
  if first_step_after_background?(test_step)
    feature_elements << @test_case_hash
    @element_hash = @test_case_hash
  end
  @step_or_hook_hash = create_step_hash(test_step.source.last)
  steps << @step_or_hook_hash
  @step_hash = @step_or_hook_hash
end
done() click to toggle source
# File lib/cucumber/formatter/json.rb, line 62
def done
  @io.write(MultiJson.dump(@feature_hashes, pretty: true))
end
embed(src, mime_type, _label) click to toggle source
# File lib/cucumber/formatter/json.rb, line 70
def embed(src, mime_type, _label)
  if File.file?(src)
    content = File.open(src, 'rb') { |f| f.read }
    data = encode64(content)
  else
    if mime_type =~ /;base64$/
      mime_type = mime_type[0..-8]
      data = src
    else
      data = encode64(src)
    end
  end
  test_step_embeddings << { mime_type: mime_type, data: data }
end
puts(message) click to toggle source
# File lib/cucumber/formatter/json.rb, line 66
def puts(message)
  test_step_output << message
end

Private Instance Methods

add_failed_around_hook(result) click to toggle source
# File lib/cucumber/formatter/json.rb, line 172
def add_failed_around_hook(result)
  @step_or_hook_hash = {}
  around_hooks << @step_or_hook_hash
  @step_or_hook_hash[:match] = { location: "unknown_hook_location:1" }

  @step_or_hook_hash[:result] = create_result_hash(result)
end
add_match_and_result(test_step, result) click to toggle source
# File lib/cucumber/formatter/json.rb, line 167
def add_match_and_result(test_step, result)
  @step_or_hook_hash[:match] = create_match_hash(test_step, result)
  @step_or_hook_hash[:result] = create_result_hash(result)
end
after_hooks() click to toggle source
# File lib/cucumber/formatter/json.rb, line 128
def after_hooks
  @element_hash[:after] ||= []
end
after_step_hooks() click to toggle source
# File lib/cucumber/formatter/json.rb, line 136
def after_step_hooks
  @step_hash[:after] ||= []
end
around_hooks() click to toggle source
# File lib/cucumber/formatter/json.rb, line 132
def around_hooks
  @element_hash[:around] ||= []
end
before_hooks() click to toggle source
# File lib/cucumber/formatter/json.rb, line 124
def before_hooks
  @element_hash[:before] ||= []
end
create_doc_string_hash(doc_string) click to toggle source
# File lib/cucumber/formatter/json.rb, line 159
def create_doc_string_hash(doc_string)
  {
    value: doc_string.content,
    content_type: doc_string.content_type,
    line: doc_string.location.line
  }
end
create_error_message(result) click to toggle source
# File lib/cucumber/formatter/json.rb, line 193
def create_error_message(result)
  message_element = result.failed? ? result.exception : result
  message = "#{message_element.message} (#{message_element.class})"
  ([message] + message_element.backtrace).join("\n")
end
create_match_hash(test_step, result) click to toggle source
# File lib/cucumber/formatter/json.rb, line 180
def create_match_hash(test_step, result)
  { location: test_step.action_location }
end
create_result_hash(result) click to toggle source
# File lib/cucumber/formatter/json.rb, line 184
def create_result_hash(result)
  result_hash = {
    status: result.to_sym
  }
  result_hash[:error_message] = create_error_message(result) if result.failed? || result.pending?
  result.duration.tap { |duration| result_hash[:duration] = duration.nanoseconds }
  result_hash
end
create_step_hash(step_source) click to toggle source
# File lib/cucumber/formatter/json.rb, line 148
def create_step_hash(step_source)
  step_hash = {
    keyword: step_source.keyword,
    name: step_source.name,
    line: step_source.location.line
  }
  step_hash[:comments] = Formatter.create_comments_array(step_source.comments) unless step_source.comments.empty?
  step_hash[:doc_string] = create_doc_string_hash(step_source.multiline_arg) if step_source.multiline_arg.doc_string?
  step_hash
end
current_feature() click to toggle source
# File lib/cucumber/formatter/json.rb, line 99
def current_feature
  @feature_hash ||= {}
end
encode64(data) click to toggle source
# File lib/cucumber/formatter/json.rb, line 199
def encode64(data)
  # strip newlines from the encoded data
  Base64.encode64(data).gsub(/\n/, '')
end
feature_elements() click to toggle source
# File lib/cucumber/formatter/json.rb, line 103
def feature_elements
  @feature_hash[:elements] ||= []
end
first_step_after_background?(test_step) click to toggle source
# File lib/cucumber/formatter/json.rb, line 91
def first_step_after_background?(test_step)
  test_step.source[1].name != @element_hash[:name]
end
hooks_of_type(hook_query) click to toggle source
# File lib/cucumber/formatter/json.rb, line 111
def hooks_of_type(hook_query)
  case hook_query.type
  when :before
    return before_hooks
  when :after
    return after_hooks
  when :after_step
    return after_step_hooks
  else
    fail 'Unkown hook type ' + hook_query.type.to_s
  end
end
internal_hook?(test_step) click to toggle source
# File lib/cucumber/formatter/json.rb, line 95
def internal_hook?(test_step)
  test_step.source.last.location.file.include?('lib/cucumber/')
end
same_feature_as_previous_test_case?(feature) click to toggle source
# File lib/cucumber/formatter/json.rb, line 87
def same_feature_as_previous_test_case?(feature)
  current_feature[:uri] == feature.file && current_feature[:line] == feature.location.line
end
steps() click to toggle source
# File lib/cucumber/formatter/json.rb, line 107
def steps
  @element_hash[:steps] ||= []
end
test_step_embeddings() click to toggle source
# File lib/cucumber/formatter/json.rb, line 144
def test_step_embeddings
  @step_or_hook_hash[:embeddings] ||= []
end
test_step_output() click to toggle source
# File lib/cucumber/formatter/json.rb, line 140
def test_step_output
  @step_or_hook_hash[:output] ||= []
end