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
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'a model, integration' do
4
+
5
+ # clazz must be defined by the calling file
6
+
7
+ let(:model) { clazz.new }
8
+
9
+
10
+ describe 'unique behavior' do
11
+
12
+ it 'inherits from the common model class' do
13
+ expect(model).to be_a(CukeModeler::Model)
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -1,121 +1,229 @@
1
1
  require 'spec_helper'
2
2
 
3
- SimpleCov.command_name('Step') unless RUBY_VERSION.to_s < '1.9.0'
4
3
 
5
4
  describe 'Step, Integration' do
6
5
 
7
6
  let(:clazz) { CukeModeler::Step }
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
13
- source_1 = ['* a step',
14
- '"""',
15
- 'a doc string',
16
- '"""']
17
- source_2 = ['* a step',
18
- '| a block|']
17
+ it 'can be instantiated with the minimum viable Gherkin' do
18
+ source = '* a step'
19
19
 
20
- step_1 = clazz.new(source_1.join("\n"))
21
- step_2 = clazz.new(source_2.join("\n"))
20
+ expect { clazz.new(source) }.to_not raise_error
21
+ end
22
22
 
23
+ it 'provides a descriptive filename when being parsed from stand alone text' do
24
+ source = "bad step text\n And a step\n @foo"
23
25
 
24
- doc_string = step_1.block
25
- table = step_2.block
26
+ expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_step\.feature'/)
27
+ end
26
28
 
27
- doc_string.parent_element.should equal step_1
28
- table.parent_element.should equal step_2
29
+ it 'stores the original data generated by the parsing adapter (with a table)', :gherkin4 => true do
30
+ step = clazz.new("* test step\n|table|")
31
+ data = step.parsing_data
32
+
33
+ expect(data.keys).to match_array([:type, :location, :keyword, :text, :argument])
34
+ expect(data[:type]).to eq(:Step)
29
35
  end
30
36
 
31
- it 'defaults to the World delimiters if its own are not set' do
32
- world = CukeModeler::World
33
- world.left_delimiter = '"'
34
- world.right_delimiter = '"'
37
+ it 'stores the original data generated by the parsing adapter (with a doc string)', :gherkin4 => true do
38
+ step = clazz.new("* test step\n\"\"\"\na doc string\n\"\"\"")
39
+ data = step.parsing_data
35
40
 
36
- step = clazz.new
37
- step.right_delimiter = nil
38
- step.left_delimiter = nil
41
+ expect(data.keys).to match_array([:type, :location, :keyword, :text, :argument])
42
+ expect(data[:type]).to eq(:Step)
43
+ end
39
44
 
40
- step.right_delimiter.should == '"'
41
- step.left_delimiter.should == '"'
45
+ it 'stores the original data generated by the parsing adapter (with a table)', :gherkin3 => true do
46
+ step = clazz.new("* test step\n|table|")
47
+ data = step.parsing_data
48
+
49
+ expect(data.keys).to match_array([:type, :location, :keyword, :text, :argument])
50
+ expect(data[:type]).to eq(:Step)
42
51
  end
43
52
 
44
- it 'attempts to determine its arguments during creation' do
45
- source = 'Given a test step with *parameter 1* and "parameter 2" and *parameter 3*'
53
+ it 'stores the original data generated by the parsing adapter (with a doc string)', :gherkin3 => true do
54
+ step = clazz.new("* test step\n\"\"\"\na doc string\n\"\"\"")
55
+ data = step.parsing_data
56
+
57
+ expect(data.keys).to match_array([:type, :location, :keyword, :text, :argument])
58
+ expect(data[:type]).to eq(:Step)
59
+ end
46
60
 
47
- world = CukeModeler::World
48
- world.left_delimiter = '"'
49
- world.right_delimiter = '"'
61
+ it 'stores the original data generated by the parsing adapter (with a table)', :gherkin2 => true do
62
+ step = clazz.new("* test step\n|table|")
63
+ data = step.parsing_data
64
+
65
+ expect(data.keys).to match_array(['keyword', 'name', 'line', 'rows'])
66
+ expect(data['keyword']).to eq('* ')
67
+ end
50
68
 
51
- step = clazz.new(source)
69
+ it 'stores the original data generated by the parsing adapter (with a doc string)', :gherkin2 => true do
70
+ step = clazz.new("* test step\n\"\"\"\na doc string\n\"\"\"")
71
+ data = step.parsing_data
52
72
 
53
- step.arguments.should == ['parameter 2']
73
+ expect(data.keys).to match_array(['keyword', 'name', 'line', 'doc_string'])
74
+ expect(data['keyword']).to eq('* ')
54
75
  end
55
76
 
56
- it 'finds nothing when no regular expression or delimiters are available' do
57
- world = CukeModeler::World
58
- world.left_delimiter = nil
59
- world.right_delimiter = nil
77
+ describe 'model population' do
78
+
79
+ context 'from source text' do
80
+
81
+ let(:source_text) { '* a step' }
82
+ let(:step) { clazz.new(source_text) }
83
+
84
+
85
+ it "models the step's keyword" do
86
+ expect(step.keyword).to eq('*')
87
+ end
88
+
89
+ it "models the step's text" do
90
+ expect(step.text).to eq('a step')
91
+ end
92
+
93
+ it "models the step's source line" do
94
+ source_text = "Feature:
95
+
96
+ Scenario: foo
97
+ * step"
98
+ step = CukeModeler::Feature.new(source_text).tests.first.steps.first
99
+
100
+ expect(step.source_line).to eq(4)
101
+ end
102
+
60
103
 
61
- source = 'Given a test step with *parameter 1* and "parameter 2" and *parameter 3*'
62
- step = clazz.new(source)
104
+ context 'with no block' do
63
105
 
64
- step.scan_arguments
106
+ let(:source_text) { '* a step' }
107
+ let(:step) { clazz.new(source_text) }
108
+
109
+
110
+ it "models the step's block" do
111
+ expect(step.block).to be_nil
112
+ end
113
+
114
+ end
115
+
116
+ context 'a step with a table' do
117
+
118
+ let(:source_text) { '* a step
119
+ | value 1 |
120
+ | value 2 |' }
121
+ let(:step) { clazz.new(source_text) }
122
+
123
+
124
+ it "models the step's table" do
125
+ table_cell_values = step.block.rows.collect { |row| row.cells.collect { |cell| cell.value } }
126
+
127
+ expect(table_cell_values).to eq([['value 1'], ['value 2']])
128
+ end
129
+
130
+ end
131
+
132
+ context 'a step with a doc string' do
133
+
134
+ let(:source_text) { '* a step
135
+ """
136
+ some text
137
+ """' }
138
+ let(:step) { clazz.new(source_text) }
139
+
140
+
141
+ it "models the step's doc string" do
142
+ doc_string = step.block
143
+
144
+ expect(doc_string.content).to eq('some text')
145
+ end
146
+
147
+ end
148
+
149
+ end
65
150
 
66
- step.arguments.should == []
67
151
  end
68
152
 
69
- it 'can determine its equality with another Step' do
70
- source_1 = "Given a test step with *parameter 1* and *parameter 2*\n|a block|"
71
- source_2 = "Given a test step with *parameter 3* and *parameter 4*\n|another block|"
72
- source_3 = 'Given a different *parameterized* step'
73
153
 
74
- step_1 = clazz.new(source_1)
75
- step_2 = clazz.new(source_2)
76
- step_3 = clazz.new(source_3)
154
+ it 'properly sets its child models' do
155
+ source_1 = ['* a step',
156
+ '"""',
157
+ 'a doc string',
158
+ '"""']
159
+ source_2 = ['* a step',
160
+ '| a block|']
77
161
 
78
- step_1.delimiter = '*'
79
- step_2.delimiter = '*'
80
- step_3.delimiter = '*'
162
+ step_1 = clazz.new(source_1.join("\n"))
163
+ step_2 = clazz.new(source_2.join("\n"))
81
164
 
82
165
 
83
- (step_1 == step_2).should be_true
84
- (step_1 == step_3).should be_false
166
+ doc_string = step_1.block
167
+ table = step_2.block
168
+
169
+ expect(doc_string.parent_model).to equal(step_1)
170
+ expect(table.parent_model).to equal(step_2)
85
171
  end
86
172
 
87
- describe '#step_text' do
88
173
 
89
- let(:source) { "Given a test step with -parameter 1- ^and@ *parameter 2!!\n|a block|" }
90
- let(:step) { clazz.new(source) }
174
+ describe 'step comparison' do
175
+
176
+ it 'is equal to another Step that has the same text' do
177
+ source_1 = '* a step'
178
+ source_2 = '* a step'
179
+ source_3 = '* a different step'
180
+
181
+ step_1 = clazz.new(source_1)
182
+ step_2 = clazz.new(source_2)
183
+ step_3 = clazz.new(source_3)
184
+
91
185
 
186
+ expect(step_1).to eq(step_2)
187
+ expect(step_1).to_not eq(step_3)
188
+ end
189
+
190
+ it 'ignores steps keywords when comparing steps' do
191
+ source_1 = 'Given a step'
192
+ source_2 = 'Then a step'
92
193
 
93
- it 'returns the step\'s entire text by default' do
94
- source = "Given a test step with -parameter 1- ^and@ *parameter 2!!\n|a block|"
95
- step_with_block = clazz.new(source)
194
+ step_1 = clazz.new(source_1)
195
+ step_2 = clazz.new(source_2)
96
196
 
97
- expected_output = ['Given a test step with -parameter 1- ^and@ *parameter 2!!',
98
- '|a block|']
99
197
 
100
- step_with_block.step_text.should == expected_output
198
+ expect(step_1).to eq(step_2)
199
+ end
101
200
 
102
- source = 'Given a test step with -parameter 1- ^and@ *parameter 2!!'
103
- step_without_block = clazz.new(source)
201
+ it 'ignores step tables when comparing steps' do
202
+ source_1 = '* a step'
203
+ source_2 = "* a step\n|with a table|"
104
204
 
105
- expected_output = ['Given a test step with -parameter 1- ^and@ *parameter 2!!']
205
+ step_1 = clazz.new(source_1)
206
+ step_2 = clazz.new(source_2)
106
207
 
107
- step_without_block.step_text.should == expected_output
208
+
209
+ expect(step_1).to eq(step_2)
108
210
  end
109
211
 
110
- it 'can provide the step\'s text without the keyword' do
111
- expected_output = ['a test step with -parameter 1- ^and@ *parameter 2!!',
112
- '|a block|']
212
+ it 'ignores step doc strings when comparing steps' do
213
+ source_1 = '* a step'
214
+ source_2 = "* a step\n\"\"\"\nwith a doc string\n\"\"\""
215
+
113
216
 
114
- step.step_text(:with_keywords => false).should == expected_output
217
+ step_1 = clazz.new(source_1)
218
+ step_2 = clazz.new(source_2)
219
+
220
+
221
+ expect(step_1).to eq(step_2)
115
222
  end
116
223
 
117
224
  end
118
225
 
226
+
119
227
  describe 'getting ancestors' do
120
228
 
121
229
  before(:each) do
@@ -130,44 +238,187 @@ describe 'Step, Integration' do
130
238
  end
131
239
 
132
240
  let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
133
- let(:step) { directory.feature_files.first.features.first.tests.first.steps.first }
241
+ let(:step) { directory.feature_files.first.feature.tests.first.steps.first }
134
242
 
135
243
 
136
244
  it 'can get its directory' do
137
245
  ancestor = step.get_ancestor(:directory)
138
246
 
139
- ancestor.should equal directory
247
+ expect(ancestor).to equal(directory)
140
248
  end
141
249
 
142
250
  it 'can get its feature file' do
143
251
  ancestor = step.get_ancestor(:feature_file)
144
252
 
145
- ancestor.should equal directory.feature_files.first
253
+ expect(ancestor).to equal(directory.feature_files.first)
146
254
  end
147
255
 
148
256
  it 'can get its feature' do
149
257
  ancestor = step.get_ancestor(:feature)
150
258
 
151
- ancestor.should equal directory.feature_files.first.features.first
259
+ expect(ancestor).to equal(directory.feature_files.first.feature)
152
260
  end
153
261
 
154
- it 'can get its test' do
155
- ancestor = step.get_ancestor(:test)
156
262
 
157
- ancestor.should equal directory.feature_files.first.features.first.tests.first
263
+ context 'a step that is part of a scenario' do
264
+
265
+ before(:each) do
266
+ source = 'Feature: Test feature
267
+
268
+ Scenario: Test scenario
269
+ * a step'
270
+
271
+ file_path = "#{@default_file_directory}/step_test_file.feature"
272
+ File.open(file_path, 'w') { |file| file.write(source) }
273
+ end
274
+
275
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
276
+ let(:step) { directory.feature_files.first.feature.tests.first.steps.first }
277
+
278
+
279
+ it 'can get its scenario' do
280
+ ancestor = step.get_ancestor(:scenario)
281
+
282
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first)
283
+ end
284
+
285
+ end
286
+
287
+ context 'a step that is part of an outline' do
288
+
289
+ before(:each) do
290
+ source = 'Feature: Test feature
291
+
292
+ Scenario Outline: Test outline
293
+ * a step
294
+ Examples:
295
+ | param |
296
+ | value |'
297
+
298
+ file_path = "#{@default_file_directory}/step_test_file.feature"
299
+ File.open(file_path, 'w') { |file| file.write(source) }
300
+ end
301
+
302
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
303
+ let(:step) { directory.feature_files.first.feature.tests.first.steps.first }
304
+
305
+
306
+ it 'can get its outline' do
307
+ ancestor = step.get_ancestor(:outline)
308
+
309
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first)
310
+ end
311
+
312
+ end
313
+
314
+ context 'a step that is part of a background' do
315
+
316
+ before(:each) do
317
+ source = 'Feature: Test feature
318
+
319
+ Background: Test background
320
+ * a step'
321
+
322
+ file_path = "#{@default_file_directory}/step_test_file.feature"
323
+ File.open(file_path, 'w') { |file| file.write(source) }
324
+ end
325
+
326
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
327
+ let(:step) { directory.feature_files.first.feature.background.steps.first }
328
+
329
+
330
+ it 'can get its background' do
331
+ ancestor = step.get_ancestor(:background)
332
+
333
+ expect(ancestor).to equal(directory.feature_files.first.feature.background)
334
+ end
335
+
158
336
  end
159
337
 
160
338
  it 'returns nil if it does not have the requested type of ancestor' do
161
339
  ancestor = step.get_ancestor(:example)
162
340
 
163
- ancestor.should be_nil
341
+ expect(ancestor).to be_nil
164
342
  end
165
343
 
166
344
  end
167
345
 
168
- describe 'step output edge cases' do
169
346
 
170
- context 'a new step object' do
347
+ describe 'step output' do
348
+
349
+ context 'from source text' do
350
+
351
+ context 'with no block' do
352
+
353
+ it 'can output a step' do
354
+ source = ['* a step']
355
+ source = source.join("\n")
356
+ step = clazz.new(source)
357
+
358
+ step_output = step.to_s.split("\n")
359
+
360
+ expect(step_output).to eq(['* a step'])
361
+ end
362
+
363
+ end
364
+
365
+ context 'a step with a table' do
366
+
367
+ let(:source_text) { ['* a step',
368
+ ' | value1 | value2 |',
369
+ ' | value3 | value4 |'].join("\n") }
370
+ let(:step) { clazz.new(source_text) }
371
+
372
+
373
+ it 'can output a step that has a table' do
374
+ step_output = step.to_s.split("\n")
375
+
376
+ expect(step_output).to eq(['* a step',
377
+ ' | value1 | value2 |',
378
+ ' | value3 | value4 |'])
379
+
380
+ end
381
+
382
+ it 'can be remade from its own output' do
383
+ step_output = step.to_s
384
+ remade_step_output = clazz.new(step_output).to_s
385
+
386
+ expect(remade_step_output).to eq(step_output)
387
+ end
388
+
389
+ end
390
+
391
+ context 'a step with a doc string' do
392
+
393
+ let(:source_text) { ['* a step',
394
+ ' """',
395
+ ' some text',
396
+ ' """'].join("\n") }
397
+ let(:step) { clazz.new(source_text) }
398
+
399
+
400
+ it 'can output a step that has a doc string' do
401
+ step_output = step.to_s.split("\n")
402
+
403
+ expect(step_output).to eq(['* a step',
404
+ ' """',
405
+ ' some text',
406
+ ' """'])
407
+ end
408
+
409
+ it 'can be remade from its own output' do
410
+ step_output = step.to_s
411
+ remade_step_output = clazz.new(step_output).to_s
412
+
413
+ expect(remade_step_output).to eq(step_output)
414
+ end
415
+
416
+ end
417
+
418
+ end
419
+
420
+
421
+ context 'from abstract instantiation' do
171
422
 
172
423
  let(:step) { clazz.new }
173
424