# frozen_string_literal: true require 'cucumber/core' require 'cucumber/core/compiler' require 'cucumber/core/gherkin/writer' module Cucumber::Core describe Compiler do include Gherkin::Writer include Cucumber::Core def self.stubs(*names) names.each do |name| let(name) { double(name.to_s) } end end it "compiles a feature with a single scenario" do gherkin_documents = [ gherkin do feature do scenario do step 'passing' end end end ] compile(gherkin_documents) do |visitor| expect( visitor ).to receive(:test_case).once.ordered.and_yield(visitor) expect( visitor ).to receive(:test_step).once.ordered expect( visitor ).to receive(:done).once.ordered end end it "compiles a feature with a background" do gherkin_documents = [ gherkin do feature do background do step 'passing' end scenario do step 'passing' end end end ] compile(gherkin_documents) do |visitor| expect( visitor ).to receive(:test_case).once.ordered.and_yield(visitor) expect( visitor ).to receive(:test_step).exactly(2).times.ordered expect( visitor ).to receive(:done).once.ordered end end it "compiles multiple features" do gherkin_documents = [ gherkin do feature do background do step 'passing' end scenario do step 'passing' end end end, gherkin do feature do background do step 'passing' end scenario do step 'passing' end end end ] compile(gherkin_documents) do |visitor| expect( visitor ).to receive(:test_case).once.ordered expect( visitor ).to receive(:test_step).twice.ordered expect( visitor ).to receive(:test_case).once.ordered expect( visitor ).to receive(:test_step).twice.ordered expect( visitor ).to receive(:done).once end end context "compiling scenario outlines" do it "compiles a scenario outline to test cases" do gherkin_documents = [ gherkin do feature do background do step 'passing' end scenario_outline do step 'passing ' step 'passing' examples 'examples 1' do row 'arg' row '1' row '2' end examples 'examples 2' do row 'arg' row 'a' end end end end ] compile(gherkin_documents) do |visitor| expect( visitor ).to receive(:test_case).exactly(3).times.and_yield(visitor) expect( visitor ).to receive(:test_step).exactly(9).times expect( visitor ).to receive(:done).once end end it 'replaces arguments correctly when generating test steps' do gherkin_documents = [ gherkin do feature do scenario_outline do step 'passing with ' step 'as well as ' examples do row 'arg1', 'arg2', 'arg3' row '1', '2', '3' end end end end ] compile(gherkin_documents) do |visitor| expect( visitor ).to receive(:test_step) do |test_step| expect(test_step.text).to eq 'passing 1 with 2' end.once.ordered expect( visitor ).to receive(:test_step) do |test_step| expect(test_step.text).to eq 'as well as 3' end.once.ordered expect( visitor ).to receive(:done).once.ordered end end end context 'empty scenarios' do it 'does create test cases for them' do gherkin_documents = [ gherkin do feature do scenario do end end end ] compile(gherkin_documents) do |visitor| expect( visitor ).to receive(:test_case).once.ordered expect( visitor ).to receive(:done).once.ordered end end end def compile(gherkin_documents) visitor = double allow( visitor ).to receive(:test_suite).and_yield(visitor) allow( visitor ).to receive(:test_case).and_yield(visitor) yield visitor super(gherkin_documents, visitor) end end end