From 19d8e7d4ae9738ea5439d588f49082521a03cc3b Mon Sep 17 00:00:00 2001 From: Jonah Hirsch Date: Fri, 20 Feb 2015 09:27:01 -0700 Subject: [PATCH] Support multiple line numbers in CLI syntax --- lib/spinach/feature.rb | 6 ++--- lib/spinach/runner.rb | 28 +++++++++++++++-------- test/spinach/cli_test.rb | 9 ++++++++ test/spinach/runner_test.rb | 45 ++++++++++++++++++++++++++++++++++++- 4 files changed, 75 insertions(+), 13 deletions(-) diff --git a/lib/spinach/feature.rb b/lib/spinach/feature.rb index 781b5ab9..b7659ab2 100644 --- a/lib/spinach/feature.rb +++ b/lib/spinach/feature.rb @@ -1,6 +1,6 @@ module Spinach class Feature - attr_accessor :filename, :line + attr_accessor :filename, :lines attr_accessor :name, :scenarios, :tags attr_accessor :background attr_accessor :description @@ -14,8 +14,8 @@ def background_steps @background.nil? ? [] : @background.steps end - def line=(value) - @line = value.to_i if value + def lines=(value) + @lines = value.map(&:to_i) if value end end end diff --git a/lib/spinach/runner.rb b/lib/spinach/runner.rb index ace7369c..9fa4e194 100644 --- a/lib/spinach/runner.rb +++ b/lib/spinach/runner.rb @@ -69,15 +69,25 @@ def run successful = true - filenames.map do |filename| - filename.split(':') - end.each do |filename, line| - feature = Parser.open_file(filename).parse - feature.filename = filename - feature.line = line - success = FeatureRunner.new(feature, line).run - successful = false unless success - break if fail_fast? && !successful + filenames.map! do |filename| + file, *lines = filename.split(":") + [file, lines] + end + + catch :fail do + filenames.each do |filename, lines| + lines = [nil] if lines.empty? + + feature = Parser.open_file(filename).parse + feature.filename = filename + feature.lines = lines + + lines.each do |line| + success = FeatureRunner.new(feature, line).run + successful = false unless success + throw :fail if fail_fast? && !successful + end + end end Spinach.hooks.run_after_run(successful) diff --git a/test/spinach/cli_test.rb b/test/spinach/cli_test.rb index 05a6eb9b..cb216976 100644 --- a/test/spinach/cli_test.rb +++ b/test/spinach/cli_test.rb @@ -257,6 +257,15 @@ end end + describe "when a particular feature list is passed with multiple lines" do + it "returns the feature with the line numbers" do + cli = Spinach::Cli.new(['features/some_feature.feature:10:20']) + File.stubs(:exists?).returns(true) + + cli.feature_files.must_equal ["features/some_feature.feature:10:20"] + end + end + describe 'when no feature is passed' do it 'returns all the features' do cli = Spinach::Cli.new([]) diff --git a/test/spinach/runner_test.rb b/test/spinach/runner_test.rb index 14a21fdc..3c80e590 100644 --- a/test/spinach/runner_test.rb +++ b/test/spinach/runner_test.rb @@ -119,7 +119,50 @@ runner.run.must_equal true feature.filename.must_equal filename - feature.line.must_equal line + feature.lines.must_equal [line] + end + end + + describe "when lines set" do + let(:filename) { "features/cool_feature.feature" } + let(:line) { "12:24" } + let(:filenames) { ["#{filename}:#{line}"] } + let(:runner) { Spinach::Runner.new(filenames) } + + before(:each) do + @feature_runner = stub + Spinach::Parser.stubs(:open_file).with(filename).returns parser = stub + parser.stubs(:parse).returns @feature = Spinach::Feature.new + Spinach::Runner::FeatureRunner.stubs(:new). + with(@feature, anything). + returns(@feature_runner) + runner.stubs(required_files: []) + end + + it "sets filename and lines on the feature" do + @feature_runner.stubs(:run).returns(true) + runner.run.must_equal true + @feature.filename.must_equal filename + @feature.lines.must_equal line.split(":").map(&:to_i) + end + + it "returns false if it fails" do + @feature_runner.stubs(:run).returns(false) + runner.run.must_equal false + end + + it "breaks with a failure when fail fast set" do + Spinach.config.stubs(:fail_fast).returns true + @feature_runner.stubs(:run).returns(false) + @feature_runner.expects(:run).never + runner.run.must_equal false + end + + it "does not break when success when fail fast set" do + Spinach.config.stubs(:fail_fast).returns true + @feature_runner.stubs(:run).returns(true) + @feature_runner.expects(:run).returns true + runner.run.must_equal true end end