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,25 +1,104 @@
1
1
  require 'spec_helper'
2
2
 
3
- SimpleCov.command_name('Table') unless RUBY_VERSION.to_s < '1.9.0'
4
3
 
5
4
  describe 'Table, Integration' do
6
5
 
7
6
  let(:clazz) { CukeModeler::Table }
8
7
 
9
8
 
9
+ describe 'common behavior' do
10
+
11
+ it_should_behave_like 'a model, integration'
12
+
13
+ end
14
+
15
+
10
16
  describe 'unique behavior' do
11
17
 
12
- it 'properly sets its child elements' do
18
+ it 'provides a descriptive filename when being parsed from stand alone text' do
19
+ source = 'bad table text'
20
+
21
+ expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_table\.feature'/)
22
+ end
23
+
24
+ it 'stores the original data generated by the parsing adapter', :gherkin4 => true do
25
+ table = clazz.new("| a table |")
26
+ data = table.parsing_data
27
+
28
+ expect(data.keys).to match_array([:type, :location, :rows])
29
+ expect(data[:type]).to eq(:DataTable)
30
+ end
31
+
32
+ it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
33
+ table = clazz.new("| a table |")
34
+ data = table.parsing_data
35
+
36
+ expect(data.keys).to match_array([:type, :location, :rows])
37
+ expect(data[:type]).to eq(:DataTable)
38
+ end
39
+
40
+ it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
41
+ table = clazz.new("| a table |")
42
+ data = table.parsing_data
43
+
44
+ # There is no parsing data for the table itself, only its rows
45
+ expect(data).to match_array([])
46
+ end
47
+
48
+ it 'can be instantiated with the minimum viable Gherkin' do
49
+ source = '| a table |'
50
+
51
+ expect { clazz.new(source) }.to_not raise_error
52
+ end
53
+
54
+
55
+ describe 'model population' do
56
+
57
+ context 'from source text' do
58
+
59
+ it "models the table's source line" do
60
+ source_text = "Feature:
61
+
62
+ Scenario:
63
+ * step
64
+ | value |"
65
+ table = CukeModeler::Feature.new(source_text).tests.first.steps.first.block
66
+
67
+ expect(table.source_line).to eq(5)
68
+ end
69
+
70
+
71
+ context 'a filled table' do
72
+
73
+ let(:source_text) { "| value 1 |
74
+ | value 2 |" }
75
+ let(:table) { clazz.new(source_text) }
76
+
77
+
78
+ it "models the table's rows" do
79
+ table_cell_values = table.rows.collect { |row| row.cells.collect { |cell| cell.value } }
80
+
81
+ expect(table_cell_values).to eq([['value 1'], ['value 2']])
82
+ end
83
+
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+
90
+
91
+ it 'properly sets its child models' do
13
92
  source = ['| cell 1 |',
14
93
  '| cell 2 |']
15
94
  source = source.join("\n")
16
95
 
17
96
  table = clazz.new(source)
18
- row_1 = table.row_elements[0]
19
- row_2 = table.row_elements[1]
97
+ row_1 = table.rows[0]
98
+ row_2 = table.rows[1]
20
99
 
21
- row_1.parent_element.should equal table
22
- row_2.parent_element.should equal table
100
+ expect(row_1.parent_model).to equal(table)
101
+ expect(row_2.parent_model).to equal(table)
23
102
  end
24
103
 
25
104
  describe 'getting ancestors' do
@@ -37,57 +116,200 @@ describe 'Table, Integration' do
37
116
  end
38
117
 
39
118
  let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
40
- let(:table) { directory.feature_files.first.features.first.tests.first.steps.first.block }
119
+ let(:table) { directory.feature_files.first.feature.tests.first.steps.first.block }
41
120
 
42
121
 
43
122
  it 'can get its directory' do
44
123
  ancestor = table.get_ancestor(:directory)
45
124
 
46
- ancestor.should equal directory
125
+ expect(ancestor).to equal(directory)
47
126
  end
48
127
 
49
128
  it 'can get its feature file' do
50
129
  ancestor = table.get_ancestor(:feature_file)
51
130
 
52
- ancestor.should equal directory.feature_files.first
131
+ expect(ancestor).to equal(directory.feature_files.first)
53
132
  end
54
133
 
55
134
  it 'can get its feature' do
56
135
  ancestor = table.get_ancestor(:feature)
57
136
 
58
- ancestor.should equal directory.feature_files.first.features.first
137
+ expect(ancestor).to equal(directory.feature_files.first.feature)
138
+ end
139
+
140
+ context 'a table that is part of a scenario' do
141
+
142
+ before(:each) do
143
+ source = 'Feature: Test feature
144
+
145
+ Scenario: Test test
146
+ * a step:
147
+ | a | table |'
148
+
149
+ file_path = "#{@default_file_directory}/doc_string_test_file.feature"
150
+ File.open(file_path, 'w') { |file| file.write(source) }
151
+ end
152
+
153
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
154
+ let(:table) { directory.feature_files.first.feature.tests.first.steps.first.block }
155
+
156
+
157
+ it 'can get its scenario' do
158
+ ancestor = table.get_ancestor(:scenario)
159
+
160
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first)
161
+ end
162
+
59
163
  end
60
164
 
61
- it 'can get its test' do
62
- ancestor = table.get_ancestor(:test)
165
+ context 'a table that is part of an outline' do
166
+
167
+ before(:each) do
168
+ source = 'Feature: Test feature
169
+
170
+ Scenario Outline: Test outline
171
+ * a step:
172
+ | a | table |
173
+ Examples:
174
+ | param |
175
+ | value |'
176
+
177
+ file_path = "#{@default_file_directory}/doc_string_test_file.feature"
178
+ File.open(file_path, 'w') { |file| file.write(source) }
179
+ end
180
+
181
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
182
+ let(:table) { directory.feature_files.first.feature.tests.first.steps.first.block }
183
+
184
+
185
+ it 'can get its outline' do
186
+ ancestor = table.get_ancestor(:outline)
187
+
188
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first)
189
+ end
190
+
191
+ end
192
+
193
+ context 'a table that is part of a background' do
194
+
195
+ before(:each) do
196
+ source = 'Feature: Test feature
197
+
198
+ Background: Test background
199
+ * a step:
200
+ | a | table |'
201
+
202
+ file_path = "#{@default_file_directory}/doc_string_test_file.feature"
203
+ File.open(file_path, 'w') { |file| file.write(source) }
204
+ end
205
+
206
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
207
+ let(:table) { directory.feature_files.first.feature.background.steps.first.block }
208
+
209
+
210
+ it 'can get its background' do
211
+ ancestor = table.get_ancestor(:background)
212
+
213
+ expect(ancestor).to equal(directory.feature_files.first.feature.background)
214
+ end
63
215
 
64
- ancestor.should equal directory.feature_files.first.features.first.tests.first
65
216
  end
66
217
 
67
218
  it 'can get its step' do
68
219
  ancestor = table.get_ancestor(:step)
69
220
 
70
- ancestor.should equal directory.feature_files.first.features.first.tests.first.steps.first
221
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first.steps.first)
71
222
  end
72
223
 
73
224
  it 'returns nil if it does not have the requested type of ancestor' do
74
225
  ancestor = table.get_ancestor(:example)
75
226
 
76
- ancestor.should be_nil
227
+ expect(ancestor).to be_nil
77
228
  end
78
229
 
79
230
  end
80
231
 
81
- describe 'table output edge cases' do
82
232
 
83
- context 'a new table object' do
233
+ describe 'table output' do
234
+
235
+ it 'can be remade from its own output' do
236
+ source = ['| value1 | value2 |',
237
+ '| value3 | value4 |']
238
+ source = source.join("\n")
239
+ table = clazz.new(source)
240
+
241
+ table_output = table.to_s
242
+ remade_table_output = clazz.new(table_output).to_s
243
+
244
+ expect(remade_table_output).to eq(table_output)
245
+ end
246
+
247
+ # This behavior should already be taken care of by the cell object's output method, but
248
+ # the table object has to adjust that output in order to properly buffer column width
249
+ # and it is possible that during that process it messes up the cell's output.
250
+
251
+ it 'can correctly output a row that has special characters in it' do
252
+ source = ['| a value with \| |',
253
+ '| a value with \\\\ |',
254
+ '| a value with \\\\ and \| |']
255
+ source = source.join("\n")
256
+ table = clazz.new(source)
257
+
258
+ table_output = table.to_s.split("\n")
259
+
260
+ expect(table_output).to eq(['| a value with \| |',
261
+ '| a value with \\\\ |',
262
+ '| a value with \\\\ and \| |'])
263
+ end
264
+
265
+ context 'from source text' do
266
+
267
+ it 'can output an table that has a single row' do
268
+ source = ['|value1|value2|']
269
+ source = source.join("\n")
270
+ table = clazz.new(source)
271
+
272
+ table_output = table.to_s.split("\n")
273
+
274
+ expect(table_output).to eq(['| value1 | value2 |'])
275
+ end
276
+
277
+ it 'can output an table that has multiple rows' do
278
+ source = ['|value1|value2|',
279
+ '|value3|value4|']
280
+ source = source.join("\n")
281
+ table = clazz.new(source)
282
+
283
+ table_output = table.to_s.split("\n")
284
+
285
+ expect(table_output).to eq(['| value1 | value2 |',
286
+ '| value3 | value4 |'])
287
+ end
288
+
289
+ it 'buffers row cells based on the longest value in a column' do
290
+ source = ['|value 1| x|',
291
+ '|y|value 2|',
292
+ '|a|b|']
293
+ source = source.join("\n")
294
+ table = clazz.new(source)
295
+
296
+ table_output = table.to_s.split("\n")
297
+
298
+ expect(table_output).to eq(['| value 1 | x |',
299
+ '| y | value 2 |',
300
+ '| a | b |'])
301
+ end
302
+
303
+ end
304
+
305
+
306
+ context 'from abstract instantiation' do
84
307
 
85
308
  let(:table) { clazz.new }
86
309
 
87
310
 
88
- # todo - remove once #contents is no longer supported
89
- it 'can output a table that only has row elements' do
90
- table.row_elements = [CukeModeler::TableRow.new]
311
+ it 'can output a table that only has rows' do
312
+ table.rows = [CukeModeler::Row.new]
91
313
 
92
314
  expect { table.to_s }.to_not raise_error
93
315
  end
@@ -1,14 +1,56 @@
1
1
  require 'spec_helper'
2
2
 
3
- SimpleCov.command_name('Tag') unless RUBY_VERSION.to_s < '1.9.0'
4
3
 
5
4
  describe 'Tag, Integration' do
6
5
 
7
6
  let(:clazz) { CukeModeler::Tag }
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
 
17
+ it 'can be instantiated with the minimum viable Gherkin' do
18
+ source = '@a_tag'
19
+
20
+ expect { clazz.new(source) }.to_not raise_error
21
+ end
22
+
23
+ it 'provides a descriptive filename when being parsed from stand alone text' do
24
+ source = 'bad tag text'
25
+
26
+ expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_tag\.feature'/)
27
+ end
28
+
29
+ it 'stores the original data generated by the parsing adapter', :gherkin4 => true do
30
+ tag = clazz.new('@a_tag')
31
+ data = tag.parsing_data
32
+
33
+ expect(data.keys).to match_array([:type, :location, :name])
34
+ expect(data[:type]).to eq(:Tag)
35
+ end
36
+
37
+ it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
38
+ tag = clazz.new('@a_tag')
39
+ data = tag.parsing_data
40
+
41
+ expect(data.keys).to match_array([:type, :location, :name])
42
+ expect(data[:type]).to eq('Tag')
43
+ end
44
+
45
+ it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
46
+ tag = clazz.new('@a_tag')
47
+ data = tag.parsing_data
48
+
49
+ expect(data.keys).to match_array(['name', 'line'])
50
+ expect(data['name']).to eq('@a_tag')
51
+ end
52
+
53
+
12
54
  describe 'getting ancestors' do
13
55
 
14
56
  before(:each) do
@@ -29,44 +71,167 @@ describe 'Tag, Integration' do
29
71
  end
30
72
 
31
73
  let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
32
- let(:tag) { directory.feature_files.first.features.first.tests.first.examples.first.tag_elements.first }
33
- let(:high_level_tag) { directory.feature_files.first.features.first.tag_elements.first }
74
+ let(:tag) { directory.feature_files.first.feature.tests.first.examples.first.tags.first }
75
+ let(:high_level_tag) { directory.feature_files.first.feature.tags.first }
34
76
 
35
77
 
36
78
  it 'can get its directory' do
37
79
  ancestor = tag.get_ancestor(:directory)
38
80
 
39
- ancestor.should equal directory
81
+ expect(ancestor).to equal(directory)
40
82
  end
41
83
 
42
84
  it 'can get its feature file' do
43
85
  ancestor = tag.get_ancestor(:feature_file)
44
86
 
45
- ancestor.should equal directory.feature_files.first
87
+ expect(ancestor).to equal(directory.feature_files.first)
46
88
  end
47
89
 
48
90
  it 'can get its feature' do
49
91
  ancestor = tag.get_ancestor(:feature)
50
92
 
51
- ancestor.should equal directory.feature_files.first.features.first
93
+ expect(ancestor).to equal(directory.feature_files.first.feature)
52
94
  end
53
95
 
54
- it 'can get its test' do
55
- ancestor = tag.get_ancestor(:test)
96
+ context 'a tag that is part of a scenario' do
97
+
98
+ before(:each) do
99
+ source = 'Feature: Test feature
100
+
101
+ @a_tag
102
+ Scenario: Test scenario
103
+ * a step'
104
+
105
+ file_path = "#{@default_file_directory}/step_test_file.feature"
106
+ File.open(file_path, 'w') { |file| file.write(source) }
107
+ end
108
+
109
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
110
+ let(:tag) { directory.feature_files.first.feature.tests.first.tags.first }
111
+
112
+
113
+ it 'can get its scenario' do
114
+ ancestor = tag.get_ancestor(:scenario)
115
+
116
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first)
117
+ end
56
118
 
57
- ancestor.should equal directory.feature_files.first.features.first.tests.first
58
119
  end
59
120
 
60
- it 'can get its example' do
61
- ancestor = tag.get_ancestor(:example)
121
+ context 'a tag that is part of an outline' do
122
+
123
+ before(:each) do
124
+ source = 'Feature: Test feature
125
+
126
+ @a_tag
127
+ Scenario Outline: Test outline
128
+ * a step
129
+ Examples:
130
+ | param |
131
+ | value |'
132
+
133
+ file_path = "#{@default_file_directory}/step_test_file.feature"
134
+ File.open(file_path, 'w') { |file| file.write(source) }
135
+ end
136
+
137
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
138
+ let(:tag) { directory.feature_files.first.feature.tests.first.tags.first }
139
+
140
+
141
+ it 'can get its outline' do
142
+ ancestor = tag.get_ancestor(:outline)
143
+
144
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first)
145
+ end
146
+
147
+ end
148
+
149
+ context 'a tag that is part of an example' do
150
+
151
+ before(:each) do
152
+ source = 'Feature: Test feature
153
+
154
+ Scenario Outline: Test outline
155
+ * a step
156
+ @a_tag
157
+ Examples:
158
+ | param |
159
+ | value |'
160
+ file_path = "#{@default_file_directory}/step_test_file.feature"
161
+ File.open(file_path, 'w') { |file| file.write(source) }
162
+ end
163
+
164
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
165
+ let(:tag) { directory.feature_files.first.feature.tests.first.examples.first.tags.first }
166
+
167
+
168
+ it 'can get its example' do
169
+ ancestor = tag.get_ancestor(:example)
170
+
171
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first.examples.first)
172
+ end
62
173
 
63
- ancestor.should equal directory.feature_files.first.features.first.tests.first.examples.first
64
174
  end
65
175
 
66
176
  it 'returns nil if it does not have the requested type of ancestor' do
67
177
  ancestor = high_level_tag.get_ancestor(:example)
68
178
 
69
- ancestor.should be_nil
179
+ expect(ancestor).to be_nil
180
+ end
181
+
182
+ end
183
+
184
+
185
+ describe 'model population' do
186
+
187
+ context 'from source text' do
188
+
189
+ let(:source_text) { '@a_tag' }
190
+ let(:tag) { clazz.new(source_text) }
191
+
192
+
193
+ it "models the tag's name" do
194
+ expect(tag.name).to eq('@a_tag')
195
+ end
196
+
197
+ it "models the tag's source line" do
198
+ source_text = "Feature:
199
+
200
+ @a_tag
201
+ Scenario:
202
+ * step"
203
+ tag = CukeModeler::Feature.new(source_text).tests.first.tags.first
204
+
205
+ expect(tag.source_line).to eq(3)
206
+ end
207
+
208
+ end
209
+
210
+ end
211
+
212
+
213
+ describe 'tag output' do
214
+
215
+ it 'can be remade from its own output' do
216
+ source = '@some_tag'
217
+ tag = clazz.new(source)
218
+
219
+ tag_output = tag.to_s
220
+ remade_tag_output = clazz.new(tag_output).to_s
221
+
222
+ expect(remade_tag_output).to eq(tag_output)
223
+ end
224
+
225
+
226
+ context 'from source text' do
227
+
228
+ it 'can output a tag' do
229
+ source = '@a_tag'
230
+ tag = clazz.new(source)
231
+
232
+ expect(tag.to_s).to eq('@a_tag')
233
+ end
234
+
70
235
  end
71
236
 
72
237
  end