yard-cucumber2 2.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +3 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +37 -0
  8. data/History.txt +274 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +188 -0
  11. data/Rakefile +25 -0
  12. data/example/README.md +8 -0
  13. data/example/child_feature/README.md +21 -0
  14. data/example/child_feature/child.feature +11 -0
  15. data/example/child_feature/grandchild_feature/grandchild.feature +12 -0
  16. data/example/empty.feature +2 -0
  17. data/example/french.feature +18 -0
  18. data/example/scenario.feature +63 -0
  19. data/example/scenario_outline.feature +94 -0
  20. data/example/scenario_outline_multi.feature +15 -0
  21. data/example/step_definitions/example.step.rb +109 -0
  22. data/example/step_definitions/first.step.rb +21 -0
  23. data/example/step_definitions/french_steps.rb +32 -0
  24. data/example/step_definitions/struct.rb +11 -0
  25. data/example/step_definitions/support/env.rb +7 -0
  26. data/example/step_definitions/support/env_support.rb +12 -0
  27. data/example/step_definitions/support/support.rb +6 -0
  28. data/example/tags.feature +18 -0
  29. data/example/transform.feature +13 -0
  30. data/lib/cucumber/city_builder.rb +331 -0
  31. data/lib/docserver/default/fulldoc/html/js/cucumber.js +85 -0
  32. data/lib/docserver/default/layout/html/headers.erb +14 -0
  33. data/lib/docserver/doc_server/full_list/html/full_list.erb +39 -0
  34. data/lib/docserver/doc_server/full_list/html/setup.rb +18 -0
  35. data/lib/templates/default/feature/html/feature.erb +39 -0
  36. data/lib/templates/default/feature/html/no_steps_defined.erb +1 -0
  37. data/lib/templates/default/feature/html/outline.erb +56 -0
  38. data/lib/templates/default/feature/html/pystring.erb +3 -0
  39. data/lib/templates/default/feature/html/scenario.erb +55 -0
  40. data/lib/templates/default/feature/html/setup.rb +55 -0
  41. data/lib/templates/default/feature/html/steps.erb +39 -0
  42. data/lib/templates/default/feature/html/table.erb +20 -0
  43. data/lib/templates/default/featuredirectory/html/alpha_table.erb +30 -0
  44. data/lib/templates/default/featuredirectory/html/directory.erb +32 -0
  45. data/lib/templates/default/featuredirectory/html/setup.rb +41 -0
  46. data/lib/templates/default/featuretags/html/namespace.erb +131 -0
  47. data/lib/templates/default/featuretags/html/setup.rb +34 -0
  48. data/lib/templates/default/fulldoc/html/css/cucumber.css +227 -0
  49. data/lib/templates/default/fulldoc/html/directories.erb +53 -0
  50. data/lib/templates/default/fulldoc/html/full_list_featuredirectories.erb +11 -0
  51. data/lib/templates/default/fulldoc/html/full_list_features.erb +29 -0
  52. data/lib/templates/default/fulldoc/html/full_list_stepdefinitions.erb +16 -0
  53. data/lib/templates/default/fulldoc/html/full_list_steps.erb +17 -0
  54. data/lib/templates/default/fulldoc/html/full_list_tags.erb +12 -0
  55. data/lib/templates/default/fulldoc/html/js/cucumber.js +305 -0
  56. data/lib/templates/default/fulldoc/html/setup.rb +175 -0
  57. data/lib/templates/default/layout/html/setup.rb +56 -0
  58. data/lib/templates/default/requirements/html/alpha_table.erb +26 -0
  59. data/lib/templates/default/requirements/html/requirements.erb +50 -0
  60. data/lib/templates/default/requirements/html/setup.rb +51 -0
  61. data/lib/templates/default/steptransformers/html/header.erb +12 -0
  62. data/lib/templates/default/steptransformers/html/index.erb +10 -0
  63. data/lib/templates/default/steptransformers/html/setup.rb +94 -0
  64. data/lib/templates/default/steptransformers/html/transformers.erb +79 -0
  65. data/lib/templates/default/steptransformers/html/undefinedsteps.erb +26 -0
  66. data/lib/templates/default/tag/html/alpha_table.erb +32 -0
  67. data/lib/templates/default/tag/html/setup.rb +27 -0
  68. data/lib/templates/default/tag/html/tag.erb +35 -0
  69. data/lib/yard-cucumber.rb +47 -0
  70. data/lib/yard-cucumber/version.rb +3 -0
  71. data/lib/yard/code_objects/cucumber/base.rb +32 -0
  72. data/lib/yard/code_objects/cucumber/feature.rb +18 -0
  73. data/lib/yard/code_objects/cucumber/namespace_object.rb +49 -0
  74. data/lib/yard/code_objects/cucumber/scenario.rb +26 -0
  75. data/lib/yard/code_objects/cucumber/scenario_outline.rb +75 -0
  76. data/lib/yard/code_objects/cucumber/step.rb +38 -0
  77. data/lib/yard/code_objects/cucumber/tag.rb +27 -0
  78. data/lib/yard/code_objects/step_definition.rb +7 -0
  79. data/lib/yard/code_objects/step_transform.rb +7 -0
  80. data/lib/yard/code_objects/step_transformer.rb +97 -0
  81. data/lib/yard/handlers/cucumber/base.rb +21 -0
  82. data/lib/yard/handlers/cucumber/feature_handler.rb +131 -0
  83. data/lib/yard/handlers/legacy/step_definition_handler.rb +45 -0
  84. data/lib/yard/handlers/legacy/step_transform_handler.rb +24 -0
  85. data/lib/yard/handlers/step_definition_handler.rb +86 -0
  86. data/lib/yard/handlers/step_transform_handler.rb +31 -0
  87. data/lib/yard/parser/cucumber/feature.rb +73 -0
  88. data/lib/yard/server/adapter.rb +43 -0
  89. data/lib/yard/server/commands/list_command.rb +31 -0
  90. data/lib/yard/server/router.rb +32 -0
  91. data/lib/yard/templates/helpers/base_helper.rb +26 -0
  92. data/yard-cucumber.gemspec +65 -0
  93. metadata +199 -0
@@ -0,0 +1,11 @@
1
+ #
2
+ # @see https://github.com/burtlo/yard-cucumber/issues/18
3
+ #
4
+ CustomerUsageBehavior = Struct.new(:weight, :days, :time, :location, :other_party, :usage_type, :direction, :quantity)
5
+
6
+
7
+ class CustomerProfile
8
+ def generate_winner(max=@total_weight)
9
+ # blah
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+
2
+ module Environment
3
+ module Database
4
+ class Connection
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+
2
+ class SupportClass
3
+
4
+ end
5
+
6
+ module Web
7
+ module Interface
8
+ class CachedReference
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+
2
+ ORDER = /(?:first|second|third)/
3
+
4
+ TEDDY_BEAR = /teddy bear/
5
+
6
+ CUSTOMER = /(?:(?:an?|the|#{ORDER}) customer|#{TEDDY_BEAR})/
@@ -0,0 +1,18 @@
1
+ @tags
2
+ Feature: Tags
3
+ As a developer of the test suite I expect that various tags will be supported
4
+
5
+ @tag
6
+ Scenario: Basic Tag
7
+
8
+ @tag123456
9
+ Scenario: Tag With Numbers
10
+
11
+ @tag_with_underscore
12
+ Scenario: Tag With Underscore
13
+
14
+ @tag-with-dash
15
+ Scenario: Tag With Dash
16
+
17
+ @tag+with+plus
18
+ Scenario: Tag With Plus
@@ -0,0 +1,13 @@
1
+ @scenarios @bvt
2
+ Feature: Step Transforms
3
+ As a developer of the test suite I expect that step transforms are documented correctly
4
+
5
+ @first
6
+ Scenario: Step with step transformation
7
+ Given this scenario step
8
+ Then I expect that the step, on the step transformer page, will link to the step transform
9
+
10
+ @second
11
+ Scenario: Step Transform uses a constant
12
+ Given this first step
13
+ Then I expect that the step, on the step transformer page, will link to the step transform
@@ -0,0 +1,331 @@
1
+ module Cucumber
2
+ module Parser
3
+ class CityBuilder
4
+ include Gherkin::Rubify
5
+
6
+ #
7
+ # The Gherkin Parser is going to call the various methods within this
8
+ # class as it finds items. This is similar to how Cucumber generates
9
+ # it's Abstract Syntax Tree (AST). Here instead this generates the
10
+ # various YARD::CodeObjects defined within this template.
11
+ #
12
+ # A namespace is specified and that is the place in the YARD namespacing
13
+ # where all cucumber features generated will reside. The namespace specified
14
+ # is the root namespaces.
15
+ #
16
+ # @param [String] file the name of the file which the content belongs
17
+ #
18
+ def initialize(file)
19
+ @namespace = YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE
20
+ find_or_create_namespace(file)
21
+ @file = file
22
+ end
23
+
24
+ # Return the feature that has been defined. This method is the final
25
+ # method that is called when all the work is done. It is called by
26
+ # the feature parser to return the complete Feature object that was created
27
+ #
28
+ # @return [YARD::CodeObject::Cucumber::Feature] the completed feature
29
+ #
30
+ # @see YARD::Parser::Cucumber::FeatureParser
31
+ def ast
32
+ @feature
33
+ end
34
+
35
+ #
36
+ # Feature that are found in sub-directories are considered, in the way
37
+ # that I chose to implement it, in another namespace. This is because
38
+ # when you execute a cucumber test run on a directory any sub-directories
39
+ # of features will be executed with that directory so the file is split
40
+ # and then namespaces are generated if they have not already have been.
41
+ #
42
+ # The other duty that this does is look for a README.md file within the
43
+ # specified directory of the file and loads it as the description for the
44
+ # namespace. This is useful if you want to give a particular directory
45
+ # some flavor or text to describe what is going on.
46
+ #
47
+ def find_or_create_namespace(file)
48
+ @namespace = YARD::CodeObjects::Cucumber::CUCUMBER_NAMESPACE
49
+
50
+ File.dirname(file).split('/').each do |directory|
51
+ @namespace = @namespace.children.find {|child| child.is_a?(YARD::CodeObjects::Cucumber::FeatureDirectory) && child.name.to_s == directory } ||
52
+ @namespace = YARD::CodeObjects::Cucumber::FeatureDirectory.new(@namespace,directory) {|dir| dir.add_file(directory)}
53
+ end
54
+
55
+ if @namespace.description == "" && File.exists?("#{File.dirname(file)}/README.md")
56
+ @namespace.description = File.read("#{File.dirname(file)}/README.md")
57
+ end
58
+ end
59
+
60
+ #
61
+ # Find the tag if it exists within the YARD Registry, if it doesn' t then
62
+ # create it.
63
+ #
64
+ # We note that the tag was used in this file at the current line.
65
+ #
66
+ # Then we add the tag to the current scenario or feature. We also add the
67
+ # feature or scenario to the tag.
68
+ #
69
+ # @param [String] tag_name the name of the tag
70
+ # @param [parent] parent the scenario or feature that is going to adopt
71
+ # this tag.
72
+ #
73
+ def find_or_create_tag(tag_name,parent)
74
+ #log.debug "Processing tag #{tag_name}"
75
+ tag_code_object = YARD::Registry.all(:tag).find {|tag| tag.value == tag_name } ||
76
+ YARD::CodeObjects::Cucumber::Tag.new(YARD::CodeObjects::Cucumber::CUCUMBER_TAG_NAMESPACE,tag_name.gsub('@','')) {|t| t.owners = [] ; t.value = tag_name }
77
+
78
+ tag_code_object.add_file(@file,parent.line)
79
+
80
+ parent.tags << tag_code_object unless parent.tags.find {|tag| tag == tag_code_object }
81
+ tag_code_object.owners << parent unless tag_code_object.owners.find {|owner| owner == parent}
82
+ end
83
+
84
+ #
85
+ # Each feature found will call this method, generating the feature object.
86
+ # This is once, as the gherking parser does not like multiple feature per
87
+ # file.
88
+ #
89
+ def feature(feature)
90
+ #log.debug "FEATURE"
91
+
92
+ @feature = YARD::CodeObjects::Cucumber::Feature.new(@namespace,File.basename(@file.gsub('.feature','').gsub('.','_'))) do |f|
93
+ f.comments = feature.comments.map{|comment| comment.value}.join("\n")
94
+ f.description = feature.description
95
+ f.add_file(@file,feature.line)
96
+ f.keyword = feature.keyword
97
+ f.value = feature.name
98
+ f.tags = []
99
+
100
+ feature.tags.each {|feature_tag| find_or_create_tag(feature_tag.name,f) }
101
+ end
102
+ end
103
+
104
+ #
105
+ # Called when a background has been found
106
+ #
107
+ # @see #scenario
108
+ def background(background)
109
+ #log.debug "BACKGROUND"
110
+
111
+ @background = YARD::CodeObjects::Cucumber::Scenario.new(@feature,"background") do |b|
112
+ b.comments = background.comments.map{|comment| comment.value}.join("\n")
113
+ b.description = background.description
114
+ b.keyword = background.keyword
115
+ b.value = background.name
116
+ b.add_file(@file,background.line)
117
+ end
118
+
119
+ @feature.background = @background
120
+ @background.feature = @feature
121
+ @step_container = @background
122
+ end
123
+
124
+ #
125
+ # Called when a scenario has been found
126
+ # - create a scenario
127
+ # - assign the scenario to the feature
128
+ # - assign the feature to the scenario
129
+ # - find or create tags associated with the scenario
130
+ #
131
+ # The scenario is set as the @step_container, which means that any steps
132
+ # found before another scenario is defined belong to this scenario
133
+ #
134
+ # @param [Scenario] statement is a scenario object returned from Gherkin
135
+ # @see #find_or_create_tag
136
+ #
137
+ def scenario(statement)
138
+ #log.debug "SCENARIO"
139
+
140
+ scenario = YARD::CodeObjects::Cucumber::Scenario.new(@feature,"scenario_#{@feature.scenarios.length + 1}") do |s|
141
+ s.comments = statement.comments.map{|comment| comment.value}.join("\n")
142
+ s.description = statement.description
143
+ s.add_file(@file,statement.line)
144
+ s.keyword = statement.keyword
145
+ s.value = statement.name
146
+
147
+ statement.tags.each {|scenario_tag| find_or_create_tag(scenario_tag.name,s) }
148
+ end
149
+
150
+ scenario.feature = @feature
151
+ @feature.scenarios << scenario
152
+ @step_container = scenario
153
+ end
154
+
155
+ #
156
+ # Called when a scenario outline is found. Very similar to a scenario,
157
+ # the ScenarioOutline is still a distinct object as it can contain
158
+ # multiple different example groups that can contain different values.
159
+ #
160
+ # @see #scenario
161
+ #
162
+ def scenario_outline(statement)
163
+ #log.debug "SCENARIO OUTLINE"
164
+
165
+ outline = YARD::CodeObjects::Cucumber::ScenarioOutline.new(@feature,"scenario_#{@feature.scenarios.length + 1}") do |s|
166
+ s.comments = statement.comments.map{|comment| comment.value}.join("\n")
167
+ s.description = statement.description
168
+ s.add_file(@file,statement.line)
169
+ s.keyword = statement.keyword
170
+ s.value = statement.name
171
+
172
+ statement.tags.each {|scenario_tag| find_or_create_tag(scenario_tag.name,s) }
173
+ end
174
+
175
+ outline.feature = @feature
176
+ @feature.scenarios << outline
177
+ @step_container = outline
178
+ end
179
+
180
+ #
181
+ # Examples for a scenario outline are called here. This section differs
182
+ # from the Cucumber parser because here each of the examples are exploded
183
+ # out here as individual scenarios and step definitions. This is so that
184
+ # later we can ensure that we have all the variations of the scenario
185
+ # outline defined to be displayed.
186
+ #
187
+ def examples(examples)
188
+ #log.debug "EXAMPLES"
189
+
190
+ example = YARD::CodeObjects::Cucumber::ScenarioOutline::Examples.new(:keyword => examples.keyword,
191
+ :name => examples.name,
192
+ :line => examples.line,
193
+ :comments => examples.comments.map{|comment| comment.value}.join("\n"),
194
+ :rows => matrix(examples.rows))
195
+
196
+
197
+ # add the example to the step containers list of examples
198
+
199
+ @step_container.examples << example
200
+
201
+ # For each example data row we want to generate a new scenario using our
202
+ # current scenario as the template.
203
+
204
+ example.data.length.times do |row_index|
205
+
206
+ # Generate a copy of the scenario.
207
+
208
+ scenario = YARD::CodeObjects::Cucumber::Scenario.new(@step_container,"example_#{@step_container.scenarios.length + 1}") do |s|
209
+ s.comments = @step_container.comments
210
+ s.description = @step_container.description
211
+ s.add_file(@file,@step_container.line_number)
212
+ s.keyword = @step_container.keyword
213
+ s.value = "#{@step_container.value} (#{@step_container.scenarios.length + 1})"
214
+ end
215
+
216
+ # Generate a copy of the scenario steps.
217
+
218
+ @step_container.steps.each do |step|
219
+ step_instance = YARD::CodeObjects::Cucumber::Step.new(scenario,step.line_number) do |s|
220
+ s.keyword = step.keyword.dup
221
+ s.value = step.value.dup
222
+ s.add_file(@file,step.line_number)
223
+
224
+ s.text = step.text.dup if step.has_text?
225
+ s.table = clone_table(step.table) if step.has_table?
226
+ end
227
+
228
+ # Look at the particular data for the example row and do a simple
229
+ # find and replace of the <key> with the associated values.
230
+
231
+ example.values_for_row(row_index).each do |key,text|
232
+ text ||= "" #handle empty cells in the example table
233
+ step_instance.value.gsub!("<#{key}>",text)
234
+ step_instance.text.gsub!("<#{key}>",text) if step_instance.has_text?
235
+ step_instance.table.each{|row| row.each{|col| col.gsub!("<#{key}>",text)}} if step_instance.has_table?
236
+ end
237
+
238
+ # Connect these steps that we created to the scenario we created
239
+ # and then add the steps to the scenario created.
240
+
241
+ step_instance.scenario = scenario
242
+ scenario.steps << step_instance
243
+ end
244
+
245
+ # Add the scenario to the list of scenarios maintained by the feature
246
+ # and add the feature to the scenario
247
+
248
+ scenario.feature = @feature
249
+ @step_container.scenarios << scenario
250
+
251
+ end
252
+
253
+ end
254
+
255
+ #
256
+ # Called when a step is found. The step is refered to a table owner, though
257
+ # not all steps have a table or multliline arguments associated with them.
258
+ #
259
+ # If a multiline string is present with the step it is included as the text
260
+ # of the step. If the step has a table it is added to the step using the
261
+ # same method used by the Cucumber Gherkin model.
262
+ #
263
+ def step(step)
264
+ #log.debug "STEP"
265
+
266
+ @table_owner = YARD::CodeObjects::Cucumber::Step.new(@step_container,"#{step.line}") do |s|
267
+ s.keyword = step.keyword
268
+ s.value = step.name
269
+ s.add_file(@file,step.line)
270
+ end
271
+
272
+ @table_owner.comments = step.comments.map{|comment| comment.value}.join("\n")
273
+
274
+ multiline_arg = if step.respond_to?(:multiline_arg) && !step.multiline_arg.nil?
275
+ rubify(step.multiline_arg)
276
+ elsif step.respond_to?(:rows) && !step.rows.nil?
277
+ rubify(step.rows)
278
+ elsif step.respond_to?(:doc_string) && !step.doc_string.nil?
279
+ rubify(step.doc_string)
280
+ end
281
+
282
+ case(multiline_arg)
283
+ when gherkin_multiline_string_class
284
+ @table_owner.text = multiline_arg.value
285
+ when Array
286
+ #log.info "Matrix: #{matrix(multiline_arg).collect{|row| row.collect{|cell| cell.class } }.flatten.join("\n")}"
287
+ @table_owner.table = matrix(multiline_arg)
288
+ end
289
+
290
+ @table_owner.scenario = @step_container
291
+ @step_container.steps << @table_owner
292
+ end
293
+
294
+ # Defined in the cucumber version so left here. No events for the end-of-file
295
+ def eof
296
+ end
297
+
298
+ # When a syntax error were to occurr. This parser is not interested in errors
299
+ def syntax_error(state, event, legal_events, line)
300
+ # raise "SYNTAX ERROR"
301
+ end
302
+
303
+ private
304
+ def matrix(gherkin_table)
305
+ gherkin_table.map {|gherkin_row| gherkin_row.cells }
306
+ end
307
+
308
+ #
309
+ # This helper method is used to deteremine what class is the current
310
+ # Gherkin class.
311
+ #
312
+ # @return [Class] the class that is the current supported Gherkin Model
313
+ # for multiline strings. Prior to Gherkin 2.4.0 this was the PyString
314
+ # class. As of Gherkin 2.4.0 it is the DocString class.
315
+ def gherkin_multiline_string_class
316
+ if defined?(Gherkin::Formatter::Model::PyString)
317
+ Gherkin::Formatter::Model::PyString
318
+ elsif defined?(Gherkin::Formatter::Model::DocString)
319
+ Gherkin::Formatter::Model::DocString
320
+ else
321
+ raise "Unable to find a suitable class in the Gherkin Library to parse the multiline step data."
322
+ end
323
+ end
324
+
325
+ def clone_table(base)
326
+ base.map {|row| row.map {|cell| cell.dup }}
327
+ end
328
+
329
+ end
330
+ end
331
+ end
@@ -0,0 +1,85 @@
1
+ function cucumberSearchFrameLinks() {
2
+ $('#feature_list_link').click(function() {
3
+ toggleSearchFrame(this, '/' + library + '/features');
4
+ });
5
+ $('#tag_list_link').click(function() {
6
+ toggleSearchFrame(this, '/' + library + '/tags');
7
+ });
8
+ }
9
+
10
+ $(cucumberSearchFrameLinks);
11
+
12
+
13
+
14
+ function toggleScenarioExample(id,example) {
15
+
16
+ var element = $("#" + id + "Example" + example + "Steps")[0];
17
+
18
+ $('#' + id + ' tr').each(function(index) {
19
+ this.style.backgroundColor = (index % 2 == 0 ? '#FFFFFF' : '#F0F6F9' );
20
+ });
21
+
22
+ if (element.style.display != 'none') {
23
+ element = $("#" + id + "Steps")[0];
24
+ } else {
25
+ $('#' + id + ' .outline * tr')[example].style.backgroundColor = '#FFCC80';
26
+ }
27
+
28
+ $('#' + id + ' .steps').each(function(index) {
29
+ this.style.display = 'none';
30
+ });
31
+
32
+ element.style.display = 'block';
33
+
34
+ }
35
+
36
+ function determine_tags_used_in_formula(tag_string) {
37
+ //$("#tag_debug")[0].innerHTML = "";
38
+
39
+ tag_string = tag_string.replace(/^(\s+)|(\s+)$/,'').replace(/\s{2,}/,' ');
40
+
41
+ var tags = tag_string.match(/@\w+/g);
42
+
43
+ var return_tags = [];
44
+
45
+ if (tags != null) {
46
+ tags.forEach(function(tag, index, array) {
47
+ //$("#tag_debug")[0].innerHTML += tag + " ";
48
+ if (tag_list.indexOf(tag) != -1) { return_tags.push(tag); }
49
+ });
50
+ }
51
+
52
+ return return_tags;
53
+ }
54
+
55
+
56
+ function display_example_command_line(tags) {
57
+ $("#command_example")[0].innerHTML = "cucumber ";
58
+
59
+ if (tags.length > 0) {
60
+ $("#command_example")[0].innerHTML += "--tags " + tags.join(" --tags ");
61
+ }
62
+ }
63
+
64
+ function display_qualifying_features_and_scenarios(tags) {
65
+ //$("#tag_debug")[0].innerHTML = "";
66
+
67
+ if (tags.length > 0) {
68
+
69
+ $(".feature,.scenario").each(function(feature){
70
+ this.style.display = "none";
71
+ });
72
+
73
+ $(".feature.\\" + tags.join(".\\") + ",.scenario.\\" + tags.join(".\\")).each(function(feature) {
74
+ //$("#tag_debug")[0].innerHTML += feature + " " + this;
75
+ this.style.display = "block";
76
+ });
77
+
78
+
79
+ } else {
80
+ $(".feature,.scenario").each(function(feature){
81
+ this.style.display = "block";
82
+ });
83
+ }
84
+
85
+ }