cuke_slicer 2.2.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -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 +79 -57
  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