require'cucumber/ast/has_steps'require'cucumber/ast/names'require'cucumber/ast/empty_background'moduleCucumbermoduleAstclassScenarioOutline#:nodoc:includeHasStepsincludeNamesincludeHasLocationattr_accessor:featureattr_reader:feature_tagsmoduleExamplesArray#:nodoc:defaccept(visitor)returnifCucumber.wants_to_quiteachdo|examples|visitor.visit_examples(examples)endendend# The +example_sections+ argument must be an Array where each element is another array representing# an Examples section. This array has 3 elements:## * Examples keyword# * Examples section name# * Raw matrixdefinitialize(language,location,background,comment,tags,feature_tags,keyword,title,description,raw_steps,example_sections)@language,@location,@background,@comment,@tags,@feature_tags,@keyword,@title,@description,@raw_steps,@example_sections=language,location,background,comment,tags,feature_tags,keyword,title,description,raw_steps,example_sectionsattach_steps(@raw_steps)enddefaccept(visitor)returnifCucumber.wants_to_quitraise_missing_examples_errorunless@example_sectionsvisitor.visit_comment(@comment)unless@comment.empty?visitor.visit_tags(@tags)visitor.visit_scenario_name(@keyword,name,file_colon_line,source_indent(first_line_length))visitor.visit_steps(steps)skip_invoke!if@background.failed?visitor.visit_examples_array(examples_array)unlessexamples_array.empty?enddefto_units(background)raiseArgumentError.new("#{background} != #{@background}")unlessbackground==@background# maybe we don't need this argument, but it seems like the leaf AST nodes would be better not being aware of their parents. However step_invocations uses the ivar at the moment, so we'll just do this check to make sure its OK.result=[]each_example_rowdo|row|result<<Unit.new(step_invocations(row))endresultenddeffail!(exception)# Just a hack for https://rspec.lighthouseapp.com/projects/16211/tickets/413-scenario-outlines-that-fail-with-exception-exit-process# Also see http://groups.google.com/group/cukes/browse_thread/thread/41cd567cb9df4bc3enddefskip_invoke!examples_array.each{|examples|examples.skip_invoke!}enddefstep_invocations(cells)step_invocations=steps.step_invocations_from_cells(cells)if@background@background.step_collection(step_invocations)elseStepCollection.new(step_invocations)endenddefeach_example_row(&proc)examples_array.eachdo|examples|examples.each_example_row(&proc)endenddefvisit_scenario_name(visitor,row)visitor.visit_scenario_name(language.keywords('scenario')[0],row.name,Location.new(file,row.line).to_s,source_indent(first_line_length))enddeffailed?examples_array.select{|examples|examples.failed?}.any?enddefto_sexpsexp=[:scenario_outline,@keyword,name]comment=@comment.to_sexpsexp+=[comment]ifcommenttags=@tags.to_sexpsexp+=tagsiftags.any?sexp+=steps.to_sexpifsteps.any?sexp+=examples_array.map{|e|e.to_sexp}sexpendprivateattr_reader:linedefexamples_arrayreturn@examples_arrayif@examples_array@examples_array=@example_sections.mapdo|section|create_examples_table(section)end@examples_array.extend(ExamplesArray)@examples_arrayenddefcreate_examples_table(example_section_and_gherkin_examples)example_section=example_section_and_gherkin_examples[0]gherkin_examples=example_section_and_gherkin_examples[1]examples_location=example_section[0]examples_comment=example_section[1]examples_keyword=example_section[2]examples_title=example_section[3]examples_description=example_section[4]examples_matrix=example_section[5]examples_table=OutlineTable.new(examples_matrix,self)ex=Examples.new(examples_location,examples_comment,examples_keyword,examples_title,examples_description,examples_table)ex.gherkin_statement(gherkin_examples)exenddefsteps@steps||=StepCollection.new(@raw_steps)enddefraise_missing_examples_errorraiseMissingExamples,"Missing Example Section for Scenario Outline at #{@location}"endMissingExamples=Class.new(StandardError)endendend