cucumber_analytics 1.0.0 → 1.1.1

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 (33) hide show
  1. checksums.yaml +8 -8
  2. data/History.rdoc +13 -2
  3. data/features/modeling/background_modeling.feature +5 -0
  4. data/features/modeling/example_modeling.feature +16 -8
  5. data/features/modeling/feature_modeling.feature +4 -1
  6. data/features/modeling/outline_modeling.feature +4 -0
  7. data/features/modeling/row_modeling.feature +67 -0
  8. data/features/modeling/scenario_modeling.feature +4 -0
  9. data/features/modeling/step_modeling.feature +6 -0
  10. data/features/modeling/table_modeling.feature +1 -1
  11. data/features/step_definitions/outline_steps.rb +35 -7
  12. data/features/step_definitions/step_steps.rb +11 -0
  13. data/lib/cucumber_analytics/example.rb +32 -7
  14. data/lib/cucumber_analytics/feature_element.rb +4 -0
  15. data/lib/cucumber_analytics/row.rb +58 -0
  16. data/lib/cucumber_analytics/sourceable.rb +20 -0
  17. data/lib/cucumber_analytics/step.rb +2 -1
  18. data/lib/cucumber_analytics/version.rb +1 -1
  19. data/lib/cucumber_analytics/world.rb +5 -0
  20. data/lib/cucumber_analytics.rb +2 -0
  21. data/spec/integration/example_integration_spec.rb +20 -0
  22. data/spec/spec_helper.rb +1 -0
  23. data/spec/unit/background_unit_spec.rb +1 -0
  24. data/spec/unit/example_unit_spec.rb +23 -0
  25. data/spec/unit/feature_unit_spec.rb +1 -0
  26. data/spec/unit/outline_unit_spec.rb +1 -0
  27. data/spec/unit/row_unit_spec.rb +39 -0
  28. data/spec/unit/scenario_unit_spec.rb +1 -0
  29. data/spec/unit/sourceable_unit_spec.rb +17 -0
  30. data/spec/unit/sourced_element_unit_specs.rb +18 -0
  31. data/spec/unit/step_unit_spec.rb +1 -1
  32. data/spec/unit/world_unit_spec.rb +13 -0
  33. metadata +14 -2
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDdiMjBmYjRjNzY3ODM2MDNlYzQzNDRhZmZjOWM4YmI0MTQ1ZDFmZg==
4
+ NTZmMTk1NmM2NDY0M2RlMGUyMjhlOTIyMjQ0MzlhOTliYzU5ZGNmNw==
5
5
  data.tar.gz: !binary |-
6
- MTAyOTE4MzQzYjUyMjM1MDY1NmYzMjBiYzg1OTE0NWViMjQ3NzAxMQ==
6
+ NGVkYTM0YzUxZDFjYWI5OGE3OTMzZDViYzQyYmZjMWQyYjg5MDhjYQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- YmE1OWU5N2QwNzRjZjQ2NzExN2NlM2Q3ZGQ2NjY5YjlkMWE3M2JiODgyNmNh
10
- MjQ4NTQ0ZmUwMWNjZmQwNWM0ODNlMjdiZTJjMGY3MjdmZGY1M2Y3ZTQ3YmIw
11
- MzkxNThhZmJjMjcwZmVlOTc2ODhmYWRlMThlNDUzNGY0ZTI4ZjU=
9
+ Nzg4NTJkMWYxOTE4ZGFkMTJmMDIxYmU3ZmIxZTVhY2VkNmI2YWM5MDVlZjBl
10
+ ZDdiZjFmNjViNDFkY2Q1Yzk4MGE5NDYwMzRmNmE0OWQ3MTc5ZGJiNzEyNDE1
11
+ MzZjYWVkZTNlY2UyMzJhM2QyMTMyZjNhZmQ1NGNhOGM5ZThlYTI=
12
12
  data.tar.gz: !binary |-
13
- NTBlYmU2MDAwNWUwMjA0MDRkZDdiMGY4NDk3MWU4YjYyNjkwYjYyZjc2YzJl
14
- NDRmYTExZWYzY2U0YmI5MTZiYTRkNDNlYjg3MDUxNTJiZThjNGJlOWU2MDFl
15
- MzdmZjJmMzUzOGYwY2U0MjlkODIwZGY1OTM0NzEzYjk0ZDA3NzQ=
13
+ OTc0MzBmOGFmYTE1YTM2NzkyNTg0NTI1YWY0NGM5M2EwOTgyNGE2N2FiMzhk
14
+ ZTE3NDJmMWM2YmRhZDNjNzE5NjYyY2UxNTQ2NDY5Y2YyZDk3YzU1ZDM4YmMx
15
+ ZThmM2JiNTYyNjdlNWMyOTllY2NhYzU5N2VjOGEzMzIyZDJhNDc=
data/History.rdoc CHANGED
@@ -1,11 +1,22 @@
1
+ === Version 1.1.0 / 2013-08-03
2
+
3
+ * Version bumped due to publishing wrong code for version 1.1.0.
4
+
5
+ === Version 1.1.0 / 2013-08-01
6
+
7
+ * Outline example rows are now modeled.
8
+ * Some elements now keep track of which source code line number they started on.
9
+ * Step definition patterns that have been loaded in the World can now be cleared.
10
+
11
+
1
12
  === Version 1.0.0 / 2013-06-30
2
13
 
3
14
  * Bug fix: Step definitions are now detected whether or not parenthesis are
4
15
  used in the declararion.
5
16
  * Now using the gherkin gem to parse feature files. This should eliminate most
6
17
  parsing related bugs.
7
- * Empty outline example blocks can non longer be handeled (since the gherkin gem
8
- can likewise not handle them).
18
+ * Empty outline example blocks can no longer be handeled (since the gherkin gem
19
+ can, likewise, not handle them).
9
20
  * Source code snippets can now be analyzed (rather than needing an entire feature
10
21
  file to parse).
11
22
  * Logging has been removed from the gem due to its significant negative impact
@@ -7,6 +7,7 @@ Feature: Background elements can be modeled.
7
7
  1. the background's name
8
8
  2. the background's description
9
9
  3. the background's steps
10
+ 4. the background's source line
10
11
 
11
12
  Background: Test file setup.
12
13
  Given the following feature file:
@@ -25,6 +26,10 @@ Feature: Background elements can be modeled.
25
26
  When the file is read
26
27
 
27
28
 
29
+ Scenario: The background source line is modeled.
30
+ Then the background is found to have the following properties:
31
+ | source_line | 3 |
32
+
28
33
  Scenario: The background name is modeled.
29
34
  Then the background is found to have the following properties:
30
35
  | name | Some general test setup stuff. |
@@ -4,12 +4,13 @@ Feature: Example elements can be modeled.
4
4
  Acceptance criteria
5
5
 
6
6
  All conceptual pieces of an Examples block can be modeled:
7
- 1. the examples' name
8
- 2. the examples' description
9
- 3. the examples' parameters
10
- 4. the examples' rows
11
- 5. the examples' tags
12
- 6. the examples's applied tags
7
+ 1. the example's name
8
+ 2. the example's description
9
+ 3. the example's parameters
10
+ 4. the example's rows
11
+ 5. the example's tags
12
+ 6. the example's applied tags
13
+ 7. the example's source line
13
14
 
14
15
 
15
16
  Background: Test file setup.
@@ -38,6 +39,12 @@ Feature: Example elements can be modeled.
38
39
  When the file is read
39
40
 
40
41
 
42
+ Scenario: The example's source line is modeled.
43
+ Then the test example block "1" is found to have the following properties:
44
+ | source_line | 8 |
45
+ And the test example block "2" is found to have the following properties:
46
+ | source_line | 15 |
47
+
41
48
  Scenario: The examples' name is modeled.
42
49
  Then the test example block "1" is found to have the following properties:
43
50
  | name | text describing the significance of the examples |
@@ -83,5 +90,6 @@ Feature: Example elements can be modeled.
83
90
  When the corresponding unit tests are run
84
91
  Then all of those specifications are met
85
92
  Examples:
86
- | additional specifications |
87
- | example_unit_spec.rb |
93
+ | additional specifications |
94
+ | example_unit_spec.rb |
95
+ | example_integration_spec.rb |
@@ -12,7 +12,7 @@ Feature: Features can be modeled.
12
12
  6. the feature's background
13
13
  7. the feature's total number of tests
14
14
  8. the feature's total number of test cases
15
-
15
+ 9. the feature's source line
16
16
 
17
17
  Background: Test file setup.
18
18
  Given the following feature file "much_stuff.feature":
@@ -67,15 +67,18 @@ Feature: Features can be modeled.
67
67
  | name | The test feature name. |
68
68
  | test_count | 3 |
69
69
  | test_case_count | 5 |
70
+ | source_line | 3 |
70
71
  And feature "2" is found to have the following properties:
71
72
  | name | |
72
73
  | test_count | 2 |
73
74
  | test_case_count | 1 |
75
+ | source_line | 1 |
74
76
 
75
77
  And feature "3" is found to have the following properties:
76
78
  | name | |
77
79
  | test_count | 0 |
78
80
  | test_case_count | 0 |
81
+ | source_line | 1 |
79
82
 
80
83
  Scenario: The feature's description is modeled.
81
84
  Then the descriptive lines of feature "1" are as follows:
@@ -10,6 +10,7 @@ Feature: Scenario Outline elements can be modeled.
10
10
  4. the outline's tags
11
11
  5. the outline's applied tags
12
12
  6. the outline's example blocks
13
+ 7. the outline's source line
13
14
 
14
15
 
15
16
  Background: Test file setup.
@@ -37,6 +38,9 @@ Feature: Scenario Outline elements can be modeled.
37
38
  And parameter delimiters of "*" and "*"
38
39
  When the file is read
39
40
 
41
+ Scenario: The outline source line is modeled.
42
+ Then the test is found to have the following properties:
43
+ | source_line | 5 |
40
44
 
41
45
  Scenario: The outline name is modeled.
42
46
  Then the test is found to have the following properties:
@@ -0,0 +1,67 @@
1
+ Feature: Row elements can be modeled.
2
+
3
+
4
+ Acceptance criteria
5
+
6
+ All conceptual pieces of a Row can be modeled:
7
+ 1. the row's source line
8
+ 2. the row's cells
9
+
10
+
11
+ Background: Test file setup.
12
+ Given the following feature file:
13
+ """
14
+ Feature:
15
+
16
+ Scenario Outline:
17
+ * a step
18
+ Examples:
19
+ | param1 | param2 | extra param |
20
+ | x | y | ? |
21
+ | 1 | 2 | 3 |
22
+ Examples:
23
+ | param1 |
24
+ | a |
25
+ """
26
+ And parameter delimiters of "*" and "*"
27
+ When the file is read
28
+
29
+
30
+ Scenario: The row's source line is modeled.
31
+ Then the test example block "1" row "1" is found to have the following properties:
32
+ | source_line | 6 |
33
+ And the test example block "1" row "2" is found to have the following properties:
34
+ | source_line | 7 |
35
+ And the test example block "1" row "3" is found to have the following properties:
36
+ | source_line | 8 |
37
+ And the test example block "2" row "1" is found to have the following properties:
38
+ | source_line | 10 |
39
+ And the test example block "2" row "2" is found to have the following properties:
40
+ | source_line | 11 |
41
+
42
+ Scenario: The row's cells are modeled.
43
+ Then the test example block "1" row "1" cells are as follows:
44
+ | param1 |
45
+ | param2 |
46
+ | extra param |
47
+ And the test example block "1" row "2" cells are as follows:
48
+ | x |
49
+ | y |
50
+ | ? |
51
+ And the test example block "1" row "3" cells are as follows:
52
+ | 1 |
53
+ | 2 |
54
+ | 3 |
55
+ And the test example block "2" row "1" cells are as follows:
56
+ | param1 |
57
+ And the test example block "2" row "2" cells are as follows:
58
+ | a |
59
+
60
+ Scenario Outline: Row models pass all other specifications
61
+ Exact specifications detailing the API for Row models.
62
+ Given that there are "<additional specifications>" detailing models
63
+ When the corresponding unit tests are run
64
+ Then all of those specifications are met
65
+ Examples:
66
+ | additional specifications |
67
+ | row_unit_spec.rb |
@@ -9,6 +9,7 @@ Feature: Scenario elements can be modeled.
9
9
  3. the scenario's steps
10
10
  4. the scenario's tags
11
11
  5. the scenario's applied tags
12
+ 6. the scenario's source line
12
13
 
13
14
 
14
15
  Background: Test file setup.
@@ -30,6 +31,9 @@ Feature: Scenario elements can be modeled.
30
31
  And parameter delimiters of "*" and "*"
31
32
  When the file is read
32
33
 
34
+ Scenario: The scenario source line is modeled.
35
+ Then the test is found to have the following properties:
36
+ | source_line | 6 |
33
37
 
34
38
  Scenario: The scenario name is modeled.
35
39
  Then the test is found to have the following properties:
@@ -8,6 +8,7 @@ Feature: Step elements can be modeled.
8
8
  2. the text of the step
9
9
  3. the step's arguments, if any
10
10
  4. the step's associated block, if any
11
+ 5. the step's source line
11
12
 
12
13
 
13
14
  Background: Test file setup.
@@ -30,6 +31,11 @@ Feature: Step elements can be modeled.
30
31
  And parameter delimiters of "*" and "*"
31
32
  When the file is read
32
33
 
34
+ Scenario: The step's source line is modeled.
35
+ Then the test step "1" source line is "4"
36
+ And the test step "2" source line is "5"
37
+ And the test step "3" source line is "10"
38
+ And the test step "4" source line is "13"
33
39
 
34
40
  Scenario: The step's keyword is modeled.
35
41
  Then the test step "1" keyword is "Given"
@@ -23,7 +23,7 @@ Feature: Table elements can be modeled.
23
23
  When the file is read
24
24
 
25
25
 
26
- Scenario: The table's contents are modeled.d
26
+ Scenario: The table's contents are modeled.
27
27
  Then the step "1" table has the following contents:
28
28
  | value 1 | value 2 |
29
29
  | value 3 | value 4 |
@@ -20,6 +20,22 @@ Then /^(?:the )?(?:feature "([^"]*)" )?test(?: "([^"]*)")? example block(?: "([^
20
20
  end
21
21
  end
22
22
 
23
+ Then /^(?:the )?(?:feature "([^"]*)" )?test(?: "([^"]*)")? example block(?: "([^"]*)")? row(?: "([^"]*)")? is found to have the following properties:$/ do |file, test, example, row, properties|
24
+ file ||= 1
25
+ test ||= 1
26
+ example ||= 1
27
+ row ||= 1
28
+
29
+ properties = properties.rows_hash
30
+
31
+ properties.each do |property, value|
32
+ expected = value
33
+ actual = @parsed_files[file - 1].feature.tests[test - 1].examples[example - 1].row_elements[row - 1].send(property.to_sym).to_s
34
+
35
+ assert(actual == expected, "Expected: #{expected}\n but was: #{actual}")
36
+ end
37
+ end
38
+
23
39
  Then /^(?:the )?(?:feature "([^"]*)" )?test(?: "([^"]*)")? example block(?: "([^"]*)")? descriptive lines are as follows:$/ do |file, test, example, lines|
24
40
  file ||= 1
25
41
  test ||= 1
@@ -72,10 +88,10 @@ Then /^(?:the )?(?:feature "([^"]*)" )?test(?: "([^"]*)")? example block(?: "([^
72
88
  example ||= 1
73
89
 
74
90
  rows = rows.raw.flatten
75
- examples = @parsed_files[file - 1].feature.tests[test - 1].examples[example - 1]
91
+ example = @parsed_files[file - 1].feature.tests[test - 1].examples[example - 1]
76
92
 
77
- expected = rows.collect { |row| row.split(',') }.collect { |row| Hash[examples.parameters.zip(row)] }
78
- actual = examples.rows
93
+ expected = rows.collect { |row| row.split(',') }
94
+ actual = example.row_elements[1..example.row_elements.count].collect { |row| row.cells }
79
95
 
80
96
  assert(actual == expected, "Expected: #{expected}\n but was: #{actual}")
81
97
  end
@@ -111,14 +127,24 @@ Then /^(?:the )?(?:feature "([^"]*)" )?test(?: "([^"]*)")? example block(?: "([^
111
127
  test ||= 1
112
128
  example ||= 1
113
129
 
114
- parameters = parameters.raw.flatten
115
-
116
- expected = parameters
130
+ expected = parameters.raw.flatten
117
131
  actual = @parsed_files[file - 1].feature.tests[test - 1].examples[example - 1].parameters
118
132
 
119
133
  assert(actual == expected, "Expected: #{expected}\n but was: #{actual}")
120
134
  end
121
135
 
136
+ Then /^(?:the )?(?:feature "([^"]*)" )?test(?: "([^"]*)")? example block(?: "([^"]*)")? row(?: "([^"]*)")? cells are as follows:$/ do |file, test, example, row, cells|
137
+ file ||= 1
138
+ test ||= 1
139
+ example ||= 1
140
+ row ||= 1
141
+
142
+ expected = cells.raw.flatten
143
+ actual = @parsed_files[file - 1].feature.tests[test - 1].examples[example - 1].row_elements[row - 1].cells
144
+
145
+ assert(actual == expected, "Expected: #{expected}\n but was: #{actual}")
146
+ end
147
+
122
148
  Then /^(?:the )?(?:feature "([^"]*)" )?test(?: "([^"]*)")? example block(?: "([^"]*)")? has no descriptive lines$/ do |file, test, example|
123
149
  file ||= 1
124
150
  test ||= 1
@@ -140,8 +166,10 @@ Then /^(?:the )?(?:feature "([^"]*)" )?test(?: "([^"]*)")? example block(?: "([^
140
166
  test ||= 1
141
167
  example ||= 1
142
168
 
169
+ example = @parsed_files[file - 1].feature.tests[test - 1].examples[example - 1]
170
+
143
171
  expected = []
144
- actual = @parsed_files[file - 1].feature.tests[test - 1].examples[example - 1].rows
172
+ actual = example.row_elements[1..example.row_elements.count]
145
173
 
146
174
  assert(actual == expected, "Expected: #{expected}\n but was: #{actual}")
147
175
  end
@@ -89,3 +89,14 @@ Then /^(?:the )?(?:feature "([^"]*)" )?(?:test(?: "([^"]*)")? )?step(?: "([^"]*)
89
89
 
90
90
  actual.should == expected
91
91
  end
92
+
93
+ Then /^(?:the )?(?:feature "([^"]*)" )?(?:test(?: "([^"]*)")? )?step(?: "([^"]*)")? source line is "([^"]*)"$/ do |file, test, step, line_number|
94
+ file ||= 1
95
+ test ||= 1
96
+ step ||= 1
97
+
98
+ expected = line_number.to_i
99
+ actual = @parsed_files[file - 1].feature.tests[test - 1].steps[step - 1].source_line
100
+
101
+ actual.should == expected
102
+ end
@@ -5,13 +5,21 @@ module CucumberAnalytics
5
5
  class Example < FeatureElement
6
6
 
7
7
  include Taggable
8
+ include Containing
9
+
8
10
 
9
11
  # The argument rows in the example table
10
12
  attr_accessor :rows
11
13
 
12
14
  # The parameters for the example table
15
+ #
16
+ # todo - Make this a read only method that derives the parameters from
17
+ # the row elements
13
18
  attr_accessor :parameters
14
19
 
20
+ # The row elements in the example table
21
+ attr_accessor :row_elements
22
+
15
23
 
16
24
  # Creates a new Example object and, if *source* is provided,
17
25
  # populates the object.
@@ -23,6 +31,7 @@ module CucumberAnalytics
23
31
  @tags = []
24
32
  @rows = []
25
33
  @parameters = []
34
+ @row_elements = []
26
35
 
27
36
  build_example(parsed_example) if parsed_example
28
37
  end
@@ -34,8 +43,10 @@ module CucumberAnalytics
34
43
  case
35
44
  when row.is_a?(Array)
36
45
  @rows << Hash[@parameters.zip(row.collect { |value| value.strip })]
46
+ @row_elements << Row.new("|#{row.join('|')}|")
37
47
  when row.is_a?(Hash)
38
48
  @rows << row.each_value { |value| value.strip! }
49
+ @row_elements << Row.new("|#{row.values.join('|')}|")
39
50
  else
40
51
  raise(ArgumentError, "Can only add row from a Hash or an Array but received #{row.class}")
41
52
  end
@@ -55,6 +66,12 @@ module CucumberAnalytics
55
66
  end
56
67
 
57
68
  @rows.delete_at(location) if location
69
+ @row_elements.delete_at(location + 1) if location
70
+ end
71
+
72
+ # Returns the immediate child elements of the element.
73
+ def contains
74
+ @row_elements
58
75
  end
59
76
 
60
77
 
@@ -81,18 +98,26 @@ module CucumberAnalytics
81
98
 
82
99
  def build_example(parsed_example)
83
100
  populate_element_tags(parsed_example)
84
- populate_example_parameters(parsed_example)
85
- populate_example_rows(parsed_example)
101
+ populate_example_row_elements(parsed_example)
102
+ populate_example_parameters
103
+ populate_example_rows
86
104
  end
87
105
 
88
- def populate_example_parameters(parsed_example)
89
- @parameters = parsed_example['rows'].first['cells']
106
+ def populate_example_parameters
107
+ @parameters = @row_elements.first.cells
108
+ end
109
+
110
+ def populate_example_rows
111
+ @row_elements.each do |row|
112
+ @rows << Hash[@parameters.zip(row.cells)]
113
+ end
114
+
115
+ @rows.shift
90
116
  end
91
117
 
92
- def populate_example_rows(parsed_example)
93
- parsed_example['rows'].shift
118
+ def populate_example_row_elements(parsed_example)
94
119
  parsed_example['rows'].each do |row|
95
- @rows << Hash[@parameters.zip(row['cells'])]
120
+ @row_elements << build_child_element(Row, row)
96
121
  end
97
122
  end
98
123
 
@@ -4,6 +4,9 @@ module CucumberAnalytics
4
4
 
5
5
  class FeatureElement
6
6
 
7
+ include Sourceable
8
+
9
+
7
10
  # The name of the FeatureElement
8
11
  attr_accessor :name
9
12
 
@@ -30,6 +33,7 @@ module CucumberAnalytics
30
33
  def build_feature_element(parsed_element)
31
34
  populate_feature_element_name(parsed_element)
32
35
  populate_feature_element_description(parsed_element)
36
+ populate_element_source_line(parsed_element)
33
37
  end
34
38
 
35
39
  def populate_feature_element_name(parsed_element)
@@ -0,0 +1,58 @@
1
+ module CucumberAnalytics
2
+
3
+ # A class modeling a Cucumber Examples table row.
4
+
5
+ class Row
6
+
7
+ include Sourceable
8
+
9
+ # The parent object that contains *self*
10
+ attr_accessor :parent_element
11
+
12
+ # The cells that make up the row
13
+ attr_accessor :cells
14
+
15
+
16
+ # Creates a new Row object and, if *source* is provided, populates
17
+ # the object.
18
+ def initialize(source = nil)
19
+ parsed_row = process_source(source)
20
+
21
+ @cells = []
22
+
23
+ build_row(parsed_row) if parsed_row
24
+ end
25
+
26
+
27
+ private
28
+
29
+
30
+ def process_source(source)
31
+ case
32
+ when source.is_a?(String)
33
+ parse_row(source)
34
+ else
35
+ source
36
+ end
37
+ end
38
+
39
+ def parse_row(source_text)
40
+ base_file_string = "Feature: Fake feature to parse\nScenario Outline:\n* fake step\nExamples: fake examples\n"
41
+ source_text = base_file_string + source_text
42
+
43
+ parsed_file = Parsing::parse_text(source_text)
44
+
45
+ parsed_file.first['elements'].first['examples'].first['rows'].first
46
+ end
47
+
48
+ def build_row(parsed_row)
49
+ populate_element_source_line(parsed_row)
50
+ populate_row_cells(parsed_row)
51
+ end
52
+
53
+ def populate_row_cells(parsed_row)
54
+ @cells = parsed_row['cells']
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,20 @@
1
+ module CucumberAnalytics
2
+
3
+ # A mix-in module containing methods used by elements that know their
4
+ # source code line.
5
+
6
+ module Sourceable
7
+
8
+ # The line number where the element began in the source code
9
+ attr_reader :source_line
10
+
11
+
12
+ private
13
+
14
+
15
+ def populate_element_source_line(parsed_element)
16
+ @source_line = parsed_element['line']
17
+ end
18
+
19
+ end
20
+ end
@@ -5,7 +5,7 @@ module CucumberAnalytics
5
5
  class Step
6
6
 
7
7
  include Containing
8
-
8
+ include Sourceable
9
9
 
10
10
  # The step's keyword
11
11
  attr_accessor :keyword
@@ -157,6 +157,7 @@ module CucumberAnalytics
157
157
  populate_base(step)
158
158
  populate_block(step)
159
159
  populate_keyword(step)
160
+ populate_element_source_line(step)
160
161
 
161
162
  scan_arguments
162
163
  end
@@ -1,3 +1,3 @@
1
1
  module CucumberAnalytics
2
- VERSION = '1.0.0'
2
+ VERSION = '1.1.1'
3
3
  end
@@ -75,6 +75,11 @@ module CucumberAnalytics
75
75
  @defined_expressions ||= []
76
76
  end
77
77
 
78
+ # Clears the step patterns that have been loaded into the World.
79
+ def clear_step_patterns
80
+ @defined_expressions = []
81
+ end
82
+
78
83
  # Returns all tags found in the passed container.
79
84
  def tags_in(container)
80
85
  Array.new.tap { |accumulated_tags| collect_all_in(:tags, container, accumulated_tags) }
@@ -2,6 +2,7 @@ require 'cucumber_analytics/version'
2
2
  require 'cucumber_analytics/parsing'
3
3
  require 'cucumber_analytics/containing'
4
4
  require 'cucumber_analytics/taggable'
5
+ require 'cucumber_analytics/sourceable'
5
6
  require 'cucumber_analytics/feature_file'
6
7
  require 'cucumber_analytics/directory'
7
8
  require 'cucumber_analytics/feature_element.rb'
@@ -15,3 +16,4 @@ require 'cucumber_analytics/step'
15
16
  require 'cucumber_analytics/doc_string'
16
17
  require 'cucumber_analytics/table'
17
18
  require 'cucumber_analytics/world'
19
+ require 'cucumber_analytics/row'
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ SimpleCov.command_name('Example') unless RUBY_VERSION.to_s < '1.9.0'
4
+
5
+ describe 'Example, Integration' do
6
+
7
+ it 'properly sets its child elements' do
8
+ source = ['Examples:',
9
+ ' | param |',
10
+ ' | value 1 |']
11
+ source = source.join("\n")
12
+
13
+ example = CucumberAnalytics::Example.new(source)
14
+ rows = example.row_elements
15
+
16
+ rows[0].parent_element.should equal example
17
+ rows[1].parent_element.should equal example
18
+ end
19
+
20
+ end
data/spec/spec_helper.rb CHANGED
@@ -9,6 +9,7 @@ require "#{File.dirname(__FILE__)}/unit/containing_element_unit_specs"
9
9
  require "#{File.dirname(__FILE__)}/unit/bare_bones_unit_specs"
10
10
  require "#{File.dirname(__FILE__)}/unit/test_element_unit_specs"
11
11
  require "#{File.dirname(__FILE__)}/unit/prepopulated_unit_specs"
12
+ require "#{File.dirname(__FILE__)}/unit/sourced_element_unit_specs"
12
13
 
13
14
 
14
15
  DEFAULT_FEATURE_FILE_NAME = 'test_feature.feature'
@@ -12,6 +12,7 @@ describe 'Background, Unit' do
12
12
  it_should_behave_like 'a bare bones element', clazz
13
13
  it_should_behave_like 'a prepopulated element', clazz
14
14
  it_should_behave_like 'a test element', clazz
15
+ it_should_behave_like 'a sourced element', clazz
15
16
 
16
17
  it 'can be parsed from stand alone text' do
17
18
  source = 'Background: '
@@ -11,6 +11,8 @@ describe 'Example, Unit' do
11
11
  it_should_behave_like 'a tagged element', clazz
12
12
  it_should_behave_like 'a bare bones element', clazz
13
13
  it_should_behave_like 'a prepopulated element', clazz
14
+ it_should_behave_like 'a sourced element', clazz
15
+ it_should_behave_like 'a containing element', clazz
14
16
 
15
17
 
16
18
  it 'can be parsed from stand alone text' do
@@ -78,6 +80,21 @@ describe 'Example, Unit' do
78
80
  rows.collect { |row| row.values }.should == [['value1', 'value2'], ['value3', 'value4']]
79
81
  end
80
82
 
83
+ it 'has row elements - #row_elements' do
84
+ @example.should respond_to(:row_elements)
85
+ end
86
+
87
+ it 'can get and set its row elements - #row_elements, #row_elements=' do
88
+ @example.row_elements = :some_row_elements
89
+ @example.row_elements.should == :some_row_elements
90
+ @example.row_elements = :some_other_row_elements
91
+ @example.row_elements.should == :some_other_row_elements
92
+ end
93
+
94
+ it 'starts with no row elements' do
95
+ @example.row_elements.should == []
96
+ end
97
+
81
98
  context '#add_row' do
82
99
 
83
100
  it 'can add a new example row' do
@@ -92,6 +109,7 @@ describe 'Example, Unit' do
92
109
  example.add_row(new_row)
93
110
 
94
111
  example.rows.collect { |row| row.values }.should == [['value1', 'value2'], ['value3', 'value4']]
112
+ example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2'], ['value3', 'value4']]
95
113
  end
96
114
 
97
115
  it 'can add a new row as an array' do
@@ -102,6 +120,7 @@ describe 'Example, Unit' do
102
120
  example.add_row(new_row)
103
121
 
104
122
  example.rows.collect { |row| row.values }.should == [['value1', 'value2'], ['value3', 'value4']]
123
+ example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2'], ['value3', 'value4']]
105
124
  end
106
125
 
107
126
  it 'can only use a Hash or an Array to add a new row' do
@@ -120,6 +139,7 @@ describe 'Example, Unit' do
120
139
  example.add_row(array_row)
121
140
 
122
141
  example.rows.collect { |row| row.values }.should == [['value1', 'value2'], ['value3', 'value4'], ['value5', 'value6']]
142
+ example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2'], ['value3', 'value4'], ['value5', 'value6']]
123
143
  end
124
144
  end
125
145
 
@@ -137,6 +157,7 @@ describe 'Example, Unit' do
137
157
  example.remove_row(old_row)
138
158
 
139
159
  example.rows.collect { |row| row.values }.should == [['value1', 'value2']]
160
+ example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2']]
140
161
  end
141
162
 
142
163
  it 'can remove an existing row as an array' do
@@ -147,6 +168,7 @@ describe 'Example, Unit' do
147
168
  example.remove_row(old_row)
148
169
 
149
170
  example.rows.collect { |row| row.values }.should == [['value1', 'value2']]
171
+ example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2']]
150
172
  end
151
173
 
152
174
  it 'can only use a Hash or an Array to remove an existing row' do
@@ -165,6 +187,7 @@ describe 'Example, Unit' do
165
187
  example.remove_row(array_row)
166
188
 
167
189
  example.rows.collect { |row| row.values }.should == [['value1', 'value2']]
190
+ example.row_elements.collect { |row| row.cells }[1..example.row_elements.count].should == [['value1', 'value2']]
168
191
  end
169
192
  end
170
193
 
@@ -12,6 +12,7 @@ describe 'Feature, Unit' do
12
12
  it_should_behave_like 'a tagged element', clazz
13
13
  it_should_behave_like 'a bare bones element', clazz
14
14
  it_should_behave_like 'a prepopulated element', clazz
15
+ it_should_behave_like 'a sourced element', clazz
15
16
 
16
17
  before(:each) do
17
18
  @feature = clazz.new
@@ -13,6 +13,7 @@ describe 'Outline, Unit' do
13
13
  it_should_behave_like 'a bare bones element', clazz
14
14
  it_should_behave_like 'a prepopulated element', clazz
15
15
  it_should_behave_like 'a test element', clazz
16
+ it_should_behave_like 'a sourced element', clazz
16
17
 
17
18
 
18
19
  it 'can be parsed from stand alone text' do
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ SimpleCov.command_name('Row') unless RUBY_VERSION.to_s < '1.9.0'
4
+
5
+ describe 'Row, Unit' do
6
+
7
+ clazz = CucumberAnalytics::Row
8
+
9
+ it_should_behave_like 'a nested element', clazz
10
+ it_should_behave_like 'a bare bones element', clazz
11
+ it_should_behave_like 'a prepopulated element', clazz
12
+ it_should_behave_like 'a sourced element', clazz
13
+
14
+ it 'can be parsed from stand alone text' do
15
+ source = '| a | row |'
16
+
17
+ expect { clazz.new(source) }.to_not raise_error
18
+ end
19
+
20
+ before(:each) do
21
+ @table = clazz.new
22
+ end
23
+
24
+ it 'has cells - #cells' do
25
+ @table.should respond_to(:cells)
26
+ end
27
+
28
+ it 'can get and set its cells - #cells, #cells=' do
29
+ @table.cells = :some_cells
30
+ @table.cells.should == :some_cells
31
+ @table.cells = :some_other_cells
32
+ @table.cells.should == :some_other_cells
33
+ end
34
+
35
+ it 'starts with no cells' do
36
+ @table.cells.should == []
37
+ end
38
+
39
+ end
@@ -13,6 +13,7 @@ describe 'Scenario, Unit' do
13
13
  it_should_behave_like 'a bare bones element', clazz
14
14
  it_should_behave_like 'a prepopulated element', clazz
15
15
  it_should_behave_like 'a test element', clazz
16
+ it_should_behave_like 'a sourced element', clazz
16
17
 
17
18
  it 'can be parsed from stand alone text' do
18
19
  source = 'Scenario: '
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ SimpleCov.command_name('Sourceable') unless RUBY_VERSION.to_s < '1.9.0'
4
+
5
+ describe 'Sourceable, Unit' do
6
+
7
+ nodule = CucumberAnalytics::Sourceable
8
+
9
+ before(:each) do
10
+ @element = Object.new.extend(nodule)
11
+ end
12
+
13
+ it 'has a source line - #source_line' do
14
+ @element.should respond_to(:source_line)
15
+ end
16
+
17
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'a sourced element' do |clazz|
4
+
5
+ before(:each) do
6
+ @element = clazz.new
7
+ end
8
+
9
+
10
+ it 'has a source line - #source_line' do
11
+ @element.should respond_to(:source_line)
12
+ end
13
+
14
+ it 'starts with no source line' do
15
+ @element.source_line.should == nil
16
+ end
17
+
18
+ end
@@ -9,7 +9,7 @@ describe 'Step, Unit' do
9
9
  it_should_behave_like 'a nested element', clazz
10
10
  it_should_behave_like 'a bare bones element', clazz
11
11
  it_should_behave_like 'a prepopulated element', clazz
12
-
12
+ it_should_behave_like 'a sourced element', clazz
13
13
 
14
14
  before(:each) do
15
15
  @step = clazz.new
@@ -111,6 +111,19 @@ describe 'World, Unit' do
111
111
 
112
112
  @world.loaded_step_patterns.should =~ patterns
113
113
  end
114
+
115
+ it 'can clear its loaded step patterns - #clear_step_patterns' do
116
+ patterns = [/a pattern/, /another pattern/]
117
+
118
+ patterns.each do |pattern|
119
+ @world.load_step_pattern(pattern)
120
+ end
121
+
122
+ @world.loaded_step_patterns.should =~ patterns
123
+ @world.clear_step_patterns
124
+ @world.loaded_step_patterns.should == []
125
+ end
126
+
114
127
  end
115
128
 
116
129
  context 'collecting stuff' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber_analytics
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Kessler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-01 00:00:00.000000000 Z
11
+ date: 2013-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gherkin
@@ -110,6 +110,7 @@ files:
110
110
  - features/modeling/feature_file_modeling.feature
111
111
  - features/modeling/feature_modeling.feature
112
112
  - features/modeling/outline_modeling.feature
113
+ - features/modeling/row_modeling.feature
113
114
  - features/modeling/scenario_modeling.feature
114
115
  - features/modeling/step_modeling.feature
115
116
  - features/modeling/table_modeling.feature
@@ -138,7 +139,9 @@ files:
138
139
  - lib/cucumber_analytics/feature_file.rb
139
140
  - lib/cucumber_analytics/outline.rb
140
141
  - lib/cucumber_analytics/parsing.rb
142
+ - lib/cucumber_analytics/row.rb
141
143
  - lib/cucumber_analytics/scenario.rb
144
+ - lib/cucumber_analytics/sourceable.rb
142
145
  - lib/cucumber_analytics/step.rb
143
146
  - lib/cucumber_analytics/table.rb
144
147
  - lib/cucumber_analytics/taggable.rb
@@ -147,6 +150,7 @@ files:
147
150
  - lib/cucumber_analytics/world.rb
148
151
  - spec/integration/background_integration_spec.rb
149
152
  - spec/integration/directory_integration_spec.rb
153
+ - spec/integration/example_integration_spec.rb
150
154
  - spec/integration/feature_file_integration_spec.rb
151
155
  - spec/integration/feature_integration_spec.rb
152
156
  - spec/integration/outline_integration_spec.rb
@@ -168,7 +172,10 @@ files:
168
172
  - spec/unit/outline_unit_spec.rb
169
173
  - spec/unit/parsing_unit_spec.rb
170
174
  - spec/unit/prepopulated_unit_specs.rb
175
+ - spec/unit/row_unit_spec.rb
171
176
  - spec/unit/scenario_unit_spec.rb
177
+ - spec/unit/sourceable_unit_spec.rb
178
+ - spec/unit/sourced_element_unit_specs.rb
172
179
  - spec/unit/step_unit_spec.rb
173
180
  - spec/unit/table_unit_spec.rb
174
181
  - spec/unit/taggable_unit_spec.rb
@@ -216,6 +223,7 @@ test_files:
216
223
  - features/modeling/feature_file_modeling.feature
217
224
  - features/modeling/feature_modeling.feature
218
225
  - features/modeling/outline_modeling.feature
226
+ - features/modeling/row_modeling.feature
219
227
  - features/modeling/scenario_modeling.feature
220
228
  - features/modeling/step_modeling.feature
221
229
  - features/modeling/table_modeling.feature
@@ -235,6 +243,7 @@ test_files:
235
243
  - features/support/transforms.rb
236
244
  - spec/integration/background_integration_spec.rb
237
245
  - spec/integration/directory_integration_spec.rb
246
+ - spec/integration/example_integration_spec.rb
238
247
  - spec/integration/feature_file_integration_spec.rb
239
248
  - spec/integration/feature_integration_spec.rb
240
249
  - spec/integration/outline_integration_spec.rb
@@ -256,7 +265,10 @@ test_files:
256
265
  - spec/unit/outline_unit_spec.rb
257
266
  - spec/unit/parsing_unit_spec.rb
258
267
  - spec/unit/prepopulated_unit_specs.rb
268
+ - spec/unit/row_unit_spec.rb
259
269
  - spec/unit/scenario_unit_spec.rb
270
+ - spec/unit/sourceable_unit_spec.rb
271
+ - spec/unit/sourced_element_unit_specs.rb
260
272
  - spec/unit/step_unit_spec.rb
261
273
  - spec/unit/table_unit_spec.rb
262
274
  - spec/unit/taggable_unit_spec.rb