benhamill-gherkin 2.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/.gitattributes +2 -0
  2. data/.gitignore +11 -0
  3. data/.mailmap +2 -0
  4. data/.rspec +1 -0
  5. data/.rvmrc +1 -0
  6. data/Gemfile +7 -0
  7. data/History.txt +363 -0
  8. data/LICENSE +20 -0
  9. data/README.rdoc +149 -0
  10. data/Rakefile +19 -0
  11. data/VERSION +1 -0
  12. data/build_native_gems.sh +8 -0
  13. data/cucumber.yml +3 -0
  14. data/features/escaped_pipes.feature +8 -0
  15. data/features/feature_parser.feature +237 -0
  16. data/features/json_formatter.feature +377 -0
  17. data/features/json_parser.feature +318 -0
  18. data/features/native_lexer.feature +19 -0
  19. data/features/parser_with_native_lexer.feature +205 -0
  20. data/features/pretty_formatter.feature +15 -0
  21. data/features/step_definitions/eyeball_steps.rb +3 -0
  22. data/features/step_definitions/gherkin_steps.rb +29 -0
  23. data/features/step_definitions/json_formatter_steps.rb +28 -0
  24. data/features/step_definitions/json_parser_steps.rb +20 -0
  25. data/features/step_definitions/pretty_formatter_steps.rb +84 -0
  26. data/features/steps_parser.feature +46 -0
  27. data/features/support/env.rb +38 -0
  28. data/gherkin.gemspec +61 -0
  29. data/ikvm/.gitignore +3 -0
  30. data/java/.gitignore +5 -0
  31. data/java/src/main/java/gherkin/lexer/i18n/.gitignore +1 -0
  32. data/java/src/main/resources/gherkin/.gitignore +1 -0
  33. data/js/lib/gherkin/lexer/i18n/ar.js +1094 -0
  34. data/js/lib/gherkin/lexer/i18n/bg.js +1308 -0
  35. data/js/lib/gherkin/lexer/i18n/ca.js +1236 -0
  36. data/js/lib/gherkin/lexer/i18n/cs.js +1090 -0
  37. data/js/lib/gherkin/lexer/i18n/cy_gb.js +958 -0
  38. data/js/lib/gherkin/lexer/i18n/da.js +974 -0
  39. data/js/lib/gherkin/lexer/i18n/de.js +1082 -0
  40. data/js/lib/gherkin/lexer/i18n/en.js +965 -0
  41. data/js/lib/gherkin/lexer/i18n/en_au.js +902 -0
  42. data/js/lib/gherkin/lexer/i18n/en_lol.js +859 -0
  43. data/js/lib/gherkin/lexer/i18n/en_pirate.js +1136 -0
  44. data/js/lib/gherkin/lexer/i18n/en_scouse.js +1289 -0
  45. data/js/lib/gherkin/lexer/i18n/en_tx.js +942 -0
  46. data/js/lib/gherkin/lexer/i18n/eo.js +916 -0
  47. data/js/lib/gherkin/lexer/i18n/es.js +1049 -0
  48. data/js/lib/gherkin/lexer/i18n/et.js +915 -0
  49. data/js/lib/gherkin/lexer/i18n/fi.js +894 -0
  50. data/js/lib/gherkin/lexer/i18n/fr.js +1116 -0
  51. data/js/lib/gherkin/lexer/i18n/he.js +1044 -0
  52. data/js/lib/gherkin/lexer/i18n/hr.js +994 -0
  53. data/js/lib/gherkin/lexer/i18n/hu.js +1043 -0
  54. data/js/lib/gherkin/lexer/i18n/id.js +884 -0
  55. data/js/lib/gherkin/lexer/i18n/it.js +1007 -0
  56. data/js/lib/gherkin/lexer/i18n/ja.js +1344 -0
  57. data/js/lib/gherkin/lexer/i18n/ko.js +1028 -0
  58. data/js/lib/gherkin/lexer/i18n/lt.js +972 -0
  59. data/js/lib/gherkin/lexer/i18n/lu.js +1057 -0
  60. data/js/lib/gherkin/lexer/i18n/lv.js +1092 -0
  61. data/js/lib/gherkin/lexer/i18n/nl.js +1036 -0
  62. data/js/lib/gherkin/lexer/i18n/no.js +986 -0
  63. data/js/lib/gherkin/lexer/i18n/pl.js +1140 -0
  64. data/js/lib/gherkin/lexer/i18n/pt.js +1000 -0
  65. data/js/lib/gherkin/lexer/i18n/ro.js +1089 -0
  66. data/js/lib/gherkin/lexer/i18n/ru.js +1560 -0
  67. data/js/lib/gherkin/lexer/i18n/sk.js +972 -0
  68. data/js/lib/gherkin/lexer/i18n/sr_cyrl.js +1728 -0
  69. data/js/lib/gherkin/lexer/i18n/sr_latn.js +1220 -0
  70. data/js/lib/gherkin/lexer/i18n/sv.js +997 -0
  71. data/js/lib/gherkin/lexer/i18n/tr.js +1014 -0
  72. data/js/lib/gherkin/lexer/i18n/uk.js +1572 -0
  73. data/js/lib/gherkin/lexer/i18n/uz.js +1302 -0
  74. data/js/lib/gherkin/lexer/i18n/vi.js +1124 -0
  75. data/js/lib/gherkin/lexer/i18n/zh_cn.js +902 -0
  76. data/js/lib/gherkin/lexer/i18n/zh_tw.js +940 -0
  77. data/lib/.gitignore +4 -0
  78. data/lib/gherkin.rb +2 -0
  79. data/lib/gherkin/c_lexer.rb +17 -0
  80. data/lib/gherkin/formatter/ansi_escapes.rb +95 -0
  81. data/lib/gherkin/formatter/argument.rb +16 -0
  82. data/lib/gherkin/formatter/escaping.rb +15 -0
  83. data/lib/gherkin/formatter/filter_formatter.rb +136 -0
  84. data/lib/gherkin/formatter/hashable.rb +19 -0
  85. data/lib/gherkin/formatter/json_formatter.rb +102 -0
  86. data/lib/gherkin/formatter/line_filter.rb +26 -0
  87. data/lib/gherkin/formatter/model.rb +236 -0
  88. data/lib/gherkin/formatter/pretty_formatter.rb +243 -0
  89. data/lib/gherkin/formatter/regexp_filter.rb +21 -0
  90. data/lib/gherkin/formatter/step_printer.rb +17 -0
  91. data/lib/gherkin/formatter/tag_count_formatter.rb +47 -0
  92. data/lib/gherkin/formatter/tag_filter.rb +19 -0
  93. data/lib/gherkin/i18n.rb +175 -0
  94. data/lib/gherkin/i18n.yml +588 -0
  95. data/lib/gherkin/json_parser.rb +137 -0
  96. data/lib/gherkin/lexer/i18n_lexer.rb +47 -0
  97. data/lib/gherkin/listener/event.rb +45 -0
  98. data/lib/gherkin/listener/formatter_listener.rb +113 -0
  99. data/lib/gherkin/native.rb +7 -0
  100. data/lib/gherkin/native/ikvm.rb +55 -0
  101. data/lib/gherkin/native/java.rb +55 -0
  102. data/lib/gherkin/native/null.rb +9 -0
  103. data/lib/gherkin/parser/meta.txt +5 -0
  104. data/lib/gherkin/parser/parser.rb +164 -0
  105. data/lib/gherkin/parser/root.txt +11 -0
  106. data/lib/gherkin/parser/steps.txt +4 -0
  107. data/lib/gherkin/rb_lexer.rb +8 -0
  108. data/lib/gherkin/rb_lexer/.gitignore +1 -0
  109. data/lib/gherkin/rb_lexer/README.rdoc +8 -0
  110. data/lib/gherkin/rubify.rb +24 -0
  111. data/lib/gherkin/tag_expression.rb +62 -0
  112. data/lib/gherkin/version.rb +3 -0
  113. data/ragel/i18n/.gitignore +1 -0
  114. data/ragel/lexer.c.rl.erb +439 -0
  115. data/ragel/lexer.java.rl.erb +208 -0
  116. data/ragel/lexer.rb.rl.erb +167 -0
  117. data/ragel/lexer_common.rl.erb +50 -0
  118. data/spec/gherkin/c_lexer_spec.rb +21 -0
  119. data/spec/gherkin/fixtures/1.feature +8 -0
  120. data/spec/gherkin/fixtures/comments_in_table.feature +9 -0
  121. data/spec/gherkin/fixtures/complex.feature +45 -0
  122. data/spec/gherkin/fixtures/complex.json +143 -0
  123. data/spec/gherkin/fixtures/complex_for_filtering.feature +60 -0
  124. data/spec/gherkin/fixtures/complex_with_tags.feature +61 -0
  125. data/spec/gherkin/fixtures/dos_line_endings.feature +45 -0
  126. data/spec/gherkin/fixtures/hantu_pisang.feature +35 -0
  127. data/spec/gherkin/fixtures/i18n_fr.feature +14 -0
  128. data/spec/gherkin/fixtures/i18n_no.feature +7 -0
  129. data/spec/gherkin/fixtures/i18n_zh-CN.feature +9 -0
  130. data/spec/gherkin/fixtures/scenario_outline_with_tags.feature +13 -0
  131. data/spec/gherkin/fixtures/scenario_without_steps.feature +5 -0
  132. data/spec/gherkin/fixtures/simple_with_comments.feature +7 -0
  133. data/spec/gherkin/fixtures/simple_with_tags.feature +11 -0
  134. data/spec/gherkin/fixtures/with_bom.feature +3 -0
  135. data/spec/gherkin/formatter/ansi_escapes_spec.rb +19 -0
  136. data/spec/gherkin/formatter/filter_formatter_spec.rb +165 -0
  137. data/spec/gherkin/formatter/model_spec.rb +28 -0
  138. data/spec/gherkin/formatter/pretty_formatter_spec.rb +158 -0
  139. data/spec/gherkin/formatter/spaces.feature +9 -0
  140. data/spec/gherkin/formatter/step_printer_spec.rb +55 -0
  141. data/spec/gherkin/formatter/tabs.feature +9 -0
  142. data/spec/gherkin/formatter/tag_count_formatter_spec.rb +30 -0
  143. data/spec/gherkin/i18n_spec.rb +152 -0
  144. data/spec/gherkin/java_lexer_spec.rb +20 -0
  145. data/spec/gherkin/java_libs.rb +20 -0
  146. data/spec/gherkin/json_parser_spec.rb +113 -0
  147. data/spec/gherkin/lexer/i18n_lexer_spec.rb +43 -0
  148. data/spec/gherkin/output_stream_string_io.rb +20 -0
  149. data/spec/gherkin/parser/parser_spec.rb +16 -0
  150. data/spec/gherkin/rb_lexer_spec.rb +19 -0
  151. data/spec/gherkin/sexp_recorder.rb +56 -0
  152. data/spec/gherkin/shared/lexer_group.rb +593 -0
  153. data/spec/gherkin/shared/py_string_group.rb +153 -0
  154. data/spec/gherkin/shared/row_group.rb +125 -0
  155. data/spec/gherkin/shared/tags_group.rb +54 -0
  156. data/spec/gherkin/tag_expression_spec.rb +137 -0
  157. data/spec/spec_helper.rb +69 -0
  158. data/tasks/bench.rake +184 -0
  159. data/tasks/bench/feature_builder.rb +49 -0
  160. data/tasks/bench/generated/.gitignore +1 -0
  161. data/tasks/bench/null_listener.rb +4 -0
  162. data/tasks/compile.rake +102 -0
  163. data/tasks/cucumber.rake +20 -0
  164. data/tasks/gems.rake +35 -0
  165. data/tasks/ikvm.rake +79 -0
  166. data/tasks/ragel_task.rb +70 -0
  167. data/tasks/rdoc.rake +9 -0
  168. data/tasks/release.rake +30 -0
  169. data/tasks/rspec.rake +8 -0
  170. metadata +609 -0
@@ -0,0 +1,21 @@
1
+ module Gherkin
2
+ module Formatter
3
+ class RegexpFilter
4
+ def initialize(regexen)
5
+ @regexen = regexen
6
+ end
7
+
8
+ def eval(tags, names, ranges)
9
+ @regexen.detect do |regexp|
10
+ names.detect do |name|
11
+ name =~ regexp
12
+ end
13
+ end
14
+ end
15
+
16
+ def filter_table_body_rows(rows)
17
+ rows
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ module Gherkin
2
+ module Formatter
3
+ class StepPrinter
4
+ def write_step(io, text_format, arg_format, step_name, arguments)
5
+ unpacked_step_name = step_name.unpack("U*")
6
+
7
+ text_start = 0
8
+ arguments.each do |arg|
9
+ io.write(text_format.text(unpacked_step_name[text_start..arg.offset-1].pack("U*"))) unless arg.offset == 0
10
+ io.write(arg_format.text(arg.val))
11
+ text_start = arg.offset + arg.val.unpack("U*").length
12
+ end
13
+ io.write(text_format.text(unpacked_step_name[text_start..-1].pack("U*"))) unless text_start == unpacked_step_name.length
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,47 @@
1
+ module Gherkin
2
+ module Formatter
3
+ class TagCountFormatter
4
+ def initialize(formatter, tag_counts)
5
+ @formatter = formatter
6
+ @tag_counts = tag_counts
7
+ end
8
+
9
+ def uri(uri)
10
+ @uri = uri
11
+ end
12
+
13
+ def feature(feature)
14
+ @feature_tags = feature.tags
15
+ @formatter.feature(feature)
16
+ end
17
+
18
+ def scenario(scenario)
19
+ record_tags((@feature_tags.to_a + scenario.tags.to_a).uniq, scenario.line)
20
+ @formatter.scenario(scenario)
21
+ end
22
+
23
+ def scenario_outline(scenario_outline)
24
+ @scenario_outline_tags = scenario_outline.tags
25
+ @formatter.scenario_outline(scenario_outline)
26
+ end
27
+
28
+ def examples(examples)
29
+ record_tags((@feature_tags.to_a + @scenario_outline_tags.to_a + examples.tags.to_a).uniq, examples.line)
30
+ @formatter.examples(examples)
31
+ end
32
+
33
+ private
34
+
35
+ def record_tags(tags, line)
36
+ tags.each do |tag|
37
+ @tag_counts[tag.name] ||= []
38
+ @tag_counts[tag.name] << "#{@uri}:#{line}"
39
+ end
40
+ end
41
+
42
+ def method_missing(*args)
43
+ @formatter.__send__(*args)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,19 @@
1
+ require 'gherkin/tag_expression'
2
+
3
+ module Gherkin
4
+ module Formatter
5
+ class TagFilter
6
+ def initialize(tags)
7
+ @tag_expression = TagExpression.new(tags)
8
+ end
9
+
10
+ def eval(tags, names, ranges)
11
+ @tag_expression.eval(tags.uniq.map{|tag| tag.name})
12
+ end
13
+
14
+ def filter_table_body_rows(rows)
15
+ rows
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,175 @@
1
+ require 'yaml'
2
+ require 'gherkin/rubify'
3
+ require 'gherkin/native'
4
+
5
+ module Gherkin
6
+ class I18n
7
+ native_impl('gherkin') unless defined?(BYPASS_NATIVE_IMPL)
8
+
9
+ FEATURE_ELEMENT_KEYS = %w{feature background scenario scenario_outline examples}
10
+ STEP_KEYWORD_KEYS = %w{given when then and but}
11
+ KEYWORD_KEYS = FEATURE_ELEMENT_KEYS + STEP_KEYWORD_KEYS
12
+ LANGUAGES = YAML.load_file(File.dirname(__FILE__) + '/i18n.yml')
13
+
14
+ class << self
15
+ include Rubify
16
+
17
+ # Used by code generators for other lexer tools like pygments lexer and textmate bundle
18
+ def all
19
+ LANGUAGES.keys.sort.map{|iso_code| get(iso_code)}
20
+ end
21
+
22
+ def get(iso_code)
23
+ languages[iso_code] ||= new(iso_code)
24
+ end
25
+
26
+ # Returns all keyword translations and aliases of +keywords+, escaped and joined with <tt>|</tt>.
27
+ # This method is convenient for editor support and syntax highlighting engines for Gherkin, where
28
+ # there is typically a code generation tool to generate regular expressions for recognising the
29
+ # various I18n translations of Gherkin's keywords.
30
+ #
31
+ # The +keywords+ arguments can be one of <tt>:feature</tt>, <tt>:background</tt>, <tt>:scenario</tt>,
32
+ # <tt>:scenario_outline</tt>, <tt>:examples</tt>, <tt>:step</tt>.
33
+ def keyword_regexp(*keywords)
34
+ unique_keywords = all.map do |i18n|
35
+ keywords.map do |keyword|
36
+ if keyword.to_s == 'step'
37
+ i18n.step_keywords.to_a
38
+ else
39
+ i18n.keywords(keyword).to_a
40
+ end
41
+ end
42
+ end
43
+
44
+ unique_keywords.flatten.compact.map{|kw| kw.to_s}.sort.reverse.uniq.join('|').gsub(/\*/, '\*')
45
+ end
46
+
47
+ def code_keywords
48
+ rubify(all.map{|i18n| i18n.code_keywords}).flatten.uniq.sort
49
+ end
50
+
51
+ def code_keyword_for(gherkin_keyword)
52
+ gherkin_keyword.gsub(/[\s',!]/, '').strip
53
+ end
54
+
55
+ def language_table
56
+ require 'stringio'
57
+ require 'gherkin/formatter/pretty_formatter'
58
+ require 'gherkin/formatter/model'
59
+ io = StringIO.new
60
+ pf = Gherkin::Formatter::PrettyFormatter.new(io, false, false)
61
+ table = all.map do |i18n|
62
+ Formatter::Model::Row.new([], [i18n.iso_code, i18n.keywords('name')[0], i18n.keywords('native')[0]], nil)
63
+ end
64
+ pf.table(table)
65
+ io.string
66
+ end
67
+
68
+ def unicode_escape(word, prefix="\\u")
69
+ word = word.unpack("U*").map do |c|
70
+ if c > 127 || c == 32
71
+ "#{prefix}%04x" % c
72
+ else
73
+ c.chr
74
+ end
75
+ end.join
76
+ end
77
+
78
+ private
79
+
80
+ def languages
81
+ @languages ||= {}
82
+ end
83
+ end
84
+
85
+ attr_reader :iso_code
86
+
87
+ def initialize(iso_code)
88
+ @iso_code = iso_code
89
+ @keywords = LANGUAGES[iso_code]
90
+ raise "Language not supported: #{iso_code.inspect}" if @iso_code.nil?
91
+ @keywords['grammar_name'] = @keywords['name'].gsub(/\s/, '')
92
+ end
93
+
94
+ def lexer(listener, force_ruby=false)
95
+ begin
96
+ if force_ruby
97
+ rb(listener)
98
+ else
99
+ begin
100
+ c(listener)
101
+ rescue NameError, LoadError => e
102
+ warn("WARNING: #{e.message}. Reverting to Ruby lexer.")
103
+ rb(listener)
104
+ end
105
+ end
106
+ rescue LoadError => e
107
+ raise I18nLexerNotFound, "No lexer was found for #{i18n_language_name} (#{e.message}). Supported languages are listed in gherkin/i18n.yml."
108
+ end
109
+ end
110
+
111
+ def c(listener)
112
+ require 'gherkin/c_lexer'
113
+ CLexer[underscored_iso_code].new(listener)
114
+ end
115
+
116
+ def rb(listener)
117
+ require 'gherkin/rb_lexer'
118
+ RbLexer[underscored_iso_code].new(listener)
119
+ end
120
+
121
+ def underscored_iso_code
122
+ @iso_code.gsub(/[\s-]/, '_').downcase
123
+ end
124
+
125
+ # Keywords that can be used in Gherkin source
126
+ def step_keywords
127
+ STEP_KEYWORD_KEYS.map{|iso_code| keywords(iso_code)}.flatten.uniq
128
+ end
129
+
130
+ # Keywords that can be used in code
131
+ def code_keywords
132
+ result = step_keywords.map{|keyword| self.class.code_keyword_for(keyword)}
133
+ result.delete('*')
134
+ result
135
+ end
136
+
137
+ def keywords(key)
138
+ key = key.to_s
139
+ raise "No #{key.inspect} in #{@keywords.inspect}" if @keywords[key].nil?
140
+ @keywords[key].split('|').map{|keyword| real_keyword(key, keyword)}
141
+ end
142
+
143
+ def keyword_table
144
+ require 'stringio'
145
+ require 'gherkin/formatter/pretty_formatter'
146
+ require 'gherkin/formatter/model'
147
+ io = StringIO.new
148
+ pf = Gherkin::Formatter::PrettyFormatter.new(io, false, false)
149
+
150
+ gherkin_keyword_table = KEYWORD_KEYS.map do |key|
151
+ Formatter::Model::Row.new([], [key, keywords(key).map{|keyword| %{"#{keyword}"}}.join(', ')], nil)
152
+ end
153
+
154
+ code_keyword_table = STEP_KEYWORD_KEYS.map do |key|
155
+ code_keywords = keywords(key).reject{|keyword| keyword == '* '}.map do |keyword|
156
+ %{"#{self.class.code_keyword_for(keyword)}"}
157
+ end.join(', ')
158
+ Formatter::Model::Row.new([], ["#{key} (code)", code_keywords], nil)
159
+ end
160
+
161
+ pf.table(gherkin_keyword_table + code_keyword_table)
162
+ io.string
163
+ end
164
+
165
+ private
166
+
167
+ def real_keyword(key, keyword)
168
+ if(STEP_KEYWORD_KEYS.index(key))
169
+ (keyword + ' ').sub(/< $/, '')
170
+ else
171
+ keyword
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,588 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # We use ISO 639-1 (language) and ISO 3166 alpha-2 (region - if appliccable):
4
+ # http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
5
+ # http://en.wikipedia.org/wiki/ISO_3166-1
6
+ #
7
+ # If you want several aliases for a keyword, just separate them
8
+ # with a | character. Make sure there are no ambiguities in the
9
+ # keywords.
10
+ #
11
+ # If you do *not* want a trailing space after a keyword, end it with a < character.
12
+ # (See Chinese for examples).
13
+ #
14
+ "en":
15
+ name: English
16
+ native: English
17
+ feature: Feature
18
+ background: Background
19
+ scenario: Scenario
20
+ scenario_outline: Scenario Outline|Scenario Template
21
+ examples: Examples|Scenarios
22
+ given: "*|Given"
23
+ when: "*|When"
24
+ then: "*|Then"
25
+ and: "*|And"
26
+ but: "*|But"
27
+
28
+ # Please keep the grammars in alphabetical order by name from here and down.
29
+
30
+ "ar":
31
+ name: Arabic
32
+ native: العربية
33
+ feature: خاصية
34
+ background: الخلفية
35
+ scenario: سيناريو
36
+ scenario_outline: سيناريو مخطط
37
+ examples: امثلة
38
+ given: "*|بفرض"
39
+ when: "*|متى|عندما"
40
+ then: "*|اذاً|ثم"
41
+ and: "*|و"
42
+ but: "*|لكن"
43
+ "bg":
44
+ name: Bulgarian
45
+ native: български
46
+ feature: Функционалност
47
+ background: Предистория
48
+ scenario: Сценарий
49
+ scenario_outline: Рамка на сценарий
50
+ examples: Примери
51
+ given: "*|Дадено"
52
+ when: "*|Когато"
53
+ then: "*|То"
54
+ and: "*|И"
55
+ but: "*|Но"
56
+ "ca":
57
+ name: Catalan
58
+ native: català
59
+ background: Rerefons|Antecedents
60
+ feature: Característica|Funcionalitat
61
+ scenario: Escenari
62
+ scenario_outline: Esquema de l'escenari
63
+ examples: Exemples
64
+ given: "*|Donat|Donada|Atès|Atesa"
65
+ when: "*|Quan"
66
+ then: "*|Aleshores|Cal"
67
+ and: "*|I"
68
+ but: "*|Però"
69
+ "cy-GB":
70
+ name: Welsh
71
+ native: Cymraeg
72
+ background: Cefndir
73
+ feature: Arwedd
74
+ scenario: Scenario
75
+ scenario_outline: Scenario Amlinellol
76
+ examples: Enghreifftiau
77
+ given: "*|Anrhegedig a"
78
+ when: "*|Pryd"
79
+ then: "*|Yna"
80
+ and: "*|A"
81
+ but: "*|Ond"
82
+ "cs":
83
+ name: Czech
84
+ native: Česky
85
+ feature: Požadavek
86
+ background: Pozadí|Kontext
87
+ scenario: Scénář
88
+ scenario_outline: Náčrt Scénáře|Osnova scénáře
89
+ examples: Příklady
90
+ given: "*|Pokud"
91
+ when: "*|Když"
92
+ then: "*|Pak"
93
+ and: "*|A|A také"
94
+ but: "*|Ale"
95
+ "da":
96
+ name: Danish
97
+ native: dansk
98
+ feature: Egenskab
99
+ background: Baggrund
100
+ scenario: Scenarie
101
+ scenario_outline: Abstrakt Scenario
102
+ examples: Eksempler
103
+ given: "*|Givet"
104
+ when: "*|Når"
105
+ then: "*|Så"
106
+ and: "*|Og"
107
+ but: "*|Men"
108
+ "de":
109
+ name: German
110
+ native: Deutsch
111
+ feature: Funktionalität
112
+ background: Grundlage
113
+ scenario: Szenario
114
+ scenario_outline: Szenariogrundriss
115
+ examples: Beispiele
116
+ given: "*|Angenommen|Gegeben sei"
117
+ when: "*|Wenn"
118
+ then: "*|Dann"
119
+ and: "*|Und"
120
+ but: "*|Aber"
121
+ "en-au":
122
+ name: Australian
123
+ native: Australian
124
+ feature: Crikey
125
+ background: Background
126
+ scenario: Mate
127
+ scenario_outline: Blokes
128
+ examples: Cobber
129
+ given: "*|Ya know how"
130
+ when: "*|When"
131
+ then: "*|Ya gotta"
132
+ and: "*|N"
133
+ but: "*|Cept"
134
+ "en-lol":
135
+ name: LOLCAT
136
+ native: LOLCAT
137
+ feature: OH HAI
138
+ background: B4
139
+ scenario: MISHUN
140
+ scenario_outline: MISHUN SRSLY
141
+ examples: EXAMPLZ
142
+ given: "*|I CAN HAZ"
143
+ when: "*|WEN"
144
+ then: "*|DEN"
145
+ and: "*|AN"
146
+ but: "*|BUT"
147
+ "en-pirate":
148
+ name: Pirate
149
+ native: Pirate
150
+ feature: Ahoy matey!
151
+ background: Yo-ho-ho
152
+ scenario: Heave to
153
+ scenario_outline: Shiver me timbers
154
+ examples: Dead men tell no tales
155
+ given: "*|Gangway!"
156
+ when: "*|Blimey!"
157
+ then: "*|Let go and haul"
158
+ and: "*|Aye"
159
+ but: "*|Avast!"
160
+ "en-Scouse":
161
+ name: Scouse
162
+ native: Scouse
163
+ feature: Feature
164
+ background: "Dis is what went down"
165
+ scenario: "The thing of it is"
166
+ scenario_outline: "Wharrimean is"
167
+ examples: Examples
168
+ given: "*|Givun|Youse know when youse got"
169
+ when: "*|Wun|Youse know like when"
170
+ then: "*|Dun|Den youse gotta"
171
+ and: "*|An"
172
+ but: "*|Buh"
173
+ "en-tx":
174
+ name: Texan
175
+ native: Texan
176
+ feature: Feature
177
+ background: Background
178
+ scenario: Scenario
179
+ scenario_outline: All y'all
180
+ examples: Examples
181
+ given: "*|Given y'all"
182
+ when: "*|When y'all"
183
+ then: "*|Then y'all"
184
+ and: "*|And y'all"
185
+ but: "*|But y'all"
186
+ "eo":
187
+ name: Esperanto
188
+ native: Esperanto
189
+ feature: Trajto
190
+ background: Fono
191
+ scenario: Scenaro
192
+ scenario_outline: Konturo de la scenaro
193
+ examples: Ekzemploj
194
+ given: "*|Donitaĵo"
195
+ when: "*|Se"
196
+ then: "*|Do"
197
+ and: "*|Kaj"
198
+ but: "*|Sed"
199
+ "es":
200
+ name: Spanish
201
+ native: español
202
+ background: Antecedentes
203
+ feature: Característica
204
+ scenario: Escenario
205
+ scenario_outline: Esquema del escenario
206
+ examples: Ejemplos
207
+ given: "*|Dado"
208
+ when: "*|Cuando"
209
+ then: "*|Entonces"
210
+ and: "*|Y"
211
+ but: "*|Pero"
212
+ "et":
213
+ name: Estonian
214
+ native: eesti keel
215
+ feature: Omadus
216
+ background: Taust
217
+ scenario: Stsenaarium
218
+ scenario_outline: Raamstsenaarium
219
+ examples: Juhtumid
220
+ given: "*|Eeldades"
221
+ when: "*|Kui"
222
+ then: "*|Siis"
223
+ and: "*|Ja"
224
+ but: "*|Kuid"
225
+ "fi":
226
+ name: Finnish
227
+ native: suomi
228
+ feature: Ominaisuus
229
+ background: Tausta
230
+ scenario: Tapaus
231
+ scenario_outline: Tapausaihio
232
+ examples: Tapaukset
233
+ given: "*|Oletetaan"
234
+ when: "*|Kun"
235
+ then: "*|Niin"
236
+ and: "*|Ja"
237
+ but: "*|Mutta"
238
+ "fr":
239
+ name: French
240
+ native: français
241
+ feature: Fonctionnalité
242
+ background: Contexte
243
+ scenario: Scénario
244
+ scenario_outline: Plan du scénario|Plan du Scénario
245
+ examples: Exemples
246
+ given: "*|Soit|Etant donné"
247
+ when: "*|Quand|Lorsque|Lorsqu'<"
248
+ then: "*|Alors"
249
+ and: "*|Et"
250
+ but: "*|Mais"
251
+ "he":
252
+ name: Hebrew
253
+ native: עברית
254
+ feature: תכונה
255
+ background: רקע
256
+ scenario: תרחיש
257
+ scenario_outline: תבנית תרחיש
258
+ examples: דוגמאות
259
+ given: "*|בהינתן"
260
+ when: "*|כאשר"
261
+ then: "*|אז|אזי"
262
+ and: "*|וגם"
263
+ but: "*|אבל"
264
+ "hr":
265
+ name: Croatian
266
+ native: hrvatski
267
+ feature: Osobina|Mogućnost|Mogucnost
268
+ background: Pozadina
269
+ scenario: Scenarij
270
+ scenario_outline: Skica|Koncept
271
+ examples: Primjeri|Scenariji
272
+ given: "*|Zadan|Zadani|Zadano"
273
+ when: "*|Kada|Kad"
274
+ then: "*|Onda"
275
+ and: "*|I"
276
+ but: "*|Ali"
277
+ "hu":
278
+ name: Hungarian
279
+ native: magyar
280
+ feature: Jellemző
281
+ background: Háttér
282
+ scenario: Forgatókönyv
283
+ scenario_outline: Forgatókönyv vázlat
284
+ examples: Példák
285
+ given: "*|Amennyiben|Adott"
286
+ when: "*|Majd|Ha|Amikor"
287
+ then: "*|Akkor"
288
+ and: "*|És"
289
+ but: "*|De"
290
+ "id":
291
+ name: Indonesian
292
+ native: Bahasa Indonesia
293
+ feature: Fitur
294
+ background: Dasar
295
+ scenario: Skenario
296
+ scenario_outline: Skenario konsep
297
+ examples: Contoh
298
+ given: "*|Dengan"
299
+ when: "*|Ketika"
300
+ then: "*|Maka"
301
+ and: "*|Dan"
302
+ but: "*|Tapi"
303
+ "it":
304
+ name: Italian
305
+ native: italiano
306
+ feature: Funzionalità
307
+ background: Contesto
308
+ scenario: Scenario
309
+ scenario_outline: Schema dello scenario
310
+ examples: Esempi
311
+ given: "*|Dato"
312
+ when: "*|Quando"
313
+ then: "*|Allora"
314
+ and: "*|E"
315
+ but: "*|Ma"
316
+ "ja":
317
+ name: Japanese
318
+ native: 日本語
319
+ feature: フィーチャ|機能
320
+ background: 背景
321
+ scenario: シナリオ
322
+ scenario_outline: シナリオアウトライン|シナリオテンプレート|テンプレ|シナリオテンプレ
323
+ examples: 例|サンプル
324
+ given: "*|前提<"
325
+ when: "*|もし<"
326
+ then: "*|ならば<"
327
+ and: "*|かつ<"
328
+ but: "*|しかし<|但し<|ただし<"
329
+ "ko":
330
+ name: Korean
331
+ native: 한국어
332
+ background: 배경
333
+ feature: 기능
334
+ scenario: 시나리오
335
+ scenario_outline: 시나리오 개요
336
+ examples: 예
337
+ given: "*|조건<|먼저<"
338
+ when: "*|만일<|만약<"
339
+ then: "*|그러면<"
340
+ and: "*|그리고<"
341
+ but: "*|하지만<|단<"
342
+ "lt":
343
+ name: Lithuanian
344
+ native: lietuvių kalba
345
+ feature: Savybė
346
+ background: Kontekstas
347
+ scenario: Scenarijus
348
+ scenario_outline: Scenarijaus šablonas
349
+ examples: Pavyzdžiai|Scenarijai|Variantai
350
+ given: "*|Duota"
351
+ when: "*|Kai"
352
+ then: "*|Tada"
353
+ and: "*|Ir"
354
+ but: "*|Bet"
355
+ "lu":
356
+ name: Luxemburgish
357
+ native: Lëtzebuergesch
358
+ feature: Funktionalitéit
359
+ background: Hannergrond
360
+ scenario: Szenario
361
+ scenario_outline: Plang vum Szenario
362
+ examples: Beispiller
363
+ given: "*|ugeholl"
364
+ when: "*|wann"
365
+ then: "*|dann"
366
+ and: "*|an|a"
367
+ but: "*|awer|mä"
368
+ "lv":
369
+ name: Latvian
370
+ native: latviešu
371
+ feature: Funkcionalitāte|Fīča
372
+ background: Konteksts|Situācija
373
+ scenario: Scenārijs
374
+ scenario_outline: Scenārijs pēc parauga
375
+ examples: Piemēri|Paraugs
376
+ given: "*|Kad"
377
+ when: "*|Ja"
378
+ then: "*|Tad"
379
+ and: "*|Un"
380
+ but: "*|Bet"
381
+ "nl":
382
+ name: Dutch
383
+ native: Nederlands
384
+ feature: Functionaliteit
385
+ background: Achtergrond
386
+ scenario: Scenario
387
+ scenario_outline: Abstract Scenario
388
+ examples: Voorbeelden
389
+ given: "*|Gegeven|Stel"
390
+ when: "*|Als"
391
+ then: "*|Dan"
392
+ and: "*|En"
393
+ but: "*|Maar"
394
+ "no":
395
+ name: Norwegian
396
+ native: norsk
397
+ feature: Egenskap
398
+ background: Bakgrunn
399
+ scenario: Scenario
400
+ scenario_outline: Scenariomal|Abstrakt Scenario
401
+ examples: Eksempler
402
+ given: "*|Gitt"
403
+ when: "*|Når"
404
+ then: "*|Så"
405
+ and: "*|Og"
406
+ but: "*|Men"
407
+ "pl":
408
+ name: Polish
409
+ native: polski
410
+ feature: Właściwość
411
+ background: Założenia
412
+ scenario: Scenariusz
413
+ scenario_outline: Szablon scenariusza
414
+ examples: Przykłady
415
+ given: "*|Zakładając|Mając"
416
+ when: "*|Jeżeli|Jeśli"
417
+ then: "*|Wtedy"
418
+ and: "*|Oraz|I"
419
+ but: "*|Ale"
420
+ "pt":
421
+ name: Portuguese
422
+ native: português
423
+ background: Contexto
424
+ feature: Funcionalidade
425
+ scenario: Cenário|Cenario
426
+ scenario_outline: Esquema do Cenário|Esquema do Cenario
427
+ examples: Exemplos
428
+ given: "*|Dado"
429
+ when: "*|Quando"
430
+ then: "*|Então|Entao"
431
+ and: "*|E"
432
+ but: "*|Mas"
433
+ "ro":
434
+ name: Romanian
435
+ native: română
436
+ background: Context
437
+ feature: Functionalitate|Funcționalitate|Funcţionalitate
438
+ scenario: Scenariu
439
+ scenario_outline: Structura scenariu|Structură scenariu
440
+ examples: Exemple
441
+ given: "*|Date fiind|Dat fiind|Dati fiind|Dați fiind|Daţi fiind"
442
+ when: "*|Cand|Când"
443
+ then: "*|Atunci"
444
+ and: "*|Si|Și|Şi"
445
+ but: "*|Dar"
446
+ "ru":
447
+ name: Russian
448
+ native: русский
449
+ feature: Функционал|Фича
450
+ background: Предыстория
451
+ scenario: Сценарий
452
+ scenario_outline: Структура сценария
453
+ examples: Значения
454
+ given: "*|Допустим|Дано|Пусть"
455
+ when: "*|Если|Когда"
456
+ then: "*|То|Тогда"
457
+ and: "*|И|К тому же"
458
+ but: "*|Но|А"
459
+ "sv":
460
+ name: Swedish
461
+ native: Svenska
462
+ feature: Egenskap
463
+ background: Bakgrund
464
+ scenario: Scenario
465
+ scenario_outline: Abstrakt Scenario|Scenariomall
466
+ examples: Exempel
467
+ given: "*|Givet"
468
+ when: "*|När"
469
+ then: "*|Så"
470
+ and: "*|Och"
471
+ but: "*|Men"
472
+ "sk":
473
+ name: Slovak
474
+ native: Slovensky
475
+ feature: Požiadavka
476
+ background: Pozadie
477
+ scenario: Scenár
478
+ scenario_outline: Náčrt Scenáru
479
+ examples: Príklady
480
+ given: "*|Pokiaľ"
481
+ when: "*|Keď"
482
+ then: "*|Tak"
483
+ and: "*|A"
484
+ but: "*|Ale"
485
+ "sr-Latn":
486
+ name: Serbian (Latin)
487
+ native: Srpski (Latinica)
488
+ feature: Funkcionalnost|Mogućnost|Mogucnost|Osobina
489
+ background: Kontekst|Osnova|Pozadina
490
+ scenario: Scenario|Primer
491
+ scenario_outline: Struktura scenarija|Skica|Koncept
492
+ examples: Primeri|Scenariji
493
+ given: "*|Zadato|Zadate|Zatati"
494
+ when: "*|Kada|Kad"
495
+ then: "*|Onda"
496
+ and: "*|I"
497
+ but: "*|Ali"
498
+ "sr-Cyrl":
499
+ name: Serbian
500
+ native: Српски
501
+ feature: Функционалност|Могућност|Особина
502
+ background: Контекст|Основа|Позадина
503
+ scenario: Сценарио|Пример
504
+ scenario_outline: Структура сценарија|Скица|Концепт
505
+ examples: Примери|Сценарији
506
+ given: "*|Задато|Задате|Задати"
507
+ when: "*|Када|Кад"
508
+ then: "*|Онда"
509
+ and: "*|И"
510
+ but: "*|Али"
511
+ "tr":
512
+ name: Turkish
513
+ native: Türkçe
514
+ feature: Özellik
515
+ background: Geçmiş
516
+ scenario: Senaryo
517
+ scenario_outline: Senaryo taslağı
518
+ examples: Örnekler
519
+ given: "*|Diyelim ki"
520
+ when: "*|Eğer ki"
521
+ then: "*|O zaman"
522
+ and: "*|Ve"
523
+ but: "*|Fakat|Ama"
524
+ "uk":
525
+ name: Ukrainian
526
+ native: Українська
527
+ feature: Функціонал
528
+ background: Передумова
529
+ scenario: Сценарій
530
+ scenario_outline: Структура сценарію
531
+ examples: Приклади
532
+ given: "*|Припустимо|Припустимо, що|Нехай|Дано"
533
+ when: "*|Якщо|Коли"
534
+ then: "*|То|Тоді"
535
+ and: "*|І|А також|Та"
536
+ but: "*|Але"
537
+ "uz":
538
+ name: Uzbek
539
+ native: Узбекча
540
+ feature: Функционал
541
+ background: Тарих
542
+ scenario: Сценарий
543
+ scenario_outline: Сценарий структураси
544
+ examples: Мисоллар
545
+ given: "*|Агар"
546
+ when: "*|Агар"
547
+ then: "*|Унда"
548
+ and: "*|Ва"
549
+ but: "*|Лекин|Бирок|Аммо"
550
+ "vi":
551
+ name: Vietnamese
552
+ native: Tiếng Việt
553
+ feature: Tính năng
554
+ background: Bối cảnh
555
+ scenario: Tình huống|Kịch bản
556
+ scenario_outline: Khung tình huống|Khung kịch bản
557
+ examples: Dữ liệu
558
+ given: "*|Biết|Cho"
559
+ when: "*|Khi"
560
+ then: "*|Thì"
561
+ and: "*|Và"
562
+ but: "*|Nhưng"
563
+ "zh-CN":
564
+ name: Chinese simplified
565
+ native: 简体中文
566
+ feature: 功能
567
+ background: 背景
568
+ scenario: 场景
569
+ scenario_outline: 场景大纲
570
+ examples: 例子
571
+ given: "*|假如<"
572
+ when: "*|当<"
573
+ then: "*|那么<"
574
+ and: "*|而且<"
575
+ but: "*|但是<"
576
+ "zh-TW":
577
+ name: Chinese traditional
578
+ native: 繁體中文
579
+ feature: 功能
580
+ background: 背景
581
+ scenario: 場景|劇本
582
+ scenario_outline: 場景大綱|劇本大綱
583
+ examples: 例子
584
+ given: "*|假設<"
585
+ when: "*|當<"
586
+ then: "*|那麼<"
587
+ and: "*|而且<|並且<"
588
+ but: "*|但是<"