cucumber_analytics 1.4.2 → 1.5.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 (84) hide show
  1. data/History.rdoc +7 -0
  2. data/README.rdoc +4 -0
  3. data/Rakefile +1 -1
  4. data/cucumber_analytics.gemspec +3 -1
  5. data/features/modeling/background_modeling.feature +27 -13
  6. data/features/modeling/background_output.feature +130 -0
  7. data/features/modeling/directory_modeling.feature +11 -6
  8. data/features/modeling/directory_output.feature +13 -0
  9. data/features/modeling/doc_string_modeling.feature +18 -11
  10. data/features/modeling/doc_string_output.feature +71 -0
  11. data/features/modeling/example_modeling.feature +30 -19
  12. data/features/modeling/example_output.feature +192 -0
  13. data/features/modeling/feature_file_modeling.feature +9 -4
  14. data/features/modeling/feature_file_output.feature +13 -0
  15. data/features/modeling/feature_modeling.feature +33 -20
  16. data/features/modeling/feature_output.feature +244 -0
  17. data/features/modeling/outline_modeling.feature +29 -16
  18. data/features/modeling/outline_output.feature +197 -0
  19. data/features/modeling/row_modeling.feature +9 -4
  20. data/features/modeling/row_output.feature +27 -0
  21. data/features/modeling/scenario_modeling.feature +27 -14
  22. data/features/modeling/scenario_output.feature +147 -0
  23. data/features/modeling/step_modeling.feature +13 -8
  24. data/features/modeling/step_output.feature +52 -0
  25. data/features/modeling/table_modeling.feature +9 -4
  26. data/features/modeling/table_output.feature +42 -0
  27. data/features/modeling/table_row_modeling.feature +9 -4
  28. data/features/modeling/table_row_output.feature +27 -0
  29. data/features/modeling/tag_modeling.feature +10 -5
  30. data/features/modeling/tag_output.feature +16 -0
  31. data/features/step_definitions/action_steps.rb +3 -0
  32. data/features/step_definitions/background_steps.rb +17 -4
  33. data/features/step_definitions/directory_steps.rb +11 -0
  34. data/features/step_definitions/doc_string_steps.rb +18 -15
  35. data/features/step_definitions/feature_file_steps.rb +12 -1
  36. data/features/step_definitions/feature_steps.rb +23 -6
  37. data/features/step_definitions/outline_steps.rb +70 -9
  38. data/features/step_definitions/step_steps.rb +9 -1
  39. data/features/step_definitions/table_steps.rb +35 -2
  40. data/features/step_definitions/tag_steps.rb +8 -0
  41. data/features/step_definitions/test_steps.rb +14 -3
  42. data/features/step_definitions/verification_steps.rb +9 -0
  43. data/features/support/env.rb +1 -0
  44. data/lib/cucumber_analytics/background.rb +12 -0
  45. data/lib/cucumber_analytics/directory.rb +5 -0
  46. data/lib/cucumber_analytics/doc_string.rb +22 -0
  47. data/lib/cucumber_analytics/example.rb +55 -0
  48. data/lib/cucumber_analytics/feature.rb +26 -0
  49. data/lib/cucumber_analytics/feature_element.rb +25 -1
  50. data/lib/cucumber_analytics/feature_file.rb +5 -0
  51. data/lib/cucumber_analytics/outline.rb +18 -0
  52. data/lib/cucumber_analytics/parsing.rb +3 -1
  53. data/lib/cucumber_analytics/row.rb +5 -0
  54. data/lib/cucumber_analytics/scenario.rb +13 -0
  55. data/lib/cucumber_analytics/step.rb +8 -0
  56. data/lib/cucumber_analytics/table.rb +21 -0
  57. data/lib/cucumber_analytics/table_row.rb +5 -0
  58. data/lib/cucumber_analytics/tag.rb +5 -0
  59. data/lib/cucumber_analytics/taggable.rb +4 -0
  60. data/lib/cucumber_analytics/test_element.rb +8 -0
  61. data/lib/cucumber_analytics/version.rb +1 -1
  62. data/spec/integration/background_integration_spec.rb +12 -0
  63. data/spec/integration/example_integration_spec.rb +21 -0
  64. data/spec/integration/feature_integration_spec.rb +29 -0
  65. data/spec/integration/outline_integration_spec.rb +22 -0
  66. data/spec/integration/scenario_integration_spec.rb +16 -0
  67. data/spec/integration/step_integration_spec.rb +20 -0
  68. data/spec/integration/table_integration_spec.rb +11 -0
  69. data/spec/unit/background_unit_spec.rb +28 -0
  70. data/spec/unit/directory_unit_spec.rb +12 -0
  71. data/spec/unit/doc_string_unit_spec.rb +43 -3
  72. data/spec/unit/example_unit_spec.rb +53 -0
  73. data/spec/unit/feature_element_unit_specs.rb +9 -2
  74. data/spec/unit/feature_file_unit_spec.rb +12 -0
  75. data/spec/unit/feature_unit_spec.rb +30 -0
  76. data/spec/unit/outline_unit_spec.rb +30 -0
  77. data/spec/unit/row_unit_spec.rb +19 -7
  78. data/spec/unit/scenario_unit_spec.rb +30 -0
  79. data/spec/unit/step_unit_spec.rb +25 -1
  80. data/spec/unit/table_row_unit_spec.rb +12 -0
  81. data/spec/unit/table_unit_spec.rb +25 -0
  82. data/spec/unit/tag_unit_spec.rb +12 -0
  83. metadata +165 -86
  84. checksums.yaml +0 -15
@@ -20,6 +20,19 @@ module CucumberAnalytics
20
20
  build_scenario(parsed_scenario) if parsed_scenario
21
21
  end
22
22
 
23
+ # Returns gherkin representation of the scenario.
24
+ def to_s
25
+ text = ''
26
+
27
+ text << tag_output_string + "\n" unless tags.empty?
28
+ text << "Scenario:#{name_output_string}"
29
+ text << "\n" + description_output_string unless description_text.empty?
30
+ text << "\n" unless steps.empty? || description_text.empty?
31
+ text << "\n" + steps_output_string unless steps.empty?
32
+
33
+ text
34
+ end
35
+
23
36
 
24
37
  private
25
38
 
@@ -131,6 +131,14 @@ module CucumberAnalytics
131
131
  @arguments = @base.scan(pattern).flatten
132
132
  end
133
133
 
134
+ # Returns a gherkin representation of the step.
135
+ def to_s
136
+ text = "#{keyword} #{base}"
137
+ text << "\n" + block.to_s.split("\n").collect { |line| " #{line}" }.join("\n") if block
138
+
139
+ text
140
+ end
141
+
134
142
 
135
143
  private
136
144
 
@@ -10,6 +10,8 @@ module CucumberAnalytics
10
10
 
11
11
 
12
12
  # The contents of the table
13
+ #
14
+ # Deprecated
13
15
  attr_accessor :contents
14
16
 
15
17
  # The row elements that make up the table
@@ -27,6 +29,11 @@ module CucumberAnalytics
27
29
  build_table(parsed_table) if parsed_table
28
30
  end
29
31
 
32
+ # Returns a gherkin representation of the table.
33
+ def to_s
34
+ row_elements.empty? ? '' : row_elements.collect { |row| row_output_string(row) }.join("\n")
35
+ end
36
+
30
37
 
31
38
  private
32
39
 
@@ -65,5 +72,19 @@ module CucumberAnalytics
65
72
  end
66
73
  end
67
74
 
75
+ def row_output_string(row)
76
+ row_text = '|'
77
+
78
+ row.cells.count.times do |count|
79
+ row_text << " #{row.cells[count].ljust(determine_buffer_size(count))} |"
80
+ end
81
+
82
+ row_text
83
+ end
84
+
85
+ def determine_buffer_size(index)
86
+ row_elements.collect { |row| row.cells[index].length }.max || 0
87
+ end
88
+
68
89
  end
69
90
  end
@@ -23,6 +23,11 @@ module CucumberAnalytics
23
23
  build_row(parsed_row) if parsed_row
24
24
  end
25
25
 
26
+ # Returns a gherkin representation of the table row.
27
+ def to_s
28
+ "| #{cells.join(' | ')} |"
29
+ end
30
+
26
31
 
27
32
  private
28
33
 
@@ -21,6 +21,11 @@ module CucumberAnalytics
21
21
  build_tag(parsed_tag) if parsed_tag
22
22
  end
23
23
 
24
+ # Returns gherkin representation of the tag.
25
+ def to_s
26
+ name || ''
27
+ end
28
+
24
29
 
25
30
  private
26
31
 
@@ -46,5 +46,9 @@ module CucumberAnalytics
46
46
  end
47
47
  end
48
48
 
49
+ def tag_output_string
50
+ tag_elements.collect { |tag| tag.name }.join(' ')
51
+ end
52
+
49
53
  end
50
54
  end
@@ -65,5 +65,13 @@ module CucumberAnalytics
65
65
  end
66
66
  end
67
67
 
68
+ def steps_output_string
69
+ steps.collect { |step| indented_step_text(step) }.join("\n")
70
+ end
71
+
72
+ def indented_step_text(step)
73
+ step.to_s.split("\n").collect { |line| " #{line}" }.join("\n")
74
+ end
75
+
68
76
  end
69
77
  end
@@ -1,3 +1,3 @@
1
1
  module CucumberAnalytics
2
- VERSION = '1.4.2'
2
+ VERSION = '1.5.0'
3
3
  end
@@ -57,4 +57,16 @@ describe 'Background, Integration' do
57
57
  end
58
58
 
59
59
  end
60
+
61
+ context 'background output edge cases' do
62
+
63
+ it 'can output a background that has only steps' do
64
+ background = CucumberAnalytics::Background.new
65
+ background.steps = [CucumberAnalytics::Step.new]
66
+
67
+ expect { background.to_s }.to_not raise_error
68
+ end
69
+
70
+ end
71
+
60
72
  end
@@ -70,4 +70,25 @@ describe 'Example, Integration' do
70
70
  end
71
71
 
72
72
  end
73
+
74
+ context 'example output edge cases' do
75
+
76
+ before(:each) do
77
+ @example = CucumberAnalytics::Example.new
78
+ end
79
+
80
+ it 'can output an example that has only a tag elements' do
81
+ @example.tag_elements = [CucumberAnalytics::Tag.new]
82
+
83
+ expect { @example.to_s }.to_not raise_error
84
+ end
85
+
86
+ #todo - remove once Hash rows are no longer supported
87
+ it 'can output an example that has only row elements' do
88
+ @example.row_elements = [CucumberAnalytics::Row.new]
89
+
90
+ expect { @example.to_s }.to_not raise_error
91
+ end
92
+
93
+ end
73
94
  end
@@ -120,4 +120,33 @@ describe 'Feature, Integration' do
120
120
  end
121
121
 
122
122
  end
123
+
124
+ context 'feature output edge cases' do
125
+
126
+ it 'can output a feature that has only a tag elements' do
127
+ @feature.tag_elements = [CucumberAnalytics::Tag.new]
128
+
129
+ expect { @feature.to_s }.to_not raise_error
130
+ end
131
+
132
+ it 'can output a feature that has only a background' do
133
+ @feature.background = [CucumberAnalytics::Background.new]
134
+
135
+ expect { @feature.to_s }.to_not raise_error
136
+ end
137
+
138
+ it 'can output a feature that has only scenarios' do
139
+ @feature.tests = [CucumberAnalytics::Scenario.new]
140
+
141
+ expect { @feature.to_s }.to_not raise_error
142
+ end
143
+
144
+ it 'can output a feature that has only outlines' do
145
+ @feature.tests = [CucumberAnalytics::Outline.new]
146
+
147
+ expect { @feature.to_s }.to_not raise_error
148
+ end
149
+
150
+ end
151
+
123
152
  end
@@ -66,5 +66,27 @@ describe 'Outline, Integration' do
66
66
  test.should be_nil
67
67
  end
68
68
 
69
+ context 'outline output edge cases' do
70
+
71
+ it 'can output an outline that has only a tag elements' do
72
+ @outline.tag_elements = [CucumberAnalytics::Tag.new]
73
+
74
+ expect { @outline.to_s }.to_not raise_error
75
+ end
76
+
77
+ it 'can output an outline that has only steps' do
78
+ @outline.steps = [CucumberAnalytics::Step.new]
79
+
80
+ expect { @outline.to_s }.to_not raise_error
81
+ end
82
+
83
+ it 'can output an outline that has only examples' do
84
+ @outline.examples = [CucumberAnalytics::Example.new]
85
+
86
+ expect { @outline.to_s }.to_not raise_error
87
+ end
88
+
89
+ end
90
+
69
91
  end
70
92
  end
@@ -60,5 +60,21 @@ describe 'Scenario, Integration' do
60
60
  test.should be_nil
61
61
  end
62
62
 
63
+ context 'scenario output edge cases' do
64
+
65
+ it 'can output a scenario that has only a tag elements' do
66
+ @scenario.tag_elements = [CucumberAnalytics::Tag.new]
67
+
68
+ expect { @scenario.to_s }.to_not raise_error
69
+ end
70
+
71
+ it 'can output a scenario that has only steps' do
72
+ @scenario.steps = [CucumberAnalytics::Step.new]
73
+
74
+ expect { @scenario.to_s }.to_not raise_error
75
+ end
76
+
77
+ end
78
+
63
79
  end
64
80
  end
@@ -161,4 +161,24 @@ describe 'Step, Integration' do
161
161
  end
162
162
 
163
163
  end
164
+
165
+ context 'step output edge cases' do
166
+
167
+ before(:each) do
168
+ @step = CucumberAnalytics::Step.new
169
+ end
170
+
171
+ it 'can output a step that has only a table' do
172
+ @step.block = CucumberAnalytics::Table.new
173
+
174
+ expect { @step.to_s }.to_not raise_error
175
+ end
176
+
177
+ it 'can output a step that has only a doc string' do
178
+ @step.block = CucumberAnalytics::DocString.new
179
+
180
+ expect { @step.to_s }.to_not raise_error
181
+ end
182
+
183
+ end
164
184
  end
@@ -72,4 +72,15 @@ describe 'Table, Integration' do
72
72
  end
73
73
 
74
74
  end
75
+
76
+ context 'table output edge cases' do
77
+ # todo - remove once #contents is no longer supported
78
+ it 'can output a table that only has row elements' do
79
+ table = CucumberAnalytics::Table.new
80
+ table.row_elements = [CucumberAnalytics::TableRow.new]
81
+
82
+ expect { table.to_s }.to_not raise_error
83
+ end
84
+
85
+ end
75
86
  end
@@ -24,4 +24,32 @@ describe 'Background, Unit' do
24
24
  @element.name.should == 'test background'
25
25
  end
26
26
 
27
+ context 'background output edge cases' do
28
+
29
+ before(:each) do
30
+ @background = clazz.new
31
+ end
32
+
33
+ it 'is a String' do
34
+ @background.to_s.should be_a(String)
35
+ end
36
+
37
+ it 'can output an empty background' do
38
+ expect { @background.to_s }.to_not raise_error
39
+ end
40
+
41
+ it 'can output a background that has only a name' do
42
+ @background.name = 'a name'
43
+
44
+ expect { @background.to_s }.to_not raise_error
45
+ end
46
+
47
+ it 'can output a background that has only a description' do
48
+ @background.description_text = 'a description'
49
+
50
+ expect { @background.to_s }.to_not raise_error
51
+ end
52
+
53
+ end
54
+
27
55
  end
@@ -87,5 +87,17 @@ describe 'Directory, Unit' do
87
87
  @directory.contains.should =~ everything
88
88
  end
89
89
 
90
+ context 'directory output edge cases' do
91
+
92
+ it 'is a String' do
93
+ @directory.to_s.should be_a(String)
94
+ end
95
+
96
+ it 'can output an empty directory' do
97
+ expect { @directory.to_s }.to_not raise_error
98
+ end
99
+
100
+ end
101
+
90
102
  end
91
103
 
@@ -17,6 +17,8 @@ describe 'DocString, Unit' do
17
17
  expect { @element = clazz.new(source) }.to_not raise_error
18
18
 
19
19
  # Sanity check in case instantiation failed in a non-explosive manner
20
+ @element.contents_text.should == "some doc string"
21
+ #todo Remove once Array contents is no longer supported
20
22
  @element.contents.should == ["some doc string"]
21
23
  end
22
24
 
@@ -39,22 +41,33 @@ describe 'DocString, Unit' do
39
41
  @doc_string.content_type.should == nil
40
42
  end
41
43
 
42
- it 'has contents - #contents' do
44
+ it 'has contents' do
45
+ #todo Remove once Array contents is no longer supported
43
46
  @doc_string.should respond_to(:contents)
47
+ @doc_string.should respond_to(:contents_text)
44
48
  end
45
49
 
46
- it 'can get and set its contents - #contents, #contents=' do
50
+ it 'can get and set its contents' do
51
+ #todo Remove once Array contents is no longer supported
47
52
  @doc_string.contents = :some_contents
48
53
  @doc_string.contents.should == :some_contents
49
54
  @doc_string.contents = :some_other_contents
50
55
  @doc_string.contents.should == :some_other_contents
56
+
57
+ @doc_string.contents_text = :some_contents
58
+ @doc_string.contents_text.should == :some_contents
59
+ @doc_string.contents_text = :some_other_contents
60
+ @doc_string.contents_text.should == :some_other_contents
51
61
  end
52
62
 
53
63
  it 'starts with no contents' do
64
+ #todo Remove once Array contents is no longer supported
54
65
  @doc_string.contents.should == []
66
+ @doc_string.contents_text.should == ''
55
67
  end
56
68
 
57
- it 'stores its contents as an array of strings' do
69
+ #todo Remove once Array contents is no longer supported
70
+ it 'stores its contents as an array of strings - deprecated' do
58
71
  source = "\"\"\"\nsome text\nsome more text\n\"\"\""
59
72
  doc_string = CucumberAnalytics::DocString.new(source)
60
73
 
@@ -66,4 +79,31 @@ describe 'DocString, Unit' do
66
79
  end
67
80
  end
68
81
 
82
+ it 'stores its contents as a String' do
83
+ source = "\"\"\"\nsome text\nsome more text\n\"\"\""
84
+ doc_string = clazz.new(source)
85
+
86
+ contents = doc_string.contents_text
87
+
88
+ contents.is_a?(String).should be_true
89
+ end
90
+
91
+ context 'doc string output edge cases' do
92
+
93
+ it 'is a String' do
94
+ @doc_string.to_s.should be_a(String)
95
+ end
96
+
97
+ it 'can output an empty doc string' do
98
+ expect { @doc_string.to_s }.to_not raise_error
99
+ end
100
+
101
+ it 'can output a doc string that has only a content type' do
102
+ @doc_string.content_type = 'some type'
103
+
104
+ expect { @doc_string.to_s }.to_not raise_error
105
+ end
106
+
107
+ end
108
+
69
109
  end
@@ -53,6 +53,7 @@ describe 'Example, Unit' do
53
53
  @example.should respond_to(:rows)
54
54
  end
55
55
 
56
+ #todo - remove once Hash rows are no longer supported
56
57
  it 'can get and set its rows - #rows, #rows=' do
57
58
  @example.rows = :some_rows
58
59
  @example.rows.should == :some_rows
@@ -60,10 +61,12 @@ describe 'Example, Unit' do
60
61
  @example.rows.should == :some_other_rows
61
62
  end
62
63
 
64
+ #todo - remove once Hash rows are no longer supported
63
65
  it 'starts with no rows' do
64
66
  @example.rows.should == []
65
67
  end
66
68
 
69
+ #todo - remove once Hash rows are no longer supported
67
70
  it 'stores its rows as an nested array of hashes' do
68
71
  source = "Examples:\n|param1|param2|\n|value1|value2|"
69
72
  example = CucumberAnalytics::Example.new(source)
@@ -112,6 +115,7 @@ describe 'Example, Unit' do
112
115
  new_row = {'param1' => 'value3', 'param2' => 'value4'}
113
116
  example.add_row(new_row)
114
117
 
118
+ #todo - remove once Hash rows are no longer supported
115
119
  example.rows.should == [{'param1' => 'value1', 'param2' => 'value2'}, {'param1' => 'value3', 'param2' => 'value4'}]
116
120
  example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2'], ['value3', 'value4']]
117
121
  end
@@ -123,6 +127,7 @@ describe 'Example, Unit' do
123
127
  new_row = ['value3', 'value4']
124
128
  example.add_row(new_row)
125
129
 
130
+ #todo - remove once Hash rows are no longer supported
126
131
  example.rows.should == [{'param1' => 'value1', 'param2' => 'value2'}, {'param1' => 'value3', 'param2' => 'value4'}]
127
132
  example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2'], ['value3', 'value4']]
128
133
  end
@@ -142,6 +147,7 @@ describe 'Example, Unit' do
142
147
  example.add_row(hash_row)
143
148
  example.add_row(array_row)
144
149
 
150
+ #todo - remove once Hash rows are no longer supported
145
151
  example.rows.should == [{'param1' => 'value1', 'param2' => 'value2'}, {'param1' => 'value3', 'param2' => 'value4'}, {'param1' => 'value5', 'param2' => 'value6'}]
146
152
  example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2'], ['value3', 'value4'], ['value5', 'value6']]
147
153
  end
@@ -160,6 +166,7 @@ describe 'Example, Unit' do
160
166
  old_row = {'param1' => 'value3', 'param2' => 'value4'}
161
167
  example.remove_row(old_row)
162
168
 
169
+ #todo - remove once Hash rows are no longer supported
163
170
  example.rows.should == [{'param1' => 'value1', 'param2' => 'value2'}]
164
171
  example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2']]
165
172
  end
@@ -171,6 +178,7 @@ describe 'Example, Unit' do
171
178
  old_row = ['value3', 'value4']
172
179
  example.remove_row(old_row)
173
180
 
181
+ #todo - remove once Hash rows are no longer supported
174
182
  example.rows.should == [{'param1' => 'value1', 'param2' => 'value2'}]
175
183
  example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2']]
176
184
  end
@@ -190,9 +198,54 @@ describe 'Example, Unit' do
190
198
  example.remove_row(hash_row)
191
199
  example.remove_row(array_row)
192
200
 
201
+ #todo - remove once Hash rows are no longer supported
193
202
  example.rows.should == [{'param1' => 'value1', 'param2' => 'value2'}]
194
203
  example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2']]
195
204
  end
196
205
  end
197
206
 
207
+ context 'example output edge cases' do
208
+
209
+ it 'is a String' do
210
+ @example.to_s.should be_a(String)
211
+ end
212
+
213
+ it 'can output an empty example' do
214
+ expect { @example.to_s }.to_not raise_error
215
+ end
216
+
217
+ it 'can output an example that has only a name' do
218
+ @example.name = 'a name'
219
+
220
+ expect { @example.to_s }.to_not raise_error
221
+ end
222
+
223
+ it 'can output an example that has only a description' do
224
+ @example.description_text = 'a description'
225
+
226
+ expect { @example.to_s }.to_not raise_error
227
+ end
228
+
229
+ it 'can output an example that has only a tags' do
230
+ @example.tags = ['a tag']
231
+
232
+ expect { @example.to_s }.to_not raise_error
233
+ end
234
+
235
+ #todo - remove once Hash rows are no longer supported
236
+ it 'can output an example that only has parameters' do
237
+ @example.parameters = ['param1']
238
+
239
+ expect { @example.to_s }.to_not raise_error
240
+ end
241
+
242
+ #todo - remove once Hash rows are no longer supported
243
+ it 'can output an example that only has rows' do
244
+ @example.rows = [{:param1 => 'row1'}]
245
+
246
+ expect { @example.to_s }.to_not raise_error
247
+ end
248
+
249
+ end
250
+
198
251
  end