lib/parallel_tests/cucumber/scenarios.rb in parallel_tests-2.10.0 vs lib/parallel_tests/cucumber/scenarios.rb in parallel_tests-2.11.0

- old
+ new

@@ -1,30 +1,64 @@ require 'cucumber/core/gherkin/tag_expression' require 'cucumber/runtime' require 'cucumber' require 'parallel_tests/cucumber/scenario_line_logger' require 'parallel_tests/gherkin/listener' +require 'gherkin/errors' module ParallelTests module Cucumber class Scenarios class << self def all(files, options={}) tags = [] tags.concat options[:ignore_tag_pattern].to_s.split(/\s*,\s*/).map {|tag| "~#{tag}" } tags.concat options[:test_options].to_s.scan(/(?:-t|--tags) (~?@[\w,~@]+)/).flatten + split_into_scenarios files, tags.uniq end private def split_into_scenarios(files, tags=[]) - tag_expression = ::Gherkin::TagExpression.new(tags) + + # Create the tag expression instance from gherkin, this is needed to know if the scenario matches with the tags invoked by the request + tag_expression = ::Cucumber::Core::Gherkin::TagExpression.new(tags) + + # Create the ScenarioLineLogger which will filter the scenario we want scenario_line_logger = ParallelTests::Cucumber::Formatters::ScenarioLineLogger.new(tag_expression) - loader = ::Cucumber::Runtime::FeaturesLoader.new(files, [], tag_expression) - loader.features.each do |feature| - feature.accept(scenario_line_logger) + # here we loop on the files map, each file will containe one or more scenario + features ||= files.map do |path| + + # We encode the file and get the content of it + source = ::Cucumber::Runtime::NormalisedEncodingFile.read(path) + # We create a Gherkin document, this will be used to decode the details of each scenario + document = ::Cucumber::Core::Gherkin::Document.new(path, source) + + # We create a parser for the gherkin document + parser = ::Gherkin::Parser.new() + scanner = ::Gherkin::TokenScanner.new(document.body) + + begin + # We make an attempt to parse the gherkin document, this could be failed if the document is not well formated + result = parser.parse(scanner) + + # We loop on each children of the feature + result[:feature][:children].each do |feature_element| + # If the type of the child is not a scenario, we continue, we are only interested by the name of the scenario here + if feature_element[:type].to_s != 'Scenario' + next + end + + # It's a scenario, we add it to the scenario_line_logger + scenario_line_logger.visit_feature_element(document.uri, feature_element) + end + + rescue StandardError => e + # Exception if the document is no well formated or error in the tags + raise ::Cucumber::Core::Gherkin::ParseError.new("#{document.uri}: #{e.message}") + end end scenario_line_logger.scenarios end end