lib/gurke/runner.rb in gurke-2.0.0.dev.1.b17 vs lib/gurke/runner.rb in gurke-2.0.0.dev.1.b18

- old
+ new

@@ -10,147 +10,42 @@ @files = files @builder = Builder.new options end def reporter - @reporter ||= Reporter.new + @reporter ||= Reporters::DefaultReporter.new end def run files.each{|f| builder.parse(f) } + features = builder.features + features.freeze - with_hooks(:features, nil, nil) do - run_features builder.features - end - - !builder.features - .map(&:scenarios) - .flatten - .any?{|s| s.failed? || s.pending? } + features.run self, reporter end - def run_features(features) - reporter.start_features(features) - - features.each do |feature| - run_feature(feature) - end - - reporter.finish_features(features) - end - - def run_feature(feature) - reporter.start_feature(feature) - - feature.scenarios.each do |scenario| - run_scenario(scenario, feature) - end - - reporter.finish_feature(feature) - end - - def run_scenario(scenario, feature) - reporter.start_scenario(scenario, feature) - - world = world_for(scenario, feature) - - with_hooks(:scenario, scenario, world) do - feature.backgrounds.each do |b| - run_background(b, scenario, feature, world) - end - scenario.steps.each{|s| run_step(s, scenario, feature, world) } - end - - reporter.finish_scenario(scenario, feature) - end - - def run_background(background, scenario, feature, world) - reporter.start_background(background) - - background.steps.each{|s| run_step(s, scenario, feature, world) } - - reporter.finish_background(background) - end - - def run_step(step, scenario, feature, world) - reporter.start_step(step, scenario, feature) - - result = nil - with_filtered_backtrace do - match = Steps.find_step(step, world, step.type) - - if scenario.pending? || scenario.failed? - result = StepResult.new(step, :skipped) - return - end - - m = world.method(match.method_name) - world.send match.method_name, *(match.params + [step])[0...m.arity] - end - - result = StepResult.new(step, :success) - rescue StepPending => e - scenario.pending! e - result = StepResult.new(step, :pending, e) - rescue => e - scenario.failed! e - result = StepResult.new(step, :failed, e) - ensure - reporter.finish_step(result, scenario, feature) - end - - def with_hooks(scope, _context, world, &block) - Configuration::BEFORE_HOOKS.for(scope).each do |hook| - hook.run(world) - end + def hook(scope, world, &block) + Configuration::BEFORE_HOOKS.for(scope).each{|hook| hook.run world } Configuration::AROUND_HOOKS.for(scope).reduce(block) do |blk, hook| proc { hook.run(world, blk) } end.call + ensure Configuration::AFTER_HOOKS.for(scope).each do |hook| - hook.run(world) + begin + hook.run world + rescue => e + warn "Rescued error in after hook: #{e}\n#{e.backtrace.join("\n")}" + end end end - def world_for(scenario, _feature) - scenario.send(:world) - end - def with_filtered_backtrace yield rescue => e unless options[:backtrace] base = File.expand_path(Gurke.root.dirname) e.backtrace.select!{|l| File.expand_path(l)[0...base.size] == base } end raise - end - - # - class StepResult - attr_reader :step, :exception, :state - - def initialize(step, state, err = nil) - @step, @state, @exception = step, state, err - end - - Gurke::Step.public_instance_methods(false).each do |m| - define_method(m){|*args| step.send m, *args } - end - - def failed? - @state == :failed - end - - def pending? - @state == :pending - end - - def skipped? - @state == :skipped - end - - def success? - @state == :success - end end end end