require'cucumber/errors'require'cucumber/step_match'require'cucumber/ast/table'require'gherkin/rubify'moduleCucumbermoduleAstclassStepInvocation#:nodoc:includeGherkin::Rubifyattr_writer:step_collection,:backgroundattr_reader:name,:matched_cells,:status,:reported_exceptionattr_accessor:exceptionclass<<selfSEVERITY=[:passed,:undefined,:pending,:skipped,:failed]defworst_status(statuses)SEVERITY[statuses.map{|status|SEVERITY.index(status)}.max]endenddefinitialize(step,name,multiline_arg,matched_cells)@step,@name,@multiline_arg,@matched_cells=step,name,multiline_arg,matched_cellsstatus!(:skipped)@skip_invoke=@exception=@step_match=@different_table=@reported_exception=@background=nilenddefbackground?@backgroundenddefskip_invoke!@skip_invoke=trueenddefaccept(visitor)returnifCucumber.wants_to_quitinvoke(visitor.runtime,visitor.configuration)visit_step_result(visitor)enddefvisit_step_result(visitor)visitor.visit_step_result(keyword,@step_match,(@different_table||@multiline_arg),@status,@reported_exception,source_indent,@background,file_colon_line)enddefinvoke(runtime,configuration)find_step_match!(runtime,configuration)unless@skip_invoke||configuration.dry_run?||@exception||@step_collection.exception@skip_invoke=truebegin@step_match.invoke(@multiline_arg)runtime.after_stepstatus!(:passed)rescuePending=>efailed(configuration,e,false)status!(:pending)rescueUndefined=>efailed(configuration,e,false)status!(:undefined)rescueCucumber::Ast::Table::Different=>e@different_table=e.tablefailed(configuration,e,false)status!(:failed)rescueException=>efailed(configuration,e,false)status!(:failed)endendenddeffind_step_match!(runtime,configuration)returnif@step_matchbegin@step_match=runtime.step_match(@name)rescueUndefined=>efailed(configuration,e,true)status!(:undefined)@step_match=NoStepMatch.new(@step,@name)rescueAmbiguous=>efailed(configuration,e,false)status!(:failed)@step_match=NoStepMatch.new(@step,@name)endruntime.step_visited(self)enddeffailed(configuration,e,clear_backtrace)e.set_backtrace([])ife.backtrace.nil?||clear_backtracee.backtrace<<@step.backtrace_lineunless@step.backtrace_line.nil?e=filter_backtrace(e)@exception=eif(configuration.strict?||!(Undefined===e)||e.nested?)@reported_exception=eelse@reported_exception=nilendend# This constant is appended to by Cuke4Duke. Do not change its nameBACKTRACE_FILTER_PATTERNS=[/vendor\/rails|lib\/cucumber|bin\/cucumber:|lib\/rspec|gems\/|minitest|test\/unit|lib\/ruby/]if(Cucumber::JRUBY)BACKTRACE_FILTER_PATTERNS<</org\/jruby/endPWD_PATTERN=/#{Regexp.escape(Dir.pwd)}\//m# This is to work around double ":in " segments in JRuby backtraces. JRuby bug?deffilter_backtrace(e)returneifCucumber.use_full_backtracee.backtrace.each{|line|line.gsub!(PWD_PATTERN,"./")}filtered=(e.backtrace||[]).rejectdo|line|BACKTRACE_FILTER_PATTERNS.detect{|p|line=~p}endifENV['CUCUMBER_TRUNCATE_OUTPUT']# Strip off file locationsfiltered=filtered.mapdo|line|line=~/(.*):in `/?$1:lineendende.set_backtrace(filtered)eenddefstatus!(status)@status=status@matched_cells.eachdo|cell|cell.status=statusendenddefprevious@step_collection.previous_step(self)enddefactual_keywordrepeat_keywords=rubify([language.keywords('but'),language.keywords('and')]).flatten.uniq.reject{|kw|kw=='* '}ifrepeat_keywords.index(@step.keyword)&&previousprevious.actual_keywordelsekeyword=='* '?language.code_keywords.first:keywordendenddefsource_indent@step.feature_element.source_indent(text_length)enddeftext_length@step.text_length(@name)enddefkeyword@step.keywordenddefmultiline_arg@step.multiline_argenddeffile_colon_line@step.file_colon_lineenddefdom_id@step.dom_idenddefbacktrace_line@step.backtrace_lineenddeflanguage@step.language||raise("Language is required on #{@step}")enddefgherkin_statement@step.gherkin_statementenddefto_sexp[:step_invocation,@step.line,@step.keyword,@name,(@multiline_arg.nil??nil:@multiline_arg.to_sexp)].compactendendendend