require'cucumber/formatter/ansicolor'require'cucumber/formatter/duration'require'cucumber/formatter/summary'moduleCucumbermoduleFormatter# This module contains helper methods that are used by formatters# that print output to the terminal.moduleConsoleextendANSIColorincludeDurationincludeSummaryFORMATS=Hash.new{|hash,format|hash[format]=method(format).to_proc}defformat_step(keyword,step_match,status,source_indent)comment=ifsource_indentc=(' # '+step_match.file_colon_line).indent(source_indent)format_string(c,:comment)else''endformat=format_for(status,:param)line=keyword+step_match.format_args(format)+commentformat_string(line,status)enddefformat_string(o,status)fmt=format_for(status)o.to_s.split("\n").mapdo|line|ifProc===fmtfmt.call(line)elsefmt%lineendend.join("\n")enddefprint_steps(status)print_elements(step_mother.steps(status),status,'steps')enddefprint_elements(elements,status,kind)ifelements.any?@io.puts(format_string("(::) #{status}#{kind} (::)",status))@io.puts@io.flushendelements.each_with_indexdo|element,i|ifstatus==:failedprint_exception(element.exception,status,0)else@io.puts(format_string(element.backtrace_line,status))end@io.puts@io.flushendenddefprint_stats(features,options)@failures=step_mother.scenarios(:failed).select{|s|s.is_a?(Cucumber::Ast::Scenario)||s.is_a?(Cucumber::Ast::OutlineTable::ExampleRow)}@failures.collect!{|s|(s.is_a?(Cucumber::Ast::OutlineTable::ExampleRow))?s.scenario_outline:s}if!@failures.empty?@io.putsformat_string("Failing Scenarios:",:failed)@failures.eachdo|failure|profiles_string=options.custom_profiles.empty??'':(options.custom_profiles.map{|profile|"-p #{profile}"}).join(' ')+' 'source=options[:source]?format_string(" # Scenario: "+failure.name,:comment):''@io.putsformat_string("cucumber #{profiles_string}"+failure.file_colon_line,:failed)+sourceend@io.putsend@io.putsscenario_summary(step_mother){|status_count,status|format_string(status_count,status)}@io.putsstep_summary(step_mother){|status_count,status|format_string(status_count,status)}@io.puts(format_duration(features.duration))iffeatures&&features.duration@io.flushenddefprint_exception(e,status,indent)message="#{e.message} (#{e.class})"ifENV['CUCUMBER_TRUNCATE_OUTPUT']message=linebreaks(message,ENV['CUCUMBER_TRUNCATE_OUTPUT'].to_i)endstring="#{message}\n#{e.backtrace.join("\n")}".indent(indent)@io.puts(format_string(string,status))end# http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/10655 deflinebreaks(s,max)s.gsub(/.{1,#{max}}(?:\s|\Z)/){($&+5.chr).gsub(/\n\005/,"\n").gsub(/\005/,"\n")}.rstripenddefprint_snippets(options)returnunlessoptions[:snippets]undefined=step_mother.steps(:undefined)returnifundefined.empty?unknown_programming_language=step_mother.unknown_programming_language?snippets=undefined.mapdo|step|step_name=Undefined===step.exception?step.exception.step_name:step.namestep_multiline_class=step.multiline_arg?step.multiline_arg.class:nilsnippet=@step_mother.snippet_text(step.actual_keyword,step_name,step_multiline_class)snippetend.compact.uniqtext="\nYou can implement step definitions for undefined steps with these snippets:\n\n"text+=snippets.join("\n\n")@io.putsformat_string(text,:undefined)ifunknown_programming_language@io.putsformat_string("\nIf you want snippets in a different programming language,\n"+"just make sure a file with the appropriate file extension\n"+"exists where cucumber looks for step definitions.",:failed)end@io.puts@io.flushenddefprint_passing_wip(options)returnunlessoptions[:wip]passed=step_mother.scenarios(:passed)ifpassed.any?@io.putsformat_string("\nThe --wip switch was used, so I didn't expect anything to pass. These scenarios passed:",:failed)print_elements(passed,:passed,"scenarios")else@io.putsformat_string("\nThe --wip switch was used, so the failures were expected. All is good.\n",:passed)endenddefembed(file,mime_type,label)# no-opend#define @delayed_messages = [] in your Formatter if you want to#activate this featuredefputs(*messages)if@delayed_messages@delayed_messages+=messageselseif@io@io.putsmessages.eachdo|message|@io.puts(format_string(message,:tag))end@io.flushendendenddefprint_messages@delayed_messages.each{|message|print_message(message)}empty_messagesenddefprint_table_row_messagesreturnif@delayed_messages.empty?@io.print(format_string(@delayed_messages.join(', '),:tag).indent(2))@io.flushempty_messagesenddefprint_message(message)@io.puts(format_string(message,:tag).indent(@indent))@io.flushenddefempty_messages@delayed_messages=[]endprivatedefformat_for(*keys)key=keys.join('_').to_symfmt=FORMATS[key]raise"No format for #{key.inspect}: #{FORMATS.inspect}"iffmt.nil?fmtendendendend