|
- require 'cucumber/formatter/console'
-
- module Cucumber
- module Formatter
- class ConsoleIssues
- include Console
-
- def initialize(config, ast_lookup = AstLookup.new(config))
- @previous_test_case = nil
- @issues = Hash.new { |h, k| h[k] = [] }
- @config = config
- @config.on_event(:test_case_finished) do |event|
- if event.test_case != @previous_test_case
- @previous_test_case = event.test_case
- @issues[event.result.to_sym] << event.test_case unless event.result.ok?(@config.strict)
- elsif event.result.passed?
- @issues[:flaky] << event.test_case unless Core::Test::Result::Flaky.ok?(@config.strict.strict?(:flaky))
- @issues[:failed].delete(event.test_case)
- end
- end
- @ast_lookup = ast_lookup
- end
-
- def to_s
- return if @issues.empty?
-
- result = Core::Test::Result::TYPES.map { |type| scenario_listing(type, @issues[type]) }
- result.flatten.join("\n")
- end
-
- def any?
- @issues.any?
- end
-
- private
-
- def scenario_listing(type, test_cases)
- return [] if test_cases.empty?
-
- [format_string("#{type_heading(type)} Scenarios:", type)] + test_cases.map do |test_case|
- scenario_source = @ast_lookup.scenario_source(test_case)
- keyword = scenario_source.type == :Scenario ? scenario_source.scenario.keyword : scenario_source.scenario_outline.keyword
- source = @config.source? ? format_string(" # #{keyword}: #{test_case.name}", :comment) : ''
- format_string("cucumber #{profiles_string}#{test_case.location.file}:#{test_case.location.lines.max}", type) + source
- end
- end
-
- def type_heading(type)
- case type
- when :failed
- 'Failing'
- else
- type.to_s.slice(0, 1).capitalize + type.to_s.slice(1..-1)
- end
- end
-
- def profiles_string
- return if @config.custom_profiles.empty?
-
- profiles = @config.custom_profiles.map { |profile| "-p #{profile}" }.join(' ')
-
- "#{profiles} "
- end
- end
- end
- end
|