cuke_modeler 0.4.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +17 -17
  3. data/.travis.yml +1 -1
  4. data/Gemfile +4 -0
  5. data/History.rdoc +71 -3
  6. data/LICENSE.txt +22 -22
  7. data/README.md +24 -10
  8. data/Rakefile +2 -12
  9. data/cuke_modeler.gemspec +1 -1
  10. data/features/analysis/test_comparison.feature +37 -122
  11. data/features/modeling/background_modeling.feature +77 -0
  12. data/features/modeling/background_output.feature +42 -0
  13. data/features/modeling/cell_modeling.feature +23 -0
  14. data/features/modeling/cell_output.feature +22 -0
  15. data/features/modeling/directory_modeling.feature +65 -0
  16. data/features/modeling/directory_output.feature +12 -0
  17. data/features/modeling/doc_string_modeling.feature +61 -0
  18. data/features/modeling/doc_string_output.feature +32 -0
  19. data/features/modeling/example_modeling.feature +125 -0
  20. data/features/modeling/example_output.feature +39 -0
  21. data/features/modeling/feature_file_modeling.feature +40 -0
  22. data/features/modeling/feature_file_output.feature +12 -0
  23. data/features/modeling/feature_modeling.feature +109 -0
  24. data/features/modeling/feature_output.feature +104 -0
  25. data/features/modeling/model_output.feature +22 -0
  26. data/features/modeling/model_structure.feature +48 -0
  27. data/features/modeling/outline_modeling.feature +144 -0
  28. data/features/modeling/outline_output.feature +69 -0
  29. data/features/modeling/row_modeling.feature +48 -0
  30. data/features/modeling/row_output.feature +22 -0
  31. data/features/modeling/scenario_modeling.feature +118 -0
  32. data/features/modeling/scenario_output.feature +45 -0
  33. data/features/modeling/step_modeling.feature +84 -0
  34. data/features/modeling/step_output.feature +29 -0
  35. data/features/modeling/table_modeling.feature +50 -0
  36. data/features/modeling/table_output.feature +24 -0
  37. data/features/modeling/tag_modeling.feature +43 -0
  38. data/features/modeling/tag_output.feature +22 -0
  39. data/features/step_definitions/action_steps.rb +11 -1
  40. data/features/step_definitions/background_steps.rb +1 -85
  41. data/features/step_definitions/directory_steps.rb +2 -48
  42. data/features/step_definitions/doc_string_steps.rb +1 -67
  43. data/features/step_definitions/feature_file_steps.rb +2 -37
  44. data/features/step_definitions/feature_steps.rb +4 -100
  45. data/features/step_definitions/modeling_steps.rb +44 -0
  46. data/features/step_definitions/setup_steps.rb +19 -41
  47. data/features/step_definitions/step_steps.rb +2 -166
  48. data/features/step_definitions/table_steps.rb +1 -58
  49. data/features/step_definitions/tag_steps.rb +2 -72
  50. data/features/step_definitions/verification_steps.rb +152 -4
  51. data/features/support/env.rb +4 -6
  52. data/gemfiles/{gherkin.gemfile → gherkin2.gemfile} +4 -0
  53. data/gemfiles/gherkin3.gemfile +4 -0
  54. data/gemfiles/gherkin4.gemfile +4 -0
  55. data/lib/cuke_modeler.rb +24 -22
  56. data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +103 -31
  57. data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +103 -40
  58. data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +111 -50
  59. data/lib/cuke_modeler/containing.rb +255 -4
  60. data/lib/cuke_modeler/described.rb +28 -0
  61. data/lib/cuke_modeler/models/background.rb +66 -0
  62. data/lib/cuke_modeler/models/cell.rb +48 -0
  63. data/lib/cuke_modeler/models/directory.rb +95 -0
  64. data/lib/cuke_modeler/models/doc_string.rb +59 -0
  65. data/lib/cuke_modeler/models/example.rb +167 -0
  66. data/lib/cuke_modeler/models/feature.rb +106 -0
  67. data/lib/cuke_modeler/models/feature_file.rb +64 -0
  68. data/lib/cuke_modeler/models/model.rb +32 -0
  69. data/lib/cuke_modeler/models/outline.rb +79 -0
  70. data/lib/cuke_modeler/models/row.rb +49 -0
  71. data/lib/cuke_modeler/models/scenario.rb +69 -0
  72. data/lib/cuke_modeler/models/step.rb +68 -0
  73. data/lib/cuke_modeler/models/table.rb +67 -0
  74. data/lib/cuke_modeler/models/tag.rb +46 -0
  75. data/lib/cuke_modeler/named.rb +19 -0
  76. data/lib/cuke_modeler/nested.rb +22 -15
  77. data/lib/cuke_modeler/parsed.rb +11 -0
  78. data/lib/cuke_modeler/parsing.rb +66 -83
  79. data/lib/cuke_modeler/sourceable.rb +3 -11
  80. data/lib/cuke_modeler/stepped.rb +24 -0
  81. data/lib/cuke_modeler/taggable.rb +6 -29
  82. data/lib/cuke_modeler/version.rb +2 -1
  83. data/spec/integration/background_integration_spec.rb +332 -7
  84. data/spec/integration/cell_integration_spec.rb +321 -0
  85. data/spec/integration/directory_integration_spec.rb +175 -9
  86. data/spec/integration/doc_string_integration_spec.rb +318 -7
  87. data/spec/integration/example_integration_spec.rb +602 -19
  88. data/spec/integration/feature_file_integration_spec.rb +98 -3
  89. data/spec/integration/feature_integration_spec.rb +445 -27
  90. data/spec/integration/gherkin_2_adapter_spec.rb +122 -0
  91. data/spec/integration/gherkin_3_adapter_spec.rb +125 -0
  92. data/spec/integration/gherkin_4_adapter_spec.rb +123 -0
  93. data/spec/integration/model_integration_spec.rb +15 -0
  94. data/spec/integration/nested_integration_spec.rb +91 -0
  95. data/spec/integration/outline_integration_spec.rb +485 -12
  96. data/spec/integration/parsing_integration_spec.rb +85 -0
  97. data/spec/integration/row_integration_spec.rb +221 -18
  98. data/spec/integration/scenario_integration_spec.rb +368 -14
  99. data/spec/integration/shared/models_integration_specs.rb +18 -0
  100. data/spec/integration/step_integration_spec.rb +328 -77
  101. data/spec/integration/table_integration_spec.rb +242 -20
  102. data/spec/integration/tag_integration_spec.rb +178 -13
  103. data/spec/spec_helper.rb +32 -18
  104. data/spec/unit/background_unit_spec.rb +24 -44
  105. data/spec/unit/cell_unit_spec.rb +73 -0
  106. data/spec/unit/described_unit_spec.rb +23 -0
  107. data/spec/unit/directory_unit_spec.rb +52 -62
  108. data/spec/unit/doc_string_unit_spec.rb +47 -100
  109. data/spec/unit/example_unit_spec.rb +50 -296
  110. data/spec/unit/feature_file_unit_spec.rb +53 -52
  111. data/spec/unit/feature_unit_spec.rb +39 -83
  112. data/spec/unit/model_unit_spec.rb +15 -0
  113. data/spec/unit/named_unit_spec.rb +23 -0
  114. data/spec/unit/nested_unit_spec.rb +24 -21
  115. data/spec/unit/outline_unit_spec.rb +46 -69
  116. data/spec/unit/parsed_unit_spec.rb +27 -0
  117. data/spec/unit/parsing_unit_spec.rb +2 -70
  118. data/spec/unit/row_unit_spec.rb +22 -51
  119. data/spec/unit/scenario_unit_spec.rb +27 -59
  120. data/spec/unit/{bare_bones_unit_specs.rb → shared/bare_bones_models_unit_specs.rb} +2 -2
  121. data/spec/unit/shared/containing_models_unit_specs.rb +18 -0
  122. data/spec/unit/shared/described_models_unit_specs.rb +38 -0
  123. data/spec/unit/shared/models_unit_specs.rb +15 -0
  124. data/spec/unit/shared/named_models_unit_specs.rb +39 -0
  125. data/spec/unit/shared/nested_models_unit_specs.rb +51 -0
  126. data/spec/unit/shared/parsed_models_unit_specs.rb +39 -0
  127. data/spec/unit/shared/prepopulated_models_unit_specs.rb +18 -0
  128. data/spec/unit/shared/sourced_models_unit_specs.rb +39 -0
  129. data/spec/unit/shared/stepped_models_unit_specs.rb +46 -0
  130. data/spec/unit/shared/stringifiable_models_unit_specs.rb +18 -0
  131. data/spec/unit/shared/tagged_models_unit_specs.rb +72 -0
  132. data/spec/unit/sourceable_unit_spec.rb +12 -4
  133. data/spec/unit/step_unit_spec.rb +40 -231
  134. data/spec/unit/stepped_unit_spec.rb +23 -0
  135. data/spec/unit/table_unit_spec.rb +27 -89
  136. data/spec/unit/tag_unit_spec.rb +30 -53
  137. data/spec/unit/taggable_unit_spec.rb +26 -42
  138. data/todo.txt +32 -0
  139. metadata +135 -217
  140. data/features/analysis/test_manipulation.feature +0 -37
  141. data/features/modeling/gherkin/background_modeling.feature +0 -65
  142. data/features/modeling/gherkin/background_output.feature +0 -131
  143. data/features/modeling/gherkin/directory_modeling.feature +0 -110
  144. data/features/modeling/gherkin/directory_output.feature +0 -14
  145. data/features/modeling/gherkin/doc_string_modeling.feature +0 -53
  146. data/features/modeling/gherkin/doc_string_output.feature +0 -72
  147. data/features/modeling/gherkin/example_modeling.feature +0 -101
  148. data/features/modeling/gherkin/example_output.feature +0 -193
  149. data/features/modeling/gherkin/feature_file_modeling.feature +0 -54
  150. data/features/modeling/gherkin/feature_file_output.feature +0 -14
  151. data/features/modeling/gherkin/feature_modeling.feature +0 -154
  152. data/features/modeling/gherkin/feature_output.feature +0 -245
  153. data/features/modeling/gherkin/outline_modeling.feature +0 -90
  154. data/features/modeling/gherkin/outline_output.feature +0 -198
  155. data/features/modeling/gherkin/row_modeling.feature +0 -68
  156. data/features/modeling/gherkin/row_output.feature +0 -28
  157. data/features/modeling/gherkin/scenario_modeling.feature +0 -79
  158. data/features/modeling/gherkin/scenario_output.feature +0 -148
  159. data/features/modeling/gherkin/step_modeling.feature +0 -75
  160. data/features/modeling/gherkin/step_output.feature +0 -53
  161. data/features/modeling/gherkin/table_modeling.feature +0 -42
  162. data/features/modeling/gherkin/table_output.feature +0 -43
  163. data/features/modeling/gherkin/table_row_modeling.feature +0 -57
  164. data/features/modeling/gherkin/table_row_output.feature +0 -28
  165. data/features/modeling/gherkin/tag_modeling.feature +0 -48
  166. data/features/modeling/gherkin/tag_output.feature +0 -17
  167. data/features/modeling/gherkin3/background_modeling.feature +0 -64
  168. data/features/modeling/gherkin3/background_output.feature +0 -131
  169. data/features/modeling/gherkin3/directory_modeling.feature +0 -110
  170. data/features/modeling/gherkin3/directory_output.feature +0 -14
  171. data/features/modeling/gherkin3/doc_string_modeling.feature +0 -53
  172. data/features/modeling/gherkin3/doc_string_output.feature +0 -72
  173. data/features/modeling/gherkin3/example_modeling.feature +0 -100
  174. data/features/modeling/gherkin3/example_output.feature +0 -207
  175. data/features/modeling/gherkin3/feature_file_modeling.feature +0 -54
  176. data/features/modeling/gherkin3/feature_file_output.feature +0 -14
  177. data/features/modeling/gherkin3/feature_modeling.feature +0 -155
  178. data/features/modeling/gherkin3/feature_output.feature +0 -249
  179. data/features/modeling/gherkin3/outline_modeling.feature +0 -89
  180. data/features/modeling/gherkin3/outline_output.feature +0 -255
  181. data/features/modeling/gherkin3/row_modeling.feature +0 -68
  182. data/features/modeling/gherkin3/row_output.feature +0 -28
  183. data/features/modeling/gherkin3/scenario_modeling.feature +0 -78
  184. data/features/modeling/gherkin3/scenario_output.feature +0 -148
  185. data/features/modeling/gherkin3/step_modeling.feature +0 -75
  186. data/features/modeling/gherkin3/step_output.feature +0 -53
  187. data/features/modeling/gherkin3/table_modeling.feature +0 -42
  188. data/features/modeling/gherkin3/table_output.feature +0 -43
  189. data/features/modeling/gherkin3/table_row_modeling.feature +0 -57
  190. data/features/modeling/gherkin3/table_row_output.feature +0 -28
  191. data/features/modeling/gherkin3/tag_modeling.feature +0 -49
  192. data/features/modeling/gherkin3/tag_output.feature +0 -17
  193. data/features/modeling/gherkin4/background_modeling.feature +0 -64
  194. data/features/modeling/gherkin4/background_output.feature +0 -131
  195. data/features/modeling/gherkin4/directory_modeling.feature +0 -110
  196. data/features/modeling/gherkin4/directory_output.feature +0 -14
  197. data/features/modeling/gherkin4/doc_string_modeling.feature +0 -53
  198. data/features/modeling/gherkin4/doc_string_output.feature +0 -72
  199. data/features/modeling/gherkin4/example_modeling.feature +0 -100
  200. data/features/modeling/gherkin4/example_output.feature +0 -193
  201. data/features/modeling/gherkin4/feature_file_modeling.feature +0 -54
  202. data/features/modeling/gherkin4/feature_file_output.feature +0 -14
  203. data/features/modeling/gherkin4/feature_modeling.feature +0 -153
  204. data/features/modeling/gherkin4/feature_output.feature +0 -245
  205. data/features/modeling/gherkin4/outline_modeling.feature +0 -89
  206. data/features/modeling/gherkin4/outline_output.feature +0 -198
  207. data/features/modeling/gherkin4/row_modeling.feature +0 -68
  208. data/features/modeling/gherkin4/row_output.feature +0 -28
  209. data/features/modeling/gherkin4/scenario_modeling.feature +0 -78
  210. data/features/modeling/gherkin4/scenario_output.feature +0 -148
  211. data/features/modeling/gherkin4/step_modeling.feature +0 -75
  212. data/features/modeling/gherkin4/step_output.feature +0 -53
  213. data/features/modeling/gherkin4/table_modeling.feature +0 -42
  214. data/features/modeling/gherkin4/table_output.feature +0 -43
  215. data/features/modeling/gherkin4/table_row_modeling.feature +0 -57
  216. data/features/modeling/gherkin4/table_row_output.feature +0 -28
  217. data/features/modeling/gherkin4/tag_modeling.feature +0 -48
  218. data/features/modeling/gherkin4/tag_output.feature +0 -17
  219. data/features/step_definitions/outline_steps.rb +0 -258
  220. data/features/step_definitions/test_steps.rb +0 -123
  221. data/lib/cuke_modeler/background.rb +0 -38
  222. data/lib/cuke_modeler/directory.rb +0 -83
  223. data/lib/cuke_modeler/doc_string.rb +0 -87
  224. data/lib/cuke_modeler/example.rb +0 -195
  225. data/lib/cuke_modeler/feature.rb +0 -147
  226. data/lib/cuke_modeler/feature_element.rb +0 -73
  227. data/lib/cuke_modeler/feature_file.rb +0 -77
  228. data/lib/cuke_modeler/outline.rb +0 -68
  229. data/lib/cuke_modeler/raw.rb +0 -20
  230. data/lib/cuke_modeler/row.rb +0 -64
  231. data/lib/cuke_modeler/scenario.rb +0 -45
  232. data/lib/cuke_modeler/step.rb +0 -216
  233. data/lib/cuke_modeler/table.rb +0 -90
  234. data/lib/cuke_modeler/table_row.rb +0 -64
  235. data/lib/cuke_modeler/tag.rb +0 -62
  236. data/lib/cuke_modeler/test_element.rb +0 -79
  237. data/lib/cuke_modeler/world.rb +0 -113
  238. data/spec/integration/table_row_integration_spec.rb +0 -76
  239. data/spec/integration/world_integration_spec.rb +0 -14
  240. data/spec/unit/containing_element_unit_specs.rb +0 -18
  241. data/spec/unit/feature_element_unit_spec.rb +0 -19
  242. data/spec/unit/feature_element_unit_specs.rb +0 -52
  243. data/spec/unit/nested_element_unit_specs.rb +0 -39
  244. data/spec/unit/prepopulated_unit_specs.rb +0 -14
  245. data/spec/unit/raw_element_unit_specs.rb +0 -27
  246. data/spec/unit/raw_unit_spec.rb +0 -28
  247. data/spec/unit/sourced_element_unit_specs.rb +0 -18
  248. data/spec/unit/table_row_unit_spec.rb +0 -102
  249. data/spec/unit/tagged_element_unit_specs.rb +0 -67
  250. data/spec/unit/test_element_unit_spec.rb +0 -54
  251. data/spec/unit/test_element_unit_specs.rb +0 -34
  252. data/spec/unit/world_unit_spec.rb +0 -140
@@ -1,15 +1,72 @@
1
1
  require 'spec_helper'
2
2
 
3
- SimpleCov.command_name('Outline') unless RUBY_VERSION.to_s < '1.9.0'
4
3
 
5
4
  describe 'Outline, Integration' do
6
5
 
7
6
  let(:clazz) { CukeModeler::Outline }
8
7
 
9
8
 
9
+ describe 'common behavior' do
10
+
11
+ it_should_behave_like 'a model, integration'
12
+
13
+ end
14
+
10
15
  describe 'unique behavior' do
11
16
 
12
- it 'properly sets its child elements' do
17
+ it 'can be instantiated with the minimum viable Gherkin', :gherkin4 => true do
18
+ source = "Scenario Outline:"
19
+
20
+ expect { clazz.new(source) }.to_not raise_error
21
+ end
22
+
23
+ it 'can be instantiated with the minimum viable Gherkin', :gherkin2 => true do
24
+ source = "Scenario Outline:"
25
+
26
+ expect { clazz.new(source) }.to_not raise_error
27
+ end
28
+
29
+ # gherkin 3.x does not accept incomplete outlines
30
+ it 'can be instantiated with the minimum viable Gherkin', :gherkin3 => true do
31
+ source = "Scenario Outline:
32
+ Examples:
33
+ | param |
34
+ | value |"
35
+
36
+ expect { clazz.new(source) }.to_not raise_error
37
+ end
38
+
39
+ it 'stores the original data generated by the parsing adapter', :gherkin4 => true do
40
+ outline = clazz.new("@tag\nScenario Outline: test outline\ndescription\n* a step\nExamples:\n|param|\n|value|")
41
+ data = outline.parsing_data
42
+
43
+ expect(data.keys).to match_array([:type, :tags, :location, :keyword, :name, :steps, :examples, :description])
44
+ expect(data[:type]).to eq(:ScenarioOutline)
45
+ end
46
+
47
+ it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
48
+ outline = clazz.new("@tag\nScenario Outline: test outline\ndescription\n* a step\nExamples:\n|param|\n|value|")
49
+ data = outline.parsing_data
50
+
51
+ expect(data.keys).to match_array([:type, :tags, :location, :keyword, :name, :steps, :examples, :description])
52
+ expect(data[:type]).to eq(:ScenarioOutline)
53
+ end
54
+
55
+ it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
56
+ outline = clazz.new("@tag\nScenario Outline: test outline\ndescription\n* a step\nExamples:\n|param|\n|value|")
57
+ data = outline.parsing_data
58
+
59
+ expect(data.keys).to match_array(['keyword', 'name', 'line', 'description', 'id', 'type', 'examples', 'steps', 'tags'])
60
+ expect(data['keyword']).to eq('Scenario Outline')
61
+ end
62
+
63
+ it 'provides a descriptive filename when being parsed from stand alone text' do
64
+ source = "bad outline text \n Scenario Outline:\n And a step\n @foo "
65
+
66
+ expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_outline\.feature'/)
67
+ end
68
+
69
+ it 'properly sets its child models' do
13
70
  source = ['@a_tag',
14
71
  ' Scenario Outline:',
15
72
  ' * a step',
@@ -21,11 +78,11 @@ describe 'Outline, Integration' do
21
78
  outline = clazz.new(source)
22
79
  example = outline.examples.first
23
80
  step = outline.steps.first
24
- tag = outline.tag_elements.first
81
+ tag = outline.tags.first
25
82
 
26
- expect(example.parent_element).to equal(outline)
27
- expect(step.parent_element).to equal(outline)
28
- expect(tag.parent_element).to equal(outline)
83
+ expect(example.parent_model).to equal(outline)
84
+ expect(step.parent_model).to equal(outline)
85
+ expect(tag.parent_model).to equal(outline)
29
86
  end
30
87
 
31
88
 
@@ -46,7 +103,7 @@ describe 'Outline, Integration' do
46
103
  end
47
104
 
48
105
  let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
49
- let(:outline) { directory.feature_files.first.features.first.tests.first }
106
+ let(:outline) { directory.feature_files.first.feature.tests.first }
50
107
 
51
108
 
52
109
  it 'can get its directory' do
@@ -64,7 +121,7 @@ describe 'Outline, Integration' do
64
121
  it 'can get its feature' do
65
122
  ancestor = outline.get_ancestor(:feature)
66
123
 
67
- expect(ancestor).to equal(directory.feature_files.first.features.first)
124
+ expect(ancestor).to equal(directory.feature_files.first.feature)
68
125
  end
69
126
 
70
127
  it 'returns nil if it does not have the requested type of ancestor' do
@@ -73,15 +130,431 @@ describe 'Outline, Integration' do
73
130
  expect(ancestor).to be_nil
74
131
  end
75
132
 
76
- describe 'outline output edge cases' do
77
133
 
78
- context 'a new outline object' do
134
+ describe 'model population' do
135
+
136
+ context 'from source text' do
137
+
138
+ it "models the outline's source line" do
139
+ source_text = 'Feature:
140
+
141
+ Scenario Outline: foo
142
+ * step
143
+ Examples:
144
+ | param |
145
+ | value |'
146
+ outline = CukeModeler::Feature.new(source_text).tests.first
147
+
148
+ expect(outline.source_line).to eq(3)
149
+ end
150
+
151
+
152
+ context 'a filled outline' do
153
+
154
+ let(:source_text) { '@tag1 @tag2 @tag3
155
+ Scenario Outline: Foo
156
+ Scenario description.
157
+
158
+ Some more.
159
+ Even more.
160
+
161
+ Given a <setup> step
162
+ When an action step
163
+ Then a <verification> step
164
+
165
+ Examples: example 1
166
+ | setup | verification |
167
+ | x | y |
168
+ Examples: example 2
169
+ | setup | verification |
170
+ | a | b |' }
171
+ let(:outline) { clazz.new(source_text) }
172
+
173
+
174
+ it "models the outline's name" do
175
+ expect(outline.name).to eq('Foo')
176
+ end
177
+
178
+ it "models the outline's description" do
179
+ description = outline.description.split("\n")
180
+
181
+ expect(description).to eq([' Scenario description.',
182
+ '',
183
+ 'Some more.',
184
+ ' Even more.'])
185
+ end
186
+
187
+ it "models the outline's steps" do
188
+ step_names = outline.steps.collect { |step| step.text }
189
+
190
+ expect(step_names).to eq(['a <setup> step', 'an action step', 'a <verification> step'])
191
+ end
192
+
193
+ it "models the outline's tags" do
194
+ tag_names = outline.tags.collect { |tag| tag.name }
195
+
196
+ expect(tag_names).to eq(['@tag1', '@tag2', '@tag3'])
197
+ end
198
+
199
+ it "models the outline's examples" do
200
+ example_names = outline.examples.collect { |example| example.name }
201
+
202
+ expect(example_names).to eq(['example 1', 'example 2'])
203
+ end
204
+
205
+ end
206
+
207
+
208
+ # gherkin 3.x does not accept incomplete outlines
209
+ context 'an empty outline', :gherkin3 => false do
210
+
211
+ let(:source_text) { 'Scenario Outline:' }
212
+ let(:outline) { clazz.new(source_text) }
213
+
214
+
215
+ it "models the outline's name" do
216
+ expect(outline.name).to eq('')
217
+ end
218
+
219
+ it "models the outline's description" do
220
+ expect(outline.description).to eq('')
221
+ end
222
+
223
+ it "models the outline's steps" do
224
+ expect(outline.steps).to eq([])
225
+ end
226
+
227
+ it "models the outline's tags" do
228
+ expect(outline.tags).to eq([])
229
+ end
230
+
231
+ it "models the outline's examples" do
232
+ expect(outline.examples).to eq([])
233
+ end
234
+
235
+ end
236
+
237
+ end
238
+
239
+ it 'trims whitespace from its source description' do
240
+ source = ['Scenario Outline:',
241
+ ' ',
242
+ ' description line 1',
243
+ '',
244
+ ' description line 2',
245
+ ' description line 3 ',
246
+ '',
247
+ '',
248
+ '',
249
+ ' * a step',
250
+ '',
251
+ 'Examples:',
252
+ '|param|',
253
+ '|value|']
254
+ source = source.join("\n")
255
+
256
+ outline = clazz.new(source)
257
+ description = outline.description.split("\n")
258
+
259
+ expect(description).to eq([' description line 1',
260
+ '',
261
+ 'description line 2',
262
+ ' description line 3'])
263
+ end
264
+
265
+ end
266
+
267
+
268
+ describe 'comparison' do
269
+
270
+ it 'is equal to a background with the same steps' do
271
+ source = "Scenario Outline:
272
+ * step 1
273
+ * step 2
274
+ Examples:
275
+ | param |
276
+ | value |"
277
+ outline = clazz.new(source)
278
+
279
+ source = "Background:
280
+ * step 1
281
+ * step 2"
282
+ background_1 = CukeModeler::Background.new(source)
283
+
284
+ source = "Background:
285
+ * step 2
286
+ * step 1"
287
+ background_2 = CukeModeler::Background.new(source)
288
+
289
+
290
+ expect(outline).to eq(background_1)
291
+ expect(outline).to_not eq(background_2)
292
+ end
293
+
294
+ it 'is equal to a scenario with the same steps' do
295
+ source = "Scenario Outline:
296
+ * step 1
297
+ * step 2
298
+ Examples:
299
+ | param |
300
+ | value |"
301
+ outline = clazz.new(source)
302
+
303
+ source = "Scenario:
304
+ * step 1
305
+ * step 2"
306
+ scenario_1 = CukeModeler::Scenario.new(source)
307
+
308
+ source = "Scenario:
309
+ * step 2
310
+ * step 1"
311
+ scenario_2 = CukeModeler::Scenario.new(source)
312
+
313
+
314
+ expect(outline).to eq(scenario_1)
315
+ expect(outline).to_not eq(scenario_2)
316
+ end
317
+
318
+ it 'is equal to an outline with the same steps' do
319
+ source = "Scenario Outline:
320
+ * step 1
321
+ * step 2
322
+ Examples:
323
+ | param |
324
+ | value |"
325
+ outline_1 = clazz.new(source)
326
+
327
+ source = "Scenario Outline:
328
+ * step 1
329
+ * step 2
330
+ Examples:
331
+ | param |
332
+ | value |"
333
+ outline_2 = clazz.new(source)
334
+
335
+ source = "Scenario Outline:
336
+ * step 2
337
+ * step 1
338
+ Examples:
339
+ | param |
340
+ | value |"
341
+ outline_3 = clazz.new(source)
342
+
343
+
344
+ expect(outline_1).to eq(outline_2)
345
+ expect(outline_1).to_not eq(outline_3)
346
+ end
347
+
348
+ end
349
+
350
+
351
+ describe 'outline output' do
352
+
353
+ it 'can be remade from its own output' do
354
+ source = ['@tag1 @tag2 @tag3',
355
+ 'Scenario Outline: An outline with everything it could have',
356
+ '',
357
+ 'Some description.',
358
+ 'Some more description.',
359
+ '',
360
+ ' * a step',
361
+ ' | value |',
362
+ ' * a <value> step',
363
+ ' """',
364
+ ' some string',
365
+ ' """',
366
+ '',
367
+ 'Examples:',
368
+ '',
369
+ 'Some description.',
370
+ 'Some more description.',
371
+ '',
372
+ ' | value |',
373
+ ' | x |',
374
+ '',
375
+ '@example_tag',
376
+ 'Examples:',
377
+ ' | value |',
378
+ ' | y |']
379
+ source = source.join("\n")
380
+ outline = clazz.new(source)
381
+
382
+ outline_output = outline.to_s
383
+ remade_outline_output = clazz.new(outline_output).to_s
384
+
385
+ expect(remade_outline_output).to eq(outline_output)
386
+ end
387
+
388
+
389
+ context 'from source text' do
390
+
391
+ # gherkin 3.x does not accept incomplete outlines
392
+ it 'can output an empty outline', :gherkin3 => false do
393
+ source = ['Scenario Outline:']
394
+ source = source.join("\n")
395
+ outline = clazz.new(source)
396
+
397
+ outline_output = outline.to_s.split("\n")
398
+
399
+ expect(outline_output).to eq(['Scenario Outline:'])
400
+ end
401
+
402
+ # gherkin 3.x does not accept incomplete outlines
403
+ it 'can output a outline that has a name', :gherkin3 => false do
404
+ source = ['Scenario Outline: test outline']
405
+ source = source.join("\n")
406
+ outline = clazz.new(source)
407
+
408
+ outline_output = outline.to_s.split("\n")
409
+
410
+ expect(outline_output).to eq(['Scenario Outline: test outline'])
411
+ end
412
+
413
+ # gherkin 3.x does not accept incomplete outlines
414
+ it 'can output a outline that has a description', :gherkin3 => false do
415
+ source = ['Scenario Outline:',
416
+ 'Some description.',
417
+ 'Some more description.']
418
+ source = source.join("\n")
419
+ outline = clazz.new(source)
420
+
421
+ outline_output = outline.to_s.split("\n")
422
+
423
+ expect(outline_output).to eq(['Scenario Outline:',
424
+ '',
425
+ 'Some description.',
426
+ 'Some more description.'])
427
+ end
428
+
429
+ # gherkin 3.x does not accept incomplete outlines
430
+ it 'can output a outline that has steps', :gherkin3 => false do
431
+ source = ['Scenario Outline:',
432
+ ' * a step',
433
+ ' | value |',
434
+ ' * another step',
435
+ ' """',
436
+ ' some string',
437
+ ' """']
438
+ source = source.join("\n")
439
+ outline = clazz.new(source)
440
+
441
+ outline_output = outline.to_s.split("\n")
442
+
443
+ expect(outline_output).to eq(['Scenario Outline:',
444
+ ' * a step',
445
+ ' | value |',
446
+ ' * another step',
447
+ ' """',
448
+ ' some string',
449
+ ' """'])
450
+ end
451
+
452
+ # gherkin 3.x does not accept incomplete outlines
453
+ it 'can output a outline that has tags', :gherkin3 => false do
454
+ source = ['@tag1 @tag2',
455
+ '@tag3',
456
+ 'Scenario Outline:']
457
+ source = source.join("\n")
458
+ outline = clazz.new(source)
459
+
460
+ outline_output = outline.to_s.split("\n")
461
+
462
+ expect(outline_output).to eq(['@tag1 @tag2 @tag3',
463
+ 'Scenario Outline:'])
464
+ end
465
+
466
+ it 'can output a outline that has examples' do
467
+ source = ['Scenario Outline:',
468
+ '* a step',
469
+ 'Examples:',
470
+ '| value |',
471
+ '| x |',
472
+ 'Examples:',
473
+ '| value |',
474
+ '| y |']
475
+ source = source.join("\n")
476
+ outline = clazz.new(source)
477
+
478
+ outline_output = outline.to_s.split("\n")
479
+
480
+ expect(outline_output).to eq(['Scenario Outline:',
481
+ ' * a step',
482
+ '',
483
+ 'Examples:',
484
+ ' | value |',
485
+ ' | x |',
486
+ '',
487
+ 'Examples:',
488
+ ' | value |',
489
+ ' | y |'])
490
+ end
491
+
492
+ it 'can output a outline that has everything' do
493
+ source = ['@tag1 @tag2 @tag3',
494
+ 'Scenario Outline: A outline with everything it could have',
495
+ 'Including a description',
496
+ 'and then some.',
497
+ '* a step',
498
+ '|value|',
499
+ '* another step',
500
+ '"""',
501
+ 'some string',
502
+ '"""',
503
+ '',
504
+ 'Examples:',
505
+ '',
506
+ 'Some description.',
507
+ 'Some more description.',
508
+ '',
509
+ '| value |',
510
+ '| x |',
511
+ '',
512
+ '@example_tag',
513
+ 'Examples:',
514
+ '| value |',
515
+ '| y |']
516
+ source = source.join("\n")
517
+ outline = clazz.new(source)
518
+
519
+ outline_output = outline.to_s.split("\n")
520
+
521
+ expect(outline_output).to eq(['@tag1 @tag2 @tag3',
522
+ 'Scenario Outline: A outline with everything it could have',
523
+ '',
524
+ 'Including a description',
525
+ 'and then some.',
526
+ '',
527
+ ' * a step',
528
+ ' | value |',
529
+ ' * another step',
530
+ ' """',
531
+ ' some string',
532
+ ' """',
533
+ '',
534
+ 'Examples:',
535
+ '',
536
+ 'Some description.',
537
+ 'Some more description.',
538
+ '',
539
+ ' | value |',
540
+ ' | x |',
541
+ '',
542
+ '@example_tag',
543
+ 'Examples:',
544
+ ' | value |',
545
+ ' | y |'])
546
+ end
547
+
548
+ end
549
+
550
+
551
+ context 'from abstract instantiation' do
79
552
 
80
553
  let(:outline) { clazz.new }
81
554
 
82
555
 
83
- it 'can output an outline that has only tag elements' do
84
- outline.tag_elements = [CukeModeler::Tag.new]
556
+ it 'can output an outline that has only tags' do
557
+ outline.tags = [CukeModeler::Tag.new]
85
558
 
86
559
  expect { outline.to_s }.to_not raise_error
87
560
  end