cuke_slicer 2.1.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -1
- data/LICENSE.txt +1 -1
- data/README.md +18 -10
- data/cuke_slicer.gemspec +34 -19
- data/lib/cuke_slicer/collections/nested_tag_collection.rb +6 -4
- data/lib/cuke_slicer/collections/path_collection.rb +4 -2
- data/lib/cuke_slicer/collections/tag_collection.rb +6 -4
- data/lib/cuke_slicer/extractors/directory_extractor.rb +3 -1
- data/lib/cuke_slicer/extractors/file_extractor.rb +11 -4
- data/lib/cuke_slicer/filters/filter_set.rb +12 -10
- data/lib/cuke_slicer/helpers/extraction_helpers.rb +11 -5
- data/lib/cuke_slicer/helpers/filter_helpers.rb +36 -30
- data/lib/cuke_slicer/helpers/helpers.rb +5 -4
- data/lib/cuke_slicer/helpers/matching_helpers.rb +12 -7
- data/lib/cuke_slicer/slicer.rb +16 -20
- data/lib/cuke_slicer/version.rb +1 -1
- data/lib/cuke_slicer.rb +2 -2
- data/{features → testing/cucumber/features}/test_case_extraction.feature +22 -0
- metadata +80 -58
- data/.gitignore +0 -24
- data/.simplecov +0 -7
- data/.travis.yml +0 -33
- data/Gemfile +0 -4
- data/Rakefile +0 -85
- data/appveyor.yml +0 -81
- data/features/step_definitions/action_steps.rb +0 -107
- data/features/step_definitions/setup_steps.rb +0 -103
- data/features/step_definitions/verification_steps.rb +0 -58
- data/features/support/env.rb +0 -18
- data/gemfiles/cuke_modeler0.gemfile +0 -28
- data/gemfiles/cuke_modeler1.gemfile +0 -29
- data/gemfiles/cuke_modeler2.gemfile +0 -29
- data/gemfiles/cuke_modeler3.gemfile +0 -12
- data/spec/cuke_slicer_spec.rb +0 -28
- data/spec/slicer_integration_spec.rb +0 -279
- data/spec/slicer_unit_spec.rb +0 -37
- data/spec/spec_helper.rb +0 -22
- /data/{features → testing/cucumber/features}/tag_logic.feature +0 -0
- /data/{features → testing/cucumber/features}/test_case_filtering.feature +0 -0
- /data/{features → testing/cucumber/features}/validation.feature +0 -0
@@ -1,103 +0,0 @@
|
|
1
|
-
Given(/^the following feature file(?: "([^"]*)")?:$/) do |file_name, file_text|
|
2
|
-
@test_directory ||= @default_file_directory
|
3
|
-
file_name ||= @default_feature_file_name
|
4
|
-
|
5
|
-
@targets ||= []
|
6
|
-
@targets << file_name
|
7
|
-
|
8
|
-
File.open("#{@test_directory}/#{file_name}", 'w') { |file| file.write(file_text) }
|
9
|
-
end
|
10
|
-
|
11
|
-
Given(/^the directory "([^"]*)"$/) do |directory_name|
|
12
|
-
@test_directory = "#{@default_file_directory}/#{directory_name}"
|
13
|
-
|
14
|
-
FileUtils.mkdir(@test_directory)
|
15
|
-
end
|
16
|
-
|
17
|
-
Given(/^the following tag filters:$/) do |filters|
|
18
|
-
filters.hashes.each do |filter|
|
19
|
-
case filter['filter type']
|
20
|
-
when 'excluded'
|
21
|
-
@excluded_tag_filters = filter['filter']
|
22
|
-
when 'included'
|
23
|
-
@included_tag_filters = filter['filter']
|
24
|
-
else
|
25
|
-
raise("Unknown filter type #{filter['filter type']}")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
And(/^the following path filters:$/) do |filters|
|
31
|
-
@excluded_path_filters = []
|
32
|
-
@included_path_filters = []
|
33
|
-
|
34
|
-
filters.hashes.each do |filter|
|
35
|
-
case filter['filter type']
|
36
|
-
when 'excluded'
|
37
|
-
@excluded_path_filters << process_filter(filter['filter'])
|
38
|
-
when 'included'
|
39
|
-
@included_path_filters << process_filter(filter['filter'])
|
40
|
-
else
|
41
|
-
raise("Unknown filter type #{filter['filter type']}")
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
And(/^the following custom filter:$/) do |filter|
|
47
|
-
@custom_filter = eval("Proc.new #{filter}")
|
48
|
-
end
|
49
|
-
|
50
|
-
Given(/^the file "([^"]*)" does not exist$/) do |file_name|
|
51
|
-
@test_directory ||= @default_file_directory
|
52
|
-
|
53
|
-
@targets ||= []
|
54
|
-
@targets << file_name
|
55
|
-
|
56
|
-
file_path = "#{@test_directory}/#{file_name}"
|
57
|
-
FileUtils.rm(file_path) if File.exists?(file_path)
|
58
|
-
end
|
59
|
-
|
60
|
-
Given(/^the directory "([^"]*)" does not exist$/) do |directory_name|
|
61
|
-
@targets ||= []
|
62
|
-
@targets << directory_name
|
63
|
-
|
64
|
-
file_path = "#{@default_file_directory}/#{directory_name}"
|
65
|
-
FileUtils.remove_dir(file_path) if File.exists?(file_path)
|
66
|
-
end
|
67
|
-
|
68
|
-
And(/^the file "([^"]*)"$/) do |file_name|
|
69
|
-
@test_directory ||= @default_file_directory
|
70
|
-
|
71
|
-
@targets ||= []
|
72
|
-
@targets << file_name
|
73
|
-
|
74
|
-
File.open("#{@test_directory}/#{file_name}", 'w') { |file| file.write('') }
|
75
|
-
end
|
76
|
-
|
77
|
-
Given(/^a slicer$/) do
|
78
|
-
@slicer = CukeSlicer::Slicer.new
|
79
|
-
end
|
80
|
-
|
81
|
-
And(/^the test cases are to be extracted as objects$/) do
|
82
|
-
@output_type = :test_object
|
83
|
-
end
|
84
|
-
|
85
|
-
And(/^an invalid output option$/) do
|
86
|
-
@output_type = :invalid_option
|
87
|
-
end
|
88
|
-
|
89
|
-
Given(/^a test suite to extract from$/) do
|
90
|
-
@test_directory ||= @default_file_directory
|
91
|
-
|
92
|
-
@targets ||= []
|
93
|
-
@targets << @default_feature_file_name
|
94
|
-
|
95
|
-
|
96
|
-
test_suite = "Feature: Test feature
|
97
|
-
|
98
|
-
@tag
|
99
|
-
Scenario: Test scenario
|
100
|
-
* some step"
|
101
|
-
|
102
|
-
File.write("#{@test_directory}/#{@default_feature_file_name}", test_suite)
|
103
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
Then(/^the following test cases are found$/) do |expected_test_cases|
|
2
|
-
expected_test_cases = expected_test_cases.raw.flatten
|
3
|
-
expected_test_cases.collect! { |test_case| test_case.sub('path/to', @default_file_directory) }
|
4
|
-
|
5
|
-
found_test_cases = @output.values.flatten
|
6
|
-
|
7
|
-
expect(found_test_cases).to match_array(expected_test_cases)
|
8
|
-
end
|
9
|
-
|
10
|
-
Then(/^no test cases are found$/) do
|
11
|
-
expect(@output.values.flatten).to be_empty
|
12
|
-
end
|
13
|
-
|
14
|
-
Then(/^The following filter types are valid:$/) do |filter_types|
|
15
|
-
filter_types = filter_types.raw.flatten.collect { |filter| filter.to_sym }
|
16
|
-
|
17
|
-
expect(CukeSlicer::Slicer.known_filters).to match_array(filter_types)
|
18
|
-
end
|
19
|
-
|
20
|
-
Then(/^"([^"]*)" are found$/) do |test_cases|
|
21
|
-
expected_test_cases = test_cases.delete(' ').split(',')
|
22
|
-
expected_test_cases.collect! { |test_case| test_case.sub('path/to', @default_file_directory) }
|
23
|
-
|
24
|
-
found_test_cases = @output.values.flatten
|
25
|
-
|
26
|
-
expect(found_test_cases).to match_array(expected_test_cases)
|
27
|
-
end
|
28
|
-
|
29
|
-
Then(/^an error indicating that the (?:file|directory) does not exist will be triggered$/) do
|
30
|
-
expect(@error_raised).to_not be_nil
|
31
|
-
expect(@error_raised.message).to match(/file.*directory.*does not exist/i)
|
32
|
-
end
|
33
|
-
|
34
|
-
Then(/^an error indicating that the feature file is invalid will be triggered$/) do
|
35
|
-
expect(@error_raised).to_not be_nil
|
36
|
-
expect(@error_raised.message).to match(/syntax.*lexing/)
|
37
|
-
end
|
38
|
-
|
39
|
-
Then(/^an error indicating that the filter type is unknown will be triggered$/) do
|
40
|
-
expect(@error_raised).to_not be_nil
|
41
|
-
expect(@error_raised.message).to match(/unknown filter/i)
|
42
|
-
end
|
43
|
-
|
44
|
-
Then(/^an error indicating that the filter is invalid will be triggered$/) do
|
45
|
-
expect(@error_raised).to_not be_nil
|
46
|
-
expect(@error_raised.message).to match(/invalid filter/i)
|
47
|
-
end
|
48
|
-
|
49
|
-
Then(/^the test cases are provided as objects$/) do
|
50
|
-
@output.values.flatten.each do |output|
|
51
|
-
expect(output).to be_a(CukeModeler::Scenario).or be_a(CukeModeler::Row)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
Then(/^an error indicating that the output type is invalid will be triggered$/) do
|
56
|
-
expect(@error_raised).to_not be_nil
|
57
|
-
expect(@error_raised.message).to match(/Invalid Output Format/i)
|
58
|
-
end
|
data/features/support/env.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'simplecov'
|
2
|
-
SimpleCov.command_name('cuke_slicer-cucumber_tests')
|
3
|
-
|
4
|
-
|
5
|
-
require 'cuke_slicer'
|
6
|
-
|
7
|
-
|
8
|
-
Before do
|
9
|
-
feature_directory = "#{File.dirname(__FILE__)}/.."
|
10
|
-
@default_file_directory = "#{feature_directory}/temp_files"
|
11
|
-
@default_feature_file_name = 'unnamed_feature.feature'
|
12
|
-
|
13
|
-
FileUtils.mkdir(@default_file_directory)
|
14
|
-
end
|
15
|
-
|
16
|
-
After do
|
17
|
-
FileUtils.remove_dir(@default_file_directory, true)
|
18
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# Older Rubies on Windows cannot securely connect to RubyGems anymore (https://github.com/rubygems/rubygems/issues/2330)
|
2
|
-
if (RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw32/) && (RUBY_VERSION =~ /^1\./)
|
3
|
-
source 'http://rubygems.org'
|
4
|
-
else
|
5
|
-
source 'https://rubygems.org'
|
6
|
-
end
|
7
|
-
|
8
|
-
gemspec :path => "../"
|
9
|
-
|
10
|
-
# Using the most recent release of the 0.x series in order to have all of the bug fixes.
|
11
|
-
gem 'cuke_modeler', '0.4.1'
|
12
|
-
|
13
|
-
if RUBY_VERSION =~ /^1\./
|
14
|
-
gem 'cucumber', '< 3.0.0' # Ruby 1.9.x support dropped after this version
|
15
|
-
gem 'ffi', '< 1.9.15' # The 'ffi' gem requires Ruby 2.x on/after this version
|
16
|
-
gem 'json', '< 2.0' # The 'json' gem drops pre-Ruby 2.x support on/after this version
|
17
|
-
gem 'mime-types', '< 3.0.0' # The 'mime-types' gem requires Ruby 2.x on/after this version
|
18
|
-
gem 'rainbow', '< 3.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
19
|
-
gem 'rake', '< 12.3.0' # The 'rake' gem requires Ruby 2.x on/after this version
|
20
|
-
gem 'rest-client', '< 2.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
21
|
-
gem 'simplecov-html', '< 0.11.0' # The 'simplecov-html' gem requires Ruby 2.x on/after this version
|
22
|
-
gem 'thor', '< 1.0' # The 'thor' gem requires Ruby 2.x on/after this version
|
23
|
-
gem 'tins', '< 1.7' # The 'tins' gem requires Ruby 2.x on/after this version
|
24
|
-
gem 'term-ansicolor', '< 1.4' # The 'term-ansicolor' gem requires Ruby 2.x on/after this version
|
25
|
-
gem 'unf_ext', '< 0.0.7.3' # The 'unf_ext' gem requires Ruby 2.x on/after this version
|
26
|
-
else
|
27
|
-
gem 'cucumber', '< 4.0.0' # Cucumber 4.x switches to needing the `cucumber-gherkin` gem, which is incompatible with `cuke_modeler` 0.x
|
28
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# Older Rubies on Windows cannot securely connect to RubyGems anymore (https://github.com/rubygems/rubygems/issues/2330)
|
2
|
-
if (RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw32/) && (RUBY_VERSION =~ /^1\./)
|
3
|
-
source 'http://rubygems.org'
|
4
|
-
else
|
5
|
-
source 'https://rubygems.org'
|
6
|
-
end
|
7
|
-
|
8
|
-
gemspec :path => "../"
|
9
|
-
|
10
|
-
# The version of CukeModeler being tested
|
11
|
-
gem 'cuke_modeler', '~> 1.0'
|
12
|
-
|
13
|
-
|
14
|
-
if RUBY_VERSION =~ /^1\./
|
15
|
-
gem 'cucumber', '< 3.0.0' # Ruby 1.9.x support dropped after this version
|
16
|
-
gem 'ffi', '< 1.9.15' # The 'ffi' gem requires Ruby 2.x on/after this version
|
17
|
-
gem 'json', '< 2.0' # The 'json' gem drops pre-Ruby 2.x support on/after this version
|
18
|
-
gem 'mime-types', '< 3.0.0' # The 'mime-types' gem requires Ruby 2.x on/after this version
|
19
|
-
gem 'rainbow', '< 3.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
20
|
-
gem 'rake', '< 12.3.0' # The 'rake' gem requires Ruby 2.x on/after this version
|
21
|
-
gem 'rest-client', '< 2.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
22
|
-
gem 'simplecov-html', '< 0.11.0' # The 'simplecov-html' gem requires Ruby 2.x on/after this version
|
23
|
-
gem 'thor', '< 1.0' # The 'thor' gem requires Ruby 2.x on/after this version
|
24
|
-
gem 'tins', '< 1.7' # The 'tins' gem requires Ruby 2.x on/after this version
|
25
|
-
gem 'term-ansicolor', '< 1.4' # The 'term-ansicolor' gem requires Ruby 2.x on/after this version
|
26
|
-
gem 'unf_ext', '< 0.0.7.3' # The 'unf_ext' gem requires Ruby 2.x on/after this version
|
27
|
-
else
|
28
|
-
gem 'cucumber', '< 4.0.0' # Cucumber 4.x switches to needing the `cucumber-gherkin` gem, which is incompatible with `cuke_modeler` 1.x
|
29
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# Older Rubies on Windows cannot securely connect to RubyGems anymore (https://github.com/rubygems/rubygems/issues/2330)
|
2
|
-
if (RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw32/) && (RUBY_VERSION =~ /^1\./)
|
3
|
-
source 'http://rubygems.org'
|
4
|
-
else
|
5
|
-
source 'https://rubygems.org'
|
6
|
-
end
|
7
|
-
|
8
|
-
gemspec :path => "../"
|
9
|
-
|
10
|
-
# The version of CukeModeler being tested
|
11
|
-
gem 'cuke_modeler', '~> 2.0'
|
12
|
-
|
13
|
-
|
14
|
-
if RUBY_VERSION =~ /^1\./
|
15
|
-
gem 'cucumber', '< 3.0.0' # Ruby 1.9.x support dropped after this version
|
16
|
-
gem 'ffi', '< 1.9.15' # The 'ffi' gem requires Ruby 2.x on/after this version
|
17
|
-
gem 'json', '< 2.0' # The 'json' gem drops pre-Ruby 2.x support on/after this version
|
18
|
-
gem 'mime-types', '< 3.0.0' # The 'mime-types' gem requires Ruby 2.x on/after this version
|
19
|
-
gem 'rainbow', '< 3.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
20
|
-
gem 'rake', '< 12.3.0' # The 'rake' gem requires Ruby 2.x on/after this version
|
21
|
-
gem 'rest-client', '< 2.0' # The 'rainbow' gem requires Ruby 2.x on/after this version
|
22
|
-
gem 'simplecov-html', '< 0.11.0' # The 'simplecov-html' gem requires Ruby 2.x on/after this version
|
23
|
-
gem 'thor', '< 1.0' # The 'thor' gem requires Ruby 2.x on/after this version
|
24
|
-
gem 'tins', '< 1.7' # The 'tins' gem requires Ruby 2.x on/after this version
|
25
|
-
gem 'term-ansicolor', '< 1.4' # The 'term-ansicolor' gem requires Ruby 2.x on/after this version
|
26
|
-
gem 'unf_ext', '< 0.0.7.3' # The 'unf_ext' gem requires Ruby 2.x on/after this version
|
27
|
-
else
|
28
|
-
gem 'cucumber', '< 4.0.0' # Cucumber 4.x switches to needing the `cucumber-gherkin` gem, which is incompatible with `cuke_modeler` 2.x
|
29
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
|
3
|
-
gemspec :path => "../"
|
4
|
-
|
5
|
-
# The version of CukeModeler being tested
|
6
|
-
gem 'cuke_modeler', '~> 3.0'
|
7
|
-
|
8
|
-
gem 'cucumber', '2.2.0' # `cucumber` 4.x does not currently work on JRuby
|
9
|
-
|
10
|
-
if RUBY_VERSION =~ /^2\.[1234]/
|
11
|
-
gem 'activesupport', '< 6.0' # `activesupport` 6.x requires at least Ruby 2.5
|
12
|
-
end
|
data/spec/cuke_slicer_spec.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require "#{File.dirname(__FILE__)}/spec_helper"
|
3
|
-
require 'rubygems/mock_gem_ui'
|
4
|
-
|
5
|
-
|
6
|
-
describe 'CukeSlicer, Unit' do
|
7
|
-
|
8
|
-
let(:nodule) { CukeSlicer }
|
9
|
-
|
10
|
-
|
11
|
-
it 'is defined' do
|
12
|
-
expect(Kernel.const_defined?(:CukeSlicer)).to be true
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'the gem' do
|
16
|
-
|
17
|
-
let(:gemspec) { eval(File.read "#{File.dirname(__FILE__)}/../cuke_slicer.gemspec") }
|
18
|
-
|
19
|
-
it 'validates cleanly' do
|
20
|
-
mock_ui = Gem::MockGemUi.new
|
21
|
-
Gem::DefaultUserInteraction.use_ui(mock_ui) { gemspec.validate }
|
22
|
-
|
23
|
-
expect(mock_ui.error).to_not match(/warn/i)
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
@@ -1,279 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe 'Slicer, Integration' do
|
5
|
-
|
6
|
-
let(:clazz) { CukeSlicer::Slicer }
|
7
|
-
let(:slicer) { clazz.new }
|
8
|
-
let(:test_file) { "#{@default_file_directory}/a_test.feature" }
|
9
|
-
let(:test_file_text) { "Feature: Test feature
|
10
|
-
|
11
|
-
@tag
|
12
|
-
Scenario: Test scenario
|
13
|
-
* some step" }
|
14
|
-
|
15
|
-
before(:each) do
|
16
|
-
File.write(test_file, test_file_text)
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
describe 'slicing' do
|
21
|
-
|
22
|
-
describe 'output' do
|
23
|
-
|
24
|
-
it 'slicing returns a collection of test source lines' do
|
25
|
-
slice_output = slicer.slice(test_file, :file_line)
|
26
|
-
|
27
|
-
expect(slice_output).to be_an(Array)
|
28
|
-
expect(slice_output).to_not be_empty
|
29
|
-
|
30
|
-
slice_output.each do |test_case|
|
31
|
-
# Test cases come in 'file_path:line_number' format
|
32
|
-
expect(test_case).to match(/^.+:\d+$/)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'slicing returns a collection of test objects' do
|
37
|
-
slice_output = slicer.slice(test_file, :test_object)
|
38
|
-
|
39
|
-
expect(slice_output).to be_an(Array)
|
40
|
-
expect(slice_output).to_not be_empty
|
41
|
-
|
42
|
-
slice_output.each do |test_case|
|
43
|
-
# Test cases come as test objects
|
44
|
-
expect(test_case).to be_a(CukeModeler::Scenario).or be_a(CukeModeler::Row)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'complains if told to provide output in an unknown format' do
|
49
|
-
expect { slicer.slice(test_file, :bad_option) }.to raise_error(ArgumentError, /Invalid Output Format/)
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'can slice without being provided filters' do
|
55
|
-
expect { slicer.slice(test_file, :file_line) }.to_not raise_error
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'uses the custom filter, if provided' do
|
59
|
-
expect { |test_block| slicer.slice(@default_file_directory, :file_line, &test_block) }.to yield_control
|
60
|
-
expect { slicer.slice(@default_file_directory, :file_line) }.to_not raise_error
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'can slice an empty feature file' do
|
64
|
-
File.open(test_file, 'w') { |file| file.write('') }
|
65
|
-
|
66
|
-
expect { slicer.slice(test_file, :file_line) }.to_not raise_error
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'can slice a feature that has no tests' do
|
70
|
-
File.open(test_file, 'w') { |file| file.write('Feature: Empty feature') }
|
71
|
-
|
72
|
-
expect { slicer.slice(test_file, :file_line) }.to_not raise_error
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'can slice a directory that contains non-feature files' do
|
76
|
-
File.open("#{@default_file_directory}/not_a_feature.file", 'w') { |file| file.write('foobar') }
|
77
|
-
|
78
|
-
expect { slicer.slice(@default_file_directory, :file_line) }.to_not raise_error
|
79
|
-
end
|
80
|
-
|
81
|
-
|
82
|
-
describe 'target validation' do
|
83
|
-
|
84
|
-
it 'complains if told to slice a non-existent location' do
|
85
|
-
expect { slicer.slice('does/not/exist', :file_line) }.to raise_error(ArgumentError, /does not exist/)
|
86
|
-
expect { slicer.slice(nil, :file_line) }.to raise_error(ArgumentError, /does not exist/)
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'complains if told to slice an incorrectly formatted feature file' do
|
90
|
-
File.open(test_file, 'w') { |file| file.write('foobar') }
|
91
|
-
|
92
|
-
expect { slicer.slice(test_file, :file_line) }.to raise_error(ArgumentError, /syntax.*lexing problem.*#{test_file}/i)
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'does not swallow unexpected exceptions while slicing' do
|
96
|
-
begin
|
97
|
-
$old_method = CukeModeler::Parsing.method(:parse_text)
|
98
|
-
|
99
|
-
# Custom error type in order to ensure that we are throwing the correct thing
|
100
|
-
module CukeSlicer
|
101
|
-
class TestError < StandardError
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
# Monkey patch the parsing method to throw the error that we need for testing
|
106
|
-
module CukeModeler
|
107
|
-
module Parsing
|
108
|
-
class << self
|
109
|
-
def parse_text(*args)
|
110
|
-
raise(CukeSlicer::TestError, 'something went wrong')
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
|
117
|
-
File.write(test_file, 'junk text')
|
118
|
-
|
119
|
-
expect { slicer.slice(test_file, :file_line) }.to raise_error(CukeSlicer::TestError, 'something went wrong')
|
120
|
-
ensure
|
121
|
-
# Making sure that our changes don't escape a test and ruin the rest of the suite
|
122
|
-
module CukeModeler
|
123
|
-
module Parsing
|
124
|
-
class << self
|
125
|
-
define_method(:parse_text, $old_method)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
end
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
|
137
|
-
describe 'filtering' do
|
138
|
-
|
139
|
-
it 'treats an empty filter set as if the filter were not provided' do
|
140
|
-
filters = clazz.known_filters
|
141
|
-
|
142
|
-
filters.each do |filter|
|
143
|
-
not_provided = slicer.slice(test_file, :file_line)
|
144
|
-
|
145
|
-
case
|
146
|
-
when filter.to_s =~ /path/
|
147
|
-
nothing_provided = slicer.slice(test_file, {filter => []}, :file_line)
|
148
|
-
when filter.to_s =~ /tag/
|
149
|
-
nothing_provided = slicer.slice(test_file, {filter => []}, :file_line)
|
150
|
-
else
|
151
|
-
raise(ArgumentError, "Unknown filter '#{filter}'")
|
152
|
-
end
|
153
|
-
|
154
|
-
expect(nothing_provided).to eq(not_provided)
|
155
|
-
expect(nothing_provided).to_not be_empty
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
it 'can combine any and all filters' do
|
160
|
-
filters = clazz.known_filters
|
161
|
-
|
162
|
-
applied_filters = {excluded_tags: '@a',
|
163
|
-
included_tags: /./,
|
164
|
-
excluded_paths: 'a',
|
165
|
-
included_paths: /./}
|
166
|
-
|
167
|
-
block_filter = eval("Proc.new { |test_case| false}")
|
168
|
-
|
169
|
-
# A reminder to update this test if new filters are added in the future
|
170
|
-
expect(applied_filters.keys).to match_array(filters)
|
171
|
-
|
172
|
-
|
173
|
-
expect { @slice_output = slicer.slice(@default_file_directory, applied_filters, :file_line, &block_filter) }.to_not raise_error
|
174
|
-
expect(@slice_output).to be_an(Array)
|
175
|
-
expect(@slice_output).to_not be_empty
|
176
|
-
end
|
177
|
-
|
178
|
-
|
179
|
-
describe 'filter validation' do
|
180
|
-
|
181
|
-
it 'will only accept string, regular expression, or collections thereof as path filters' do
|
182
|
-
path_filter_types = clazz.known_filters.select { |filter| filter.to_s =~ /path/ }
|
183
|
-
|
184
|
-
path_filter_types.each do |filter|
|
185
|
-
expect { slicer.slice(@default_file_directory, {filter => '@some_value'}, :file_line) }.to_not raise_error
|
186
|
-
expect { slicer.slice(@default_file_directory, {filter => /some_pattern/}, :file_line)}.to_not raise_error
|
187
|
-
expect { slicer.slice(@default_file_directory, {filter => ['@some_value', /some_pattern/]}, :file_line)}.to_not raise_error
|
188
|
-
expect { slicer.slice(@default_file_directory, {filter => :something_else}, :file_line) }.to raise_error(ArgumentError, /must be a/i)
|
189
|
-
expect { slicer.slice(@default_file_directory, {filter => [:something_else]}, :file_line) }.to raise_error(ArgumentError, /must be a/i)
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
it 'will only accept strings, regular expressions, arrays, or collections thereof as tag filters' do
|
194
|
-
tag_filter_types = clazz.known_filters.select { |filter| filter.to_s =~ /tag/ }
|
195
|
-
|
196
|
-
tag_filter_types.each do |filter|
|
197
|
-
expect { slicer.slice(@default_file_directory, {filter => '@some_value'}, :file_line) }.to_not raise_error
|
198
|
-
expect { slicer.slice(@default_file_directory, {filter => /some_pattern/}, :file_line) }.to_not raise_error
|
199
|
-
expect { slicer.slice(@default_file_directory, {filter => ['@some_value', /some_pattern/]}, :file_line) }.to_not raise_error
|
200
|
-
expect { slicer.slice(@default_file_directory, {filter => ['@some_value', [/nested_pattern/]]}, :file_line) }.to_not raise_error
|
201
|
-
expect { slicer.slice(@default_file_directory, {filter => ['@some_value', [/nested_pattern/, :bad_value]]}, :file_line) }.to raise_error(ArgumentError, /must be a/i)
|
202
|
-
expect { slicer.slice(@default_file_directory, {filter => :something_else}, :file_line) }.to raise_error(ArgumentError, /must be a/i)
|
203
|
-
expect { slicer.slice(@default_file_directory, {filter => [:something_else]}, :file_line) }.to raise_error(ArgumentError, /must be a/i)
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
it 'will only accept a single level of tag filter nesting' do
|
208
|
-
tag_filter_types = clazz.known_filters.select { |filter| filter.to_s =~ /tag/ }
|
209
|
-
|
210
|
-
tag_filter_types.each do |filter|
|
211
|
-
expect { slicer.slice(@default_file_directory, {filter => ['@some_value', [/nested_pattern/]]}, :file_line) }.to_not raise_error
|
212
|
-
expect { slicer.slice(@default_file_directory, {filter => ['@some_value', [/nested_pattern/, ['way_too_nested']]]}, :file_line) }.to raise_error(ArgumentError, /cannot.* nested/i)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
it 'complains if given an unknown filter' do
|
217
|
-
unknown_filter_type = :unknown_filter
|
218
|
-
options = {unknown_filter_type => 'foo'}
|
219
|
-
|
220
|
-
expect { slicer.slice(@default_file_directory, options, :file_line) }.to raise_error(ArgumentError, /unknown filter.*#{unknown_filter_type}/i)
|
221
|
-
end
|
222
|
-
|
223
|
-
end
|
224
|
-
|
225
|
-
end
|
226
|
-
|
227
|
-
describe "bugs that we don't want to happen again" do
|
228
|
-
|
229
|
-
|
230
|
-
# As a nested directory structure was being traversed for slicing, the extraction algorithm was mangling the
|
231
|
-
# current file path such that it would sometimes attempt to search non-existent locations. Sometimes this
|
232
|
-
# resulted in an exception and sometimes this resulted in files getting silently skipped over.
|
233
|
-
|
234
|
-
|
235
|
-
it 'can handle a realistically nested directory structure' do
|
236
|
-
root_directory = @default_file_directory
|
237
|
-
|
238
|
-
# Outer 'before' hook already makes a root level feature file
|
239
|
-
expected_tests = ["#{test_file}:4"]
|
240
|
-
|
241
|
-
# Adding a nested directory
|
242
|
-
nested_directory_1 = "#{root_directory}/nested_directory_1"
|
243
|
-
FileUtils.mkpath(nested_directory_1)
|
244
|
-
test_file = "#{nested_directory_1}/nested_file_1.feature"
|
245
|
-
File.write(test_file, test_file_text)
|
246
|
-
expected_tests << "#{test_file}:4"
|
247
|
-
test_file = "#{nested_directory_1}/nested_file_2.feature"
|
248
|
-
File.write(test_file, test_file_text)
|
249
|
-
expected_tests << "#{test_file}:4"
|
250
|
-
|
251
|
-
# And another one
|
252
|
-
nested_directory_2 = "#{root_directory}/nested_directory_2"
|
253
|
-
FileUtils.mkpath(nested_directory_2)
|
254
|
-
test_file = "#{nested_directory_2}/nested_file_1.feature"
|
255
|
-
File.write(test_file, test_file_text)
|
256
|
-
expected_tests << "#{test_file}:4"
|
257
|
-
test_file = "#{nested_directory_2}/nested_file_2.feature"
|
258
|
-
File.write(test_file, test_file_text)
|
259
|
-
expected_tests << "#{test_file}:4"
|
260
|
-
|
261
|
-
# And one of them has another directory inside of it
|
262
|
-
doubly_nested_directory = "#{nested_directory_1}/doubly_nested_directory"
|
263
|
-
FileUtils.mkpath(doubly_nested_directory)
|
264
|
-
test_file = "#{doubly_nested_directory}/doubly_nested_file_1.feature"
|
265
|
-
File.write(test_file, test_file_text)
|
266
|
-
expected_tests << "#{test_file}:4"
|
267
|
-
test_file = "#{doubly_nested_directory}/doubly_nested_file_2.feature"
|
268
|
-
File.write(test_file, test_file_text)
|
269
|
-
expected_tests << "#{test_file}:4"
|
270
|
-
|
271
|
-
|
272
|
-
# No problems, no missed files
|
273
|
-
expect { @slice_output = slicer.slice(root_directory, :file_line) }.to_not raise_error
|
274
|
-
expect(@slice_output).to match_array(expected_tests)
|
275
|
-
end
|
276
|
-
|
277
|
-
end
|
278
|
-
|
279
|
-
end
|
data/spec/slicer_unit_spec.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe 'Slicer, Unit' do
|
5
|
-
|
6
|
-
let(:clazz) { CukeSlicer::Slicer }
|
7
|
-
let(:slicer) { clazz.new }
|
8
|
-
|
9
|
-
|
10
|
-
it 'is defined' do
|
11
|
-
expect(CukeSlicer.const_defined?(:Slicer)).to be true
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'can slice individual test cases out of a larger group' do
|
15
|
-
expect(slicer).to respond_to(:slice)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'needs something to slice up, an output format, and can optionally have applicable filters' do
|
19
|
-
expect(slicer.method(:slice).arity).to eq(-3)
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'knows what slice filters are available for use' do
|
23
|
-
expect(clazz).to respond_to(:known_filters)
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'tracks its filters as an array of symbols' do
|
27
|
-
filters = clazz.known_filters
|
28
|
-
|
29
|
-
expect(filters).to be_an(Array)
|
30
|
-
expect(filters).to_not be_empty
|
31
|
-
|
32
|
-
filters.each do |filter|
|
33
|
-
expect(filter).to be_a(Symbol)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'simplecov'
|
2
|
-
SimpleCov.command_name('cuke_slicer-rspec_tests')
|
3
|
-
|
4
|
-
|
5
|
-
require 'cuke_slicer'
|
6
|
-
|
7
|
-
|
8
|
-
RSpec.configure do |config|
|
9
|
-
config.before(:all) do
|
10
|
-
spec_directory = File.dirname(__FILE__)
|
11
|
-
@default_file_directory = "#{spec_directory}/temp_files"
|
12
|
-
end
|
13
|
-
|
14
|
-
config.before(:each) do
|
15
|
-
FileUtils.mkpath(@default_file_directory)
|
16
|
-
end
|
17
|
-
|
18
|
-
config.after(:each) do
|
19
|
-
FileUtils.remove_dir(@default_file_directory, true)
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
File without changes
|
File without changes
|
File without changes
|