cucumber-gherkin 28.0.0 → 29.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ece34082ea75a09a5cbeae3980afa533c15807b6bfdcebff24b757f01dbccc5e
4
- data.tar.gz: c36a3c7b537533d54653d8ac71e4f7514a20a9898712c04c3c19dc49881fbbe8
3
+ metadata.gz: fb339971170bdf897bf51a6d7cc8e63fee16894e19c4ef4473338019c74210e4
4
+ data.tar.gz: 90052ec9d9cff63eaca6f7d0a69b86e898e0c32f6ad04952d7bdf39904070cec
5
5
  SHA512:
6
- metadata.gz: 6c81377d145f9944910004eeb22b75570ecc850d4c2cccbb9d851e2b9c89bcdbd5e54fafcc531bdb27a7833275ebf3be6504bc6dee23f457a401e8ebcbbf459c
7
- data.tar.gz: 553a43f5d6e5ce49d0573ba64b4c42b5089519c0e56c66b20dd92fb70e9790db6e3000581d922df5f312389a6860cc1d59adc4ef300224f280680874cd94e099
6
+ metadata.gz: 8afa90ac6ba2c8b4730e64038d3a6e7c733698e8b10c1e10dbd6f82356fab0baa679944aa3c4aadf850f77aba270f28b53dc3fd72137e64785cc4aecfee980af
7
+ data.tar.gz: bd312859d9a2b2c1dc5ae2bcd9ae19b527e83d1f0a645a3f8e60f913f08552f9f6629ac7840d6950263859bf7ace7ee58f3c8221586ca1f2e0ef1d9ca2266723
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant, and contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/bin/gherkin CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- $VERBOSE=nil # Shut up JRuby warnings on Travis
2
+
3
3
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__),"../lib"))
4
4
 
5
5
  require 'optparse'
@@ -15,17 +15,17 @@ options = {
15
15
  }
16
16
 
17
17
  OptionParser.new do |opts|
18
- opts.on("--[no-]source", "Don't print source messages") do |v|
19
- options[:include_source] = v
18
+ opts.on('--[no-]source', "Don't print source messages") do |value|
19
+ options[:include_source] = value
20
20
  end
21
- opts.on("--[no-]ast", "Don't print ast messages") do |v|
22
- options[:include_gherkin_document] = v
21
+ opts.on('--[no-]ast', "Don't print ast messages") do |value|
22
+ options[:include_gherkin_document] = value
23
23
  end
24
- opts.on("--[no-]pickles", "Don't print pickle messages") do |v|
25
- options[:include_pickles] = v
24
+ opts.on('--[no-]pickles', "Don't print pickle messages") do |value|
25
+ options[:include_pickles] = value
26
26
  end
27
- opts.on("--predictable-ids", "Generate incrementing ids rather than UUIDs") do |v|
28
- options[:id_generator] = Cucumber::Messages::IdGenerator::Incrementing.new if v
27
+ opts.on('--predictable-ids', 'Generate incrementing ids rather than UUIDs') do |value|
28
+ options[:id_generator] = Cucumber::Messages::Helpers::IdGenerator::Incrementing.new if value
29
29
  end
30
30
  end.parse!
31
31
 
@@ -38,7 +38,7 @@ end
38
38
 
39
39
  if ARGV.empty?
40
40
  # Read from STDIN
41
- messages = Cucumber::Messages::NdjsonToMessageEnumerator.new(STDIN)
41
+ messages = Cucumber::Messages::Helpers::NdjsonToMessageEnumerator.new(STDIN)
42
42
  else
43
43
  messages = Gherkin.from_paths(ARGV, options)
44
44
  end
@@ -278,7 +278,7 @@
278
278
  "Nə vaxt ki "
279
279
  ]
280
280
  },
281
- "be": {
281
+ "be": {
282
282
  "and": [
283
283
  "* ",
284
284
  "I ",
@@ -1401,14 +1401,14 @@
1401
1401
  "ga": {
1402
1402
  "and": [
1403
1403
  "* ",
1404
- "Agus"
1404
+ "Agus "
1405
1405
  ],
1406
1406
  "background": [
1407
1407
  "Cúlra"
1408
1408
  ],
1409
1409
  "but": [
1410
1410
  "* ",
1411
- "Ach"
1411
+ "Ach "
1412
1412
  ],
1413
1413
  "examples": [
1414
1414
  "Samplaí"
@@ -1418,10 +1418,10 @@
1418
1418
  ],
1419
1419
  "given": [
1420
1420
  "* ",
1421
- "Cuir i gcás go",
1422
- "Cuir i gcás nach",
1423
- "Cuir i gcás gur",
1424
- "Cuir i gcás nár"
1421
+ "Cuir i gcás go ",
1422
+ "Cuir i gcás nach ",
1423
+ "Cuir i gcás gur ",
1424
+ "Cuir i gcás nár "
1425
1425
  ],
1426
1426
  "name": "Irish",
1427
1427
  "native": "Gaeilge",
@@ -1437,14 +1437,14 @@
1437
1437
  ],
1438
1438
  "then": [
1439
1439
  "* ",
1440
- "Ansin"
1440
+ "Ansin "
1441
1441
  ],
1442
1442
  "when": [
1443
1443
  "* ",
1444
- "Nuair a",
1445
- "Nuair nach",
1446
- "Nuair ba",
1447
- "Nuair nár"
1444
+ "Nuair a ",
1445
+ "Nuair nach ",
1446
+ "Nuair ba ",
1447
+ "Nuair nár "
1448
1448
  ]
1449
1449
  },
1450
1450
  "gj": {
@@ -1474,7 +1474,7 @@
1474
1474
  "name": "Gujarati",
1475
1475
  "native": "ગુજરાતી",
1476
1476
  "rule": [
1477
- "Rule"
1477
+ "નિયમ"
1478
1478
  ],
1479
1479
  "scenario": [
1480
1480
  "ઉદાહરણ",
@@ -2133,15 +2133,15 @@
2133
2133
  "ko": {
2134
2134
  "and": [
2135
2135
  "* ",
2136
- "그리고"
2136
+ "그리고 "
2137
2137
  ],
2138
2138
  "background": [
2139
2139
  "배경"
2140
2140
  ],
2141
2141
  "but": [
2142
2142
  "* ",
2143
- "하지만",
2144
- "단"
2143
+ "하지만 ",
2144
+ "단 "
2145
2145
  ],
2146
2146
  "examples": [
2147
2147
  "예"
@@ -2151,8 +2151,8 @@
2151
2151
  ],
2152
2152
  "given": [
2153
2153
  "* ",
2154
- "조건",
2155
- "먼저"
2154
+ "조건 ",
2155
+ "먼저 "
2156
2156
  ],
2157
2157
  "name": "Korean",
2158
2158
  "native": "한국어",
@@ -2167,12 +2167,12 @@
2167
2167
  ],
2168
2168
  "then": [
2169
2169
  "* ",
2170
- "그러면"
2170
+ "그러면 "
2171
2171
  ],
2172
2172
  "when": [
2173
2173
  "* ",
2174
- "만일",
2175
- "만약"
2174
+ "만일 ",
2175
+ "만약 "
2176
2176
  ]
2177
2177
  },
2178
2178
  "lt": {
@@ -3015,7 +3015,6 @@
3015
3015
  "Правило"
3016
3016
  ],
3017
3017
  "scenario": [
3018
- "Пример",
3019
3018
  "Сценарио",
3020
3019
  "Пример"
3021
3020
  ],
@@ -3134,7 +3133,7 @@
3134
3133
  "ta": {
3135
3134
  "and": [
3136
3135
  "* ",
3137
- "மேலும் ",
3136
+ "மேலும் ",
3138
3137
  "மற்றும் "
3139
3138
  ],
3140
3139
  "background": [
@@ -3142,7 +3141,7 @@
3142
3141
  ],
3143
3142
  "but": [
3144
3143
  "* ",
3145
- "ஆனால் "
3144
+ "ஆனால் "
3146
3145
  ],
3147
3146
  "examples": [
3148
3147
  "எடுத்துக்காட்டுகள்",
@@ -66,7 +66,7 @@ module Gherkin
66
66
  cell = ''
67
67
  start_col = col + 1
68
68
  elsif char == '\\'
69
- char = row[col]
69
+ char = row[col] || ''
70
70
  col += 1
71
71
  if char == 'n'
72
72
  cell += "\n"
@@ -56,7 +56,7 @@ module Gherkin
56
56
  class Parser
57
57
  attr_accessor :stop_at_first_error
58
58
 
59
- def initialize(ast_builder = AstBuilder.new(Cucumber::Messages::IdGenerator::UUID.new))
59
+ def initialize(ast_builder = AstBuilder.new(Cucumber::Messages::Helpers::IdGenerator::UUID.new))
60
60
  @ast_builder = ast_builder
61
61
  end
62
62
 
@@ -11,7 +11,7 @@ module Gherkin
11
11
  @sources = sources
12
12
  @options = options
13
13
 
14
- id_generator = options[:id_generator] || Cucumber::Messages::IdGenerator::UUID.new
14
+ id_generator = options[:id_generator] || Cucumber::Messages::Helpers::IdGenerator::UUID.new
15
15
  @parser = Parser.new(AstBuilder.new(id_generator))
16
16
  @compiler = Pickles::Compiler.new(id_generator)
17
17
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber-gherkin
3
3
  version: !ruby/object:Gem::Version
4
- version: 28.0.0
4
+ version: 29.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gáspár Nagy
@@ -10,68 +10,70 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-02-15 00:00:00.000000000 Z
13
+ date: 2024-08-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: cucumber-messages
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - ">="
19
+ - - ">"
20
20
  - !ruby/object:Gem::Version
21
- version: 19.1.4
21
+ version: '25'
22
22
  - - "<"
23
23
  - !ruby/object:Gem::Version
24
- version: '24'
24
+ version: '26'
25
25
  type: :runtime
26
26
  prerelease: false
27
27
  version_requirements: !ruby/object:Gem::Requirement
28
28
  requirements:
29
- - - ">="
29
+ - - ">"
30
30
  - !ruby/object:Gem::Version
31
- version: 19.1.4
31
+ version: '25'
32
32
  - - "<"
33
33
  - !ruby/object:Gem::Version
34
- version: '24'
34
+ version: '26'
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: rake
37
37
  requirement: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '13.0'
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- version: 13.0.6
41
+ version: '13.1'
45
42
  type: :development
46
43
  prerelease: false
47
44
  version_requirements: !ruby/object:Gem::Requirement
48
45
  requirements:
49
46
  - - "~>"
50
47
  - !ruby/object:Gem::Version
51
- version: '13.0'
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: 13.0.6
48
+ version: '13.1'
55
49
  - !ruby/object:Gem::Dependency
56
50
  name: rspec
57
51
  requirement: !ruby/object:Gem::Requirement
58
52
  requirements:
59
53
  - - "~>"
60
54
  - !ruby/object:Gem::Version
61
- version: '3.11'
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- version: 3.11.0
55
+ version: '3.13'
65
56
  type: :development
66
57
  prerelease: false
67
58
  version_requirements: !ruby/object:Gem::Requirement
68
59
  requirements:
69
60
  - - "~>"
70
61
  - !ruby/object:Gem::Version
71
- version: '3.11'
72
- - - ">="
62
+ version: '3.13'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rubocop
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 1.26.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
73
75
  - !ruby/object:Gem::Version
74
- version: 3.11.0
76
+ version: 1.26.0
75
77
  description: Gherkin parser
76
78
  email: cukes@googlegroups.com
77
79
  executables:
@@ -80,6 +82,7 @@ executables:
80
82
  extensions: []
81
83
  extra_rdoc_files: []
82
84
  files:
85
+ - LICENSE
83
86
  - README.md
84
87
  - bin/gherkin
85
88
  - bin/gherkin-ruby
@@ -98,13 +101,6 @@ files:
98
101
  - lib/gherkin/token_formatter_builder.rb
99
102
  - lib/gherkin/token_matcher.rb
100
103
  - lib/gherkin/token_scanner.rb
101
- - spec/capture_warnings.rb
102
- - spec/gherkin/dialect_spec.rb
103
- - spec/gherkin/gherkin_line_spec.rb
104
- - spec/gherkin/gherkin_spec.rb
105
- - spec/gherkin/parser_spec.rb
106
- - spec/gherkin/query_spec.rb
107
- - spec/gherkin/stream/parser_message_stream_spec.rb
108
104
  homepage: https://github.com/cucumber/gherkin
109
105
  licenses:
110
106
  - MIT
@@ -123,22 +119,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
119
  requirements:
124
120
  - - ">="
125
121
  - !ruby/object:Gem::Version
126
- version: '2.5'
122
+ version: '3.0'
127
123
  required_rubygems_version: !ruby/object:Gem::Requirement
128
124
  requirements:
129
125
  - - ">="
130
126
  - !ruby/object:Gem::Version
131
- version: '0'
127
+ version: 3.2.8
132
128
  requirements: []
133
- rubygems_version: 3.4.19
129
+ rubygems_version: 3.5.11
134
130
  signing_key:
135
131
  specification_version: 4
136
- summary: cucumber-gherkin-28.0.0
137
- test_files:
138
- - spec/capture_warnings.rb
139
- - spec/gherkin/dialect_spec.rb
140
- - spec/gherkin/gherkin_line_spec.rb
141
- - spec/gherkin/gherkin_spec.rb
142
- - spec/gherkin/parser_spec.rb
143
- - spec/gherkin/query_spec.rb
144
- - spec/gherkin/stream/parser_message_stream_spec.rb
132
+ summary: cucumber-gherkin-29.0.0
133
+ test_files: []
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
- # With thanks to @myronmarston
3
- # https://github.com/vcr/vcr/blob/master/spec/capture_warnings.rb
4
-
5
- module CaptureWarnings
6
- def report_warnings(&block)
7
- current_dir = Dir.pwd
8
- warnings, errors = capture_error(&block).partition { |line| line.include?('warning') }
9
- project_warnings, other_warnings = warnings.uniq.partition { |line| line.include?(current_dir) }
10
-
11
- if errors.any?
12
- puts errors.join("\n")
13
- end
14
-
15
- if other_warnings.any?
16
- puts "#{ other_warnings.count } warnings detected, set VIEW_OTHER_WARNINGS=true to see them."
17
- print_warnings('other', other_warnings) if ENV['VIEW_OTHER_WARNINGS']
18
- end
19
-
20
- # Until they fix https://bugs.ruby-lang.org/issues/10661
21
- if RUBY_VERSION == "2.2.0"
22
- project_warnings = project_warnings.reject { |w| w =~ /warning: possible reference to past scope/ }
23
- end
24
-
25
- if project_warnings.any?
26
- puts "#{ project_warnings.count } warnings detected"
27
- print_warnings('cucumber-expressions', project_warnings)
28
- fail "Please remove all cucumber-expressions warnings."
29
- end
30
-
31
- ensure_system_exit_if_required
32
- end
33
-
34
- def capture_error(&block)
35
- old_stderr = STDERR.clone
36
- pipe_r, pipe_w = IO.pipe
37
- pipe_r.sync = true
38
- error = String.new
39
- reader = Thread.new do
40
- begin
41
- loop do
42
- error << pipe_r.readpartial(1024)
43
- end
44
- rescue EOFError
45
- end
46
- end
47
- STDERR.reopen(pipe_w)
48
- block.call
49
- ensure
50
- capture_system_exit
51
- STDERR.reopen(old_stderr)
52
- pipe_w.close
53
- reader.join
54
- return error.split("\n")
55
- end
56
-
57
- def print_warnings(type, warnings)
58
- puts
59
- puts "-" * 30 + " #{type} warnings: " + "-" * 30
60
- puts
61
- puts warnings.join("\n")
62
- puts
63
- puts "-" * 75
64
- puts
65
- end
66
-
67
- def ensure_system_exit_if_required
68
- raise @system_exit if @system_exit
69
- end
70
-
71
- def capture_system_exit
72
- @system_exit = $!
73
- end
74
- end
@@ -1,13 +0,0 @@
1
- # coding: utf-8
2
- require 'rspec'
3
- require 'gherkin/dialect'
4
-
5
- module Gherkin
6
- describe Dialect do
7
- it 'provides an interface to the keywords of a dialect' do
8
- dialect_en = Dialect.for('en')
9
-
10
- expect(dialect_en.feature_keywords).to eq(['Feature', 'Business Need', 'Ability'])
11
- end
12
- end
13
- end
@@ -1,36 +0,0 @@
1
- require 'rspec'
2
- require 'gherkin/gherkin_line'
3
-
4
- describe Gherkin::GherkinLine do
5
- context '#tags' do
6
- def tags(line)
7
- Gherkin::GherkinLine.new(line, 12).tags.map(&:text)
8
- end
9
-
10
- it 'allows any non-space characters in a tag' do
11
- expect(tags(" @foo:bar @zap🥒yo")).to eq(['@foo:bar', '@zap🥒yo'])
12
- end
13
- end
14
-
15
- context '#table_cells' do
16
- def cells_text(line)
17
- Gherkin::GherkinLine.new(line, 12).table_cells.map(&:text)
18
- end
19
-
20
- it 'trims white spaces before cell content' do
21
- expect(cells_text("| \t spaces before|")).to eq(['spaces before'])
22
- end
23
-
24
- it 'trims white spaces after cell content' do
25
- expect(cells_text("|spaces after |")).to eq(['spaces after'])
26
- end
27
-
28
- it 'trims white spaces around cell content' do
29
- expect(cells_text("| \t spaces everywhere \t|")).to eq(['spaces everywhere'])
30
- end
31
-
32
- it 'does not drop white spaces inside a cell' do
33
- expect(cells_text("| foo()\n bar\nbaz |")).to eq(["foo()\n bar\nbaz"])
34
- end
35
- end
36
- end
@@ -1,45 +0,0 @@
1
- require 'rspec'
2
- require 'gherkin'
3
-
4
- describe Gherkin do
5
- it "can process feature file paths" do
6
- messages = Gherkin.from_paths(
7
- ["../testdata/good/minimal.feature"],
8
- {include_source: true,
9
- include_gherkin_document: true,
10
- include_pickles: true}
11
- ).to_a
12
-
13
- expect(messages.length).to eq(3)
14
- end
15
-
16
- it "can process feature file content" do
17
- data = File.open("../testdata/good/minimal.feature", 'r:UTF-8', &:read)
18
-
19
- messages = Gherkin.from_source(
20
- "uri",
21
- data,
22
- {include_source: true,
23
- include_gherkin_document: true,
24
- include_pickles: true}
25
- ).to_a
26
-
27
- expect(messages.length).to eq(3)
28
- end
29
-
30
- it "can set the default dialect for the feature file content" do
31
- data = File.open("../testdata/good/i18n_no.feature", 'r:UTF-8', &:read)
32
- data_without_language_header = data.split("\n")[1..-1].join("\n")
33
-
34
- messages = Gherkin.from_source(
35
- "uri",
36
- data,
37
- {include_source: true,
38
- include_gherkin_document: true,
39
- include_pickles: true,
40
- default_dialect: "no"}
41
- ).to_a
42
-
43
- expect(messages.length).to eq(3)
44
- end
45
- end
@@ -1,10 +0,0 @@
1
- require 'rspec'
2
- require 'gherkin'
3
-
4
- describe Gherkin::Parser do
5
- context '.new' do
6
- it 'can be invoked with no args' do
7
- Gherkin::Parser.new
8
- end
9
- end
10
- end
@@ -1,208 +0,0 @@
1
- require 'rspec'
2
- require 'gherkin'
3
- require 'gherkin/query'
4
-
5
- describe Gherkin::Query do
6
- let(:subject) { Gherkin::Query.new }
7
-
8
- def filter_messages_by_attribute(messages, attribute)
9
- messages.map do |message|
10
- return unless message.respond_to?(attribute)
11
- message.send(attribute)
12
- end.compact
13
- end
14
-
15
- def find_message_by_attribute(messages, attribute)
16
- filter_messages_by_attribute(messages, attribute).first
17
- end
18
-
19
- let(:gherkin_document) { find_message_by_attribute(messages, :gherkin_document) }
20
-
21
- let(:messages) do
22
- Gherkin.from_source(
23
- "some/path",
24
- feature_content,
25
- {
26
- include_gherkin_document: true
27
- }
28
- ).to_a
29
- end
30
-
31
- let(:feature_content) do
32
- """
33
- @feature-tag
34
- Feature: my feature
35
-
36
- Background:
37
- Given a passed background step
38
-
39
- @scenario-tag
40
- Scenario: my scenario
41
- Given a passed step
42
-
43
- Scenario Outline: with examples
44
- Given a <Status> step
45
-
46
- @examples-tag
47
- Examples:
48
- | Status |
49
- | passed |
50
- | failed |
51
-
52
- @rule-tag
53
- Rule: this is a rule
54
- Background:
55
- Given the passed step in the rule background
56
-
57
- @ruled-scenario-tag
58
- Scenario: a ruled scenario
59
- Given a step in the ruled scenario
60
- """
61
- end
62
-
63
- describe '#update' do
64
- context 'when the feature file is empty' do
65
- let(:feature_content) { '' }
66
-
67
- it 'does not fail' do
68
- expect do
69
- messages.each { |message| subject.update(message) }
70
- end.not_to raise_exception
71
- end
72
- end
73
- end
74
-
75
- describe '#scenario_parent_locations' do
76
- before do
77
- messages.each { |message| subject.update(message) }
78
- end
79
-
80
- let(:background) { find_message_by_attribute(gherkin_document.feature.children, :background) }
81
- let(:scenarios) { filter_messages_by_attribute(gherkin_document.feature.children, :scenario) }
82
-
83
- context 'without rule' do
84
- let(:scenario) { scenarios.first }
85
-
86
- it 'provides the feature and background locations of a given scenario node id' do
87
- expect(subject.scenario_parent_locations(scenario.id)).to eq([
88
- gherkin_document.feature.location,
89
- background.location,
90
- ])
91
- end
92
- end
93
-
94
- context 'with rule' do
95
- let(:rule) { find_message_by_attribute(gherkin_document.feature.children, :rule) }
96
- let(:rule_background) { find_message_by_attribute(rule.children, :background) }
97
- let(:scenario) { find_message_by_attribute(rule.children, :scenario) }
98
-
99
- it 'provides the feature, background, rule, and rule background locations of a given scenario node id' do
100
- expect(subject.scenario_parent_locations(scenario.id)).to eq([
101
- gherkin_document.feature.location,
102
- background.location,
103
- rule.location,
104
- rule_background.location,
105
- ])
106
- end
107
- end
108
-
109
- context 'in a scenario outline' do
110
- let(:scenario) { scenarios.last }
111
-
112
- it 'provides the feature and background locations of a given scenario outline node id' do
113
- expect(subject.scenario_parent_locations(scenario.id)).to eq([
114
- gherkin_document.feature.location,
115
- background.location,
116
- ])
117
- end
118
- end
119
-
120
- it 'raises an exception if called with an invalid id' do
121
- expect { subject.scenario_parent_locations("BAD") }.to raise_error(Gherkin::AstNodeNotLocatedException)
122
- end
123
- end
124
-
125
- describe '#location' do
126
- before do
127
- messages.each { |message| subject.update(message) }
128
- end
129
-
130
- let(:background) { find_message_by_attribute(gherkin_document.feature.children, :background) }
131
- let(:rule) { find_message_by_attribute(gherkin_document.feature.children, :rule) }
132
- let(:scenarios) { filter_messages_by_attribute(gherkin_document.feature.children, :scenario) }
133
- let(:scenario) { scenarios.first }
134
-
135
- it 'raises an exception when the AST node ID is unknown' do
136
- expect { subject.location("this-id-may-not-exist-for-real") }.to raise_exception(Gherkin::AstNodeNotLocatedException)
137
- end
138
-
139
- it 'provides the location of a scenario' do
140
- expect(subject.location(scenario.id)).to eq(scenario.location)
141
- end
142
-
143
- it 'provides the location of an examples table row' do
144
- node = scenarios.last.examples.first.table_body.first
145
- expect(subject.location(node.id)).to eq(node.location)
146
- end
147
-
148
- context 'when querying steps' do
149
- let(:background_step) { background.steps.first }
150
- let(:scenario_step) { scenario.steps.first }
151
-
152
- it 'provides the location of a background step' do
153
- expect(subject.location(background_step.id)).to eq(background_step.location)
154
- end
155
-
156
- it 'provides the location of a scenario step' do
157
- expect(subject.location(scenario_step.id)).to eq(scenario_step.location)
158
- end
159
- end
160
-
161
- context 'when querying tags' do
162
- let(:feature_tag) { gherkin_document.feature.tags.first }
163
- let(:rule_tag) { rule.tags.first }
164
- let(:scenario_tag) { scenario.tags.first }
165
- let(:examples_tag) { scenarios.last.examples.first.tags.first }
166
-
167
- it 'provides the location of a feature tags' do
168
- expect(subject.location(feature_tag.id)).to eq(feature_tag.location)
169
- end
170
-
171
- it 'provides the location of a scenario tags' do
172
- expect(subject.location(scenario_tag.id)).to eq(scenario_tag.location)
173
- end
174
-
175
- it 'provides the location of scenario examples tags' do
176
- expect(subject.location(examples_tag.id)).to eq(examples_tag.location)
177
- end
178
-
179
- it 'provides the location of a rule tag' do
180
- expect(subject.location(rule_tag.id)).to eq(rule_tag.location)
181
- end
182
- end
183
-
184
- context 'when children are scoped in a Rule' do
185
- let(:rule_background) { find_message_by_attribute(rule.children, :background) }
186
- let(:rule_background_step) { rule_background.steps.first }
187
- let(:rule_scenario) { find_message_by_attribute(rule.children, :scenario) }
188
- let(:rule_scenario_step) { rule_scenario.steps.first }
189
- let(:rule_scenario_tag) { rule_scenario.tags.first }
190
-
191
- it 'provides the location of a background step' do
192
- expect(subject.location(rule_background_step.id)).to eq(rule_background_step.location)
193
- end
194
-
195
- it 'provides the location of a scenario' do
196
- expect(subject.location(rule_scenario.id)).to eq(rule_scenario.location)
197
- end
198
-
199
- it 'provides the location of a scenario tag' do
200
- expect(subject.location(rule_scenario_tag.id)).to eq(rule_scenario_tag.location)
201
- end
202
-
203
- it 'provides the location of a scenario step' do
204
- expect(subject.location(rule_scenario_step.id)).to eq(rule_scenario_step.location)
205
- end
206
- end
207
- end
208
- end
@@ -1,67 +0,0 @@
1
- require 'rspec'
2
- require 'gherkin/stream/parser_message_stream'
3
-
4
- module Gherkin
5
- module Stream
6
- describe ParserMessageStream do
7
- let(:feature_content) {
8
- "Feature: my feature\n" \
9
- " Scenario: a scenario\n" \
10
- " Given some context"
11
- }
12
-
13
- let(:source_feature) {
14
- Cucumber::Messages::Source.new(
15
- uri: '//whatever/uri',
16
- data: feature_content,
17
- media_type: 'text/x.cucumber.gherkin+plain'
18
- )
19
- }
20
-
21
- let(:options) {
22
- {
23
- include_gherkin_document: true,
24
- }
25
- }
26
-
27
- let(:gherkin_document) {
28
- ParserMessageStream.new([], [source_feature], options).messages.first.gherkin_document
29
- }
30
-
31
- let(:scenario_id) { gherkin_document.feature.children.first.scenario.id }
32
-
33
- context '#messages' do
34
- it "raises an exception on second iteration" do
35
- messages = ParserMessageStream.new([], [source_feature], options).messages
36
-
37
- expect { messages.map(&:to_s) }.not_to raise_exception
38
- expect { messages.map(&:to_s) }.to raise_exception(Gherkin::DoubleIterationException)
39
- end
40
- end
41
-
42
- context 'options.id_generator' do
43
- context 'when not set' do
44
- it 'generates random UUIDs' do
45
- expect(scenario_id).to match(/[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}/)
46
- end
47
- end
48
-
49
-
50
- context 'when set' do
51
- let(:id_generator) { double }
52
- let(:options) {
53
- {
54
- include_gherkin_document: true,
55
- id_generator: id_generator
56
- }
57
- }
58
-
59
- it 'uses the generator instance to produce the IDs' do
60
- allow(id_generator).to receive(:new_id).and_return('some-random-id')
61
- expect(scenario_id).to eq('some-random-id')
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end