cuke_modeler 1.4.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +329 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +25 -18
  5. data/cuke_modeler.gemspec +15 -9
  6. data/lib/cuke_modeler/adapters/gherkin_10_adapter.rb +12 -0
  7. data/lib/cuke_modeler/adapters/gherkin_11_adapter.rb +12 -0
  8. data/lib/cuke_modeler/adapters/gherkin_12_adapter.rb +12 -0
  9. data/lib/cuke_modeler/adapters/gherkin_13_adapter.rb +12 -0
  10. data/lib/cuke_modeler/adapters/{gherkin_6_adapter.rb → gherkin_9_adapter.rb} +75 -64
  11. data/lib/cuke_modeler/containing.rb +16 -0
  12. data/lib/cuke_modeler/described.rb +1 -0
  13. data/lib/cuke_modeler/models/background.rb +1 -1
  14. data/lib/cuke_modeler/models/cell.rb +1 -1
  15. data/lib/cuke_modeler/models/comment.rb +1 -1
  16. data/lib/cuke_modeler/models/directory.rb +2 -2
  17. data/lib/cuke_modeler/models/doc_string.rb +1 -1
  18. data/lib/cuke_modeler/models/example.rb +1 -1
  19. data/lib/cuke_modeler/models/feature.rb +1 -1
  20. data/lib/cuke_modeler/models/feature_file.rb +2 -2
  21. data/lib/cuke_modeler/models/outline.rb +1 -1
  22. data/lib/cuke_modeler/models/row.rb +1 -1
  23. data/lib/cuke_modeler/models/scenario.rb +1 -1
  24. data/lib/cuke_modeler/models/step.rb +32 -3
  25. data/lib/cuke_modeler/models/table.rb +1 -1
  26. data/lib/cuke_modeler/models/tag.rb +1 -1
  27. data/lib/cuke_modeler/named.rb +1 -0
  28. data/lib/cuke_modeler/nested.rb +1 -0
  29. data/lib/cuke_modeler/parsed.rb +1 -0
  30. data/lib/cuke_modeler/parsing.rb +88 -92
  31. data/lib/cuke_modeler/sourceable.rb +1 -0
  32. data/lib/cuke_modeler/stepped.rb +1 -0
  33. data/lib/cuke_modeler/taggable.rb +1 -0
  34. data/lib/cuke_modeler/version.rb +1 -1
  35. data/testing/cucumber/features/analysis/step_comparison.feature +25 -0
  36. data/testing/cucumber/features/analysis/test_comparison.feature +1 -1
  37. metadata +55 -142
  38. data/.gitignore +0 -18
  39. data/.simplecov +0 -7
  40. data/.travis.yml +0 -54
  41. data/Gemfile +0 -36
  42. data/History.md +0 -191
  43. data/Rakefile +0 -63
  44. data/appveyor.yml +0 -43
  45. data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +0 -273
  46. data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +0 -296
  47. data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +0 -308
  48. data/testing/cucumber/step_definitions/action_steps.rb +0 -13
  49. data/testing/cucumber/step_definitions/background_steps.rb +0 -1
  50. data/testing/cucumber/step_definitions/directory_steps.rb +0 -6
  51. data/testing/cucumber/step_definitions/doc_string_steps.rb +0 -1
  52. data/testing/cucumber/step_definitions/feature_file_steps.rb +0 -16
  53. data/testing/cucumber/step_definitions/feature_steps.rb +0 -7
  54. data/testing/cucumber/step_definitions/modeling_steps.rb +0 -44
  55. data/testing/cucumber/step_definitions/setup_steps.rb +0 -32
  56. data/testing/cucumber/step_definitions/step_steps.rb +0 -3
  57. data/testing/cucumber/step_definitions/table_steps.rb +0 -1
  58. data/testing/cucumber/step_definitions/tag_steps.rb +0 -3
  59. data/testing/cucumber/step_definitions/verification_steps.rb +0 -173
  60. data/testing/cucumber/support/env.rb +0 -30
  61. data/testing/dialect_helper.rb +0 -48
  62. data/testing/file_helper.rb +0 -47
  63. data/testing/gemfiles/gherkin2.gemfile +0 -32
  64. data/testing/gemfiles/gherkin3.gemfile +0 -26
  65. data/testing/gemfiles/gherkin4.gemfile +0 -27
  66. data/testing/gemfiles/gherkin5.gemfile +0 -26
  67. data/testing/gemfiles/gherkin6.gemfile +0 -10
  68. data/testing/rspec/spec/integration/background_integration_spec.rb +0 -442
  69. data/testing/rspec/spec/integration/cell_integration_spec.rb +0 -335
  70. data/testing/rspec/spec/integration/comment_integration_spec.rb +0 -177
  71. data/testing/rspec/spec/integration/directory_integration_spec.rb +0 -218
  72. data/testing/rspec/spec/integration/doc_string_integration_spec.rb +0 -402
  73. data/testing/rspec/spec/integration/example_integration_spec.rb +0 -741
  74. data/testing/rspec/spec/integration/feature_file_integration_spec.rb +0 -272
  75. data/testing/rspec/spec/integration/feature_integration_spec.rb +0 -650
  76. data/testing/rspec/spec/integration/gherkin_2_adapter_spec.rb +0 -166
  77. data/testing/rspec/spec/integration/gherkin_3_adapter_spec.rb +0 -166
  78. data/testing/rspec/spec/integration/gherkin_4_adapter_spec.rb +0 -165
  79. data/testing/rspec/spec/integration/gherkin_6_adapter_spec.rb +0 -166
  80. data/testing/rspec/spec/integration/model_integration_spec.rb +0 -15
  81. data/testing/rspec/spec/integration/nested_integration_spec.rb +0 -91
  82. data/testing/rspec/spec/integration/outline_integration_spec.rb +0 -624
  83. data/testing/rspec/spec/integration/parsing_integration_spec.rb +0 -117
  84. data/testing/rspec/spec/integration/row_integration_spec.rb +0 -291
  85. data/testing/rspec/spec/integration/scenario_integration_spec.rb +0 -479
  86. data/testing/rspec/spec/integration/shared/models_integration_specs.rb +0 -18
  87. data/testing/rspec/spec/integration/step_integration_spec.rb +0 -475
  88. data/testing/rspec/spec/integration/table_integration_spec.rb +0 -337
  89. data/testing/rspec/spec/integration/tag_integration_spec.rb +0 -259
  90. data/testing/rspec/spec/spec_helper.rb +0 -122
  91. data/testing/rspec/spec/unit/background_unit_spec.rb +0 -83
  92. data/testing/rspec/spec/unit/cell_unit_spec.rb +0 -68
  93. data/testing/rspec/spec/unit/comment_unit_spec.rb +0 -68
  94. data/testing/rspec/spec/unit/described_unit_spec.rb +0 -23
  95. data/testing/rspec/spec/unit/directory_unit_spec.rb +0 -127
  96. data/testing/rspec/spec/unit/doc_string_unit_spec.rb +0 -100
  97. data/testing/rspec/spec/unit/example_unit_spec.rb +0 -133
  98. data/testing/rspec/spec/unit/feature_file_unit_spec.rb +0 -125
  99. data/testing/rspec/spec/unit/feature_unit_spec.rb +0 -157
  100. data/testing/rspec/spec/unit/model_unit_spec.rb +0 -15
  101. data/testing/rspec/spec/unit/named_unit_spec.rb +0 -23
  102. data/testing/rspec/spec/unit/nested_unit_spec.rb +0 -43
  103. data/testing/rspec/spec/unit/outline_unit_spec.rb +0 -117
  104. data/testing/rspec/spec/unit/parsed_unit_spec.rb +0 -27
  105. data/testing/rspec/spec/unit/parsing_unit_spec.rb +0 -54
  106. data/testing/rspec/spec/unit/row_unit_spec.rb +0 -68
  107. data/testing/rspec/spec/unit/scenario_unit_spec.rb +0 -86
  108. data/testing/rspec/spec/unit/shared/bare_bones_models_unit_specs.rb +0 -14
  109. data/testing/rspec/spec/unit/shared/containing_models_unit_specs.rb +0 -25
  110. data/testing/rspec/spec/unit/shared/described_models_unit_specs.rb +0 -38
  111. data/testing/rspec/spec/unit/shared/keyworded_models_unit_specs.rb +0 -58
  112. data/testing/rspec/spec/unit/shared/models_unit_specs.rb +0 -15
  113. data/testing/rspec/spec/unit/shared/named_models_unit_specs.rb +0 -39
  114. data/testing/rspec/spec/unit/shared/nested_models_unit_specs.rb +0 -51
  115. data/testing/rspec/spec/unit/shared/parsed_models_unit_specs.rb +0 -39
  116. data/testing/rspec/spec/unit/shared/prepopulated_models_unit_specs.rb +0 -18
  117. data/testing/rspec/spec/unit/shared/sourced_models_unit_specs.rb +0 -39
  118. data/testing/rspec/spec/unit/shared/stepped_models_unit_specs.rb +0 -46
  119. data/testing/rspec/spec/unit/shared/stringifiable_models_unit_specs.rb +0 -18
  120. data/testing/rspec/spec/unit/shared/tagged_models_unit_specs.rb +0 -72
  121. data/testing/rspec/spec/unit/sourceable_unit_spec.rb +0 -27
  122. data/testing/rspec/spec/unit/step_unit_spec.rb +0 -109
  123. data/testing/rspec/spec/unit/stepped_unit_spec.rb +0 -23
  124. data/testing/rspec/spec/unit/table_unit_spec.rb +0 -77
  125. data/testing/rspec/spec/unit/tag_unit_spec.rb +0 -68
  126. data/testing/rspec/spec/unit/taggable_unit_spec.rb +0 -69
  127. data/testing/test_languages.json +0 -45
  128. data/todo.txt +0 -24
@@ -1,218 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
2
-
3
-
4
- describe 'Directory, Integration' do
5
-
6
- let(:clazz) { CukeModeler::Directory }
7
-
8
-
9
- describe 'common behavior' do
10
-
11
- it_should_behave_like 'a model, integration'
12
-
13
- end
14
-
15
-
16
- describe 'unique behavior' do
17
-
18
-
19
- describe 'modeling directories' do
20
-
21
-
22
- context 'with an existing directory' do
23
-
24
- let(:root_test_path) { CukeModeler::FileHelper.create_directory }
25
-
26
- let(:directory_path) { CukeModeler::FileHelper.create_directory(:name => 'nested_directory', :directory => root_test_path) }
27
- let(:directory_model) { clazz.new(directory_path) }
28
-
29
-
30
- it 'models the path of the directory' do
31
- expect(directory_model.path).to eq(directory_path)
32
- end
33
-
34
- it 'models the name of the directory' do
35
- name = File.basename(directory_path)
36
-
37
- expect(directory_model.name).to eq(name)
38
- end
39
-
40
-
41
- context 'with both files and feature files' do
42
-
43
- let(:feature_files) { ['test_file_1', 'test_file_2'] }
44
- let(:non_feature_files) { ['test_file_3'] }
45
-
46
- before(:each) do
47
- feature_files.each do |file_name|
48
- # Some versions of Gherkin require feature content to be present in feature files
49
- CukeModeler::FileHelper.create_feature_file(:text => "#{FEATURE_KEYWORD}: Test feature", :name => file_name, :directory => directory_path)
50
- end
51
-
52
- non_feature_files.each do |file_name|
53
- CukeModeler::FileHelper.create_file(:text => '', :name => file_name, :extension => '.file', :directory => directory_path)
54
- end
55
- end
56
-
57
-
58
- it 'models the feature files contained in the directory' do
59
- modeled_files = directory_model.feature_files.collect { |file| file.name[/test_file_\d/] }
60
-
61
- expect(modeled_files).to match_array(feature_files)
62
- end
63
-
64
- it 'does not model non-feature files contained in the directory' do
65
- modeled_files = directory_model.feature_files.collect { |file| file.name[/test_file_\d/] }
66
-
67
- non_feature_files.all? do |file|
68
- expect(modeled_files).to_not include(file)
69
- end
70
- end
71
-
72
- end
73
-
74
-
75
- context 'with no feature files' do
76
-
77
- let(:directory_path) { CukeModeler::FileHelper.create_directory(:name => 'empty_directory', :directory => root_test_path) }
78
- let(:directory_model) { clazz.new(directory_path) }
79
-
80
-
81
- it 'models the feature files contained in the directory' do
82
- modeled_files = directory_model.feature_files.collect { |file| file.name }
83
-
84
- expect(modeled_files).to eq([])
85
- end
86
-
87
- end
88
-
89
-
90
- context 'with a nested directory' do
91
-
92
- let(:directory_path) { CukeModeler::FileHelper.create_directory(:name => 'test_directory', :directory => root_test_path) }
93
- let(:directory_model) { clazz.new(directory_path) }
94
-
95
- let(:nested_directories) { ['nested_directory_1', 'nested_directory_2'] }
96
-
97
- before(:each) do
98
- nested_directories.each do |nested_directory|
99
- CukeModeler::FileHelper.create_directory(:name => nested_directory, :directory => directory_path)
100
- end
101
- end
102
-
103
-
104
- it 'models the directories in the directory' do
105
- modeled_directories = directory_model.directories.collect { |nested_directory| nested_directory.name[/nested_directory_\d/] }
106
-
107
- expect(modeled_directories).to match_array(nested_directories)
108
- end
109
-
110
- end
111
-
112
-
113
- context 'with no directories' do
114
-
115
- let(:directory_path) { CukeModeler::FileHelper.create_directory(:name => 'empty_directory', :directory => root_test_path) }
116
- let(:directory_model) { clazz.new(directory_path) }
117
-
118
-
119
- it 'models the directories contained in the directory' do
120
- modeled_directories = directory_model.directories.collect { |nested_directory| nested_directory.name }
121
-
122
- expect(modeled_directories).to eq([])
123
- end
124
-
125
- end
126
-
127
- end
128
-
129
-
130
- context 'with a non-existing directory' do
131
-
132
- let(:root_test_path) { CukeModeler::FileHelper.create_directory }
133
- let(:directory_path) { "#{root_test_path}/this_directory_should_not_exist" }
134
-
135
-
136
- it 'cannot model a non-existent directory' do
137
- expect { clazz.new(directory_path) }.to raise_error(ArgumentError)
138
- end
139
-
140
- end
141
-
142
- end
143
-
144
-
145
- it 'properly sets its child models' do
146
- directory_path = CukeModeler::FileHelper.create_directory
147
- _nested_directory_path = CukeModeler::FileHelper.create_directory(:name => 'nested_directory', :directory => directory_path)
148
-
149
- CukeModeler::FileHelper.create_feature_file(:text => "#{FEATURE_KEYWORD}: Test feature", :name => 'test_file', :directory => directory_path)
150
-
151
-
152
- directory_model = clazz.new(directory_path)
153
- nested_directory_model = directory_model.directories.first
154
- file_model = directory_model.feature_files.first
155
-
156
- expect(nested_directory_model.parent_model).to equal(directory_model)
157
- expect(file_model.parent_model).to equal(directory_model)
158
- end
159
-
160
-
161
- describe 'getting ancestors' do
162
-
163
- before(:each) do
164
- CukeModeler::FileHelper.create_directory(:name => 'nested_directory', :directory => test_directory)
165
- end
166
-
167
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
168
-
169
- let(:directory_model) { clazz.new(test_directory) }
170
- let(:nested_directory_model) { directory_model.directories.first }
171
-
172
-
173
- it 'can get its directory' do
174
- ancestor = nested_directory_model.get_ancestor(:directory)
175
-
176
- expect(ancestor).to equal(directory_model)
177
- end
178
-
179
- it 'returns nil if it does not have the requested type of ancestor' do
180
- ancestor = nested_directory_model.get_ancestor(:example)
181
-
182
- expect(ancestor).to be_nil
183
- end
184
-
185
- end
186
-
187
-
188
- describe 'directory output' do
189
-
190
- context 'from source text' do
191
-
192
- let(:directory_path) { CukeModeler::FileHelper.create_directory }
193
- let(:directory_model) { clazz.new(directory_path) }
194
-
195
-
196
- it 'can output a directory' do
197
- directory_output = directory_model.to_s
198
-
199
- expect(directory_output).to eq(directory_path)
200
- end
201
-
202
- end
203
-
204
- it 'can be remade from its own output' do
205
- source = CukeModeler::FileHelper.create_directory
206
- directory = clazz.new(source)
207
-
208
- directory_output = directory.to_s
209
- remade_directory_output = clazz.new(directory_output).to_s
210
-
211
- expect(remade_directory_output).to eq(directory_output)
212
- end
213
-
214
- end
215
-
216
- end
217
-
218
- end
@@ -1,402 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
2
-
3
-
4
- describe 'DocString, Integration' do
5
-
6
- let(:clazz) { CukeModeler::DocString }
7
-
8
-
9
- describe 'common behavior' do
10
-
11
- it_should_behave_like 'a model, integration'
12
-
13
- end
14
-
15
- describe 'unique behavior' do
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 'can parse text that uses a non-default dialect' do
24
- original_dialect = CukeModeler::Parsing.dialect
25
- CukeModeler::Parsing.dialect = 'en-au'
26
-
27
- begin
28
- source_text = "\"\"\"\ntext foo\n\"\"\""
29
-
30
- expect { @model = clazz.new(source_text) }.to_not raise_error
31
-
32
- # Sanity check in case modeling failed in a non-explosive manner
33
- expect(@model.content).to eq('text foo')
34
- ensure
35
- # Making sure that our changes don't escape a test and ruin the rest of the suite
36
- CukeModeler::Parsing.dialect = original_dialect
37
- end
38
- end
39
-
40
- it 'provides a descriptive filename when being parsed from stand alone text' do
41
- source = 'bad doc string text'
42
-
43
- expect { clazz.new(source) }.to raise_error(/'cuke_modeler_stand_alone_doc_string\.feature'/)
44
- end
45
-
46
- it 'stores the original data generated by the parsing adapter', :gherkin6 => true do
47
- doc_string = clazz.new("\"\"\" content type\nsome doc string\n\"\"\"")
48
- data = doc_string.parsing_data
49
-
50
- expect(data.keys).to match_array([:location, :content, :content_type, :delimiter])
51
- expect(data[:content]).to eq('some doc string')
52
- end
53
-
54
- it 'stores the original data generated by the parsing adapter', :gherkin4_5 => true do
55
- doc_string = clazz.new("\"\"\" content type\nsome doc string\n\"\"\"")
56
- data = doc_string.parsing_data
57
-
58
- expect(data.keys).to match_array([:type, :location, :content, :contentType])
59
- expect(data[:type]).to eq(:DocString)
60
- end
61
-
62
- it 'stores the original data generated by the parsing adapter', :gherkin3 => true do
63
- doc_string = clazz.new("\"\"\" content type\nsome doc string\n\"\"\"")
64
- data = doc_string.parsing_data
65
-
66
- expect(data.keys).to match_array([:type, :location, :content, :contentType])
67
- expect(data[:type]).to eq(:DocString)
68
- end
69
-
70
- it 'stores the original data generated by the parsing adapter', :gherkin2 => true do
71
- doc_string = clazz.new("\"\"\" content type\nsome doc string\n\"\"\"")
72
- data = doc_string.parsing_data
73
-
74
- expect(data.keys).to match_array(['value', 'content_type', 'line'])
75
- expect(data['value']).to eq('some doc string')
76
- end
77
-
78
- it 'stores its content as a String' do
79
- source = "\"\"\"\nsome text\nsome more text\n\"\"\""
80
- doc_string = clazz.new(source)
81
-
82
- content = doc_string.content
83
-
84
- expect(content).to be_a(String)
85
- end
86
-
87
-
88
- describe 'getting ancestors' do
89
-
90
- before(:each) do
91
- CukeModeler::FileHelper.create_feature_file(:text => source_gherkin, :name => 'doc_string_test_file', :directory => test_directory)
92
- end
93
-
94
-
95
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
96
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
97
-
98
- #{SCENARIO_KEYWORD}: Test test
99
- #{STEP_KEYWORD} a big step:
100
- \"\"\"
101
- a
102
- doc
103
- string
104
- \"\"\""
105
- }
106
-
107
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
108
- let(:doc_string_model) { directory_model.feature_files.first.feature.tests.first.steps.first.block }
109
-
110
-
111
- it 'can get its directory' do
112
- ancestor = doc_string_model.get_ancestor(:directory)
113
-
114
- expect(ancestor).to equal(directory_model)
115
- end
116
-
117
- it 'can get its feature file' do
118
- ancestor = doc_string_model.get_ancestor(:feature_file)
119
-
120
- expect(ancestor).to equal(directory_model.feature_files.first)
121
- end
122
-
123
- it 'can get its feature' do
124
- ancestor = doc_string_model.get_ancestor(:feature)
125
-
126
- expect(ancestor).to equal(directory_model.feature_files.first.feature)
127
- end
128
-
129
- context 'a doc string that is part of a scenario' do
130
-
131
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
132
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
133
-
134
- #{SCENARIO_KEYWORD}: Test test
135
- #{STEP_KEYWORD} a big step:
136
- \"\"\"
137
- a
138
- doc
139
- string
140
- \"\"\""
141
- }
142
-
143
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
144
- let(:doc_string_model) { directory_model.feature_files.first.feature.tests.first.steps.first.block }
145
-
146
-
147
- it 'can get its scenario' do
148
- ancestor = doc_string_model.get_ancestor(:scenario)
149
-
150
- expect(ancestor).to equal(directory_model.feature_files.first.feature.tests.first)
151
- end
152
-
153
- end
154
-
155
- context 'a doc string that is part of an outline' do
156
-
157
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
158
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
159
-
160
- #{OUTLINE_KEYWORD}: Test outline
161
- #{STEP_KEYWORD} a big step:
162
- \"\"\"
163
- a
164
- doc
165
- string
166
- \"\"\"
167
- #{EXAMPLE_KEYWORD}:
168
- | param |
169
- | value |"
170
- }
171
-
172
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
173
- let(:doc_string_model) { directory_model.feature_files.first.feature.tests.first.steps.first.block }
174
-
175
-
176
- it 'can get its outline' do
177
- ancestor = doc_string_model.get_ancestor(:outline)
178
-
179
- expect(ancestor).to equal(directory_model.feature_files.first.feature.tests.first)
180
- end
181
-
182
- end
183
-
184
- context 'a doc string that is part of a background' do
185
-
186
- let(:test_directory) { CukeModeler::FileHelper.create_directory }
187
- let(:source_gherkin) { "#{FEATURE_KEYWORD}: Test feature
188
-
189
- #{BACKGROUND_KEYWORD}: Test background
190
- #{STEP_KEYWORD} a big step:
191
- \"\"\"
192
- a
193
- doc
194
- string
195
- \"\"\""
196
- }
197
-
198
- let(:directory_model) { CukeModeler::Directory.new(test_directory) }
199
- let(:doc_string_model) { directory_model.feature_files.first.feature.background.steps.first.block }
200
-
201
-
202
- it 'can get its background' do
203
- ancestor = doc_string_model.get_ancestor(:background)
204
-
205
- expect(ancestor).to equal(directory_model.feature_files.first.feature.background)
206
- end
207
-
208
- end
209
-
210
- it 'can get its step' do
211
- ancestor = doc_string_model.get_ancestor(:step)
212
-
213
- expect(ancestor).to equal(directory_model.feature_files.first.feature.tests.first.steps.first)
214
- end
215
-
216
- it 'returns nil if it does not have the requested type of ancestor' do
217
- ancestor = doc_string_model.get_ancestor(:example)
218
-
219
- expect(ancestor).to be_nil
220
- end
221
-
222
- end
223
-
224
-
225
- describe 'model population' do
226
-
227
- context 'from source text' do
228
-
229
- context 'a filled doc string' do
230
-
231
- let(:source_text) { ['""" type foo',
232
- 'bar',
233
- '"""'].join("\n") }
234
- let(:doc_string) { clazz.new(source_text) }
235
-
236
-
237
- it "models the doc string's content type" do
238
- expect(doc_string.content_type).to eq('type foo')
239
- end
240
-
241
- it "models the doc_string's content" do
242
- expect(doc_string.content).to eq('bar')
243
- end
244
-
245
- end
246
-
247
- context 'an empty doc_string' do
248
-
249
- let(:source_text) { '"""
250
- """' }
251
- let(:doc_string) { clazz.new(source_text) }
252
-
253
- it "models the doc_string's content type" do
254
- expect(doc_string.content_type).to be_nil
255
- end
256
-
257
- it "models the doc_string's content" do
258
- expect(doc_string.content).to eq('')
259
- end
260
-
261
- end
262
-
263
- it "models the doc string's source line" do
264
- source_text = "#{FEATURE_KEYWORD}:
265
-
266
- #{SCENARIO_KEYWORD}:
267
- #{STEP_KEYWORD} step
268
- \"\"\"
269
- foo
270
- \"\"\""
271
- doc_string = CukeModeler::Feature.new(source_text).tests.first.steps.first.block
272
-
273
- expect(doc_string.source_line).to eq(5)
274
- end
275
-
276
- end
277
-
278
- end
279
-
280
-
281
- describe 'doc string output' do
282
-
283
- it 'can be remade from its own output' do
284
- source = ['"""" the type',
285
- "#{STEP_KEYWORD} a step",
286
- ' \"\"\"',
287
- ' that also has a doc string',
288
- ' \"\"\"',
289
- '"""']
290
- source = source.join("\n")
291
- doc_string = clazz.new(source)
292
-
293
- doc_string_output = doc_string.to_s
294
- remade_doc_string_output = clazz.new(doc_string_output).to_s
295
-
296
- expect(remade_doc_string_output).to eq(doc_string_output)
297
- end
298
-
299
-
300
- context 'from source text' do
301
-
302
- it 'can output an empty doc string' do
303
- source = ['"""',
304
- '"""']
305
- source = source.join("\n")
306
- doc_string = clazz.new(source)
307
-
308
- doc_string_output = doc_string.to_s.split("\n", -1)
309
-
310
- expect(doc_string_output).to eq(['"""', '"""'])
311
- end
312
-
313
- it 'can output a doc string that has a content type' do
314
- source = ['""" foo',
315
- '"""']
316
- source = source.join("\n")
317
- doc_string = clazz.new(source)
318
-
319
- doc_string_output = doc_string.to_s.split("\n", -1)
320
-
321
- expect(doc_string_output).to eq(['""" foo',
322
- '"""'])
323
- end
324
-
325
- it 'can output a doc_string that has contents' do
326
- source = ['"""',
327
- 'foo',
328
- '"""']
329
- source = source.join("\n")
330
- doc_string = clazz.new(source)
331
-
332
- doc_string_output = doc_string.to_s.split("\n", -1)
333
-
334
- expect(doc_string_output).to eq(['"""',
335
- 'foo',
336
- '"""'])
337
- end
338
-
339
- # Since triple double quotes mark the beginning and end of a doc string, any triple
340
- # double quotes inside of the doc string (which would have had to have been escaped
341
- # to get inside in the first place) will be escaped when outputted so as to
342
- # retain the quality of being able to use the output directly as gherkin.
343
-
344
- it 'can output a doc_string that has triple double quotes in the contents' do
345
- source = ['"""',
346
- 'a \"\"\"',
347
- '\"\"\" again',
348
- '"""']
349
- source = source.join("\n")
350
- doc_string = clazz.new(source)
351
-
352
- doc_string_output = doc_string.to_s.split("\n", -1)
353
-
354
- expect(doc_string_output).to eq(['"""',
355
- 'a \"\"\"',
356
- '\"\"\" again',
357
- '"""'])
358
- end
359
-
360
- # Double quotes that are not three (or more) in a row do not seem to need and special escaping when
361
- # used in Gherkin. Therefore they should be left alone.
362
- it 'only escapes triple double quotes' do
363
- source = ['"""',
364
- 'change these \"\"\"\"\"\"',
365
- 'but leave " and "" alone',
366
- '"""']
367
- source = source.join("\n")
368
- doc_string = clazz.new(source)
369
-
370
- doc_string_output = doc_string.to_s.split("\n", -1)
371
-
372
- expect(doc_string_output).to eq(['"""',
373
- 'change these \"\"\"\"\"\"',
374
- 'but leave " and "" alone',
375
- '"""'])
376
- end
377
-
378
- it 'can output a doc string that has everything' do
379
- source = ['""" type foo',
380
- '\"\"\"',
381
- 'bar',
382
- '\"\"\"',
383
- '"""']
384
- source = source.join("\n")
385
- doc_string = clazz.new(source)
386
-
387
- doc_string_output = doc_string.to_s.split("\n", -1)
388
-
389
- expect(doc_string_output).to eq(['""" type foo',
390
- '\"\"\"',
391
- 'bar',
392
- '\"\"\"',
393
- '"""'])
394
- end
395
-
396
- end
397
-
398
- end
399
-
400
- end
401
-
402
- end