cuke_modeler 1.5.0 → 3.1.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 (129) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +341 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +22 -15
  5. data/cuke_modeler.gemspec +15 -9
  6. data/lib/cuke_modeler/adapters/gherkin_10_adapter.rb +12 -0
  7. data/lib/cuke_modeler/adapters/gherkin_11_adapter.rb +12 -0
  8. data/lib/cuke_modeler/adapters/gherkin_12_adapter.rb +12 -0
  9. data/lib/cuke_modeler/adapters/gherkin_13_adapter.rb +12 -0
  10. data/lib/cuke_modeler/adapters/gherkin_14_adapter.rb +12 -0
  11. data/lib/cuke_modeler/adapters/{gherkin_6_adapter.rb → gherkin_9_adapter.rb} +75 -64
  12. data/lib/cuke_modeler/containing.rb +3 -0
  13. data/lib/cuke_modeler/described.rb +1 -0
  14. data/lib/cuke_modeler/models/background.rb +1 -1
  15. data/lib/cuke_modeler/models/cell.rb +1 -1
  16. data/lib/cuke_modeler/models/comment.rb +1 -1
  17. data/lib/cuke_modeler/models/directory.rb +2 -2
  18. data/lib/cuke_modeler/models/doc_string.rb +1 -1
  19. data/lib/cuke_modeler/models/example.rb +1 -1
  20. data/lib/cuke_modeler/models/feature.rb +1 -1
  21. data/lib/cuke_modeler/models/feature_file.rb +2 -2
  22. data/lib/cuke_modeler/models/outline.rb +1 -1
  23. data/lib/cuke_modeler/models/row.rb +1 -1
  24. data/lib/cuke_modeler/models/scenario.rb +1 -1
  25. data/lib/cuke_modeler/models/step.rb +32 -3
  26. data/lib/cuke_modeler/models/table.rb +1 -1
  27. data/lib/cuke_modeler/models/tag.rb +1 -1
  28. data/lib/cuke_modeler/named.rb +1 -0
  29. data/lib/cuke_modeler/nested.rb +1 -0
  30. data/lib/cuke_modeler/parsed.rb +1 -0
  31. data/lib/cuke_modeler/parsing.rb +89 -94
  32. data/lib/cuke_modeler/sourceable.rb +1 -0
  33. data/lib/cuke_modeler/stepped.rb +1 -0
  34. data/lib/cuke_modeler/taggable.rb +1 -0
  35. data/lib/cuke_modeler/version.rb +1 -1
  36. data/testing/cucumber/features/analysis/step_comparison.feature +25 -0
  37. data/testing/cucumber/features/analysis/test_comparison.feature +1 -1
  38. metadata +56 -142
  39. data/.gitignore +0 -18
  40. data/.simplecov +0 -7
  41. data/.travis.yml +0 -60
  42. data/Gemfile +0 -36
  43. data/History.md +0 -196
  44. data/Rakefile +0 -63
  45. data/appveyor.yml +0 -61
  46. data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +0 -273
  47. data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +0 -296
  48. data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +0 -308
  49. data/testing/cucumber/step_definitions/action_steps.rb +0 -13
  50. data/testing/cucumber/step_definitions/background_steps.rb +0 -1
  51. data/testing/cucumber/step_definitions/directory_steps.rb +0 -6
  52. data/testing/cucumber/step_definitions/doc_string_steps.rb +0 -1
  53. data/testing/cucumber/step_definitions/feature_file_steps.rb +0 -16
  54. data/testing/cucumber/step_definitions/feature_steps.rb +0 -7
  55. data/testing/cucumber/step_definitions/modeling_steps.rb +0 -44
  56. data/testing/cucumber/step_definitions/setup_steps.rb +0 -32
  57. data/testing/cucumber/step_definitions/step_steps.rb +0 -3
  58. data/testing/cucumber/step_definitions/table_steps.rb +0 -1
  59. data/testing/cucumber/step_definitions/tag_steps.rb +0 -3
  60. data/testing/cucumber/step_definitions/verification_steps.rb +0 -173
  61. data/testing/cucumber/support/env.rb +0 -30
  62. data/testing/dialect_helper.rb +0 -48
  63. data/testing/file_helper.rb +0 -47
  64. data/testing/gemfiles/gherkin2.gemfile +0 -32
  65. data/testing/gemfiles/gherkin3.gemfile +0 -26
  66. data/testing/gemfiles/gherkin4.gemfile +0 -27
  67. data/testing/gemfiles/gherkin5.gemfile +0 -27
  68. data/testing/gemfiles/gherkin6.gemfile +0 -10
  69. data/testing/rspec/spec/integration/background_integration_spec.rb +0 -442
  70. data/testing/rspec/spec/integration/cell_integration_spec.rb +0 -335
  71. data/testing/rspec/spec/integration/comment_integration_spec.rb +0 -177
  72. data/testing/rspec/spec/integration/directory_integration_spec.rb +0 -218
  73. data/testing/rspec/spec/integration/doc_string_integration_spec.rb +0 -402
  74. data/testing/rspec/spec/integration/example_integration_spec.rb +0 -741
  75. data/testing/rspec/spec/integration/feature_file_integration_spec.rb +0 -272
  76. data/testing/rspec/spec/integration/feature_integration_spec.rb +0 -650
  77. data/testing/rspec/spec/integration/gherkin_2_adapter_spec.rb +0 -166
  78. data/testing/rspec/spec/integration/gherkin_3_adapter_spec.rb +0 -166
  79. data/testing/rspec/spec/integration/gherkin_4_adapter_spec.rb +0 -165
  80. data/testing/rspec/spec/integration/gherkin_6_adapter_spec.rb +0 -166
  81. data/testing/rspec/spec/integration/model_integration_spec.rb +0 -15
  82. data/testing/rspec/spec/integration/nested_integration_spec.rb +0 -91
  83. data/testing/rspec/spec/integration/outline_integration_spec.rb +0 -624
  84. data/testing/rspec/spec/integration/parsing_integration_spec.rb +0 -122
  85. data/testing/rspec/spec/integration/row_integration_spec.rb +0 -291
  86. data/testing/rspec/spec/integration/scenario_integration_spec.rb +0 -479
  87. data/testing/rspec/spec/integration/shared/models_integration_specs.rb +0 -18
  88. data/testing/rspec/spec/integration/step_integration_spec.rb +0 -475
  89. data/testing/rspec/spec/integration/table_integration_spec.rb +0 -337
  90. data/testing/rspec/spec/integration/tag_integration_spec.rb +0 -259
  91. data/testing/rspec/spec/spec_helper.rb +0 -122
  92. data/testing/rspec/spec/unit/background_unit_spec.rb +0 -83
  93. data/testing/rspec/spec/unit/cell_unit_spec.rb +0 -68
  94. data/testing/rspec/spec/unit/comment_unit_spec.rb +0 -68
  95. data/testing/rspec/spec/unit/described_unit_spec.rb +0 -23
  96. data/testing/rspec/spec/unit/directory_unit_spec.rb +0 -127
  97. data/testing/rspec/spec/unit/doc_string_unit_spec.rb +0 -100
  98. data/testing/rspec/spec/unit/example_unit_spec.rb +0 -133
  99. data/testing/rspec/spec/unit/feature_file_unit_spec.rb +0 -125
  100. data/testing/rspec/spec/unit/feature_unit_spec.rb +0 -157
  101. data/testing/rspec/spec/unit/model_unit_spec.rb +0 -15
  102. data/testing/rspec/spec/unit/named_unit_spec.rb +0 -23
  103. data/testing/rspec/spec/unit/nested_unit_spec.rb +0 -43
  104. data/testing/rspec/spec/unit/outline_unit_spec.rb +0 -117
  105. data/testing/rspec/spec/unit/parsed_unit_spec.rb +0 -27
  106. data/testing/rspec/spec/unit/parsing_unit_spec.rb +0 -54
  107. data/testing/rspec/spec/unit/row_unit_spec.rb +0 -68
  108. data/testing/rspec/spec/unit/scenario_unit_spec.rb +0 -86
  109. data/testing/rspec/spec/unit/shared/bare_bones_models_unit_specs.rb +0 -14
  110. data/testing/rspec/spec/unit/shared/containing_models_unit_specs.rb +0 -127
  111. data/testing/rspec/spec/unit/shared/described_models_unit_specs.rb +0 -38
  112. data/testing/rspec/spec/unit/shared/keyworded_models_unit_specs.rb +0 -58
  113. data/testing/rspec/spec/unit/shared/models_unit_specs.rb +0 -15
  114. data/testing/rspec/spec/unit/shared/named_models_unit_specs.rb +0 -39
  115. data/testing/rspec/spec/unit/shared/nested_models_unit_specs.rb +0 -51
  116. data/testing/rspec/spec/unit/shared/parsed_models_unit_specs.rb +0 -39
  117. data/testing/rspec/spec/unit/shared/prepopulated_models_unit_specs.rb +0 -18
  118. data/testing/rspec/spec/unit/shared/sourced_models_unit_specs.rb +0 -39
  119. data/testing/rspec/spec/unit/shared/stepped_models_unit_specs.rb +0 -46
  120. data/testing/rspec/spec/unit/shared/stringifiable_models_unit_specs.rb +0 -18
  121. data/testing/rspec/spec/unit/shared/tagged_models_unit_specs.rb +0 -72
  122. data/testing/rspec/spec/unit/sourceable_unit_spec.rb +0 -27
  123. data/testing/rspec/spec/unit/step_unit_spec.rb +0 -109
  124. data/testing/rspec/spec/unit/stepped_unit_spec.rb +0 -23
  125. data/testing/rspec/spec/unit/table_unit_spec.rb +0 -77
  126. data/testing/rspec/spec/unit/tag_unit_spec.rb +0 -68
  127. data/testing/rspec/spec/unit/taggable_unit_spec.rb +0 -69
  128. data/testing/test_languages.json +0 -45
  129. data/todo.txt +0 -24
@@ -1,272 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
2
-
3
-
4
- describe 'FeatureFile, Integration' do
5
-
6
- let(:clazz) { CukeModeler::FeatureFile }
7
-
8
-
9
- describe 'common behavior' do
10
-
11
- it_should_behave_like 'a model, integration'
12
-
13
- end
14
-
15
- describe 'unique behavior' do
16
-
17
- it 'stores the original data generated by the parsing adapter', :gherkin6 => true do
18
- test_file_path = CukeModeler::FileHelper.create_feature_file(:text => "#{FEATURE_KEYWORD}: test feature", :name => 'test_file')
19
-
20
- feature_file = clazz.new(test_file_path)
21
- data = feature_file.parsing_data
22
-
23
- expect(data.keys).to match_array([:uri, :feature, :comments])
24
- expect(File.basename(data[:uri])).to eq('test_file.feature')
25
- end
26
-
27
- it 'stores the original data generated by the parsing adapter', :gherkin4_5 => true do
28
- test_file_path = CukeModeler::FileHelper.create_feature_file(:text => "#{FEATURE_KEYWORD}: test feature", :name => 'test_file')
29
-
30
- feature_file = clazz.new(test_file_path)
31
- data = feature_file.parsing_data
32
-
33
- expect(data.keys).to match_array([:type, :feature, :comments])
34
- expect(data[:type]).to eq(:GherkinDocument)
35
- end
36
-
37
- it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
38
- test_file_path = CukeModeler::FileHelper.create_feature_file(:text => "#{FEATURE_KEYWORD}: test feature", :name => 'test_file')
39
-
40
- feature_file = clazz.new(test_file_path)
41
- data = feature_file.parsing_data
42
-
43
- # There is no parsing data stored above the feature level for gherkin 3.x
44
- expect(data).to be_nil
45
- end
46
-
47
- it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
48
- test_file_path = CukeModeler::FileHelper.create_feature_file(:text => "#{FEATURE_KEYWORD}: test feature", :name => 'test_file')
49
-
50
- feature_file = clazz.new(test_file_path)
51
- data = feature_file.parsing_data
52
-
53
- # There is no parsing data stored above the feature level for gherkin 2.x
54
- expect(data).to eq([])
55
- end
56
-
57
- it 'provides its own filename when being parsed' do
58
- test_file_path = CukeModeler::FileHelper.create_feature_file(:text => 'bad feature text', :name => 'test_file')
59
-
60
- expect { clazz.new(test_file_path) }.to raise_error(/'#{test_file_path}'/)
61
- end
62
-
63
- it 'cannot model a non-existent feature file' do
64
- path = "#{CukeModeler::FileHelper.create_directory}/missing_file.feature"
65
-
66
- expect { clazz.new(path) }.to raise_error(ArgumentError)
67
- end
68
-
69
-
70
- describe 'model population' do
71
-
72
- let(:source_text) { "#{FEATURE_KEYWORD}: Test feature" }
73
- let(:feature_file_path) { CukeModeler::FileHelper.create_feature_file }
74
- let(:feature_file) { clazz.new(feature_file_path) }
75
-
76
- before(:each) do
77
- File.open(feature_file_path, 'w') { |file| file.write(source_text) }
78
- end
79
-
80
- it "models the feature file's name" do
81
- expect(feature_file.name).to eq(File.basename(feature_file_path))
82
- end
83
-
84
- it "models the feature file's path" do
85
- expect(feature_file.path).to eq(feature_file_path)
86
- end
87
-
88
- it "models the feature file's feature" do
89
- feature_name = feature_file.feature.name
90
-
91
- expect(feature_name).to eq('Test feature')
92
- end
93
-
94
- it "models the feature file's comments" do
95
- source_text = "# feature comment
96
- @tag1 @tag2 @tag3
97
- #{FEATURE_KEYWORD}: A feature with everything it could have
98
-
99
- Including a description
100
- and then some.
101
-
102
- # background comment
103
- #{BACKGROUND_KEYWORD}:
104
-
105
- Background
106
- description
107
-
108
- #{STEP_KEYWORD} a step
109
- # table comment
110
- | value1 |
111
- # table row comment
112
- | value2 |
113
- #{STEP_KEYWORD} another step
114
-
115
- # scenario comment
116
- @scenario_tag
117
- #{SCENARIO_KEYWORD}:
118
-
119
- Scenario
120
- description
121
-
122
- #{STEP_KEYWORD} a step
123
- #{STEP_KEYWORD} another step
124
- \"\"\"
125
- some text
126
- \"\"\"
127
-
128
- # outline comment
129
- @outline_tag
130
- #{OUTLINE_KEYWORD}:
131
-
132
- Outline
133
- description
134
-
135
- # step comment
136
- #{STEP_KEYWORD} a step
137
- # table comment
138
- | value2 |
139
- # step comment
140
- #{STEP_KEYWORD} another step
141
- # doc string comment
142
- \"\"\"
143
- some text
144
- \"\"\"
145
-
146
- # example comment
147
- @example_tag
148
- #{EXAMPLE_KEYWORD}:
149
-
150
- Example
151
- description
152
-
153
- # row comment
154
- | param |
155
- | value |
156
- # final comment"
157
-
158
- File.open(feature_file_path, 'w') { |file| file.write(source_text) }
159
-
160
- feature_file = clazz.new(feature_file_path)
161
- comments = feature_file.comments.collect { |comment| comment.text }
162
-
163
-
164
- expected_comments = ['# feature comment',
165
- '# background comment',
166
- '# table comment',
167
- '# table row comment',
168
- '# scenario comment',
169
- '# outline comment',
170
- '# step comment',
171
- '# table comment',
172
- '# step comment',
173
- '# doc string comment',
174
- '# example comment',
175
- '# row comment']
176
-
177
- # gherkin 2.x 'loses' comments that are not followed by some element
178
- expected_comments << '# final comment' unless Gem.loaded_specs['gherkin'].version.version[/^2\./]
179
-
180
-
181
- expect(comments).to match_array(expected_comments)
182
- end
183
-
184
-
185
- # gherkin 3.x does not accept empty feature files
186
- context 'an empty feature file', :gherkin3 => false do
187
-
188
- let(:source_text) { '' }
189
-
190
-
191
- it "models the feature file's feature" do
192
- expect(feature_file.feature).to be_nil
193
- end
194
-
195
- end
196
-
197
- end
198
-
199
- it 'properly sets its child models' do
200
- file_path = CukeModeler::FileHelper.create_feature_file(:text => "#{FEATURE_KEYWORD}: Test feature", :name => 'test_file')
201
-
202
- file = clazz.new(file_path)
203
- feature = file.feature
204
-
205
- expect(feature.parent_model).to equal(file)
206
- end
207
-
208
-
209
- describe 'getting ancestors' do
210
-
211
- let(:directory_path) { CukeModeler::FileHelper.create_directory }
212
- let(:feature_file_path) { CukeModeler::FileHelper.create_feature_file(:text => '', :name => 'feature_file_test_file', :directory => directory_path) }
213
-
214
- before(:each) do
215
- File.open(feature_file_path, 'w') { |file| file.write("#{FEATURE_KEYWORD}: Test feature") }
216
- end
217
-
218
- let(:directory_model) { CukeModeler::Directory.new(directory_path) }
219
- let(:feature_file_model) { directory_model.feature_files.first }
220
-
221
-
222
- it 'can get its directory' do
223
- ancestor = feature_file_model.get_ancestor(:directory)
224
-
225
- expect(ancestor).to equal(directory_model)
226
- end
227
-
228
- it 'returns nil if it does not have the requested type of ancestor' do
229
- ancestor = feature_file_model.get_ancestor(:example)
230
-
231
- expect(ancestor).to be_nil
232
- end
233
-
234
- end
235
-
236
-
237
- describe 'feature file output' do
238
-
239
- context 'from source text' do
240
-
241
- let(:source_text) { "#{FEATURE_KEYWORD}: Test feature" }
242
- let(:feature_file_path) { CukeModeler::FileHelper.create_feature_file(:text => '', :name => 'feature_file_test_file') }
243
- let(:feature_file) { clazz.new(feature_file_path) }
244
-
245
- before(:each) do
246
- File.open(feature_file_path, 'w') { |file| file.write(source_text) }
247
- end
248
-
249
-
250
- it 'can output a feature file' do
251
- feature_file_output = feature_file.to_s
252
-
253
- expect(feature_file_output).to eq(feature_file_path)
254
- end
255
-
256
- end
257
-
258
- it 'can be remade from its own output' do
259
- path = CukeModeler::FileHelper.create_feature_file(:text => "#{FEATURE_KEYWORD}:", :name => 'feature_file_test_file')
260
- feature_file = clazz.new(path)
261
-
262
- feature_file_output = feature_file.to_s
263
- remade_feature_file_output = clazz.new(feature_file_output).to_s
264
-
265
- expect(remade_feature_file_output).to eq(feature_file_output)
266
- end
267
-
268
- end
269
-
270
- end
271
-
272
- end
@@ -1,650 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
2
-
3
-
4
- describe 'Feature, Integration' do
5
-
6
- let(:clazz) { CukeModeler::Feature }
7
- let(:feature) { clazz.new }
8
-
9
-
10
- describe 'common behavior' do
11
-
12
- it_should_behave_like 'a model, integration'
13
-
14
- end
15
-
16
- describe 'unique behavior' do
17
-
18
- it 'can be instantiated with the minimum viable Gherkin' do
19
- source = "#{FEATURE_KEYWORD}:"
20
-
21
- expect { clazz.new(source) }.to_not raise_error
22
- end
23
-
24
- it 'can parse text that uses a non-default dialect' do
25
- original_dialect = CukeModeler::Parsing.dialect
26
- CukeModeler::Parsing.dialect = 'en-au'
27
-
28
- begin
29
- source_text = "# language: en-au
30
- Pretty much: Feature name"
31
-
32
- expect { @model = clazz.new(source_text) }.to_not raise_error
33
-
34
- # Sanity check in case modeling failed in a non-explosive manner
35
- expect(@model.name).to eq('Feature name')
36
- ensure
37
- # Making sure that our changes don't escape a test and ruin the rest of the suite
38
- CukeModeler::Parsing.dialect = original_dialect
39
- end
40
- end
41
-
42
- it 'provides a descriptive filename when being parsed from stand alone text' do
43
- source = 'bad feature text'
44
-
45
- expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_feature\.feature'/)
46
- end
47
-
48
- it 'properly sets its child models' do
49
- source = "@a_tag
50
- #{FEATURE_KEYWORD}: Test feature
51
- #{BACKGROUND_KEYWORD}: Test background
52
- #{SCENARIO_KEYWORD}: Test scenario
53
- #{OUTLINE_KEYWORD}: Test outline
54
- #{EXAMPLE_KEYWORD}: Test Examples
55
- | param |
56
- | value |"
57
-
58
-
59
- feature = clazz.new(source)
60
- background = feature.background
61
- scenario = feature.tests[0]
62
- outline = feature.tests[1]
63
- tag = feature.tags[0]
64
-
65
-
66
- expect(outline.parent_model).to equal(feature)
67
- expect(scenario.parent_model).to equal(feature)
68
- expect(background.parent_model).to equal(feature)
69
- expect(tag.parent_model).to equal(feature)
70
- end
71
-
72
- it 'stores the original data generated by the parsing adapter', :gherkin6 => true do
73
- feature = clazz.new("@tag\n#{FEATURE_KEYWORD}: test feature\ndescription\n#{BACKGROUND_KEYWORD}:\n#{SCENARIO_KEYWORD}:")
74
- data = feature.parsing_data
75
-
76
- expect(data.keys).to match_array([:tags, :location, :language, :keyword, :name, :children, :description])
77
- expect(data[:name]).to eq('test feature')
78
- end
79
-
80
- it 'stores the original data generated by the parsing adapter', :gherkin4_5 => true do
81
- feature = clazz.new("@tag\n#{FEATURE_KEYWORD}: test feature\ndescription\n#{BACKGROUND_KEYWORD}:\n#{SCENARIO_KEYWORD}:")
82
- data = feature.parsing_data
83
-
84
- expect(data.keys).to match_array([:type, :tags, :location, :language, :keyword, :name, :children, :description])
85
- expect(data[:type]).to eq(:Feature)
86
- end
87
-
88
- it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
89
- feature = clazz.new("@tag\n#{FEATURE_KEYWORD}: test feature\ndescription\n#{BACKGROUND_KEYWORD}:\n#{SCENARIO_KEYWORD}:")
90
- data = feature.parsing_data
91
-
92
- expect(data.keys).to match_array([:type, :tags, :location, :language, :keyword, :name, :scenarioDefinitions, :comments, :background, :description])
93
- expect(data[:type]).to eq(:Feature)
94
- end
95
-
96
- it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
97
- feature = clazz.new("@tag\n#{FEATURE_KEYWORD}: test feature\ndescription\n#{BACKGROUND_KEYWORD}:\n#{SCENARIO_KEYWORD}:")
98
- data = feature.parsing_data
99
-
100
- expect(data.keys).to match_array(['keyword', 'name', 'line', 'description', 'id', 'uri', 'elements', 'tags'])
101
- expect(data['keyword']).to eq('Feature')
102
- end
103
-
104
- it 'trims whitespace from its source description' do
105
- source = ["#{FEATURE_KEYWORD}:",
106
- ' ',
107
- ' description line 1',
108
- '',
109
- ' description line 2',
110
- ' description line 3 ',
111
- '',
112
- '',
113
- '',
114
- " #{SCENARIO_KEYWORD}:"]
115
- source = source.join("\n")
116
-
117
- feature = clazz.new(source)
118
- description = feature.description.split("\n", -1)
119
-
120
- expect(description).to eq([' description line 1',
121
- '',
122
- 'description line 2',
123
- ' description line 3'])
124
- end
125
-
126
- it 'can selectively access its scenarios and outlines' do
127
- scenarios = [CukeModeler::Scenario.new, CukeModeler::Scenario.new]
128
- outlines = [CukeModeler::Outline.new, CukeModeler::Outline.new]
129
-
130
- feature.tests = scenarios + outlines
131
-
132
- expect(feature.scenarios).to match_array(scenarios)
133
- expect(feature.outlines).to match_array(outlines)
134
- end
135
-
136
-
137
- describe 'model population' do
138
-
139
- context 'from source text' do
140
-
141
- it "models the feature's keyword" do
142
- source_text = "#{FEATURE_KEYWORD}:"
143
- feature = CukeModeler::Feature.new(source_text)
144
-
145
- expect(feature.keyword).to eq(FEATURE_KEYWORD)
146
- end
147
-
148
- it "models the feature's source line" do
149
- source_text = "#{FEATURE_KEYWORD}:"
150
- feature = CukeModeler::Feature.new(source_text)
151
-
152
- expect(feature.source_line).to eq(1)
153
- end
154
-
155
-
156
- context 'a filled feature' do
157
-
158
- let(:source_text) { "@tag_1 @tag_2
159
- #{FEATURE_KEYWORD}: Feature Foo
160
-
161
- Some feature description.
162
-
163
- Some more.
164
- And some more.
165
-
166
- #{BACKGROUND_KEYWORD}: The background
167
- #{STEP_KEYWORD} some setup step
168
-
169
- #{SCENARIO_KEYWORD}: Scenario 1
170
- #{STEP_KEYWORD} a step
171
-
172
- #{OUTLINE_KEYWORD}: Outline 1
173
- #{STEP_KEYWORD} a step
174
- #{EXAMPLE_KEYWORD}:
175
- | param |
176
- | value |
177
-
178
- #{SCENARIO_KEYWORD}: Scenario 2
179
- #{STEP_KEYWORD} a step
180
-
181
- #{OUTLINE_KEYWORD}: Outline 2
182
- #{STEP_KEYWORD} a step
183
- #{EXAMPLE_KEYWORD}:
184
- | param |
185
- | value |" }
186
- let(:feature) { clazz.new(source_text) }
187
-
188
-
189
- it "models the feature's name" do
190
- expect(feature.name).to eq('Feature Foo')
191
- end
192
-
193
- it "models the feature's description" do
194
- description = feature.description.split("\n", -1)
195
-
196
- expect(description).to eq([' Some feature description.',
197
- '',
198
- 'Some more.',
199
- ' And some more.'])
200
- end
201
-
202
- it "models the feature's background" do
203
- expect(feature.background.name).to eq('The background')
204
- end
205
-
206
- it "models the feature's scenarios" do
207
- scenario_names = feature.scenarios.collect { |scenario| scenario.name }
208
-
209
- expect(scenario_names).to eq(['Scenario 1', 'Scenario 2'])
210
- end
211
-
212
- it "models the feature's outlines" do
213
- outline_names = feature.outlines.collect { |outline| outline.name }
214
-
215
- expect(outline_names).to eq(['Outline 1', 'Outline 2'])
216
- end
217
-
218
- it "models the feature's tags" do
219
- tag_names = feature.tags.collect { |tag| tag.name }
220
-
221
- expect(tag_names).to eq(['@tag_1', '@tag_2'])
222
- end
223
-
224
- end
225
-
226
-
227
- context 'an empty feature' do
228
-
229
- let(:source_text) { "#{FEATURE_KEYWORD}:" }
230
- let(:feature) { clazz.new(source_text) }
231
-
232
-
233
- it "models the feature's name" do
234
- expect(feature.name).to eq('')
235
- end
236
-
237
- it "models the feature's description" do
238
- expect(feature.description).to eq('')
239
- end
240
-
241
- it "models the feature's background" do
242
- expect(feature.background).to be_nil
243
- end
244
-
245
- it "models the feature's scenarios" do
246
- expect(feature.scenarios).to eq([])
247
- end
248
-
249
- it "models the feature's outlines" do
250
- expect(feature.outlines).to eq([])
251
- end
252
-
253
- it "models the feature's tags" do
254
- expect(feature.tags).to eq([])
255
- end
256
-
257
- end
258
-
259
- end
260
-
261
- end
262
-
263
-
264
- it 'knows how many test cases it has' do
265
- source_1 = "#{FEATURE_KEYWORD}: Test feature"
266
-
267
- source_2 = "#{FEATURE_KEYWORD}: Test feature
268
- #{SCENARIO_KEYWORD}: Test scenario
269
- #{OUTLINE_KEYWORD}: Test outline
270
- #{STEP_KEYWORD} a step
271
- #{EXAMPLE_KEYWORD}: Test examples
272
- |param|
273
- |value_1|
274
- |value_2|"
275
-
276
- feature_1 = clazz.new(source_1)
277
- feature_2 = clazz.new(source_2)
278
-
279
-
280
- expect(feature_1.test_case_count).to eq(0)
281
- expect(feature_2.test_case_count).to eq(3)
282
- end
283
-
284
-
285
- describe 'getting ancestors' do
286
-
287
- before(:each) do
288
- CukeModeler::FileHelper.create_feature_file(:text => source_gherkin, :name => 'feature_test_file', :directory => test_directory)
289
- end
290
-
291
-
292
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
293
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature" }
294
-
295
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
296
- let(:feature_model) { directory_model.feature_files.first.feature }
297
-
298
-
299
- it 'can get its directory' do
300
- ancestor = feature_model.get_ancestor(:directory)
301
-
302
- expect(ancestor).to equal(directory_model)
303
- end
304
-
305
- it 'can get its feature file' do
306
- ancestor = feature_model.get_ancestor(:feature_file)
307
-
308
- expect(ancestor).to equal(directory_model.feature_files.first)
309
- end
310
-
311
- it 'returns nil if it does not have the requested type of ancestor' do
312
- ancestor = feature_model.get_ancestor(:test)
313
-
314
- expect(ancestor).to be_nil
315
- end
316
-
317
- end
318
-
319
-
320
- describe 'feature output' do
321
-
322
- it 'can be remade from its own output' do
323
- source = "@tag1 @tag2 @tag3
324
- #{FEATURE_KEYWORD}: A feature with everything it could have
325
-
326
- Including a description
327
- and then some.
328
-
329
- #{BACKGROUND_KEYWORD}:
330
-
331
- Background
332
- description
333
-
334
- #{STEP_KEYWORD} a step
335
- | value1 |
336
- #{STEP_KEYWORD} another step
337
-
338
- @scenario_tag
339
- #{SCENARIO_KEYWORD}:
340
-
341
- Scenario
342
- description
343
-
344
- #{STEP_KEYWORD} a step
345
- #{STEP_KEYWORD} another step
346
- \"\"\"
347
- some text
348
- \"\"\"
349
-
350
- @outline_tag
351
- #{OUTLINE_KEYWORD}:
352
-
353
- Outline
354
- description
355
-
356
- #{STEP_KEYWORD} a step
357
- | value2 |
358
- #{STEP_KEYWORD} another step
359
- \"\"\"
360
- some text
361
- \"\"\"
362
-
363
- @example_tag
364
- #{EXAMPLE_KEYWORD}:
365
-
366
- Example
367
- description
368
-
369
- | param |
370
- | value |"
371
- feature = clazz.new(source)
372
-
373
- feature_output = feature.to_s
374
- remade_feature_output = clazz.new(feature_output).to_s
375
-
376
- expect(remade_feature_output).to eq(feature_output)
377
- end
378
-
379
-
380
- context 'from source text' do
381
-
382
- it 'can output an empty feature' do
383
- source = ["#{FEATURE_KEYWORD}:"]
384
- source = source.join("\n")
385
- feature = clazz.new(source)
386
-
387
- feature_output = feature.to_s.split("\n", -1)
388
-
389
- expect(feature_output).to eq(["#{FEATURE_KEYWORD}:"])
390
- end
391
-
392
- it 'can output a feature that has a name' do
393
- source = ["#{FEATURE_KEYWORD}: test feature"]
394
- source = source.join("\n")
395
- feature = clazz.new(source)
396
-
397
- feature_output = feature.to_s.split("\n", -1)
398
-
399
- expect(feature_output).to eq(["#{FEATURE_KEYWORD}: test feature"])
400
- end
401
-
402
- it 'can output a feature that has a description' do
403
- source = ["#{FEATURE_KEYWORD}:",
404
- 'Some description.',
405
- 'Some more description.']
406
- source = source.join("\n")
407
- feature = clazz.new(source)
408
-
409
- feature_output = feature.to_s.split("\n", -1)
410
-
411
- expect(feature_output).to eq(["#{FEATURE_KEYWORD}:",
412
- '',
413
- 'Some description.',
414
- 'Some more description.'])
415
- end
416
-
417
- it 'can output a feature that has tags' do
418
- source = ['@tag1 @tag2',
419
- '@tag3',
420
- "#{FEATURE_KEYWORD}:"]
421
- source = source.join("\n")
422
- feature = clazz.new(source)
423
-
424
- feature_output = feature.to_s.split("\n", -1)
425
-
426
- expect(feature_output).to eq(['@tag1 @tag2 @tag3',
427
- "#{FEATURE_KEYWORD}:"])
428
- end
429
-
430
- it 'can output a feature that has a background' do
431
- source = ["#{FEATURE_KEYWORD}:",
432
- "#{BACKGROUND_KEYWORD}:",
433
- "#{STEP_KEYWORD} a step"]
434
- source = source.join("\n")
435
- feature = clazz.new(source)
436
-
437
- feature_output = feature.to_s.split("\n", -1)
438
-
439
- expect(feature_output).to eq(["#{FEATURE_KEYWORD}:",
440
- '',
441
- " #{BACKGROUND_KEYWORD}:",
442
- " #{STEP_KEYWORD} a step"])
443
- end
444
-
445
- it 'can output a feature that has a scenario' do
446
- source = ["#{FEATURE_KEYWORD}:",
447
- "#{SCENARIO_KEYWORD}:",
448
- "#{STEP_KEYWORD} a step"]
449
- source = source.join("\n")
450
- feature = clazz.new(source)
451
-
452
- feature_output = feature.to_s.split("\n", -1)
453
-
454
- expect(feature_output).to eq(["#{FEATURE_KEYWORD}:",
455
- '',
456
- " #{SCENARIO_KEYWORD}:",
457
- " #{STEP_KEYWORD} a step"])
458
- end
459
-
460
- it 'can output a feature that has an outline' do
461
- source = ["#{FEATURE_KEYWORD}:",
462
- "#{OUTLINE_KEYWORD}:",
463
- "#{STEP_KEYWORD} a step",
464
- "#{EXAMPLE_KEYWORD}:",
465
- '|param|',
466
- '|value|']
467
- source = source.join("\n")
468
- feature = clazz.new(source)
469
-
470
- feature_output = feature.to_s.split("\n", -1)
471
-
472
- expect(feature_output).to eq(["#{FEATURE_KEYWORD}:",
473
- '',
474
- " #{OUTLINE_KEYWORD}:",
475
- " #{STEP_KEYWORD} a step",
476
- '',
477
- " #{EXAMPLE_KEYWORD}:",
478
- ' | param |',
479
- ' | value |'])
480
- end
481
-
482
- it 'can output a feature that has everything' do
483
- source = ['@tag1 @tag2 @tag3',
484
- "#{FEATURE_KEYWORD}: A feature with everything it could have",
485
- 'Including a description',
486
- 'and then some.',
487
- "#{BACKGROUND_KEYWORD}:",
488
- 'Background',
489
- 'description',
490
- "#{STEP_KEYWORD} a step",
491
- '|value1|',
492
- "#{STEP_KEYWORD} another step",
493
- '@scenario_tag',
494
- "#{SCENARIO_KEYWORD}:",
495
- 'Scenario',
496
- 'description',
497
- "#{STEP_KEYWORD} a step",
498
- "#{STEP_KEYWORD} another step",
499
- '"""',
500
- 'some text',
501
- '"""',
502
- '@outline_tag',
503
- "#{OUTLINE_KEYWORD}:",
504
- 'Outline ',
505
- 'description',
506
- "#{STEP_KEYWORD} a step ",
507
- '|value2|',
508
- "#{STEP_KEYWORD} another step",
509
- '"""',
510
- 'some text',
511
- '"""',
512
- '@example_tag',
513
- "#{EXAMPLE_KEYWORD}:",
514
- 'Example',
515
- 'description',
516
- '|param|',
517
- '|value|']
518
- source = source.join("\n")
519
- feature = clazz.new(source)
520
-
521
- feature_output = feature.to_s.split("\n", -1)
522
-
523
- expect(feature_output).to eq(['@tag1 @tag2 @tag3',
524
- "#{FEATURE_KEYWORD}: A feature with everything it could have",
525
- '',
526
- 'Including a description',
527
- 'and then some.',
528
- '',
529
- " #{BACKGROUND_KEYWORD}:",
530
- '',
531
- ' Background',
532
- ' description',
533
- '',
534
- " #{STEP_KEYWORD} a step",
535
- ' | value1 |',
536
- " #{STEP_KEYWORD} another step",
537
- '',
538
- ' @scenario_tag',
539
- " #{SCENARIO_KEYWORD}:",
540
- '',
541
- ' Scenario',
542
- ' description',
543
- '',
544
- " #{STEP_KEYWORD} a step",
545
- " #{STEP_KEYWORD} another step",
546
- ' """',
547
- ' some text',
548
- ' """',
549
- '',
550
- ' @outline_tag',
551
- " #{OUTLINE_KEYWORD}:",
552
- '',
553
- ' Outline',
554
- ' description',
555
- '',
556
- " #{STEP_KEYWORD} a step",
557
- ' | value2 |',
558
- " #{STEP_KEYWORD} another step",
559
- ' """',
560
- ' some text',
561
- ' """',
562
- '',
563
- ' @example_tag',
564
- " #{EXAMPLE_KEYWORD}:",
565
- '',
566
- ' Example',
567
- ' description',
568
- '',
569
- ' | param |',
570
- ' | value |'])
571
- end
572
-
573
- end
574
-
575
-
576
- context 'from abstract instantiation' do
577
-
578
- let(:feature) { clazz.new }
579
-
580
-
581
- it 'can output a feature that has only tags' do
582
- feature.tags = [CukeModeler::Tag.new]
583
-
584
- expect { feature.to_s }.to_not raise_error
585
- end
586
-
587
- it 'can output a feature that has only a background' do
588
- feature.background = [CukeModeler::Background.new]
589
-
590
- expect { feature.to_s }.to_not raise_error
591
- end
592
-
593
- it 'can output a feature that has only scenarios' do
594
- feature.tests = [CukeModeler::Scenario.new]
595
-
596
- expect { feature.to_s }.to_not raise_error
597
- end
598
-
599
- it 'can output a feature that has only outlines' do
600
- feature.tests = [CukeModeler::Outline.new]
601
-
602
- expect { feature.to_s }.to_not raise_error
603
- end
604
-
605
- end
606
-
607
- end
608
-
609
- end
610
-
611
-
612
- describe 'stuff that is in no way part of the public API and entirely subject to change' do
613
-
614
- it 'provides a useful explosion message if it encounters an entirely new type of feature child' do
615
- begin
616
- $old_method = CukeModeler::Parsing.method(:parse_text)
617
-
618
-
619
- # Monkey patch the parsing method to mimic what would essentially be Gherkin creating new types of language objects
620
- module CukeModeler
621
- module Parsing
622
- class << self
623
- def parse_text(source_text, filename)
624
- result = $old_method.call(source_text, filename)
625
-
626
- result.first['feature']['elements'].first['type'] = :some_unknown_type
627
-
628
- result
629
- end
630
- end
631
- end
632
- end
633
-
634
-
635
- expect { clazz.new("#{FEATURE_KEYWORD}:\n#{SCENARIO_KEYWORD}:\n#{STEP_KEYWORD} foo") }.to raise_error(ArgumentError, /Unknown.*some_unknown_type/)
636
- ensure
637
- # Making sure that our changes don't escape a test and ruin the rest of the suite
638
- module CukeModeler
639
- module Parsing
640
- class << self
641
- define_method(:parse_text, $old_method)
642
- end
643
- end
644
- end
645
- end
646
- end
647
-
648
- end
649
-
650
- end