cuke_modeler 0.4.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +17 -17
  3. data/.travis.yml +1 -1
  4. data/Gemfile +4 -0
  5. data/History.rdoc +71 -3
  6. data/LICENSE.txt +22 -22
  7. data/README.md +24 -10
  8. data/Rakefile +2 -12
  9. data/cuke_modeler.gemspec +1 -1
  10. data/features/analysis/test_comparison.feature +37 -122
  11. data/features/modeling/background_modeling.feature +77 -0
  12. data/features/modeling/background_output.feature +42 -0
  13. data/features/modeling/cell_modeling.feature +23 -0
  14. data/features/modeling/cell_output.feature +22 -0
  15. data/features/modeling/directory_modeling.feature +65 -0
  16. data/features/modeling/directory_output.feature +12 -0
  17. data/features/modeling/doc_string_modeling.feature +61 -0
  18. data/features/modeling/doc_string_output.feature +32 -0
  19. data/features/modeling/example_modeling.feature +125 -0
  20. data/features/modeling/example_output.feature +39 -0
  21. data/features/modeling/feature_file_modeling.feature +40 -0
  22. data/features/modeling/feature_file_output.feature +12 -0
  23. data/features/modeling/feature_modeling.feature +109 -0
  24. data/features/modeling/feature_output.feature +104 -0
  25. data/features/modeling/model_output.feature +22 -0
  26. data/features/modeling/model_structure.feature +48 -0
  27. data/features/modeling/outline_modeling.feature +144 -0
  28. data/features/modeling/outline_output.feature +69 -0
  29. data/features/modeling/row_modeling.feature +48 -0
  30. data/features/modeling/row_output.feature +22 -0
  31. data/features/modeling/scenario_modeling.feature +118 -0
  32. data/features/modeling/scenario_output.feature +45 -0
  33. data/features/modeling/step_modeling.feature +84 -0
  34. data/features/modeling/step_output.feature +29 -0
  35. data/features/modeling/table_modeling.feature +50 -0
  36. data/features/modeling/table_output.feature +24 -0
  37. data/features/modeling/tag_modeling.feature +43 -0
  38. data/features/modeling/tag_output.feature +22 -0
  39. data/features/step_definitions/action_steps.rb +11 -1
  40. data/features/step_definitions/background_steps.rb +1 -85
  41. data/features/step_definitions/directory_steps.rb +2 -48
  42. data/features/step_definitions/doc_string_steps.rb +1 -67
  43. data/features/step_definitions/feature_file_steps.rb +2 -37
  44. data/features/step_definitions/feature_steps.rb +4 -100
  45. data/features/step_definitions/modeling_steps.rb +44 -0
  46. data/features/step_definitions/setup_steps.rb +19 -41
  47. data/features/step_definitions/step_steps.rb +2 -166
  48. data/features/step_definitions/table_steps.rb +1 -58
  49. data/features/step_definitions/tag_steps.rb +2 -72
  50. data/features/step_definitions/verification_steps.rb +152 -4
  51. data/features/support/env.rb +4 -6
  52. data/gemfiles/{gherkin.gemfile → gherkin2.gemfile} +4 -0
  53. data/gemfiles/gherkin3.gemfile +4 -0
  54. data/gemfiles/gherkin4.gemfile +4 -0
  55. data/lib/cuke_modeler.rb +24 -22
  56. data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +103 -31
  57. data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +103 -40
  58. data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +111 -50
  59. data/lib/cuke_modeler/containing.rb +255 -4
  60. data/lib/cuke_modeler/described.rb +28 -0
  61. data/lib/cuke_modeler/models/background.rb +66 -0
  62. data/lib/cuke_modeler/models/cell.rb +48 -0
  63. data/lib/cuke_modeler/models/directory.rb +95 -0
  64. data/lib/cuke_modeler/models/doc_string.rb +59 -0
  65. data/lib/cuke_modeler/models/example.rb +167 -0
  66. data/lib/cuke_modeler/models/feature.rb +106 -0
  67. data/lib/cuke_modeler/models/feature_file.rb +64 -0
  68. data/lib/cuke_modeler/models/model.rb +32 -0
  69. data/lib/cuke_modeler/models/outline.rb +79 -0
  70. data/lib/cuke_modeler/models/row.rb +49 -0
  71. data/lib/cuke_modeler/models/scenario.rb +69 -0
  72. data/lib/cuke_modeler/models/step.rb +68 -0
  73. data/lib/cuke_modeler/models/table.rb +67 -0
  74. data/lib/cuke_modeler/models/tag.rb +46 -0
  75. data/lib/cuke_modeler/named.rb +19 -0
  76. data/lib/cuke_modeler/nested.rb +22 -15
  77. data/lib/cuke_modeler/parsed.rb +11 -0
  78. data/lib/cuke_modeler/parsing.rb +66 -83
  79. data/lib/cuke_modeler/sourceable.rb +3 -11
  80. data/lib/cuke_modeler/stepped.rb +24 -0
  81. data/lib/cuke_modeler/taggable.rb +6 -29
  82. data/lib/cuke_modeler/version.rb +2 -1
  83. data/spec/integration/background_integration_spec.rb +332 -7
  84. data/spec/integration/cell_integration_spec.rb +321 -0
  85. data/spec/integration/directory_integration_spec.rb +175 -9
  86. data/spec/integration/doc_string_integration_spec.rb +318 -7
  87. data/spec/integration/example_integration_spec.rb +602 -19
  88. data/spec/integration/feature_file_integration_spec.rb +98 -3
  89. data/spec/integration/feature_integration_spec.rb +445 -27
  90. data/spec/integration/gherkin_2_adapter_spec.rb +122 -0
  91. data/spec/integration/gherkin_3_adapter_spec.rb +125 -0
  92. data/spec/integration/gherkin_4_adapter_spec.rb +123 -0
  93. data/spec/integration/model_integration_spec.rb +15 -0
  94. data/spec/integration/nested_integration_spec.rb +91 -0
  95. data/spec/integration/outline_integration_spec.rb +485 -12
  96. data/spec/integration/parsing_integration_spec.rb +85 -0
  97. data/spec/integration/row_integration_spec.rb +221 -18
  98. data/spec/integration/scenario_integration_spec.rb +368 -14
  99. data/spec/integration/shared/models_integration_specs.rb +18 -0
  100. data/spec/integration/step_integration_spec.rb +328 -77
  101. data/spec/integration/table_integration_spec.rb +242 -20
  102. data/spec/integration/tag_integration_spec.rb +178 -13
  103. data/spec/spec_helper.rb +32 -18
  104. data/spec/unit/background_unit_spec.rb +24 -44
  105. data/spec/unit/cell_unit_spec.rb +73 -0
  106. data/spec/unit/described_unit_spec.rb +23 -0
  107. data/spec/unit/directory_unit_spec.rb +52 -62
  108. data/spec/unit/doc_string_unit_spec.rb +47 -100
  109. data/spec/unit/example_unit_spec.rb +50 -296
  110. data/spec/unit/feature_file_unit_spec.rb +53 -52
  111. data/spec/unit/feature_unit_spec.rb +39 -83
  112. data/spec/unit/model_unit_spec.rb +15 -0
  113. data/spec/unit/named_unit_spec.rb +23 -0
  114. data/spec/unit/nested_unit_spec.rb +24 -21
  115. data/spec/unit/outline_unit_spec.rb +46 -69
  116. data/spec/unit/parsed_unit_spec.rb +27 -0
  117. data/spec/unit/parsing_unit_spec.rb +2 -70
  118. data/spec/unit/row_unit_spec.rb +22 -51
  119. data/spec/unit/scenario_unit_spec.rb +27 -59
  120. data/spec/unit/{bare_bones_unit_specs.rb → shared/bare_bones_models_unit_specs.rb} +2 -2
  121. data/spec/unit/shared/containing_models_unit_specs.rb +18 -0
  122. data/spec/unit/shared/described_models_unit_specs.rb +38 -0
  123. data/spec/unit/shared/models_unit_specs.rb +15 -0
  124. data/spec/unit/shared/named_models_unit_specs.rb +39 -0
  125. data/spec/unit/shared/nested_models_unit_specs.rb +51 -0
  126. data/spec/unit/shared/parsed_models_unit_specs.rb +39 -0
  127. data/spec/unit/shared/prepopulated_models_unit_specs.rb +18 -0
  128. data/spec/unit/shared/sourced_models_unit_specs.rb +39 -0
  129. data/spec/unit/shared/stepped_models_unit_specs.rb +46 -0
  130. data/spec/unit/shared/stringifiable_models_unit_specs.rb +18 -0
  131. data/spec/unit/shared/tagged_models_unit_specs.rb +72 -0
  132. data/spec/unit/sourceable_unit_spec.rb +12 -4
  133. data/spec/unit/step_unit_spec.rb +40 -231
  134. data/spec/unit/stepped_unit_spec.rb +23 -0
  135. data/spec/unit/table_unit_spec.rb +27 -89
  136. data/spec/unit/tag_unit_spec.rb +30 -53
  137. data/spec/unit/taggable_unit_spec.rb +26 -42
  138. data/todo.txt +32 -0
  139. metadata +135 -217
  140. data/features/analysis/test_manipulation.feature +0 -37
  141. data/features/modeling/gherkin/background_modeling.feature +0 -65
  142. data/features/modeling/gherkin/background_output.feature +0 -131
  143. data/features/modeling/gherkin/directory_modeling.feature +0 -110
  144. data/features/modeling/gherkin/directory_output.feature +0 -14
  145. data/features/modeling/gherkin/doc_string_modeling.feature +0 -53
  146. data/features/modeling/gherkin/doc_string_output.feature +0 -72
  147. data/features/modeling/gherkin/example_modeling.feature +0 -101
  148. data/features/modeling/gherkin/example_output.feature +0 -193
  149. data/features/modeling/gherkin/feature_file_modeling.feature +0 -54
  150. data/features/modeling/gherkin/feature_file_output.feature +0 -14
  151. data/features/modeling/gherkin/feature_modeling.feature +0 -154
  152. data/features/modeling/gherkin/feature_output.feature +0 -245
  153. data/features/modeling/gherkin/outline_modeling.feature +0 -90
  154. data/features/modeling/gherkin/outline_output.feature +0 -198
  155. data/features/modeling/gherkin/row_modeling.feature +0 -68
  156. data/features/modeling/gherkin/row_output.feature +0 -28
  157. data/features/modeling/gherkin/scenario_modeling.feature +0 -79
  158. data/features/modeling/gherkin/scenario_output.feature +0 -148
  159. data/features/modeling/gherkin/step_modeling.feature +0 -75
  160. data/features/modeling/gherkin/step_output.feature +0 -53
  161. data/features/modeling/gherkin/table_modeling.feature +0 -42
  162. data/features/modeling/gherkin/table_output.feature +0 -43
  163. data/features/modeling/gherkin/table_row_modeling.feature +0 -57
  164. data/features/modeling/gherkin/table_row_output.feature +0 -28
  165. data/features/modeling/gherkin/tag_modeling.feature +0 -48
  166. data/features/modeling/gherkin/tag_output.feature +0 -17
  167. data/features/modeling/gherkin3/background_modeling.feature +0 -64
  168. data/features/modeling/gherkin3/background_output.feature +0 -131
  169. data/features/modeling/gherkin3/directory_modeling.feature +0 -110
  170. data/features/modeling/gherkin3/directory_output.feature +0 -14
  171. data/features/modeling/gherkin3/doc_string_modeling.feature +0 -53
  172. data/features/modeling/gherkin3/doc_string_output.feature +0 -72
  173. data/features/modeling/gherkin3/example_modeling.feature +0 -100
  174. data/features/modeling/gherkin3/example_output.feature +0 -207
  175. data/features/modeling/gherkin3/feature_file_modeling.feature +0 -54
  176. data/features/modeling/gherkin3/feature_file_output.feature +0 -14
  177. data/features/modeling/gherkin3/feature_modeling.feature +0 -155
  178. data/features/modeling/gherkin3/feature_output.feature +0 -249
  179. data/features/modeling/gherkin3/outline_modeling.feature +0 -89
  180. data/features/modeling/gherkin3/outline_output.feature +0 -255
  181. data/features/modeling/gherkin3/row_modeling.feature +0 -68
  182. data/features/modeling/gherkin3/row_output.feature +0 -28
  183. data/features/modeling/gherkin3/scenario_modeling.feature +0 -78
  184. data/features/modeling/gherkin3/scenario_output.feature +0 -148
  185. data/features/modeling/gherkin3/step_modeling.feature +0 -75
  186. data/features/modeling/gherkin3/step_output.feature +0 -53
  187. data/features/modeling/gherkin3/table_modeling.feature +0 -42
  188. data/features/modeling/gherkin3/table_output.feature +0 -43
  189. data/features/modeling/gherkin3/table_row_modeling.feature +0 -57
  190. data/features/modeling/gherkin3/table_row_output.feature +0 -28
  191. data/features/modeling/gherkin3/tag_modeling.feature +0 -49
  192. data/features/modeling/gherkin3/tag_output.feature +0 -17
  193. data/features/modeling/gherkin4/background_modeling.feature +0 -64
  194. data/features/modeling/gherkin4/background_output.feature +0 -131
  195. data/features/modeling/gherkin4/directory_modeling.feature +0 -110
  196. data/features/modeling/gherkin4/directory_output.feature +0 -14
  197. data/features/modeling/gherkin4/doc_string_modeling.feature +0 -53
  198. data/features/modeling/gherkin4/doc_string_output.feature +0 -72
  199. data/features/modeling/gherkin4/example_modeling.feature +0 -100
  200. data/features/modeling/gherkin4/example_output.feature +0 -193
  201. data/features/modeling/gherkin4/feature_file_modeling.feature +0 -54
  202. data/features/modeling/gherkin4/feature_file_output.feature +0 -14
  203. data/features/modeling/gherkin4/feature_modeling.feature +0 -153
  204. data/features/modeling/gherkin4/feature_output.feature +0 -245
  205. data/features/modeling/gherkin4/outline_modeling.feature +0 -89
  206. data/features/modeling/gherkin4/outline_output.feature +0 -198
  207. data/features/modeling/gherkin4/row_modeling.feature +0 -68
  208. data/features/modeling/gherkin4/row_output.feature +0 -28
  209. data/features/modeling/gherkin4/scenario_modeling.feature +0 -78
  210. data/features/modeling/gherkin4/scenario_output.feature +0 -148
  211. data/features/modeling/gherkin4/step_modeling.feature +0 -75
  212. data/features/modeling/gherkin4/step_output.feature +0 -53
  213. data/features/modeling/gherkin4/table_modeling.feature +0 -42
  214. data/features/modeling/gherkin4/table_output.feature +0 -43
  215. data/features/modeling/gherkin4/table_row_modeling.feature +0 -57
  216. data/features/modeling/gherkin4/table_row_output.feature +0 -28
  217. data/features/modeling/gherkin4/tag_modeling.feature +0 -48
  218. data/features/modeling/gherkin4/tag_output.feature +0 -17
  219. data/features/step_definitions/outline_steps.rb +0 -258
  220. data/features/step_definitions/test_steps.rb +0 -123
  221. data/lib/cuke_modeler/background.rb +0 -38
  222. data/lib/cuke_modeler/directory.rb +0 -83
  223. data/lib/cuke_modeler/doc_string.rb +0 -87
  224. data/lib/cuke_modeler/example.rb +0 -195
  225. data/lib/cuke_modeler/feature.rb +0 -147
  226. data/lib/cuke_modeler/feature_element.rb +0 -73
  227. data/lib/cuke_modeler/feature_file.rb +0 -77
  228. data/lib/cuke_modeler/outline.rb +0 -68
  229. data/lib/cuke_modeler/raw.rb +0 -20
  230. data/lib/cuke_modeler/row.rb +0 -64
  231. data/lib/cuke_modeler/scenario.rb +0 -45
  232. data/lib/cuke_modeler/step.rb +0 -216
  233. data/lib/cuke_modeler/table.rb +0 -90
  234. data/lib/cuke_modeler/table_row.rb +0 -64
  235. data/lib/cuke_modeler/tag.rb +0 -62
  236. data/lib/cuke_modeler/test_element.rb +0 -79
  237. data/lib/cuke_modeler/world.rb +0 -113
  238. data/spec/integration/table_row_integration_spec.rb +0 -76
  239. data/spec/integration/world_integration_spec.rb +0 -14
  240. data/spec/unit/containing_element_unit_specs.rb +0 -18
  241. data/spec/unit/feature_element_unit_spec.rb +0 -19
  242. data/spec/unit/feature_element_unit_specs.rb +0 -52
  243. data/spec/unit/nested_element_unit_specs.rb +0 -39
  244. data/spec/unit/prepopulated_unit_specs.rb +0 -14
  245. data/spec/unit/raw_element_unit_specs.rb +0 -27
  246. data/spec/unit/raw_unit_spec.rb +0 -28
  247. data/spec/unit/sourced_element_unit_specs.rb +0 -18
  248. data/spec/unit/table_row_unit_spec.rb +0 -102
  249. data/spec/unit/tagged_element_unit_specs.rb +0 -67
  250. data/spec/unit/test_element_unit_spec.rb +0 -54
  251. data/spec/unit/test_element_unit_specs.rb +0 -34
  252. data/spec/unit/world_unit_spec.rb +0 -140
@@ -1,15 +1,153 @@
1
1
  require 'spec_helper'
2
2
 
3
- SimpleCov.command_name('Directory') unless RUBY_VERSION.to_s < '1.9.0'
4
3
 
5
4
  describe 'Directory, Integration' do
6
5
 
7
6
  let(:clazz) { CukeModeler::Directory }
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
+
19
+ describe 'modeling directories' do
20
+
21
+
22
+ context 'with an existing directory' do
23
+
24
+ let(:directory_path) { "#{@default_file_directory}/test_directory" }
25
+ let(:directory) { clazz.new(directory_path) }
26
+
27
+ before(:each) do
28
+ FileUtils.mkdir(directory_path)
29
+ end
30
+
31
+
32
+ it 'models the path of the directory' do
33
+ expect(directory.path).to eq(directory_path)
34
+ end
35
+
36
+ it 'models the name of the directory' do
37
+ name = File.basename(directory_path)
38
+
39
+ expect(directory.name).to eq(name)
40
+ end
41
+
42
+
43
+ context 'with both files and feature files' do
44
+
45
+ let(:feature_files) { ['test_file_1.feature', 'test_file_2.feature'] }
46
+ let(:non_feature_files) { ['random.file'] }
47
+
48
+ before(:each) do
49
+ feature_files.each do |file_name|
50
+ # Some versions of Gherkin require feature content to be present in feature files
51
+ File.open("#{directory_path}/#{file_name}", "w") { |file|
52
+ file.puts('Feature: Test feature')
53
+ }
54
+ end
55
+
56
+ non_feature_files.each do |file_name|
57
+ FileUtils.touch("#{directory_path}/#{file_name}")
58
+ end
59
+ end
60
+
61
+
62
+ it 'models the feature files contained in the directory' do
63
+ modeled_files = directory.feature_files.collect { |file| file.name }
64
+
65
+ expect(modeled_files).to match_array(feature_files)
66
+ end
67
+
68
+ it 'does not model non-feature files contained in the directory' do
69
+ modeled_files = directory.feature_files.collect { |file| file.name }
70
+
71
+ non_feature_files.all? do |file|
72
+ expect(modeled_files).to_not include(file)
73
+ end
74
+ end
75
+
76
+ end
77
+
78
+
79
+ context 'with no feature files' do
80
+
81
+ before(:each) do
82
+ FileUtils.rm(Dir.glob("#{directory_path}/*"))
83
+ end
84
+
85
+
86
+ it 'models the feature files contained in the directory' do
87
+ modeled_files = directory.feature_files.collect { |file| file.name }
88
+
89
+ expect(modeled_files).to eq([])
90
+ end
91
+
92
+ end
93
+
94
+
95
+ context 'with a nested directory' do
96
+
97
+ let(:nested_directories) { ['nested_directory_1', 'nested_directory_2'] }
98
+
99
+ before(:each) do
100
+ nested_directories.each do |nested_directory|
101
+ FileUtils.mkdir("#{directory_path}/#{nested_directory}")
102
+ end
103
+ end
104
+
105
+ it 'models the directories in the directory' do
106
+ modeled_directories = directory.directories.collect { |nested_directory| nested_directory.name }
107
+
108
+ expect(modeled_directories).to match_array(nested_directories)
109
+ end
110
+
111
+ end
112
+
113
+
114
+ context 'with no directories' do
115
+
116
+ before(:each) do
117
+ FileUtils.rm_r(Dir.glob("#{directory_path}/*"))
118
+ end
119
+
120
+
121
+ it 'models the directories contained in the directory' do
122
+ modeled_directories = directory.directories.collect { |nested_directory| nested_directory.name }
123
+
124
+ expect(modeled_directories).to eq([])
125
+ end
126
+
127
+ end
128
+
129
+ end
130
+
131
+
132
+ context 'with a non-existing directory' do
133
+
134
+ let(:directory_path) { "#{@default_file_directory}/test_directory" }
135
+
136
+ before(:each) do
137
+ FileUtils.remove_dir(directory_path, true)
138
+ end
139
+
140
+
141
+ it 'cannot model a non-existent directory' do
142
+ expect { clazz.new(directory_path) }.to raise_error(ArgumentError)
143
+ end
144
+
145
+ end
146
+
147
+ end
148
+
149
+
150
+ it 'properly sets its child models' do
13
151
  nested_directory = "#{@default_file_directory}/nested_directory"
14
152
  file_path = "#{@default_file_directory}/#{@default_feature_file_name}"
15
153
 
@@ -22,15 +160,10 @@ describe 'Directory, Integration' do
22
160
  nested_directory = directory.directories.first
23
161
  file = directory.feature_files.first
24
162
 
25
- expect(nested_directory.parent_element).to equal(directory)
26
- expect(file.parent_element).to equal(directory)
163
+ expect(nested_directory.parent_model).to equal(directory)
164
+ expect(file.parent_model).to equal(directory)
27
165
  end
28
166
 
29
- it 'cannot model a non-existent directory' do
30
- path = "#{@default_file_directory}/missing_directory"
31
-
32
- expect { clazz.new(path) }.to raise_error(ArgumentError)
33
- end
34
167
 
35
168
  describe 'getting ancestors' do
36
169
 
@@ -56,6 +189,39 @@ describe 'Directory, Integration' do
56
189
 
57
190
  end
58
191
 
192
+
193
+ describe 'directory output' do
194
+
195
+ context 'from source text' do
196
+
197
+ let(:directory_path) { "#{@default_file_directory}/test_directory" }
198
+ let(:directory) { clazz.new(directory_path) }
199
+
200
+ before(:each) do
201
+ FileUtils.mkdir(directory_path)
202
+ end
203
+
204
+
205
+ it 'can output a directory' do
206
+ directory_output = directory.to_s
207
+
208
+ expect(directory_output).to eq(directory_path)
209
+ end
210
+
211
+ end
212
+
213
+ it 'can be remade from its own output' do
214
+ source = @default_file_directory
215
+ directory = clazz.new(source)
216
+
217
+ directory_output = directory.to_s
218
+ remade_directory_output = clazz.new(directory_output).to_s
219
+
220
+ expect(remade_directory_output).to eq(directory_output)
221
+ end
222
+
223
+ end
224
+
59
225
  end
60
226
 
61
227
  end
@@ -1,14 +1,65 @@
1
1
  require 'spec_helper'
2
2
 
3
- SimpleCov.command_name('DocString') unless RUBY_VERSION.to_s < '1.9.0'
4
3
 
5
4
  describe 'DocString, Integration' do
6
5
 
7
6
  let(:clazz) { CukeModeler::DocString }
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 = "\"\"\"\n\"\"\""
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 doc string text'
25
+
26
+ expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_doc_string\.feature'/)
27
+ end
28
+
29
+ it 'stores the original data generated by the parsing adapter', :gherkin4 => true do
30
+ doc_string = clazz.new("\"\"\" content type\nsome doc string\n\"\"\"")
31
+ data = doc_string.parsing_data
32
+
33
+ expect(data.keys).to match_array([:type, :location, :content, :contentType])
34
+ expect(data[:type]).to eq(:DocString)
35
+ end
36
+
37
+ it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
38
+ doc_string = clazz.new("\"\"\" content type\nsome doc string\n\"\"\"")
39
+ data = doc_string.parsing_data
40
+
41
+ expect(data.keys).to match_array([:type, :location, :content, :contentType])
42
+ expect(data[:type]).to eq(:DocString)
43
+ end
44
+
45
+ it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
46
+ doc_string = clazz.new("\"\"\" content type\nsome doc string\n\"\"\"")
47
+ data = doc_string.parsing_data
48
+
49
+ expect(data.keys).to match_array(['value', 'content_type', 'line'])
50
+ expect(data['value']).to eq('some doc string')
51
+ end
52
+
53
+ it 'stores its content as a String' do
54
+ source = "\"\"\"\nsome text\nsome more text\n\"\"\""
55
+ doc_string = clazz.new(source)
56
+
57
+ content = doc_string.content
58
+
59
+ expect(content).to be_a(String)
60
+ end
61
+
62
+
12
63
  describe 'getting ancestors' do
13
64
 
14
65
  before(:each) do
@@ -28,7 +79,7 @@ describe 'DocString, Integration' do
28
79
  end
29
80
 
30
81
  let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
31
- let(:doc_string) { directory.feature_files.first.features.first.tests.first.steps.first.block }
82
+ let(:doc_string) { directory.feature_files.first.feature.tests.first.steps.first.block }
32
83
 
33
84
 
34
85
  it 'can get its directory' do
@@ -46,19 +97,103 @@ describe 'DocString, Integration' do
46
97
  it 'can get its feature' do
47
98
  ancestor = doc_string.get_ancestor(:feature)
48
99
 
49
- expect(ancestor).to equal(directory.feature_files.first.features.first)
100
+ expect(ancestor).to equal(directory.feature_files.first.feature)
50
101
  end
51
102
 
52
- it 'can get its test' do
53
- ancestor = doc_string.get_ancestor(:test)
103
+ context 'a doc string that is part of a scenario' do
104
+
105
+ before(:each) do
106
+ source = 'Feature: Test feature
107
+
108
+ Scenario: Test test
109
+ * a big step:
110
+ """
111
+ a
112
+ doc
113
+ string
114
+ """'
115
+
116
+ file_path = "#{@default_file_directory}/doc_string_test_file.feature"
117
+ File.open(file_path, 'w') { |file| file.write(source) }
118
+ end
119
+
120
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
121
+ let(:doc_string) { directory.feature_files.first.feature.tests.first.steps.first.block }
122
+
123
+
124
+ it 'can get its scenario' do
125
+ ancestor = doc_string.get_ancestor(:scenario)
126
+
127
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first)
128
+ end
129
+
130
+ end
131
+
132
+ context 'a doc string that is part of an outline' do
133
+
134
+ before(:each) do
135
+ source = 'Feature: Test feature
136
+
137
+ Scenario Outline: Test outline
138
+ * a big step:
139
+ """
140
+ a
141
+ doc
142
+ string
143
+ """
144
+ Examples:
145
+ | param |
146
+ | value |'
147
+
148
+ file_path = "#{@default_file_directory}/doc_string_test_file.feature"
149
+ File.open(file_path, 'w') { |file| file.write(source) }
150
+ end
151
+
152
+ let(:directory) { CukeModeler::Directory.new(@default_file_directory) }
153
+ let(:doc_string) { directory.feature_files.first.feature.tests.first.steps.first.block }
154
+
155
+
156
+ it 'can get its outline' do
157
+ ancestor = doc_string.get_ancestor(:outline)
158
+
159
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first)
160
+ end
161
+
162
+ end
163
+
164
+ context 'a doc string that is part of a background' do
165
+
166
+ before(:each) do
167
+ source = 'Feature: Test feature
168
+
169
+ Background: Test background
170
+ * a big step:
171
+ """
172
+ a
173
+ doc
174
+ string
175
+ """'
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(:doc_string) { directory.feature_files.first.feature.background.steps.first.block }
183
+
184
+
185
+ it 'can get its background' do
186
+ ancestor = doc_string.get_ancestor(:background)
187
+
188
+ expect(ancestor).to equal(directory.feature_files.first.feature.background)
189
+ end
54
190
 
55
- expect(ancestor).to equal(directory.feature_files.first.features.first.tests.first)
56
191
  end
57
192
 
58
193
  it 'can get its step' do
59
194
  ancestor = doc_string.get_ancestor(:step)
60
195
 
61
- expect(ancestor).to equal(directory.feature_files.first.features.first.tests.first.steps.first)
196
+ expect(ancestor).to equal(directory.feature_files.first.feature.tests.first.steps.first)
62
197
  end
63
198
 
64
199
  it 'returns nil if it does not have the requested type of ancestor' do
@@ -69,6 +204,182 @@ describe 'DocString, Integration' do
69
204
 
70
205
  end
71
206
 
207
+
208
+ describe 'model population' do
209
+
210
+ context 'from source text' do
211
+
212
+ context 'a filled doc string' do
213
+
214
+ let(:source_text) { ['""" type foo',
215
+ 'bar',
216
+ '"""'].join("\n") }
217
+ let(:doc_string) { clazz.new(source_text) }
218
+
219
+
220
+ it "models the doc string's content type" do
221
+ expect(doc_string.content_type).to eq('type foo')
222
+ end
223
+
224
+ it "models the doc_string's content" do
225
+ expect(doc_string.content).to eq('bar')
226
+ end
227
+
228
+ end
229
+
230
+ context 'an empty doc_string' do
231
+
232
+ let(:source_text) { '"""
233
+ """' }
234
+ let(:doc_string) { clazz.new(source_text) }
235
+
236
+ it "models the doc_string's content type" do
237
+ expect(doc_string.content_type).to be_nil
238
+ end
239
+
240
+ it "models the doc_string's content" do
241
+ expect(doc_string.content).to eq('')
242
+ end
243
+
244
+ end
245
+
246
+ it "models the doc string's source line" do
247
+ source_text = 'Feature:
248
+
249
+ Scenario:
250
+ * step
251
+ """
252
+ foo
253
+ """'
254
+ doc_string = CukeModeler::Feature.new(source_text).tests.first.steps.first.block
255
+
256
+ expect(doc_string.source_line).to eq(5)
257
+ end
258
+
259
+ end
260
+
261
+ end
262
+
263
+
264
+ describe 'doc string output' do
265
+
266
+ it 'can be remade from its own output' do
267
+ source = ['"""" the type',
268
+ '* a step',
269
+ ' \"\"\"',
270
+ ' that also has a doc string',
271
+ ' \"\"\"',
272
+ '"""']
273
+ source = source.join("\n")
274
+ doc_string = clazz.new(source)
275
+
276
+ doc_string_output = doc_string.to_s
277
+ remade_doc_string_output = clazz.new(doc_string_output).to_s
278
+
279
+ expect(remade_doc_string_output).to eq(doc_string_output)
280
+ end
281
+
282
+
283
+ context 'from source text' do
284
+
285
+ it 'can output an empty doc string' do
286
+ source = ['"""',
287
+ '"""']
288
+ source = source.join("\n")
289
+ doc_string = clazz.new(source)
290
+
291
+ doc_string_output = doc_string.to_s.split("\n")
292
+
293
+ expect(doc_string_output).to eq(['"""', '"""'])
294
+ end
295
+
296
+ it 'can output a doc string that has a content type' do
297
+ source = ['""" foo',
298
+ '"""']
299
+ source = source.join("\n")
300
+ doc_string = clazz.new(source)
301
+
302
+ doc_string_output = doc_string.to_s.split("\n")
303
+
304
+ expect(doc_string_output).to eq(['""" foo',
305
+ '"""'])
306
+ end
307
+
308
+ it 'can output a doc_string that has contents' do
309
+ source = ['"""',
310
+ 'foo',
311
+ '"""']
312
+ source = source.join("\n")
313
+ doc_string = clazz.new(source)
314
+
315
+ doc_string_output = doc_string.to_s.split("\n")
316
+
317
+ expect(doc_string_output).to eq(['"""',
318
+ 'foo',
319
+ '"""'])
320
+ end
321
+
322
+ # Since triple double quotes mark the beginning and end of a doc string, any triple
323
+ # double quotes inside of the doc string (which would have had to have been escaped
324
+ # to get inside in the first place) will be escaped when outputted so as to
325
+ # retain the quality of being able to use the output directly as gherkin.
326
+
327
+ it 'can output a doc_string that has triple double quotes in the contents' do
328
+ source = ['"""',
329
+ 'a \"\"\"',
330
+ '\"\"\" again',
331
+ '"""']
332
+ source = source.join("\n")
333
+ doc_string = clazz.new(source)
334
+
335
+ doc_string_output = doc_string.to_s.split("\n")
336
+
337
+ expect(doc_string_output).to eq(['"""',
338
+ 'a \"\"\"',
339
+ '\"\"\" again',
340
+ '"""'])
341
+ end
342
+
343
+ # Double quotes that are not three (or more) in a row do not seem to need and special escaping when
344
+ # used in Gherkin. Therefore they should be left alone.
345
+ it 'only escapes triple double quotes' do
346
+ source = ['"""',
347
+ 'change these \"\"\"\"\"\"',
348
+ 'but leave " and "" alone',
349
+ '"""']
350
+ source = source.join("\n")
351
+ doc_string = clazz.new(source)
352
+
353
+ doc_string_output = doc_string.to_s.split("\n")
354
+
355
+ expect(doc_string_output).to eq(['"""',
356
+ 'change these \"\"\"\"\"\"',
357
+ 'but leave " and "" alone',
358
+ '"""'])
359
+ end
360
+
361
+ it 'can output a doc string that has everything' do
362
+ source = ['""" type foo',
363
+ '\"\"\"',
364
+ 'bar',
365
+ '\"\"\"',
366
+ '"""']
367
+ source = source.join("\n")
368
+ doc_string = clazz.new(source)
369
+
370
+ doc_string_output = doc_string.to_s.split("\n")
371
+
372
+ expect(doc_string_output).to eq(['""" type foo',
373
+ '\"\"\"',
374
+ 'bar',
375
+ '\"\"\"',
376
+ '"""'])
377
+ end
378
+
379
+ end
380
+
381
+ end
382
+
72
383
  end
73
384
 
74
385
  end