cuke_modeler 1.5.1 → 3.2.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 (135) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -1
  3. data/LICENSE.txt +1 -1
  4. data/README.md +13 -15
  5. data/cuke_modeler.gemspec +12 -9
  6. data/lib/cuke_modeler.rb +1 -0
  7. data/lib/cuke_modeler/adapters/gherkin_10_adapter.rb +12 -0
  8. data/lib/cuke_modeler/adapters/gherkin_11_adapter.rb +12 -0
  9. data/lib/cuke_modeler/adapters/gherkin_12_adapter.rb +12 -0
  10. data/lib/cuke_modeler/adapters/gherkin_13_adapter.rb +12 -0
  11. data/lib/cuke_modeler/adapters/gherkin_14_adapter.rb +12 -0
  12. data/lib/cuke_modeler/adapters/{gherkin_6_adapter.rb → gherkin_9_adapter.rb} +105 -69
  13. data/lib/cuke_modeler/containing.rb +16 -5
  14. data/lib/cuke_modeler/described.rb +1 -0
  15. data/lib/cuke_modeler/models/background.rb +1 -1
  16. data/lib/cuke_modeler/models/cell.rb +1 -1
  17. data/lib/cuke_modeler/models/comment.rb +1 -1
  18. data/lib/cuke_modeler/models/directory.rb +2 -2
  19. data/lib/cuke_modeler/models/doc_string.rb +1 -1
  20. data/lib/cuke_modeler/models/example.rb +1 -1
  21. data/lib/cuke_modeler/models/feature.rb +16 -5
  22. data/lib/cuke_modeler/models/feature_file.rb +2 -2
  23. data/lib/cuke_modeler/models/outline.rb +1 -1
  24. data/lib/cuke_modeler/models/row.rb +1 -1
  25. data/lib/cuke_modeler/models/rule.rb +99 -0
  26. data/lib/cuke_modeler/models/scenario.rb +1 -1
  27. data/lib/cuke_modeler/models/step.rb +32 -3
  28. data/lib/cuke_modeler/models/table.rb +1 -1
  29. data/lib/cuke_modeler/models/tag.rb +1 -1
  30. data/lib/cuke_modeler/named.rb +1 -0
  31. data/lib/cuke_modeler/nested.rb +1 -0
  32. data/lib/cuke_modeler/parsed.rb +1 -0
  33. data/lib/cuke_modeler/parsing.rb +89 -102
  34. data/lib/cuke_modeler/sourceable.rb +1 -0
  35. data/lib/cuke_modeler/stepped.rb +1 -0
  36. data/lib/cuke_modeler/taggable.rb +1 -0
  37. data/lib/cuke_modeler/version.rb +1 -1
  38. data/testing/cucumber/features/analysis/step_comparison.feature +25 -0
  39. data/testing/cucumber/features/analysis/test_comparison.feature +1 -1
  40. data/testing/cucumber/features/modeling/feature_modeling.feature +28 -7
  41. data/testing/cucumber/features/modeling/feature_output.feature +45 -23
  42. data/testing/cucumber/features/modeling/rule_modeling.feature +108 -0
  43. data/testing/cucumber/features/modeling/rule_output.feature +111 -0
  44. metadata +39 -140
  45. data/.gitignore +0 -18
  46. data/.simplecov +0 -7
  47. data/.travis.yml +0 -60
  48. data/Gemfile +0 -37
  49. data/Rakefile +0 -73
  50. data/appveyor.yml +0 -61
  51. data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +0 -273
  52. data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +0 -296
  53. data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +0 -308
  54. data/testing/cucumber/step_definitions/action_steps.rb +0 -13
  55. data/testing/cucumber/step_definitions/background_steps.rb +0 -1
  56. data/testing/cucumber/step_definitions/directory_steps.rb +0 -6
  57. data/testing/cucumber/step_definitions/doc_string_steps.rb +0 -1
  58. data/testing/cucumber/step_definitions/feature_file_steps.rb +0 -16
  59. data/testing/cucumber/step_definitions/feature_steps.rb +0 -7
  60. data/testing/cucumber/step_definitions/modeling_steps.rb +0 -44
  61. data/testing/cucumber/step_definitions/setup_steps.rb +0 -32
  62. data/testing/cucumber/step_definitions/step_steps.rb +0 -3
  63. data/testing/cucumber/step_definitions/table_steps.rb +0 -1
  64. data/testing/cucumber/step_definitions/tag_steps.rb +0 -3
  65. data/testing/cucumber/step_definitions/verification_steps.rb +0 -173
  66. data/testing/cucumber/support/env.rb +0 -30
  67. data/testing/dialect_helper.rb +0 -48
  68. data/testing/file_helper.rb +0 -47
  69. data/testing/gemfiles/gherkin2.gemfile +0 -33
  70. data/testing/gemfiles/gherkin3.gemfile +0 -26
  71. data/testing/gemfiles/gherkin4.gemfile +0 -27
  72. data/testing/gemfiles/gherkin5.gemfile +0 -27
  73. data/testing/gemfiles/gherkin6.gemfile +0 -10
  74. data/testing/rspec/spec/integration/adapters/gherkin_2_adapter_spec.rb +0 -166
  75. data/testing/rspec/spec/integration/adapters/gherkin_3_adapter_spec.rb +0 -166
  76. data/testing/rspec/spec/integration/adapters/gherkin_4_adapter_spec.rb +0 -165
  77. data/testing/rspec/spec/integration/adapters/gherkin_6_adapter_spec.rb +0 -166
  78. data/testing/rspec/spec/integration/models/background_integration_spec.rb +0 -442
  79. data/testing/rspec/spec/integration/models/cell_integration_spec.rb +0 -335
  80. data/testing/rspec/spec/integration/models/comment_integration_spec.rb +0 -177
  81. data/testing/rspec/spec/integration/models/directory_integration_spec.rb +0 -218
  82. data/testing/rspec/spec/integration/models/doc_string_integration_spec.rb +0 -402
  83. data/testing/rspec/spec/integration/models/example_integration_spec.rb +0 -741
  84. data/testing/rspec/spec/integration/models/feature_file_integration_spec.rb +0 -272
  85. data/testing/rspec/spec/integration/models/feature_integration_spec.rb +0 -650
  86. data/testing/rspec/spec/integration/models/model_integration_spec.rb +0 -15
  87. data/testing/rspec/spec/integration/models/outline_integration_spec.rb +0 -624
  88. data/testing/rspec/spec/integration/models/row_integration_spec.rb +0 -291
  89. data/testing/rspec/spec/integration/models/scenario_integration_spec.rb +0 -479
  90. data/testing/rspec/spec/integration/models/step_integration_spec.rb +0 -475
  91. data/testing/rspec/spec/integration/models/table_integration_spec.rb +0 -337
  92. data/testing/rspec/spec/integration/models/tag_integration_spec.rb +0 -259
  93. data/testing/rspec/spec/integration/nested_integration_spec.rb +0 -91
  94. data/testing/rspec/spec/integration/parsing_integration_spec.rb +0 -122
  95. data/testing/rspec/spec/integration/shared/models_integration_specs.rb +0 -18
  96. data/testing/rspec/spec/spec_helper.rb +0 -125
  97. data/testing/rspec/spec/unit/cuke_modeler_unit_spec.rb +0 -25
  98. data/testing/rspec/spec/unit/described_unit_spec.rb +0 -23
  99. data/testing/rspec/spec/unit/models/background_unit_spec.rb +0 -83
  100. data/testing/rspec/spec/unit/models/cell_unit_spec.rb +0 -68
  101. data/testing/rspec/spec/unit/models/comment_unit_spec.rb +0 -68
  102. data/testing/rspec/spec/unit/models/directory_unit_spec.rb +0 -127
  103. data/testing/rspec/spec/unit/models/doc_string_unit_spec.rb +0 -100
  104. data/testing/rspec/spec/unit/models/example_unit_spec.rb +0 -133
  105. data/testing/rspec/spec/unit/models/feature_file_unit_spec.rb +0 -125
  106. data/testing/rspec/spec/unit/models/feature_unit_spec.rb +0 -157
  107. data/testing/rspec/spec/unit/models/model_unit_spec.rb +0 -15
  108. data/testing/rspec/spec/unit/models/outline_unit_spec.rb +0 -117
  109. data/testing/rspec/spec/unit/models/row_unit_spec.rb +0 -68
  110. data/testing/rspec/spec/unit/models/scenario_unit_spec.rb +0 -86
  111. data/testing/rspec/spec/unit/models/step_unit_spec.rb +0 -109
  112. data/testing/rspec/spec/unit/models/table_unit_spec.rb +0 -77
  113. data/testing/rspec/spec/unit/models/tag_unit_spec.rb +0 -68
  114. data/testing/rspec/spec/unit/named_unit_spec.rb +0 -23
  115. data/testing/rspec/spec/unit/nested_unit_spec.rb +0 -43
  116. data/testing/rspec/spec/unit/parsed_unit_spec.rb +0 -27
  117. data/testing/rspec/spec/unit/parsing_unit_spec.rb +0 -54
  118. data/testing/rspec/spec/unit/shared/bare_bones_models_unit_specs.rb +0 -14
  119. data/testing/rspec/spec/unit/shared/containing_models_unit_specs.rb +0 -127
  120. data/testing/rspec/spec/unit/shared/described_models_unit_specs.rb +0 -38
  121. data/testing/rspec/spec/unit/shared/keyworded_models_unit_specs.rb +0 -58
  122. data/testing/rspec/spec/unit/shared/models_unit_specs.rb +0 -15
  123. data/testing/rspec/spec/unit/shared/named_models_unit_specs.rb +0 -39
  124. data/testing/rspec/spec/unit/shared/nested_models_unit_specs.rb +0 -51
  125. data/testing/rspec/spec/unit/shared/parsed_models_unit_specs.rb +0 -39
  126. data/testing/rspec/spec/unit/shared/prepopulated_models_unit_specs.rb +0 -18
  127. data/testing/rspec/spec/unit/shared/sourced_models_unit_specs.rb +0 -39
  128. data/testing/rspec/spec/unit/shared/stepped_models_unit_specs.rb +0 -46
  129. data/testing/rspec/spec/unit/shared/stringifiable_models_unit_specs.rb +0 -18
  130. data/testing/rspec/spec/unit/shared/tagged_models_unit_specs.rb +0 -72
  131. data/testing/rspec/spec/unit/sourceable_unit_spec.rb +0 -27
  132. data/testing/rspec/spec/unit/stepped_unit_spec.rb +0 -23
  133. data/testing/rspec/spec/unit/taggable_unit_spec.rb +0 -69
  134. data/testing/test_languages.json +0 -45
  135. data/todo.txt +0 -24
@@ -1,442 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../../spec_helper"
2
-
3
-
4
- describe 'Background, Integration' do
5
-
6
- let(:clazz) { CukeModeler::Background }
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 'can be instantiated with the minimum viable Gherkin' do
18
- source = "#{BACKGROUND_KEYWORD}:"
19
-
20
- expect { clazz.new(source) }.to_not raise_error
21
- end
22
-
23
- it 'can parse text that uses a non-default dialect' do
24
- original_dialect = CukeModeler::Parsing.dialect
25
- CukeModeler::Parsing.dialect = 'en-au'
26
-
27
- begin
28
- source_text = 'First off: Background name'
29
-
30
- expect { @model = clazz.new(source_text) }.to_not raise_error
31
-
32
- # Sanity check in case modeling failed in a non-explosive manner
33
- expect(@model.name).to eq('Background name')
34
- ensure
35
- # Making sure that our changes don't escape a test and ruin the rest of the suite
36
- CukeModeler::Parsing.dialect = original_dialect
37
- end
38
- end
39
-
40
- it 'stores the original data generated by the parsing adapter', :gherkin6 => true do
41
- background = clazz.new("#{BACKGROUND_KEYWORD}: test background\ndescription\n#{STEP_KEYWORD} a step")
42
- data = background.parsing_data
43
-
44
- expect(data.keys).to match_array([:background, :rule, :scenario])
45
- expect(data[:background][:name]).to eq('test background')
46
- end
47
-
48
- it 'stores the original data generated by the parsing adapter', :gherkin4_5 => true do
49
- background = clazz.new("#{BACKGROUND_KEYWORD}: test background\ndescription\n#{STEP_KEYWORD} a step")
50
- data = background.parsing_data
51
-
52
- expect(data.keys).to match_array([:type, :location, :keyword, :name, :steps, :description])
53
- expect(data[:type]).to eq(:Background)
54
- end
55
-
56
- it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
57
- background = clazz.new("#{BACKGROUND_KEYWORD}: test background\ndescription\n#{STEP_KEYWORD} a step")
58
- data = background.parsing_data
59
-
60
- expect(data.keys).to match_array([:type, :location, :keyword, :name, :steps, :description])
61
- expect(data[:type]).to eq(:Background)
62
- end
63
-
64
- it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
65
- background = clazz.new("#{BACKGROUND_KEYWORD}: test background\ndescription\n#{STEP_KEYWORD} a step")
66
- data = background.parsing_data
67
-
68
- expect(data.keys).to match_array(['keyword', 'name', 'line', 'description', 'steps', 'type'])
69
- expect(data['keyword']).to eq('Background')
70
- end
71
-
72
- it 'provides a descriptive filename when being parsed from stand alone text' do
73
- source = "bad background text \n #{BACKGROUND_KEYWORD}:\n #{STEP_KEYWORD} a step\n @foo "
74
-
75
- expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_background\.feature'/)
76
- end
77
-
78
- it 'properly sets its child models' do
79
- source = "#{BACKGROUND_KEYWORD}: Test background
80
- #{STEP_KEYWORD} a step"
81
-
82
- background = clazz.new(source)
83
- step = background.steps.first
84
-
85
- expect(step.parent_model).to equal(background)
86
- end
87
-
88
- it 'trims whitespace from its source description' do
89
- source = ["#{BACKGROUND_KEYWORD}:",
90
- ' ',
91
- ' description line 1',
92
- '',
93
- ' description line 2',
94
- ' description line 3 ',
95
- '',
96
- '',
97
- '',
98
- " #{STEP_KEYWORD} a step"]
99
- source = source.join("\n")
100
-
101
- background = clazz.new(source)
102
- description = background.description.split("\n", -1)
103
-
104
- expect(description).to eq([' description line 1',
105
- '',
106
- 'description line 2',
107
- ' description line 3'])
108
- end
109
-
110
-
111
- describe 'getting ancestors' do
112
-
113
- before(:each) do
114
- CukeModeler::FileHelper.create_feature_file(:text => source_gherkin, :name => 'background_test_file', :directory => test_directory)
115
- end
116
-
117
-
118
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
119
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
120
-
121
- #{BACKGROUND_KEYWORD}: Test background
122
- #{STEP_KEYWORD} a step"
123
- }
124
-
125
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
126
- let(:background_model) { directory_model.feature_files.first.feature.background }
127
-
128
-
129
- it 'can get its directory' do
130
- ancestor = background_model.get_ancestor(:directory)
131
-
132
- expect(ancestor).to equal(directory_model)
133
- end
134
-
135
- it 'can get its feature file' do
136
- ancestor = background_model.get_ancestor(:feature_file)
137
-
138
- expect(ancestor).to equal(directory_model.feature_files.first)
139
- end
140
-
141
- it 'can get its feature' do
142
- ancestor = background_model.get_ancestor(:feature)
143
-
144
- expect(ancestor).to equal(directory_model.feature_files.first.feature)
145
- end
146
-
147
- it 'returns nil if it does not have the requested type of ancestor' do
148
- ancestor = background_model.get_ancestor(:example)
149
-
150
- expect(ancestor).to be_nil
151
- end
152
-
153
- end
154
-
155
-
156
- describe 'model population' do
157
-
158
- context 'from source text' do
159
-
160
- let(:source_text) { "#{BACKGROUND_KEYWORD}:" }
161
- let(:background) { clazz.new(source_text) }
162
-
163
-
164
- it "models the background's keyword" do
165
- expect(background.keyword).to eq("#{BACKGROUND_KEYWORD}")
166
- end
167
-
168
- it "models the background's source line" do
169
- source_text = "#{FEATURE_KEYWORD}:
170
-
171
- #{BACKGROUND_KEYWORD}: foo
172
- #{STEP_KEYWORD} step"
173
- background = CukeModeler::Feature.new(source_text).background
174
-
175
- expect(background.source_line).to eq(3)
176
- end
177
-
178
- context 'a filled background' do
179
-
180
- let(:source_text) { "#{BACKGROUND_KEYWORD}: Background name
181
-
182
- Background description.
183
-
184
- Some more.
185
- Even more.
186
-
187
- #{STEP_KEYWORD} a step
188
- #{STEP_KEYWORD} another step" }
189
- let(:background) { clazz.new(source_text) }
190
-
191
-
192
- it "models the background's name" do
193
- expect(background.name).to eq('Background name')
194
- end
195
-
196
- it "models the background's description" do
197
- description = background.description.split("\n", -1)
198
-
199
- expect(description).to eq([' Background description.',
200
- '',
201
- 'Some more.',
202
- ' Even more.'])
203
- end
204
-
205
- it "models the background's steps" do
206
- step_names = background.steps.collect { |step| step.text }
207
-
208
- expect(step_names).to eq(['a step', 'another step'])
209
- end
210
-
211
- end
212
-
213
- context 'an empty background' do
214
-
215
- let(:source_text) { "#{BACKGROUND_KEYWORD}:" }
216
- let(:background) { clazz.new(source_text) }
217
-
218
-
219
- it "models the background's name" do
220
- expect(background.name).to eq('')
221
- end
222
-
223
- it "models the background's description" do
224
- expect(background.description).to eq('')
225
- end
226
-
227
- it "models the background's steps" do
228
- expect(background.steps).to eq([])
229
- end
230
-
231
- end
232
-
233
- end
234
-
235
- end
236
-
237
-
238
- describe 'comparison' do
239
-
240
- it 'is equal to a background with the same steps' do
241
- source = "#{BACKGROUND_KEYWORD}:
242
- #{STEP_KEYWORD} step 1
243
- #{STEP_KEYWORD} step 2"
244
- background_1 = clazz.new(source)
245
-
246
- source = "#{BACKGROUND_KEYWORD}:
247
- #{STEP_KEYWORD} step 1
248
- #{STEP_KEYWORD} step 2"
249
- background_2 = clazz.new(source)
250
-
251
- source = "#{BACKGROUND_KEYWORD}:
252
- #{STEP_KEYWORD} step 2
253
- #{STEP_KEYWORD} step 1"
254
- background_3 = clazz.new(source)
255
-
256
-
257
- expect(background_1).to eq(background_2)
258
- expect(background_1).to_not eq(background_3)
259
- end
260
-
261
- it 'is equal to a scenario with the same steps' do
262
- source = "#{BACKGROUND_KEYWORD}:
263
- #{STEP_KEYWORD} step 1
264
- #{STEP_KEYWORD} step 2"
265
- background = clazz.new(source)
266
-
267
- source = "#{SCENARIO_KEYWORD}:
268
- #{STEP_KEYWORD} step 1
269
- #{STEP_KEYWORD} step 2"
270
- scenario_1 = CukeModeler::Scenario.new(source)
271
-
272
- source = "#{SCENARIO_KEYWORD}:
273
- #{STEP_KEYWORD} step 2
274
- #{STEP_KEYWORD} step 1"
275
- scenario_2 = CukeModeler::Scenario.new(source)
276
-
277
-
278
- expect(background).to eq(scenario_1)
279
- expect(background).to_not eq(scenario_2)
280
- end
281
-
282
- it 'is equal to an outline with the same steps' do
283
- source = "#{BACKGROUND_KEYWORD}:
284
- #{STEP_KEYWORD} step 1
285
- #{STEP_KEYWORD} step 2"
286
- background = clazz.new(source)
287
-
288
- source = "#{OUTLINE_KEYWORD}:
289
- #{STEP_KEYWORD} step 1
290
- #{STEP_KEYWORD} step 2
291
- #{EXAMPLE_KEYWORD}:
292
- | param |
293
- | value |"
294
- outline_1 = CukeModeler::Outline.new(source)
295
-
296
- source = "#{OUTLINE_KEYWORD}:
297
- #{STEP_KEYWORD} step 2
298
- #{STEP_KEYWORD} step 1
299
- #{EXAMPLE_KEYWORD}:
300
- | param |
301
- | value |"
302
- outline_2 = CukeModeler::Outline.new(source)
303
-
304
-
305
- expect(background).to eq(outline_1)
306
- expect(background).to_not eq(outline_2)
307
- end
308
-
309
- end
310
-
311
-
312
- describe 'background output' do
313
-
314
- it 'can be remade from its own output' do
315
- source = "#{BACKGROUND_KEYWORD}: A background with everything it could have
316
-
317
- Including a description
318
- and then some.
319
-
320
- #{STEP_KEYWORD} a step
321
- | value |
322
- #{STEP_KEYWORD} another step
323
- \"\"\"
324
- some string
325
- \"\"\""
326
- background = clazz.new(source)
327
-
328
- background_output = background.to_s
329
- remade_background_output = clazz.new(background_output).to_s
330
-
331
- expect(remade_background_output).to eq(background_output)
332
- end
333
-
334
-
335
- context 'from source text' do
336
-
337
- it 'can output an empty background' do
338
- source = ["#{BACKGROUND_KEYWORD}:"]
339
- source = source.join("\n")
340
- background = clazz.new(source)
341
-
342
- background_output = background.to_s.split("\n", -1)
343
-
344
- expect(background_output).to eq(["#{BACKGROUND_KEYWORD}:"])
345
- end
346
-
347
- it 'can output a background that has a name' do
348
- source = ["#{BACKGROUND_KEYWORD}: test background"]
349
- source = source.join("\n")
350
- background = clazz.new(source)
351
-
352
- background_output = background.to_s.split("\n", -1)
353
-
354
- expect(background_output).to eq(["#{BACKGROUND_KEYWORD}: test background"])
355
- end
356
-
357
- it 'can output a background that has a description' do
358
- source = ["#{BACKGROUND_KEYWORD}:",
359
- 'Some description.',
360
- 'Some more description.']
361
- source = source.join("\n")
362
- background = clazz.new(source)
363
-
364
- background_output = background.to_s.split("\n", -1)
365
-
366
- expect(background_output).to eq(["#{BACKGROUND_KEYWORD}:",
367
- '',
368
- 'Some description.',
369
- 'Some more description.'])
370
- end
371
-
372
- it 'can output a background that has steps' do
373
- source = ["#{BACKGROUND_KEYWORD}:",
374
- "#{STEP_KEYWORD} a step",
375
- '|value|',
376
- "#{STEP_KEYWORD} another step",
377
- '"""',
378
- 'some string',
379
- '"""']
380
- source = source.join("\n")
381
- background = clazz.new(source)
382
-
383
- background_output = background.to_s.split("\n", -1)
384
-
385
- expect(background_output).to eq(["#{BACKGROUND_KEYWORD}:",
386
- " #{STEP_KEYWORD} a step",
387
- ' | value |',
388
- " #{STEP_KEYWORD} another step",
389
- ' """',
390
- ' some string',
391
- ' """'])
392
- end
393
-
394
- it 'can output a background that has everything' do
395
- source = ["#{BACKGROUND_KEYWORD}: A background with everything it could have",
396
- 'Including a description',
397
- 'and then some.',
398
- "#{STEP_KEYWORD} a step",
399
- '|value|',
400
- "#{STEP_KEYWORD} another step",
401
- '"""',
402
- 'some string',
403
- '"""']
404
- source = source.join("\n")
405
- background = clazz.new(source)
406
-
407
- background_output = background.to_s.split("\n", -1)
408
-
409
- expect(background_output).to eq(["#{BACKGROUND_KEYWORD}: A background with everything it could have",
410
- '',
411
- 'Including a description',
412
- 'and then some.',
413
- '',
414
- " #{STEP_KEYWORD} a step",
415
- ' | value |',
416
- " #{STEP_KEYWORD} another step",
417
- ' """',
418
- ' some string',
419
- ' """'])
420
- end
421
-
422
- end
423
-
424
-
425
- context 'from abstract instantiation' do
426
-
427
- let(:background) { clazz.new }
428
-
429
-
430
- it 'can output a background that has only steps' do
431
- background.steps = [CukeModeler::Step.new]
432
-
433
- expect { background.to_s }.to_not raise_error
434
- end
435
-
436
- end
437
-
438
- end
439
-
440
- end
441
-
442
- end
@@ -1,335 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../../spec_helper"
2
-
3
-
4
- describe 'Cell, Integration' do
5
-
6
- let(:clazz) { CukeModeler::Cell }
7
-
8
-
9
- describe 'common behavior' do
10
-
11
- it_should_behave_like 'a model, integration'
12
-
13
- end
14
-
15
-
16
- describe 'unique behavior' do
17
-
18
- it 'can be instantiated with the minimum viable Gherkin' do
19
- source = ''
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 = 'foo'
30
-
31
- expect { @model = clazz.new(source_text) }.to_not raise_error
32
-
33
- # Sanity check in case modeling failed in a non-explosive manner
34
- expect(@model.value).to eq('foo')
35
- ensure
36
- # Making sure that our changes don't escape a test and ruin the rest of the suite
37
- CukeModeler::Parsing.dialect = original_dialect
38
- end
39
- end
40
-
41
- it 'provides a descriptive filename when being parsed from stand alone text' do
42
- source = "not a \n cell"
43
-
44
- expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_cell\.feature'/)
45
- end
46
-
47
- it 'stores the original data generated by the parsing adapter', :gherkin6 => true do
48
- cell = clazz.new('a cell')
49
- data = cell.parsing_data
50
-
51
- expect(data.keys).to match_array([:location, :value])
52
- expect(data[:value]).to eq('a cell')
53
- end
54
-
55
- it 'stores the original data generated by the parsing adapter', :gherkin4_5 => true do
56
- cell = clazz.new('a cell')
57
- data = cell.parsing_data
58
-
59
- expect(data.keys).to match_array([:type, :location, :value])
60
- expect(data[:type]).to eq(:TableCell)
61
- end
62
-
63
- it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
64
- cell = clazz.new("a cell")
65
- data = cell.parsing_data
66
-
67
- expect(data.keys).to match_array([:type, :location, :value])
68
- expect(data[:type]).to eq('TableCell')
69
- end
70
-
71
- it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
72
- cell = clazz.new("a cell")
73
- data = cell.parsing_data
74
-
75
- # Cells did not exist as full fledged objects in the Gherkin2 parser
76
- expect(data).to eq('a cell')
77
- end
78
-
79
-
80
- describe 'getting ancestors' do
81
-
82
- before(:each) do
83
- CukeModeler::FileHelper.create_feature_file(:text => source_gherkin, :name => 'cell_test_file', :directory => test_directory)
84
- end
85
-
86
-
87
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
88
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
89
-
90
- #{SCENARIO_KEYWORD}: Test test
91
- #{STEP_KEYWORD} a step
92
- | a value |"
93
- }
94
-
95
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
96
- let(:cell_model) { directory_model.feature_files.first.feature.tests.first.steps.first.block.rows.first.cells.first }
97
-
98
-
99
- it 'can get its directory' do
100
- ancestor = cell_model.get_ancestor(:directory)
101
-
102
- expect(ancestor).to equal(directory_model)
103
- end
104
-
105
- it 'can get its feature file' do
106
- ancestor = cell_model.get_ancestor(:feature_file)
107
-
108
- expect(ancestor).to equal(directory_model.feature_files.first)
109
- end
110
-
111
- it 'can get its feature' do
112
- ancestor = cell_model.get_ancestor(:feature)
113
-
114
- expect(ancestor).to equal(directory_model.feature_files.first.feature)
115
- end
116
-
117
- context 'a cell that is part of an outline' do
118
-
119
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
120
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
121
-
122
- #{OUTLINE_KEYWORD}: Test outline
123
- #{STEP_KEYWORD} a step
124
- #{EXAMPLE_KEYWORD}:
125
- | param |
126
- | value |"
127
- }
128
-
129
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
130
- let(:cell_model) { directory_model.feature_files.first.feature.tests.first.examples.first.rows.first.cells.first }
131
-
132
-
133
- it 'can get its outline' do
134
- ancestor = cell_model.get_ancestor(:outline)
135
-
136
- expect(ancestor).to equal(directory_model.feature_files.first.feature.tests.first)
137
- end
138
-
139
- it 'can get its example' do
140
- ancestor = cell_model.get_ancestor(:example)
141
-
142
- expect(ancestor).to equal(directory_model.feature_files.first.feature.tests.first.examples.first)
143
- end
144
-
145
- it 'can get its row' do
146
- ancestor = cell_model.get_ancestor(:row)
147
-
148
- expect(ancestor).to equal(directory_model.feature_files.first.feature.tests.first.examples.first.rows.first)
149
- end
150
-
151
- end
152
-
153
-
154
- context 'a cell that is part of a scenario' do
155
-
156
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
157
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
158
-
159
- #{SCENARIO_KEYWORD}: Test test
160
- #{STEP_KEYWORD} a step:
161
- | a | table |"
162
- }
163
-
164
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
165
- let(:cell_model) { directory_model.feature_files.first.feature.tests.first.steps.first.block.rows.first.cells.first }
166
-
167
-
168
- it 'can get its scenario' do
169
- ancestor = cell_model.get_ancestor(:scenario)
170
-
171
- expect(ancestor).to equal(directory_model.feature_files.first.feature.tests.first)
172
- end
173
-
174
- end
175
-
176
- context 'a cell that is part of a background' do
177
-
178
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
179
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
180
-
181
- #{BACKGROUND_KEYWORD}: Test background
182
- #{STEP_KEYWORD} a step:
183
- | a | table |"
184
- }
185
-
186
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
187
- let(:cell_model) { directory_model.feature_files.first.feature.background.steps.first.block.rows.first.cells.first }
188
-
189
-
190
- it 'can get its background' do
191
- ancestor = cell_model.get_ancestor(:background)
192
-
193
- expect(ancestor).to equal(directory_model.feature_files.first.feature.background)
194
- end
195
-
196
- end
197
-
198
- context 'a cell that is part of a step' do
199
-
200
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
201
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
202
-
203
- #{SCENARIO_KEYWORD}: Test test
204
- #{STEP_KEYWORD} a step:
205
- | a | table |"
206
- }
207
-
208
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
209
- let(:cell_model) { directory_model.feature_files.first.feature.tests.first.steps.first.block.rows.first.cells.first }
210
-
211
-
212
- it 'can get its step' do
213
- ancestor = cell_model.get_ancestor(:step)
214
-
215
- expect(ancestor).to equal(directory_model.feature_files.first.feature.tests.first.steps.first)
216
- end
217
-
218
- it 'can get its table' do
219
- ancestor = cell_model.get_ancestor(:table)
220
-
221
- expect(ancestor).to equal(directory_model.feature_files.first.feature.tests.first.steps.first.block)
222
- end
223
-
224
- it 'can get its row' do
225
- ancestor = cell_model.get_ancestor(:row)
226
-
227
- expect(ancestor).to equal(directory_model.feature_files.first.feature.tests.first.steps.first.block.rows.first)
228
- end
229
-
230
- end
231
-
232
- it 'returns nil if it does not have the requested type of ancestor' do
233
- ancestor = cell_model.get_ancestor(:example)
234
-
235
- expect(ancestor).to be_nil
236
- end
237
-
238
- end
239
-
240
-
241
- describe 'model population' do
242
-
243
- context 'from source text' do
244
-
245
- let(:source_text) { 'a cell' }
246
- let(:cell) { clazz.new(source_text) }
247
-
248
-
249
- it "models the cell's value" do
250
- expect(cell.value).to eq('a cell')
251
- end
252
-
253
- it "models the cell's source line" do
254
- source_text = "#{FEATURE_KEYWORD}:
255
-
256
- #{SCENARIO_KEYWORD}:
257
- #{STEP_KEYWORD} a step
258
- | value |"
259
- cell = CukeModeler::Feature.new(source_text).tests.first.steps.first.block.rows.first.cells.first
260
-
261
- expect(cell.source_line).to eq(5)
262
- end
263
-
264
- end
265
-
266
- end
267
-
268
-
269
- describe 'cell output' do
270
-
271
- it 'can be remade from its own output' do
272
- source = 'a \\\\ complex \| cell'
273
- cell = clazz.new(source)
274
-
275
- cell_output = cell.to_s
276
- remade_cell_output = clazz.new(cell_output).to_s
277
-
278
- expect(remade_cell_output).to eq(cell_output)
279
- end
280
-
281
-
282
- context 'from source text' do
283
-
284
- it 'can output a cell' do
285
- source = 'a cell'
286
- cell = clazz.new(source)
287
-
288
- expect(cell.to_s).to eq('a cell')
289
- end
290
-
291
- # Because vertical bars mark the beginning and end of a cell, any vertical bars inside
292
- # of the cell (which would have had to have been escaped to get inside of the cell in
293
- # the first place) will be escaped when outputted so as to retain the quality of being
294
- # able to use the output directly as Gherkin.
295
-
296
- it 'can output a cell that has vertical bars in it' do
297
- source = 'cell with a \| in it'
298
- cell = clazz.new(source)
299
-
300
- cell_output = cell.to_s
301
-
302
- expect(cell_output).to eq('cell with a \| in it')
303
- end
304
-
305
- # Because backslashes are used to escape special characters, any backslashes inside
306
- # of the cell (which would have had to have been escaped to get inside of the cell in
307
- # the first place) will be escaped when outputted so as to retain the quality of being
308
- # able to use the output directly as Gherkin.
309
-
310
- it 'can output a cell that has backslashes in it' do
311
- source = 'cell with a \\\\ in it'
312
- cell = clazz.new(source)
313
-
314
- cell_output = cell.to_s
315
-
316
- expect(cell_output).to eq('cell with a \\\\ in it')
317
- end
318
-
319
- # Depending on the order in which special characters are escaped, extra backslashes might occur.
320
- it 'can output a cell that has several kinds of special characters in it' do
321
- source = 'cell with a \\\\ and \| in it'
322
- cell = clazz.new(source)
323
-
324
- cell_output = cell.to_s
325
-
326
- expect(cell_output).to eq('cell with a \\\\ and \| in it')
327
- end
328
-
329
- end
330
-
331
- end
332
-
333
- end
334
-
335
- end