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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -1
  3. data/LICENSE.txt +1 -1
  4. data/README.md +18 -10
  5. data/cuke_slicer.gemspec +34 -19
  6. data/lib/cuke_slicer/collections/nested_tag_collection.rb +6 -4
  7. data/lib/cuke_slicer/collections/path_collection.rb +4 -2
  8. data/lib/cuke_slicer/collections/tag_collection.rb +6 -4
  9. data/lib/cuke_slicer/extractors/directory_extractor.rb +3 -1
  10. data/lib/cuke_slicer/extractors/file_extractor.rb +11 -4
  11. data/lib/cuke_slicer/filters/filter_set.rb +12 -10
  12. data/lib/cuke_slicer/helpers/extraction_helpers.rb +11 -5
  13. data/lib/cuke_slicer/helpers/filter_helpers.rb +36 -30
  14. data/lib/cuke_slicer/helpers/helpers.rb +5 -4
  15. data/lib/cuke_slicer/helpers/matching_helpers.rb +12 -7
  16. data/lib/cuke_slicer/slicer.rb +16 -20
  17. data/lib/cuke_slicer/version.rb +1 -1
  18. data/lib/cuke_slicer.rb +2 -2
  19. data/{features → testing/cucumber/features}/test_case_extraction.feature +22 -0
  20. metadata +80 -58
  21. data/.gitignore +0 -24
  22. data/.simplecov +0 -7
  23. data/.travis.yml +0 -33
  24. data/Gemfile +0 -4
  25. data/Rakefile +0 -85
  26. data/appveyor.yml +0 -81
  27. data/features/step_definitions/action_steps.rb +0 -107
  28. data/features/step_definitions/setup_steps.rb +0 -103
  29. data/features/step_definitions/verification_steps.rb +0 -58
  30. data/features/support/env.rb +0 -18
  31. data/gemfiles/cuke_modeler0.gemfile +0 -28
  32. data/gemfiles/cuke_modeler1.gemfile +0 -29
  33. data/gemfiles/cuke_modeler2.gemfile +0 -29
  34. data/gemfiles/cuke_modeler3.gemfile +0 -12
  35. data/spec/cuke_slicer_spec.rb +0 -28
  36. data/spec/slicer_integration_spec.rb +0 -279
  37. data/spec/slicer_unit_spec.rb +0 -37
  38. data/spec/spec_helper.rb +0 -22
  39. /data/{features → testing/cucumber/features}/tag_logic.feature +0 -0
  40. /data/{features → testing/cucumber/features}/test_case_filtering.feature +0 -0
  41. /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
@@ -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
@@ -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
@@ -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