cuke_modeler 0.4.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,21 +1,78 @@
1
1
  require 'spec_helper'
2
2
 
3
- SimpleCov.command_name('FeatureFile') unless RUBY_VERSION.to_s < '1.9.0'
4
3
 
5
4
  describe 'FeatureFile, Integration' do
6
5
 
7
6
  let(:clazz) { CukeModeler::FeatureFile }
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 'provides its own filename when being parsed' do
18
+ path = "#{@default_file_directory}/#{@default_feature_file_name}"
19
+ File.open(path, "w") { |file| file.puts 'bad feature text' }
20
+
21
+ expect { clazz.new(path) }.to raise_error(/'#{path}'/)
22
+ end
23
+
12
24
  it 'cannot model a non-existent feature file' do
13
25
  path = "#{@default_file_directory}/missing_file.txt"
14
26
 
15
27
  expect { clazz.new(path) }.to raise_error(ArgumentError)
16
28
  end
17
29
 
18
- it 'properly sets its child elements' do
30
+
31
+ describe 'model population' do
32
+
33
+ let(:source_text) { "Feature: Test feature" }
34
+ let(:feature_file_path) { "#{@default_file_directory}/#{@default_feature_file_name}" }
35
+ let(:feature_file) { clazz.new(feature_file_path) }
36
+
37
+ before(:each) do
38
+ File.open(feature_file_path, "w") { |file| file.puts source_text }
39
+ end
40
+
41
+ it "models the feature file's name" do
42
+ expect(feature_file.name).to eq(@default_feature_file_name)
43
+ end
44
+
45
+ it "models the feature file's path" do
46
+ expect(feature_file.path).to eq(feature_file_path)
47
+ end
48
+
49
+ it "models the feature file's feature" do
50
+ feature_name = feature_file.feature.name
51
+
52
+ expect(feature_name).to eq('Test feature')
53
+ end
54
+
55
+ # gherkin 3.x does not accept empty feature files
56
+ context 'an empty feature file', :gherkin3 => false do
57
+
58
+ let(:source_text) { '' }
59
+ let(:feature_file_path) { "#{@default_file_directory}/#{@default_feature_file_name}" }
60
+ let(:feature_file) { clazz.new(feature_file_path) }
61
+
62
+ before(:each) do
63
+ File.open(feature_file_path, "w") { |file| file.puts source_text }
64
+ end
65
+
66
+
67
+ it "models the feature file's feature" do
68
+ expect(feature_file.feature).to be_nil
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ it 'properly sets its child models' do
19
76
  file_path = "#{@default_file_directory}/#{@default_feature_file_name}"
20
77
 
21
78
  File.open(file_path, "w") { |file|
@@ -25,9 +82,10 @@ describe 'FeatureFile, Integration' do
25
82
  file = clazz.new(file_path)
26
83
  feature = file.feature
27
84
 
28
- expect(feature.parent_element).to equal(file)
85
+ expect(feature.parent_model).to equal(file)
29
86
  end
30
87
 
88
+
31
89
  describe 'getting ancestors' do
32
90
 
33
91
  before(:each) do
@@ -53,6 +111,43 @@ describe 'FeatureFile, Integration' do
53
111
 
54
112
  end
55
113
 
114
+
115
+ describe 'feature file output' do
116
+
117
+ context 'from source text' do
118
+
119
+ let(:source_text) { "Feature: Test feature" }
120
+ let(:feature_file_path) { "#{@default_file_directory}/#{@default_feature_file_name}" }
121
+ let(:feature_file) { clazz.new(feature_file_path) }
122
+
123
+ before(:each) do
124
+ File.open(feature_file_path, "w") { |file| file.puts source_text }
125
+ end
126
+
127
+
128
+ it 'can output a feature file' do
129
+ feature_file_output = feature_file.to_s
130
+
131
+ expect(feature_file_output).to eq(feature_file_path)
132
+ end
133
+
134
+ end
135
+
136
+ it 'can be remade from its own output' do
137
+ path = "#{@default_file_directory}/#{@default_feature_file_name}"
138
+ File.open(path, "w") { |file| file.puts "Feature:" }
139
+
140
+ source = path
141
+ feature_file = clazz.new(source)
142
+
143
+ feature_file_output = feature_file.to_s
144
+ remade_feature_file_output = clazz.new(feature_file_output).to_s
145
+
146
+ expect(remade_feature_file_output).to eq(feature_file_output)
147
+ end
148
+
149
+ end
150
+
56
151
  end
57
152
 
58
153
  end
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
- SimpleCov.command_name('Feature') unless RUBY_VERSION.to_s < '1.9.0'
4
3
 
5
4
  describe 'Feature, Integration' do
6
5
 
@@ -8,9 +7,27 @@ describe 'Feature, Integration' do
8
7
  let(:feature) { clazz.new }
9
8
 
10
9
 
10
+ describe 'common behavior' do
11
+
12
+ it_should_behave_like 'a model, integration'
13
+
14
+ end
15
+
11
16
  describe 'unique behavior' do
12
17
 
13
- it 'properly sets its child elements' do
18
+ it 'can be instantiated with the minimum viable Gherkin' do
19
+ source = 'Feature:'
20
+
21
+ expect { clazz.new(source) }.to_not raise_error
22
+ end
23
+
24
+ it 'provides a descriptive filename when being parsed from stand alone text' do
25
+ source = 'bad feature text'
26
+
27
+ expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_feature\.feature'/)
28
+ end
29
+
30
+ it 'properly sets its child models' do
14
31
  source = ['@a_tag',
15
32
  'Feature: Test feature',
16
33
  ' Background: Test background',
@@ -26,13 +43,59 @@ describe 'Feature, Integration' do
26
43
  background = feature.background
27
44
  scenario = feature.tests[0]
28
45
  outline = feature.tests[1]
29
- tag = feature.tag_elements[0]
46
+ tag = feature.tags[0]
30
47
 
31
48
 
32
- expect(outline.parent_element).to equal(feature)
33
- expect(scenario.parent_element).to equal(feature)
34
- expect(background.parent_element).to equal(feature)
35
- expect(tag.parent_element).to equal(feature)
49
+ expect(outline.parent_model).to equal(feature)
50
+ expect(scenario.parent_model).to equal(feature)
51
+ expect(background.parent_model).to equal(feature)
52
+ expect(tag.parent_model).to equal(feature)
53
+ end
54
+
55
+ it 'stores the original data generated by the parsing adapter', :gherkin4 => true do
56
+ feature = clazz.new("@tag\nFeature: test feature\ndescription\nBackground:\nScenario:")
57
+ data = feature.parsing_data
58
+
59
+ expect(data.keys).to match_array([:type, :tags, :location, :language, :keyword, :name, :children, :description])
60
+ expect(data[:type]).to eq(:Feature)
61
+ end
62
+
63
+ it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
64
+ feature = clazz.new("@tag\nFeature: test feature\ndescription\nBackground:\nScenario:")
65
+ data = feature.parsing_data
66
+
67
+ expect(data.keys).to match_array([:type, :tags, :location, :language, :keyword, :name, :scenarioDefinitions, :comments, :background, :description])
68
+ expect(data[:type]).to eq(:Feature)
69
+ end
70
+
71
+ it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
72
+ feature = clazz.new("@tag\nFeature: test feature\ndescription\nBackground:\nScenario:")
73
+ data = feature.parsing_data
74
+
75
+ expect(data.keys).to match_array(['keyword', 'name', 'line', 'description', 'id', 'uri', 'elements', 'tags'])
76
+ expect(data['keyword']).to eq('Feature')
77
+ end
78
+
79
+ it 'trims whitespace from its source description' do
80
+ source = ['Feature:',
81
+ ' ',
82
+ ' description line 1',
83
+ '',
84
+ ' description line 2',
85
+ ' description line 3 ',
86
+ '',
87
+ '',
88
+ '',
89
+ ' Scenario:']
90
+ source = source.join("\n")
91
+
92
+ feature = clazz.new(source)
93
+ description = feature.description.split("\n")
94
+
95
+ expect(description).to eq([' description line 1',
96
+ '',
97
+ 'description line 2',
98
+ ' description line 3'])
36
99
  end
37
100
 
38
101
  it 'can selectively access its scenarios and outlines' do
@@ -45,28 +108,127 @@ describe 'Feature, Integration' do
45
108
  expect(feature.outlines).to match_array(outlines)
46
109
  end
47
110
 
48
- it 'knows how many scenarios it has' do
49
- scenarios = [CukeModeler::Scenario.new, CukeModeler::Scenario.new]
50
- outlines = [CukeModeler::Outline.new]
51
111
 
52
- feature.tests = []
53
- expect(feature.scenario_count).to eq(0)
112
+ describe 'model population' do
54
113
 
55
- feature.tests = scenarios + outlines
56
- expect(feature.scenario_count).to eq(2)
57
- end
114
+ context 'from source text' do
58
115
 
59
- it 'knows how many outlines it has' do
60
- scenarios = [CukeModeler::Scenario.new]
61
- outlines = [CukeModeler::Outline.new, CukeModeler::Outline.new]
116
+ it "models the feature's source line" do
117
+ source_text = "Feature:"
118
+ feature = CukeModeler::Feature.new(source_text)
62
119
 
63
- feature.tests = []
64
- expect(feature.outline_count).to eq(0)
120
+ expect(feature.source_line).to eq(1)
121
+ end
122
+
123
+
124
+ context 'a filled feature' do
125
+
126
+ let(:source_text) { '@tag_1 @tag_2
127
+ Feature: Feature Foo
128
+
129
+ Some feature description.
130
+
131
+ Some more.
132
+ And some more.
133
+
134
+ Background: The background
135
+ * some setup step
136
+
137
+ Scenario: Scenario 1
138
+ * a step
139
+
140
+ Scenario Outline: Outline 1
141
+ * a step
142
+ Examples:
143
+ | param |
144
+ | value |
145
+
146
+ Scenario: Scenario 2
147
+ * a step
148
+
149
+ Scenario Outline: Outline 2
150
+ * a step
151
+ Examples:
152
+ | param |
153
+ | value |' }
154
+ let(:feature) { clazz.new(source_text) }
155
+
156
+
157
+ it "models the feature's name" do
158
+ expect(feature.name).to eq('Feature Foo')
159
+ end
160
+
161
+ it "models the feature's description" do
162
+ description = feature.description.split("\n")
163
+
164
+ expect(description).to eq([' Some feature description.',
165
+ '',
166
+ 'Some more.',
167
+ ' And some more.'])
168
+ end
169
+
170
+ it "models the feature's background" do
171
+ expect(feature.background.name).to eq('The background')
172
+ end
173
+
174
+ it "models the feature's scenarios" do
175
+ scenario_names = feature.scenarios.collect { |scenario| scenario.name }
176
+
177
+ expect(scenario_names).to eq(['Scenario 1', 'Scenario 2'])
178
+ end
179
+
180
+ it "models the feature's outlines" do
181
+ outline_names = feature.outlines.collect { |outline| outline.name }
182
+
183
+ expect(outline_names).to eq(['Outline 1', 'Outline 2'])
184
+ end
185
+
186
+ it "models the feature's tags" do
187
+ tag_names = feature.tags.collect { |tag| tag.name }
188
+
189
+ expect(tag_names).to eq(['@tag_1', '@tag_2'])
190
+ end
191
+
192
+ end
193
+
194
+
195
+ context 'an empty feature' do
196
+
197
+ let(:source_text) { 'Feature:' }
198
+ let(:feature) { clazz.new(source_text) }
199
+
200
+
201
+ it "models the feature's name" do
202
+ expect(feature.name).to eq('')
203
+ end
204
+
205
+ it "models the feature's description" do
206
+ expect(feature.description).to eq('')
207
+ end
208
+
209
+ it "models the feature's background" do
210
+ expect(feature.background).to be_nil
211
+ end
212
+
213
+ it "models the feature's scenarios" do
214
+ expect(feature.scenarios).to eq([])
215
+ end
216
+
217
+ it "models the feature's outlines" do
218
+ expect(feature.outlines).to eq([])
219
+ end
220
+
221
+ it "models the feature's tags" do
222
+ expect(feature.tags).to eq([])
223
+ end
224
+
225
+ end
226
+
227
+ end
65
228
 
66
- feature.tests = scenarios + outlines
67
- expect(feature.outline_count).to eq(2)
68
229
  end
69
230
 
231
+
70
232
  it 'knows how many test cases it has' do
71
233
  source_1 = ['Feature: Test feature']
72
234
  source_1 = source_1.join("\n")
@@ -101,7 +263,7 @@ describe 'Feature, Integration' do
101
263
  end
102
264
 
103
265
  let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
104
- let(:feature) { directory.feature_files.first.features.first }
266
+ let(:feature) { directory.feature_files.first.feature }
105
267
 
106
268
 
107
269
  it 'can get its directory' do
@@ -124,15 +286,271 @@ describe 'Feature, Integration' do
124
286
 
125
287
  end
126
288
 
127
- describe 'feature output edge cases' do
128
289
 
129
- context 'a new feature object' do
290
+ describe 'feature output' do
291
+
292
+ it 'can be remade from its own output' do
293
+ source = ['@tag1 @tag2 @tag3',
294
+ 'Feature: A feature with everything it could have',
295
+ '',
296
+ 'Including a description',
297
+ 'and then some.',
298
+ '',
299
+ ' Background:',
300
+ '',
301
+ ' Background',
302
+ ' description',
303
+ '',
304
+ ' * a step',
305
+ ' | value1 |',
306
+ ' * another step ',
307
+ '',
308
+ ' @scenario_tag ',
309
+ ' Scenario:',
310
+ '',
311
+ ' Scenario ',
312
+ ' description ',
313
+ '',
314
+ ' * a step ',
315
+ ' * another step ',
316
+ ' """"',
317
+ ' some text ',
318
+ ' """',
319
+ '',
320
+ ' @outline_tag ',
321
+ ' Scenario Outline: ',
322
+ '',
323
+ ' Outline ',
324
+ ' description ',
325
+ '',
326
+ ' * a step ',
327
+ ' | value2 |',
328
+ ' * another step ',
329
+ ' """',
330
+ ' some text ',
331
+ ' """',
332
+ '',
333
+ ' @example_tag ',
334
+ ' Examples:',
335
+ '',
336
+ ' Example ',
337
+ ' description',
338
+ '',
339
+ ' | param |',
340
+ ' | value |']
341
+ source = source.join(" \n")
342
+ feature = clazz.new(source)
343
+
344
+ feature_output = feature.to_s
345
+ remade_feature_output = clazz.new(feature_output).to_s
346
+
347
+ expect(remade_feature_output).to eq(feature_output)
348
+ end
349
+
350
+
351
+ context 'from source text' do
352
+
353
+ it 'can output an empty feature' do
354
+ source = ['Feature:']
355
+ source = source.join("\n")
356
+ feature = clazz.new(source)
357
+
358
+ feature_output = feature.to_s.split("\n")
359
+
360
+ expect(feature_output).to eq(['Feature:'])
361
+ end
362
+
363
+ it 'can output a feature that has a name' do
364
+ source = ['Feature: test feature']
365
+ source = source.join("\n")
366
+ feature = clazz.new(source)
367
+
368
+ feature_output = feature.to_s.split("\n")
369
+
370
+ expect(feature_output).to eq(['Feature: test feature'])
371
+ end
372
+
373
+ it 'can output a feature that has a description' do
374
+ source = ['Feature:',
375
+ 'Some description.',
376
+ 'Some more description.']
377
+ source = source.join("\n")
378
+ feature = clazz.new(source)
379
+
380
+ feature_output = feature.to_s.split("\n")
381
+
382
+ expect(feature_output).to eq(['Feature:',
383
+ '',
384
+ 'Some description.',
385
+ 'Some more description.'])
386
+ end
387
+
388
+ it 'can output a feature that has tags' do
389
+ source = ['@tag1 @tag2',
390
+ '@tag3',
391
+ 'Feature:']
392
+ source = source.join("\n")
393
+ feature = clazz.new(source)
394
+
395
+ feature_output = feature.to_s.split("\n")
396
+
397
+ expect(feature_output).to eq(['@tag1 @tag2 @tag3',
398
+ 'Feature:'])
399
+ end
400
+
401
+ it 'can output a feature that has a background' do
402
+ source = ['Feature:',
403
+ 'Background:',
404
+ '* a step']
405
+ source = source.join("\n")
406
+ feature = clazz.new(source)
407
+
408
+ feature_output = feature.to_s.split("\n")
409
+
410
+ expect(feature_output).to eq(['Feature:',
411
+ '',
412
+ ' Background:',
413
+ ' * a step'])
414
+ end
415
+
416
+ it 'can output a feature that has a scenario' do
417
+ source = ['Feature:',
418
+ 'Scenario:',
419
+ '* a step']
420
+ source = source.join("\n")
421
+ feature = clazz.new(source)
422
+
423
+ feature_output = feature.to_s.split("\n")
424
+
425
+ expect(feature_output).to eq(['Feature:',
426
+ '',
427
+ ' Scenario:',
428
+ ' * a step'])
429
+ end
430
+
431
+ it 'can output a feature that has an outline' do
432
+ source = ['Feature:',
433
+ 'Scenario Outline:',
434
+ '* a step',
435
+ 'Examples:',
436
+ '|param|',
437
+ '|value|']
438
+ source = source.join("\n")
439
+ feature = clazz.new(source)
440
+
441
+ feature_output = feature.to_s.split("\n")
442
+
443
+ expect(feature_output).to eq(['Feature:',
444
+ '',
445
+ ' Scenario Outline:',
446
+ ' * a step',
447
+ '',
448
+ ' Examples:',
449
+ ' | param |',
450
+ ' | value |'])
451
+ end
452
+
453
+ it 'can output a feature that has everything' do
454
+ source = ['@tag1 @tag2 @tag3',
455
+ 'Feature: A feature with everything it could have',
456
+ 'Including a description',
457
+ 'and then some.',
458
+ 'Background:',
459
+ 'Background',
460
+ 'description',
461
+ '* a step',
462
+ '|value1|',
463
+ '* another step',
464
+ '@scenario_tag',
465
+ 'Scenario:',
466
+ 'Scenario',
467
+ 'description',
468
+ '* a step',
469
+ '* another step',
470
+ '"""',
471
+ 'some text',
472
+ '"""',
473
+ '@outline_tag',
474
+ 'Scenario Outline:',
475
+ 'Outline ',
476
+ 'description',
477
+ '* a step ',
478
+ '|value2|',
479
+ '* another step',
480
+ '"""',
481
+ 'some text',
482
+ '"""',
483
+ '@example_tag',
484
+ 'Examples:',
485
+ 'Example',
486
+ 'description',
487
+ '|param|',
488
+ '|value|']
489
+ source = source.join("\n")
490
+ feature = clazz.new(source)
491
+
492
+ feature_output = feature.to_s.split("\n")
493
+
494
+ expect(feature_output).to eq(['@tag1 @tag2 @tag3',
495
+ 'Feature: A feature with everything it could have',
496
+ '',
497
+ 'Including a description',
498
+ 'and then some.',
499
+ '',
500
+ ' Background:',
501
+ '',
502
+ ' Background',
503
+ ' description',
504
+ '',
505
+ ' * a step',
506
+ ' | value1 |',
507
+ ' * another step',
508
+ '',
509
+ ' @scenario_tag',
510
+ ' Scenario:',
511
+ '',
512
+ ' Scenario',
513
+ ' description',
514
+ '',
515
+ ' * a step',
516
+ ' * another step',
517
+ ' """',
518
+ ' some text',
519
+ ' """',
520
+ '',
521
+ ' @outline_tag',
522
+ ' Scenario Outline:',
523
+ '',
524
+ ' Outline',
525
+ ' description',
526
+ '',
527
+ ' * a step',
528
+ ' | value2 |',
529
+ ' * another step',
530
+ ' """',
531
+ ' some text',
532
+ ' """',
533
+ '',
534
+ ' @example_tag',
535
+ ' Examples:',
536
+ '',
537
+ ' Example',
538
+ ' description',
539
+ '',
540
+ ' | param |',
541
+ ' | value |'])
542
+ end
543
+
544
+ end
545
+
546
+
547
+ context 'from abstract instantiation' do
130
548
 
131
549
  let(:feature) { clazz.new }
132
550
 
133
551
 
134
- it 'can output a feature that has only tag elements' do
135
- feature.tag_elements = [CukeModeler::Tag.new]
552
+ it 'can output a feature that has only tags' do
553
+ feature.tags = [CukeModeler::Tag.new]
136
554
 
137
555
  expect { feature.to_s }.to_not raise_error
138
556
  end