cucumber-core 2.0.0 → 3.0.0.pre.2
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.
- checksums.yaml +4 -4
- data/.travis.yml +15 -8
- data/HISTORY.md +53 -18
- data/README.md +7 -7
- data/cucumber-core.gemspec +3 -2
- data/lib/cucumber/core/ast/examples_table.rb +4 -0
- data/lib/cucumber/core/event_bus.rb +11 -2
- data/lib/cucumber/core/report/summary.rb +12 -1
- data/lib/cucumber/core/test/case.rb +14 -1
- data/lib/cucumber/core/test/filters/tag_filter.rb +0 -64
- data/lib/cucumber/core/test/result.rb +58 -17
- data/lib/cucumber/core/version.rb +1 -1
- data/spec/coverage.rb +1 -1
- data/spec/cucumber/core/ast/doc_string_spec.rb +2 -2
- data/spec/cucumber/core/ast/examples_table_spec.rb +6 -1
- data/spec/cucumber/core/ast/location_spec.rb +1 -1
- data/spec/cucumber/core/event_bus_spec.rb +12 -0
- data/spec/cucumber/core/report/summary_spec.rb +46 -0
- data/spec/cucumber/core/test/case_spec.rb +55 -1
- data/spec/cucumber/core/test/result_spec.rb +47 -0
- data/spec/cucumber/core_spec.rb +0 -121
- metadata +28 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14ae96e7b157ead29d3bb55f9590dd59abdf2878
|
4
|
+
data.tar.gz: 72d1ed6b3b96b8d19c92ffa81d6b1be7ae690a7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da7bd878d405691af0f96191da9e1d32caf7802e7d14ef039c206c524ced53c46305c12e74a8ff8362eef619e54cefa606949424609a1f576a1435cb3754879d
|
7
|
+
data.tar.gz: b1c03286e6851861e1532547825bc2bd096881acb5140a0cc1717373edbb288620960bf0bb34890459294b020e70bedb0cebd0798a4a3b394a17b0f9e019753d
|
data/.travis.yml
CHANGED
@@ -1,11 +1,20 @@
|
|
1
|
+
language: ruby
|
1
2
|
sudo: false
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
matrix:
|
5
|
+
include:
|
6
|
+
- rvm: ruby-head
|
7
|
+
- rvm: 2.4.1
|
8
|
+
- rvm: 2.3.4
|
9
|
+
- rvm: 2.2
|
10
|
+
- rvm: 2.1
|
11
|
+
- rvm: 2.0.0
|
12
|
+
- rvm: jruby-9.1.12.0
|
13
|
+
env:
|
14
|
+
- JRUBY_OPTS="--debug"
|
15
|
+
allow_failures:
|
16
|
+
- rvm: ruby-head
|
17
|
+
fast_finish: true
|
9
18
|
|
10
19
|
# whitelist
|
11
20
|
branches:
|
@@ -13,8 +22,6 @@ branches:
|
|
13
22
|
- master
|
14
23
|
|
15
24
|
notifications:
|
16
|
-
email:
|
17
|
-
- cukes-devs@googlegroups.com
|
18
25
|
webhooks:
|
19
26
|
urls: # gitter
|
20
27
|
- https://webhooks.gitter.im/e/dc010332f9d40fcc21c4
|
data/HISTORY.md
CHANGED
@@ -1,10 +1,41 @@
|
|
1
|
-
## [In Git](https://github.com/cucumber/cucumber-ruby-core/compare/
|
1
|
+
## [In Git](https://github.com/cucumber/cucumber-ruby-core/compare/3.0.0.pre.2...master)
|
2
2
|
|
3
3
|
### New Features
|
4
|
+
### Bugfixes
|
5
|
+
### Removed Features
|
6
|
+
### Refactoring
|
7
|
+
|
8
|
+
## [3.0.0.pre.2](https://github.com/cucumber/cucumber-ruby-core/compare/v2.0.0...3.0.0.pre.2) (2017-07-26)
|
9
|
+
|
10
|
+
### New Features
|
11
|
+
|
12
|
+
* Add a flaky result type to be used for flaky scenarios ([#141](https://github.com/cucumber/cucumber-ruby-core/pull/141), [cucumber/cucumber-ruby#1044](https://github.com/cucumber/cucumber-ruby/issues/1044) @brasmusson)
|
13
|
+
* Make the Summary report able to say if the total result is ok ([#140](https://github.com/cucumber/cucumber-ruby-core/pull/140) @brasmusson)
|
14
|
+
* Replay previous events to new subscribers ([#136](https://github.com/cucumber/cucumber-ruby-core/pull/136) @mattwynne)
|
15
|
+
* Ruby 2.4.0 compatibility ([#120](https://github.com/cucumber/cucumber-ruby-core/pull/120) @junaruga)
|
16
|
+
* Use tag expressions ([#116](https://github.com/cucumber/cucumber-ruby-core/pull/116) @brasmusson)
|
17
|
+
* Access example table row data by param name ([#118](https://github.com/cucumber/cucumber-ruby-core/pull/118) @enkessler)
|
18
|
+
|
19
|
+
### Bugfixes
|
20
|
+
|
21
|
+
N/A
|
22
|
+
|
23
|
+
### Removed Features
|
24
|
+
|
25
|
+
N/A
|
26
|
+
|
27
|
+
### Refactoring
|
28
|
+
|
29
|
+
* Travis: jruby-9.1.10.0 ([#130](https://github.com/cucumber/cucumber-ruby-core/pull/130) @olleolleolle)
|
30
|
+
* Travis: jruby-9.1.12.0 ([#133](https://github.com/cucumber/cucumber-ruby-core/pull/132) @olleolleolle)
|
31
|
+
|
32
|
+
## [2.0.0](https://github.com/cucumber/cucumber-ruby-core/compare/v1.5.0...2.0.0)
|
4
33
|
|
5
|
-
|
6
|
-
|
7
|
-
|
34
|
+
### New Features
|
35
|
+
|
36
|
+
* Implement equality for test cases ([#111](https://github.com/cucumber/cucumber-ruby-core/pull/111) @mattwynne)
|
37
|
+
* Implement an event bus (moved from Cucumber-Ruby) ([#106](https://github.com/cucumber/cucumber-ruby-core/pull/106) @mattwynne)
|
38
|
+
* Use frozen string literals ([#105](https://github.com/cucumber/cucumber-ruby-core/pull/105) @twalpole)
|
8
39
|
|
9
40
|
### Bugfixes
|
10
41
|
|
@@ -15,7 +46,11 @@
|
|
15
46
|
|
16
47
|
* Remove support for Ruby v1.9.3. ([112](https://github.com/cucumber/cucumber-ruby-core/pull/112) @brasmusson)
|
17
48
|
|
18
|
-
|
49
|
+
### Refactoring
|
50
|
+
|
51
|
+
N/A
|
52
|
+
|
53
|
+
## [1.5.0](https://github.com/cucumber/cucumber-ruby-core/compare/v1.4.0...v1.5.0)
|
19
54
|
|
20
55
|
### New Features
|
21
56
|
|
@@ -25,7 +60,7 @@
|
|
25
60
|
|
26
61
|
* Use monotonic time ([#103](https://github.com/cucumber/cucumber-ruby-core/pull/103) @mikz)
|
27
62
|
|
28
|
-
## [
|
63
|
+
## [1.4.0](https://github.com/cucumber/cucumber-ruby-core/compare/v1.3.1...v1.4.0)
|
29
64
|
|
30
65
|
### New Features
|
31
66
|
|
@@ -33,7 +68,7 @@
|
|
33
68
|
|
34
69
|
### Bugfixes
|
35
70
|
|
36
|
-
## [
|
71
|
+
## [1.3.1](https://github.com/cucumber/cucumber-ruby-core/compare/v1.3.0...v1.3.1)
|
37
72
|
|
38
73
|
### New Features
|
39
74
|
|
@@ -41,7 +76,7 @@
|
|
41
76
|
|
42
77
|
* Speed up location filtering ([#99](https://github.com/cucumber/cucumber-ruby-core/issues/99) @mattwynne @akostadinov @brasmusson)
|
43
78
|
|
44
|
-
## [
|
79
|
+
## [1.3.0](https://github.com/cucumber/cucumber-ruby-core/compare/v1.2.0...v1.3.0)
|
45
80
|
|
46
81
|
### New Features
|
47
82
|
|
@@ -53,7 +88,7 @@
|
|
53
88
|
* Make sure that `after_test_step` is sent also when a test step is interrupted by (a timeout in) an around hook ([cucumber/cucumber-ruby#909](https://github.com/cucumber/cucumber-ruby/issues/909) @brasmusson)
|
54
89
|
* Improve the check that a test_step quacks like a Cucumber::Core::Test::Step ([95](https://github.com/cucumber/cucumber-ruby-core/issues/95) @brasmusson)
|
55
90
|
|
56
|
-
## [
|
91
|
+
## [1.2.0](https://github.com/cucumber/cucumber-ruby-core/compare/v1.1.3...v1.2.0)
|
57
92
|
|
58
93
|
### New Features
|
59
94
|
|
@@ -65,13 +100,13 @@
|
|
65
100
|
|
66
101
|
### Bugfixes
|
67
102
|
|
68
|
-
## [
|
103
|
+
## [1.1.3](https://github.com/cucumber/cucumber-ruby-core/compare/v1.1.2...v1.1.3)
|
69
104
|
|
70
105
|
### New Features
|
71
106
|
|
72
107
|
* Added custom `inspect` methods for AST Nodes (@tooky)
|
73
108
|
|
74
|
-
## [
|
109
|
+
## [1.1.2](https://github.com/cucumber/cucumber-ruby-core/compare/v1.1.1...v1.1.2)
|
75
110
|
|
76
111
|
### New Features
|
77
112
|
|
@@ -81,24 +116,24 @@
|
|
81
116
|
* Fail test case if around hook fails (@mattwynne, @tooky)
|
82
117
|
* Expose `Test::Case#around_hooks` (@tooky)
|
83
118
|
|
84
|
-
## [
|
119
|
+
## [1.1.1](https://github.com/cucumber/cucumber-ruby-core/compare/v1.1.0...v1.1.1)
|
85
120
|
|
86
121
|
|
87
122
|
### New Features
|
88
123
|
|
89
124
|
* Calculate actual keyword for snippets (@brasmusson)
|
90
125
|
|
91
|
-
###
|
126
|
+
### Bugfixes
|
92
127
|
|
93
128
|
* Remove keyword from `Test::Case#name` [82](https://github.com/cucumber/cucumber-ruby-core/pull/82) (@richarda)
|
94
129
|
|
95
|
-
## [
|
130
|
+
## [1.1.0](https://github.com/cucumber/cucumber-ruby-core/compare/v1.0.0...v1.1.0)
|
96
131
|
|
97
132
|
### New features
|
98
133
|
|
99
134
|
* LocationsFilter now sorts test cases as well as filtering them (@mattwynne)
|
100
135
|
|
101
|
-
## [
|
136
|
+
## [1.0.0](https://github.com/cucumber/cucumber-ruby-core/compare/v1.0.0.beta.4...v1.0.0)
|
102
137
|
|
103
138
|
### Features Removed
|
104
139
|
|
@@ -109,7 +144,7 @@
|
|
109
144
|
|
110
145
|
* Added dynamic filter class constructor (@mattwynne)
|
111
146
|
|
112
|
-
## [
|
147
|
+
## [1.0.0.beta.4](https://github.com/cucumber/cucumber-ruby-core/compare/v1.0.0.beta.3...v1.0.0.beta.4)
|
113
148
|
|
114
149
|
### New Features
|
115
150
|
|
@@ -122,10 +157,10 @@
|
|
122
157
|
* Handle empty feature files (#[77](https://github.com/cucumber/cucumber-ruby-core/pull/77), [cucumber/cucumber-ruby#771](https://github.com/cucumber/cucumber-ruby/issues/771) [@brasmusson](https://github.com/brasmusson))
|
123
158
|
* Run after hooks in reverse order (#[69](https://github.com/cucumber/cucumber-ruby-core/pull/69) [@erran](https://github.com/erran))
|
124
159
|
|
125
|
-
## [
|
160
|
+
## [1.0.0.beta.3](https://github.com/cucumber/cucumber-ruby-core/compare/v1.0.0.beta.2...v1.0.0.beta.3)
|
126
161
|
|
127
162
|
Changes were not logged.
|
128
163
|
|
129
|
-
## [
|
164
|
+
## [1.0.0.beta.2](https://github.com/cucumber/cucumber-ruby-core/compare/v1.0.0.beta.1...v1.0.0.beta.2)
|
130
165
|
|
131
166
|
Changes were not logged.
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#cucumber-core
|
1
|
+
# cucumber-core
|
2
2
|
|
3
3
|
[](https://gitter.im/cucumber/cucumber-ruby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
4
4
|
[](http://travis-ci.org/cucumber/cucumber-ruby-core)
|
@@ -10,7 +10,7 @@ Cucumber Core is the [inner hexagon](http://alistair.cockburn.us/Hexagonal+archi
|
|
10
10
|
|
11
11
|
It contains the core domain logic to execute Cucumber features. It has no user interface, just a Ruby API. If you're interested in how Cucumber works, or in building other tools that work with Gherkin documents, you've come to the right place.
|
12
12
|
|
13
|
-
##An overview
|
13
|
+
## An overview
|
14
14
|
|
15
15
|
The entry-point is a single method on the module [`Cucumber::Core`](Cucumber/Core.html) called [`#execute`](Cucumber/Core.html#execute-instance_method). Here's what it does:
|
16
16
|
|
@@ -21,13 +21,13 @@ The entry-point is a single method on the module [`Cucumber::Core`](Cucumber/Cor
|
|
21
21
|
|
22
22
|
We've introduced a number of concepts here, so let's go through them in detail.
|
23
23
|
|
24
|
-
###The AST
|
24
|
+
### The AST
|
25
25
|
|
26
26
|
The Abstract Syntax Tree or [AST](Cucumber/Core/Ast.html) is an object graph that represents the Gherkin documents you've passed into the core. Things like [Feature](Cucumber/Core/Ast/Feature.html), [Scenario](Cucumber/Core/Ast/Scenario.html) and [ExamplesTable](Cucumber/Core/Ast/ExamplesTable.html).
|
27
27
|
|
28
28
|
These are immutable value objects.
|
29
29
|
|
30
|
-
###Test cases
|
30
|
+
### Test cases
|
31
31
|
|
32
32
|
Your gherkin might contain scenarios, as well as examples from tables beneath a scenario outline.
|
33
33
|
|
@@ -35,11 +35,11 @@ Test cases represent the general case of both of these. We compile the AST down
|
|
35
35
|
|
36
36
|
Test cases and their test steps are also immutable value objects.
|
37
37
|
|
38
|
-
###Filters
|
38
|
+
### Filters
|
39
39
|
|
40
40
|
Once we have the test cases, and they've been activated by the mappings, you may want to pass them through a filter or two. Filters can be used to do things like activate, sort, replace or remove some of the test cases or their steps before they're executed.
|
41
41
|
|
42
|
-
###Events
|
42
|
+
### Events
|
43
43
|
|
44
44
|
Events are how you find out what is happening during your test run. As the test cases and steps are executed, the runner emits events to signal what's going on.
|
45
45
|
|
@@ -52,7 +52,7 @@ The following events are emitted during a run:
|
|
52
52
|
|
53
53
|
That's probably best illustrated with an example.
|
54
54
|
|
55
|
-
##Example
|
55
|
+
## Example
|
56
56
|
|
57
57
|
Here's an example of how you might use [`Cucumber::Core#execute`](Cucumber/Core#execute-instance_method)
|
58
58
|
|
data/cucumber-core.gemspec
CHANGED
@@ -14,8 +14,9 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.license = "MIT"
|
15
15
|
s.required_ruby_version = ">= 1.9.3"
|
16
16
|
|
17
|
-
s.add_dependency 'gherkin', '
|
18
|
-
s.add_dependency '
|
17
|
+
s.add_dependency 'gherkin', '>= 4.1.3'
|
18
|
+
s.add_dependency 'cucumber-tag_expressions', '>= 1.0.1'
|
19
|
+
s.add_dependency 'backports', '>= 3.8.0'
|
19
20
|
|
20
21
|
s.add_development_dependency 'bundler', '>= 1.3.5'
|
21
22
|
s.add_development_dependency 'rake', '>= 0.9.2'
|
@@ -15,6 +15,7 @@ module Cucumber
|
|
15
15
|
def initialize(registry = Events.registry)
|
16
16
|
@event_types = registry.freeze
|
17
17
|
@handlers = {}
|
18
|
+
@event_queue = []
|
18
19
|
end
|
19
20
|
|
20
21
|
# Register for an event. The handler proc will be called back with each of the attributes
|
@@ -24,23 +25,31 @@ module Cucumber
|
|
24
25
|
validate_handler_and_event_id!(handler, event_id)
|
25
26
|
event_class = event_types[event_id]
|
26
27
|
handlers_for(event_class) << handler
|
28
|
+
broadcast_queued_events_to handler, event_class
|
27
29
|
end
|
28
30
|
|
29
31
|
# Broadcast an event
|
30
32
|
def broadcast(event)
|
31
33
|
raise ArgumentError, "Event type #{event.class} is not registered. Try one of these:\n#{event_types.values.join("\n")}" unless is_registered_type?(event.class)
|
32
34
|
handlers_for(event.class).each { |handler| handler.call(event) }
|
35
|
+
@event_queue << event
|
33
36
|
end
|
34
37
|
|
35
38
|
def method_missing(event_id, *args)
|
36
39
|
event_class = event_types.fetch(event_id) { super }
|
37
40
|
broadcast event_class.new(*args)
|
38
|
-
rescue NameError => error
|
39
|
-
raise error, error.message + "\nDid you get the ID of the event wrong? Try one of these:\n#{event_types.keys.join("\n")}", error.backtrace
|
40
41
|
end
|
41
42
|
|
42
43
|
private
|
43
44
|
|
45
|
+
def broadcast_queued_events_to(handler, event_type)
|
46
|
+
@event_queue.select { |event|
|
47
|
+
event.class == event_type
|
48
|
+
}.each { |event|
|
49
|
+
handler.call(event)
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
44
53
|
def handlers_for(event_class)
|
45
54
|
@handlers[event_class.to_s] ||= []
|
46
55
|
end
|
@@ -6,16 +6,27 @@ module Cucumber
|
|
6
6
|
attr_reader :test_cases, :test_steps
|
7
7
|
|
8
8
|
def initialize(event_bus)
|
9
|
+
@previous_test_case = nil
|
9
10
|
@test_cases = Test::Result::Summary.new
|
10
11
|
@test_steps = Test::Result::Summary.new
|
11
12
|
subscribe_to(event_bus)
|
12
13
|
end
|
13
14
|
|
15
|
+
def ok?(be_strict = false)
|
16
|
+
test_cases.ok?(be_strict)
|
17
|
+
end
|
18
|
+
|
14
19
|
private
|
15
20
|
|
16
21
|
def subscribe_to(event_bus)
|
17
22
|
event_bus.on(:test_case_finished) do |event|
|
18
|
-
event.
|
23
|
+
if event.test_case != @previous_test_case
|
24
|
+
@previous_test_case = event.test_case
|
25
|
+
event.result.describe_to test_cases
|
26
|
+
elsif event.result.passed?
|
27
|
+
test_cases.flaky
|
28
|
+
test_cases.decrement_failed
|
29
|
+
end
|
19
30
|
end
|
20
31
|
event_bus.on(:test_step_finished) do |event|
|
21
32
|
event.result.describe_to test_steps if is_step?(event.test_step)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'cucumber/core/test/result'
|
3
|
+
require 'cucumber/tag_expressions'
|
3
4
|
require 'cucumber/core/gherkin/tag_expression'
|
4
5
|
require 'cucumber/core/ast/location'
|
5
6
|
|
@@ -59,7 +60,7 @@ module Cucumber
|
|
59
60
|
end
|
60
61
|
|
61
62
|
def match_tags?(*expressions)
|
62
|
-
|
63
|
+
expressions.flatten.all? { |expression| match_single_tag_expression?(expression) }
|
63
64
|
end
|
64
65
|
|
65
66
|
def match_name?(name_regexp)
|
@@ -120,6 +121,18 @@ module Cucumber
|
|
120
121
|
end.call
|
121
122
|
end
|
122
123
|
|
124
|
+
def match_single_tag_expression?(expression)
|
125
|
+
if old_style_tag_expression?(expression)
|
126
|
+
Cucumber::Core::Gherkin::TagExpression.new([expression]).evaluate(tags)
|
127
|
+
else
|
128
|
+
Cucumber::TagExpressions::Parser.new.parse(expression).evaluate(tags.map(&:name))
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def old_style_tag_expression?(expression)
|
133
|
+
expression.include?(',') || expression.include?('~')
|
134
|
+
end
|
135
|
+
|
123
136
|
class NameBuilder
|
124
137
|
attr_reader :result
|
125
138
|
attr_reader :keyword
|
@@ -15,7 +15,6 @@ module Cucumber
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def done
|
18
|
-
tag_limits.enforce(test_cases)
|
19
18
|
receiver.done
|
20
19
|
self
|
21
20
|
end
|
@@ -26,10 +25,6 @@ module Cucumber
|
|
26
25
|
@test_cases ||= TestCases.new
|
27
26
|
end
|
28
27
|
|
29
|
-
def tag_limits
|
30
|
-
@tag_limits ||= TagLimits.new(filter_expressions)
|
31
|
-
end
|
32
|
-
|
33
28
|
class TestCases
|
34
29
|
attr_reader :test_cases_by_tag_name
|
35
30
|
private :test_cases_by_tag_name
|
@@ -48,65 +43,6 @@ module Cucumber
|
|
48
43
|
test_cases_by_tag_name[tag_name]
|
49
44
|
end
|
50
45
|
end
|
51
|
-
|
52
|
-
class TagLimits
|
53
|
-
TAG_MATCHER = /^
|
54
|
-
(?:~)? #The tag negation symbol "~". This is optional and not captured.
|
55
|
-
(?<tag_name>\@\w+) #Captures the tag name including the "@" symbol.
|
56
|
-
\: #The seperator, ":", between the tag name and the limit.
|
57
|
-
(?<limit>\d+) #Caputres the limit number.
|
58
|
-
$/x
|
59
|
-
|
60
|
-
attr_reader :limit_list
|
61
|
-
private :limit_list
|
62
|
-
def initialize(filter_expressions)
|
63
|
-
@limit_list = Array(filter_expressions).flat_map do |raw_expression|
|
64
|
-
raw_expression.split(/\s*,\s*/)
|
65
|
-
end.map do |filter_expression|
|
66
|
-
TAG_MATCHER.match(filter_expression)
|
67
|
-
end.compact.each_with_object({}) do |matchdata, limit_list|
|
68
|
-
limit_list[matchdata[:tag_name]] = Integer(matchdata[:limit])
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def enforce(test_cases)
|
73
|
-
limit_breaches = limit_list.reduce([]) do |breaches, (tag_name, limit)|
|
74
|
-
tag_count = test_cases.with_tag_name(tag_name).count
|
75
|
-
if tag_count > limit
|
76
|
-
tag_locations = test_cases.with_tag_name(tag_name).map(&:location)
|
77
|
-
breaches << TagLimitBreach.new(
|
78
|
-
tag_count,
|
79
|
-
limit,
|
80
|
-
tag_name,
|
81
|
-
tag_locations
|
82
|
-
)
|
83
|
-
end
|
84
|
-
breaches
|
85
|
-
end
|
86
|
-
raise TagExcess.new(limit_breaches) if limit_breaches.any?
|
87
|
-
self
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
TagLimitBreach = Struct.new(
|
92
|
-
:tag_count,
|
93
|
-
:tag_limit,
|
94
|
-
:tag_name,
|
95
|
-
:tag_locations
|
96
|
-
) do
|
97
|
-
|
98
|
-
def message
|
99
|
-
"#{tag_name} occurred #{tag_count} times, but the limit was set to #{tag_limit}\n " +
|
100
|
-
tag_locations.map(&:to_s).join("\n ")
|
101
|
-
end
|
102
|
-
alias :to_s :message
|
103
|
-
end
|
104
|
-
|
105
|
-
class TagExcess < StandardError
|
106
|
-
def initialize(limit_breaches)
|
107
|
-
super(limit_breaches.map(&:to_s).join("\n"))
|
108
|
-
end
|
109
|
-
end
|
110
46
|
end
|
111
47
|
end
|
112
48
|
end
|
@@ -1,10 +1,17 @@
|
|
1
|
-
# encoding:
|
1
|
+
# encoding: utf-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Cucumber
|
5
5
|
module Core
|
6
6
|
module Test
|
7
7
|
module Result
|
8
|
+
TYPES = [:failed, :flaky, :skipped, :undefined, :pending, :passed, :unknown].freeze
|
9
|
+
|
10
|
+
def self.ok?(type, be_strict = false)
|
11
|
+
private
|
12
|
+
class_name = type.to_s.slice(0, 1).capitalize + type.to_s.slice(1..-1)
|
13
|
+
const_get(class_name).ok?(be_strict)
|
14
|
+
end
|
8
15
|
|
9
16
|
# Defines to_sym on a result class for the given result type
|
10
17
|
#
|
@@ -16,7 +23,7 @@ module Cucumber
|
|
16
23
|
result_type
|
17
24
|
end
|
18
25
|
|
19
|
-
|
26
|
+
TYPES.each do |possible_result_type|
|
20
27
|
define_method("#{possible_result_type}?") do
|
21
28
|
possible_result_type == to_sym
|
22
29
|
end
|
@@ -41,6 +48,10 @@ module Cucumber
|
|
41
48
|
include Result.query_methods :passed
|
42
49
|
attr_accessor :duration
|
43
50
|
|
51
|
+
def self.ok?(be_strict = false)
|
52
|
+
true
|
53
|
+
end
|
54
|
+
|
44
55
|
def initialize(duration)
|
45
56
|
raise ArgumentError unless duration
|
46
57
|
@duration = duration
|
@@ -57,7 +68,7 @@ module Cucumber
|
|
57
68
|
end
|
58
69
|
|
59
70
|
def ok?(be_strict = false)
|
60
|
-
|
71
|
+
self.class.ok?(be_strict)
|
61
72
|
end
|
62
73
|
|
63
74
|
def with_appended_backtrace(step)
|
@@ -73,6 +84,10 @@ module Cucumber
|
|
73
84
|
include Result.query_methods :failed
|
74
85
|
attr_reader :duration, :exception
|
75
86
|
|
87
|
+
def self.ok?(be_strict = false)
|
88
|
+
false
|
89
|
+
end
|
90
|
+
|
76
91
|
def initialize(duration, exception)
|
77
92
|
raise ArgumentError unless duration
|
78
93
|
raise ArgumentError unless exception
|
@@ -92,7 +107,7 @@ module Cucumber
|
|
92
107
|
end
|
93
108
|
|
94
109
|
def ok?(be_strict = false)
|
95
|
-
|
110
|
+
self.class.ok?(be_strict)
|
96
111
|
end
|
97
112
|
|
98
113
|
def with_duration(new_duration)
|
@@ -109,7 +124,16 @@ module Cucumber
|
|
109
124
|
end
|
110
125
|
end
|
111
126
|
|
112
|
-
#
|
127
|
+
# Flaky is not used directly as an execution result, but is used as a
|
128
|
+
# reporting result type for test cases that fails and the passes on
|
129
|
+
# retry, therefore only the class method self.ok? is needed.
|
130
|
+
class Flaky
|
131
|
+
def self.ok?(be_strict = false)
|
132
|
+
!be_strict
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Base class for exceptions that can be raised in a step definition causing
|
113
137
|
# the step to have that result.
|
114
138
|
class Raisable < StandardError
|
115
139
|
attr_reader :message, :duration
|
@@ -139,11 +163,19 @@ module Cucumber
|
|
139
163
|
return self unless backtrace
|
140
164
|
filter.new(dup).exception
|
141
165
|
end
|
166
|
+
|
167
|
+
def ok?(be_strict = false)
|
168
|
+
self.class.ok?(be_strict)
|
169
|
+
end
|
142
170
|
end
|
143
171
|
|
144
172
|
class Undefined < Raisable
|
145
173
|
include Result.query_methods :undefined
|
146
174
|
|
175
|
+
def self.ok?(be_strict = false)
|
176
|
+
!be_strict
|
177
|
+
end
|
178
|
+
|
147
179
|
def describe_to(visitor, *args)
|
148
180
|
visitor.undefined(*args)
|
149
181
|
visitor.duration(duration, *args)
|
@@ -153,15 +185,15 @@ module Cucumber
|
|
153
185
|
def to_s
|
154
186
|
"?"
|
155
187
|
end
|
156
|
-
|
157
|
-
def ok?(be_strict = false)
|
158
|
-
!be_strict
|
159
|
-
end
|
160
188
|
end
|
161
189
|
|
162
190
|
class Skipped < Raisable
|
163
191
|
include Result.query_methods :skipped
|
164
192
|
|
193
|
+
def self.ok?(be_strict = false)
|
194
|
+
true
|
195
|
+
end
|
196
|
+
|
165
197
|
def describe_to(visitor, *args)
|
166
198
|
visitor.skipped(*args)
|
167
199
|
visitor.duration(duration, *args)
|
@@ -171,15 +203,15 @@ module Cucumber
|
|
171
203
|
def to_s
|
172
204
|
"-"
|
173
205
|
end
|
174
|
-
|
175
|
-
def ok?(be_strict = false)
|
176
|
-
true
|
177
|
-
end
|
178
206
|
end
|
179
207
|
|
180
208
|
class Pending < Raisable
|
181
209
|
include Result.query_methods :pending
|
182
210
|
|
211
|
+
def self.ok?(be_strict = false)
|
212
|
+
!be_strict
|
213
|
+
end
|
214
|
+
|
183
215
|
def describe_to(visitor, *args)
|
184
216
|
visitor.pending(self, *args)
|
185
217
|
visitor.duration(duration, *args)
|
@@ -189,10 +221,6 @@ module Cucumber
|
|
189
221
|
def to_s
|
190
222
|
"P"
|
191
223
|
end
|
192
|
-
|
193
|
-
def ok?(be_strict = false)
|
194
|
-
!be_strict
|
195
|
-
end
|
196
224
|
end
|
197
225
|
|
198
226
|
#
|
@@ -222,6 +250,15 @@ module Cucumber
|
|
222
250
|
end
|
223
251
|
end
|
224
252
|
|
253
|
+
def ok?(be_strict = false)
|
254
|
+
TYPES.each do |type|
|
255
|
+
if get_total(type) > 0
|
256
|
+
return false unless Result.ok?(type, be_strict)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
true
|
260
|
+
end
|
261
|
+
|
225
262
|
def exception(exception)
|
226
263
|
@exceptions << exception
|
227
264
|
self
|
@@ -240,6 +277,10 @@ module Cucumber
|
|
240
277
|
end
|
241
278
|
end
|
242
279
|
|
280
|
+
def decrement_failed
|
281
|
+
@totals[:failed] -= 1
|
282
|
+
end
|
283
|
+
|
243
284
|
private
|
244
285
|
|
245
286
|
def get_total(method_name)
|
data/spec/coverage.rb
CHANGED
@@ -77,11 +77,11 @@ module Cucumber
|
|
77
77
|
expect( doc_string.encoding ).to eq Encoding.find('US-ASCII')
|
78
78
|
end
|
79
79
|
|
80
|
-
it 'allows implicit
|
80
|
+
it 'allows implicit conversion to a String' do
|
81
81
|
expect( 'expected content' ).to include(doc_string)
|
82
82
|
end
|
83
83
|
|
84
|
-
it 'allows explicit
|
84
|
+
it 'allows explicit conversion to a String' do
|
85
85
|
expect( doc_string.to_s ).to eq 'content'
|
86
86
|
end
|
87
87
|
|
@@ -75,11 +75,16 @@ module Cucumber::Core::Ast
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
-
describe '
|
78
|
+
describe 'accessing the values' do
|
79
79
|
it 'returns the actual row values' do
|
80
80
|
row = ExamplesTable::Row.new({'x' => '1', 'y' => '2'}, 1, location, language, comments)
|
81
81
|
expect( row.values ).to eq ['1', '2']
|
82
82
|
end
|
83
|
+
|
84
|
+
it "can access a row value by it's parameter name" do
|
85
|
+
row = ExamplesTable::Row.new({'x' => '1', 'y' => '2'}, 1, location, language, comments)
|
86
|
+
expect( row['x']).to eq '1'
|
87
|
+
end
|
83
88
|
end
|
84
89
|
|
85
90
|
describe 'equality' do
|
@@ -62,7 +62,7 @@ module Cucumber::Core::Ast
|
|
62
62
|
expect( matching ).to be_match(precise)
|
63
63
|
end
|
64
64
|
|
65
|
-
it "does not match a precise location on a
|
65
|
+
it "does not match a precise location on a different line in the same file" do
|
66
66
|
expect( matching ).not_to be_match(same_file_other_line)
|
67
67
|
end
|
68
68
|
|
@@ -136,6 +136,18 @@ module Cucumber
|
|
136
136
|
expect(handler.received_payload.some_attribute).to eq :some_attribute
|
137
137
|
end
|
138
138
|
|
139
|
+
it "sends events that were broadcast before you subscribed" do
|
140
|
+
event_bus.test_event :some_attribute
|
141
|
+
event_bus.another_test_event
|
142
|
+
|
143
|
+
received_payload = nil
|
144
|
+
event_bus.on(:test_event) do |event|
|
145
|
+
received_payload = event
|
146
|
+
end
|
147
|
+
|
148
|
+
expect(received_payload.some_attribute).to eq(:some_attribute)
|
149
|
+
end
|
150
|
+
|
139
151
|
end
|
140
152
|
|
141
153
|
it "will let you inspect the registry" do
|
@@ -55,6 +55,16 @@ module Cucumber::Core::Report
|
|
55
55
|
expect( @summary.test_cases.total(:undefined) ).to eq(1)
|
56
56
|
expect( @summary.test_cases.total ).to eq(1)
|
57
57
|
end
|
58
|
+
|
59
|
+
it "handles flaky test cases" do
|
60
|
+
allow(test_case).to receive(:==).and_return(false, true)
|
61
|
+
event_bus.send(:test_case_finished, test_case, failed_result)
|
62
|
+
event_bus.send(:test_case_finished, test_case, passed_result)
|
63
|
+
|
64
|
+
expect( @summary.test_cases.total(:failed) ).to eq(0)
|
65
|
+
expect( @summary.test_cases.total(:flaky) ).to eq(1)
|
66
|
+
expect( @summary.test_cases.total ).to eq(1)
|
67
|
+
end
|
58
68
|
end
|
59
69
|
|
60
70
|
context "test step summary" do
|
@@ -123,5 +133,41 @@ module Cucumber::Core::Report
|
|
123
133
|
end
|
124
134
|
end
|
125
135
|
end
|
136
|
+
|
137
|
+
context "ok? result" do
|
138
|
+
let(:test_case) { double }
|
139
|
+
|
140
|
+
it "passed test case is ok" do
|
141
|
+
event_bus.send(:test_case_finished, test_case, passed_result)
|
142
|
+
|
143
|
+
expect( @summary.ok? ).to eq true
|
144
|
+
end
|
145
|
+
|
146
|
+
it "skipped test case is ok" do
|
147
|
+
event_bus.send(:test_case_finished, test_case, skipped_result)
|
148
|
+
|
149
|
+
expect( @summary.ok? ).to eq true
|
150
|
+
end
|
151
|
+
|
152
|
+
it "failed test case is not ok" do
|
153
|
+
event_bus.send(:test_case_finished, test_case, failed_result)
|
154
|
+
|
155
|
+
expect( @summary.ok? ).to eq false
|
156
|
+
end
|
157
|
+
|
158
|
+
it "pending test case is ok if not strict" do
|
159
|
+
event_bus.send(:test_case_finished, test_case, pending_result)
|
160
|
+
|
161
|
+
expect( @summary.ok? ).to eq true
|
162
|
+
expect( @summary.ok?(true) ).to eq false
|
163
|
+
end
|
164
|
+
|
165
|
+
it "undefined test case is ok if not strict" do
|
166
|
+
event_bus.send(:test_case_finished, test_case, undefined_result)
|
167
|
+
|
168
|
+
expect( @summary.ok? ).to eq true
|
169
|
+
expect( @summary.ok?(true) ).to eq false
|
170
|
+
end
|
171
|
+
end
|
126
172
|
end
|
127
173
|
end
|
@@ -185,6 +185,42 @@ module Cucumber
|
|
185
185
|
end
|
186
186
|
|
187
187
|
describe "matching tags" do
|
188
|
+
it "matches tags using tag expressions" do
|
189
|
+
gherkin = gherkin do
|
190
|
+
feature tags: ['@a', '@b'] do
|
191
|
+
scenario tags: ['@c'] do
|
192
|
+
step
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
receiver = double.as_null_object
|
197
|
+
expect( receiver ).to receive(:test_case) do |test_case|
|
198
|
+
expect( test_case.match_tags?(['@a and @b']) ).to be_truthy
|
199
|
+
expect( test_case.match_tags?(['@a or @d']) ).to be_truthy
|
200
|
+
expect( test_case.match_tags?(['not @d']) ).to be_truthy
|
201
|
+
expect( test_case.match_tags?(['@a and @d']) ).to be_falsy
|
202
|
+
end
|
203
|
+
compile [gherkin], receiver
|
204
|
+
end
|
205
|
+
|
206
|
+
it "matches handles multiple expressions" do
|
207
|
+
gherkin = gherkin do
|
208
|
+
feature tags: ['@a', '@b'] do
|
209
|
+
scenario tags: ['@c'] do
|
210
|
+
step
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
receiver = double.as_null_object
|
215
|
+
expect( receiver ).to receive(:test_case) do |test_case|
|
216
|
+
expect( test_case.match_tags?(['@a and @b', 'not @d']) ).to be_truthy
|
217
|
+
expect( test_case.match_tags?(['@a and @b', 'not @c']) ).to be_falsy
|
218
|
+
end
|
219
|
+
compile [gherkin], receiver
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
describe "matching tags (old style)" do
|
188
224
|
it "matches boolean expressions of tags" do
|
189
225
|
gherkin = gherkin do
|
190
226
|
feature tags: ['@a', '@b'] do
|
@@ -195,7 +231,25 @@ module Cucumber
|
|
195
231
|
end
|
196
232
|
receiver = double.as_null_object
|
197
233
|
expect( receiver ).to receive(:test_case) do |test_case|
|
198
|
-
expect( test_case.match_tags?('@a') ).to be_truthy
|
234
|
+
expect( test_case.match_tags?(['@a', '@b']) ).to be_truthy
|
235
|
+
expect( test_case.match_tags?(['@a, @d']) ).to be_truthy
|
236
|
+
expect( test_case.match_tags?(['~@d']) ).to be_truthy
|
237
|
+
expect( test_case.match_tags?(['@a', '@d']) ).to be_falsy
|
238
|
+
end
|
239
|
+
compile [gherkin], receiver
|
240
|
+
end
|
241
|
+
|
242
|
+
it "handles mixing old and new style expressions" do
|
243
|
+
gherkin = gherkin do
|
244
|
+
feature tags: ['@a', '@b'] do
|
245
|
+
scenario tags: ['@c'] do
|
246
|
+
step
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
receiver = double.as_null_object
|
251
|
+
expect( receiver ).to receive(:test_case) do |test_case|
|
252
|
+
expect( test_case.match_tags?(['@a and @b', '~@d']) ).to be_truthy
|
199
253
|
end
|
200
254
|
compile [gherkin], receiver
|
201
255
|
end
|
@@ -46,6 +46,7 @@ module Cucumber::Core::Test
|
|
46
46
|
specify { expect( result ).not_to be_undefined }
|
47
47
|
specify { expect( result ).not_to be_unknown }
|
48
48
|
specify { expect( result ).not_to be_skipped }
|
49
|
+
specify { expect( result ).not_to be_flaky }
|
49
50
|
|
50
51
|
specify { expect( result ).to be_ok }
|
51
52
|
specify { expect( result.ok?(false) ).to be_truthy }
|
@@ -105,6 +106,7 @@ module Cucumber::Core::Test
|
|
105
106
|
specify { expect( result ).not_to be_undefined }
|
106
107
|
specify { expect( result ).not_to be_unknown }
|
107
108
|
specify { expect( result ).not_to be_skipped }
|
109
|
+
specify { expect( result ).not_to be_flaky }
|
108
110
|
|
109
111
|
specify { expect( result ).to_not be_ok }
|
110
112
|
specify { expect( result.ok?(false) ).to be_falsey }
|
@@ -130,6 +132,7 @@ module Cucumber::Core::Test
|
|
130
132
|
specify { expect( result ).not_to be_undefined }
|
131
133
|
specify { expect( result ).to be_unknown }
|
132
134
|
specify { expect( result ).not_to be_skipped }
|
135
|
+
specify { expect( result ).not_to be_flaky }
|
133
136
|
end
|
134
137
|
|
135
138
|
describe Result::Raisable do
|
@@ -196,6 +199,7 @@ module Cucumber::Core::Test
|
|
196
199
|
specify { expect( result ).to be_undefined }
|
197
200
|
specify { expect( result ).not_to be_unknown }
|
198
201
|
specify { expect( result ).not_to be_skipped }
|
202
|
+
specify { expect( result ).not_to be_flaky }
|
199
203
|
|
200
204
|
specify { expect( result ).to be_ok }
|
201
205
|
specify { expect( result.ok?(false) ).to be_truthy }
|
@@ -218,6 +222,7 @@ module Cucumber::Core::Test
|
|
218
222
|
specify { expect( result ).not_to be_undefined }
|
219
223
|
specify { expect( result ).not_to be_unknown }
|
220
224
|
specify { expect( result ).to be_skipped }
|
225
|
+
specify { expect( result ).not_to be_flaky }
|
221
226
|
|
222
227
|
specify { expect( result ).to be_ok }
|
223
228
|
specify { expect( result.ok?(false) ).to be_truthy }
|
@@ -240,6 +245,7 @@ module Cucumber::Core::Test
|
|
240
245
|
specify { expect( result ).not_to be_undefined }
|
241
246
|
specify { expect( result ).not_to be_unknown }
|
242
247
|
specify { expect( result ).not_to be_skipped }
|
248
|
+
specify { expect( result ).not_to be_flaky }
|
243
249
|
specify { expect( result ).to be_pending }
|
244
250
|
|
245
251
|
specify { expect( result ).to be_ok }
|
@@ -247,12 +253,18 @@ module Cucumber::Core::Test
|
|
247
253
|
specify { expect( result.ok?(true) ).to be_falsey }
|
248
254
|
end
|
249
255
|
|
256
|
+
describe Result::Flaky do
|
257
|
+
specify { expect( Result::Flaky.ok?(false) ).to be_truthy }
|
258
|
+
specify { expect( Result::Flaky.ok?(true) ).to be_falsey }
|
259
|
+
end
|
260
|
+
|
250
261
|
describe Result::Summary do
|
251
262
|
let(:summary) { Result::Summary.new }
|
252
263
|
let(:failed) { Result::Failed.new(Result::Duration.new(10), exception) }
|
253
264
|
let(:passed) { Result::Passed.new(Result::Duration.new(11)) }
|
254
265
|
let(:skipped) { Result::Skipped.new }
|
255
266
|
let(:unknown) { Result::Unknown.new }
|
267
|
+
let(:pending) { Result::Pending.new }
|
256
268
|
let(:undefined) { Result::Undefined.new }
|
257
269
|
let(:exception) { StandardError.new }
|
258
270
|
|
@@ -328,6 +340,41 @@ module Cucumber::Core::Test
|
|
328
340
|
[passed, failed].each { |r| r.describe_to summary }
|
329
341
|
expect( summary.exceptions ).to eq [exception]
|
330
342
|
end
|
343
|
+
|
344
|
+
context "ok? result" do
|
345
|
+
it "passed result is ok" do
|
346
|
+
passed.describe_to summary
|
347
|
+
expect( summary.ok? ).to be true
|
348
|
+
end
|
349
|
+
|
350
|
+
it "skipped result is ok" do
|
351
|
+
skipped.describe_to summary
|
352
|
+
expect( summary.ok? ).to be true
|
353
|
+
end
|
354
|
+
|
355
|
+
it "failed result is not ok" do
|
356
|
+
failed.describe_to summary
|
357
|
+
expect( summary.ok? ).to be false
|
358
|
+
end
|
359
|
+
|
360
|
+
it "pending result is ok if not strict" do
|
361
|
+
pending.describe_to summary
|
362
|
+
expect( summary.ok? ).to be true
|
363
|
+
expect( summary.ok?(true) ).to be false
|
364
|
+
end
|
365
|
+
|
366
|
+
it "undefined result is ok if not strict" do
|
367
|
+
undefined.describe_to summary
|
368
|
+
expect( summary.ok? ).to be true
|
369
|
+
expect( summary.ok?(true) ).to be false
|
370
|
+
end
|
371
|
+
|
372
|
+
it "flaky result is ok if not strict" do
|
373
|
+
summary.flaky
|
374
|
+
expect( summary.ok? ).to be true
|
375
|
+
expect( summary.ok?(true) ).to be false
|
376
|
+
end
|
377
|
+
end
|
331
378
|
end
|
332
379
|
|
333
380
|
describe Result::Duration do
|
data/spec/cucumber/core_spec.rb
CHANGED
@@ -77,127 +77,6 @@ module Cucumber
|
|
77
77
|
|
78
78
|
compile [gherkin], visitor, [Cucumber::Core::Test::TagFilter.new(['@a', '@b'])]
|
79
79
|
end
|
80
|
-
|
81
|
-
describe 'with tag filters that have limits' do
|
82
|
-
let(:visitor) { double.as_null_object }
|
83
|
-
let(:gherkin_doc) do
|
84
|
-
gherkin do
|
85
|
-
feature tags: '@feature' do
|
86
|
-
scenario tags: '@one @three' do
|
87
|
-
step
|
88
|
-
end
|
89
|
-
|
90
|
-
scenario tags: '@one' do
|
91
|
-
step
|
92
|
-
end
|
93
|
-
|
94
|
-
scenario_outline do
|
95
|
-
step '<arg>'
|
96
|
-
|
97
|
-
examples tags: '@three'do
|
98
|
-
row 'arg'
|
99
|
-
row 'x'
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
scenario tags: '@ignore' do
|
104
|
-
step
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
require 'unindent'
|
111
|
-
def expect_tag_excess(error_message)
|
112
|
-
expect {
|
113
|
-
compile [gherkin_doc], visitor, tag_filters
|
114
|
-
}.to raise_error(
|
115
|
-
Cucumber::Core::Test::TagFilter::TagExcess, error_message.unindent.chomp
|
116
|
-
)
|
117
|
-
end
|
118
|
-
|
119
|
-
context 'on scenarios' do
|
120
|
-
let(:tag_filters) {
|
121
|
-
[ Cucumber::Core::Test::TagFilter.new(['@one:1']) ]
|
122
|
-
}
|
123
|
-
|
124
|
-
it 'raises a tag excess error with the location of the test cases' do
|
125
|
-
expect_tag_excess <<-STR
|
126
|
-
@one occurred 2 times, but the limit was set to 1
|
127
|
-
features/test.feature:5
|
128
|
-
features/test.feature:9
|
129
|
-
STR
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
context 'on scenario outlines' do
|
134
|
-
let(:tag_filters) {
|
135
|
-
[ Cucumber::Core::Test::TagFilter.new(['@three:1']) ]
|
136
|
-
}
|
137
|
-
|
138
|
-
it 'raises a tag excess error with the location of the test cases' do
|
139
|
-
expect_tag_excess <<-STR
|
140
|
-
@three occurred 2 times, but the limit was set to 1
|
141
|
-
features/test.feature:5
|
142
|
-
features/test.feature:18
|
143
|
-
STR
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
context 'on a feature with scenarios' do
|
148
|
-
let(:tag_filters) {
|
149
|
-
[ Cucumber::Core::Test::TagFilter.new(['@feature:2']) ]
|
150
|
-
}
|
151
|
-
|
152
|
-
it 'raises a tag excess error with the location of the test cases' do
|
153
|
-
expect_tag_excess <<-STR
|
154
|
-
@feature occurred 4 times, but the limit was set to 2
|
155
|
-
features/test.feature:5
|
156
|
-
features/test.feature:9
|
157
|
-
features/test.feature:18
|
158
|
-
features/test.feature:21
|
159
|
-
STR
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
context 'with negated tags' do
|
164
|
-
let(:tag_filters) {
|
165
|
-
[ Cucumber::Core::Test::TagFilter.new(['~@one:1']) ]
|
166
|
-
}
|
167
|
-
|
168
|
-
it 'raises a tag excess error with the location of the test cases' do
|
169
|
-
expect_tag_excess <<-STR
|
170
|
-
@one occurred 2 times, but the limit was set to 1
|
171
|
-
features/test.feature:5
|
172
|
-
features/test.feature:9
|
173
|
-
STR
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
context 'whith multiple tag limits' do
|
178
|
-
let(:tag_filters) {
|
179
|
-
[ Cucumber::Core::Test::TagFilter.new(['@one:1, @three:1', '~@feature:3']) ]
|
180
|
-
}
|
181
|
-
|
182
|
-
it 'raises a tag excess error with the location of the test cases' do
|
183
|
-
expect_tag_excess <<-STR
|
184
|
-
@one occurred 2 times, but the limit was set to 1
|
185
|
-
features/test.feature:5
|
186
|
-
features/test.feature:9
|
187
|
-
@three occurred 2 times, but the limit was set to 1
|
188
|
-
features/test.feature:5
|
189
|
-
features/test.feature:18
|
190
|
-
@feature occurred 4 times, but the limit was set to 3
|
191
|
-
features/test.feature:5
|
192
|
-
features/test.feature:9
|
193
|
-
features/test.feature:18
|
194
|
-
features/test.feature:21
|
195
|
-
STR
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
end
|
200
|
-
|
201
80
|
end
|
202
81
|
|
203
82
|
describe "executing a test suite" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.pre.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aslak Hellesøy
|
@@ -12,36 +12,50 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date:
|
15
|
+
date: 2017-07-26 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: gherkin
|
19
19
|
requirement: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
|
-
- - "
|
21
|
+
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
23
|
+
version: 4.1.3
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
|
-
- - "
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 4.1.3
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: cucumber-tag_expressions
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.0.1
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
29
43
|
- !ruby/object:Gem::Version
|
30
|
-
version:
|
44
|
+
version: 1.0.1
|
31
45
|
- !ruby/object:Gem::Dependency
|
32
46
|
name: backports
|
33
47
|
requirement: !ruby/object:Gem::Requirement
|
34
48
|
requirements:
|
35
|
-
- - "
|
49
|
+
- - ">="
|
36
50
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
51
|
+
version: 3.8.0
|
38
52
|
type: :runtime
|
39
53
|
prerelease: false
|
40
54
|
version_requirements: !ruby/object:Gem::Requirement
|
41
55
|
requirements:
|
42
|
-
- - "
|
56
|
+
- - ">="
|
43
57
|
- !ruby/object:Gem::Version
|
44
|
-
version:
|
58
|
+
version: 3.8.0
|
45
59
|
- !ruby/object:Gem::Dependency
|
46
60
|
name: bundler
|
47
61
|
requirement: !ruby/object:Gem::Requirement
|
@@ -248,15 +262,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
248
262
|
version: 1.9.3
|
249
263
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
250
264
|
requirements:
|
251
|
-
- - "
|
265
|
+
- - ">"
|
252
266
|
- !ruby/object:Gem::Version
|
253
|
-
version:
|
267
|
+
version: 1.3.1
|
254
268
|
requirements: []
|
255
269
|
rubyforge_project:
|
256
|
-
rubygems_version: 2.
|
270
|
+
rubygems_version: 2.6.8
|
257
271
|
signing_key:
|
258
272
|
specification_version: 4
|
259
|
-
summary: cucumber-core-
|
273
|
+
summary: cucumber-core-3.0.0.pre.2
|
260
274
|
test_files:
|
261
275
|
- spec/capture_warnings.rb
|
262
276
|
- spec/coverage.rb
|
@@ -286,4 +300,3 @@ test_files:
|
|
286
300
|
- spec/cucumber/core_spec.rb
|
287
301
|
- spec/readme_spec.rb
|
288
302
|
- spec/report_api_spy.rb
|
289
|
-
has_rdoc:
|