gherkin 1.0.30-universal-dotnet

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. data/.gitattributes +2 -0
  2. data/.gitignore +9 -0
  3. data/.mailmap +2 -0
  4. data/History.txt +187 -0
  5. data/LICENSE +20 -0
  6. data/README.rdoc +59 -0
  7. data/Rakefile +58 -0
  8. data/VERSION.yml +5 -0
  9. data/bin/gherkin +5 -0
  10. data/cucumber.yml +3 -0
  11. data/features/escaped_pipes.feature +8 -0
  12. data/features/feature_parser.feature +226 -0
  13. data/features/native_lexer.feature +19 -0
  14. data/features/parser_with_native_lexer.feature +205 -0
  15. data/features/pretty_printer.feature +14 -0
  16. data/features/step_definitions/eyeball_steps.rb +3 -0
  17. data/features/step_definitions/gherkin_steps.rb +30 -0
  18. data/features/step_definitions/pretty_formatter_steps.rb +55 -0
  19. data/features/steps_parser.feature +46 -0
  20. data/features/support/env.rb +33 -0
  21. data/ikvm/.gitignore +3 -0
  22. data/java/.gitignore +2 -0
  23. data/java/src/main/java/gherkin/lexer/.gitignore +1 -0
  24. data/java/src/main/resources/gherkin/.gitignore +1 -0
  25. data/lib/.gitignore +4 -0
  26. data/lib/gherkin.rb +2 -0
  27. data/lib/gherkin/c_lexer.rb +17 -0
  28. data/lib/gherkin/cli/main.rb +33 -0
  29. data/lib/gherkin/formatter/argument.rb +27 -0
  30. data/lib/gherkin/formatter/colors.rb +119 -0
  31. data/lib/gherkin/formatter/escaping.rb +15 -0
  32. data/lib/gherkin/formatter/monochrome_format.rb +9 -0
  33. data/lib/gherkin/formatter/pretty_formatter.rb +168 -0
  34. data/lib/gherkin/i18n.rb +176 -0
  35. data/lib/gherkin/i18n.yml +588 -0
  36. data/lib/gherkin/i18n_lexer.rb +38 -0
  37. data/lib/gherkin/native.rb +7 -0
  38. data/lib/gherkin/native/ikvm.rb +55 -0
  39. data/lib/gherkin/native/java.rb +47 -0
  40. data/lib/gherkin/native/null.rb +9 -0
  41. data/lib/gherkin/parser/event.rb +45 -0
  42. data/lib/gherkin/parser/filter_listener.rb +199 -0
  43. data/lib/gherkin/parser/meta.txt +5 -0
  44. data/lib/gherkin/parser/parser.rb +142 -0
  45. data/lib/gherkin/parser/root.txt +11 -0
  46. data/lib/gherkin/parser/steps.txt +4 -0
  47. data/lib/gherkin/parser/tag_expression.rb +50 -0
  48. data/lib/gherkin/rb_lexer.rb +8 -0
  49. data/lib/gherkin/rb_lexer/.gitignore +1 -0
  50. data/lib/gherkin/rb_lexer/README.rdoc +8 -0
  51. data/lib/gherkin/rubify.rb +18 -0
  52. data/lib/gherkin/tools.rb +8 -0
  53. data/lib/gherkin/tools/files.rb +35 -0
  54. data/lib/gherkin/tools/reformat.rb +19 -0
  55. data/lib/gherkin/tools/stats.rb +21 -0
  56. data/lib/gherkin/tools/stats_listener.rb +57 -0
  57. data/ragel/i18n/.gitignore +1 -0
  58. data/ragel/lexer.c.rl.erb +425 -0
  59. data/ragel/lexer.java.rl.erb +216 -0
  60. data/ragel/lexer.rb.rl.erb +173 -0
  61. data/ragel/lexer_common.rl.erb +50 -0
  62. data/spec/gherkin/c_lexer_spec.rb +21 -0
  63. data/spec/gherkin/csharp_lexer_spec.rb +20 -0
  64. data/spec/gherkin/fixtures/1.feature +8 -0
  65. data/spec/gherkin/fixtures/comments_in_table.feature +9 -0
  66. data/spec/gherkin/fixtures/complex.feature +45 -0
  67. data/spec/gherkin/fixtures/dos_line_endings.feature +45 -0
  68. data/spec/gherkin/fixtures/i18n_fr.feature +14 -0
  69. data/spec/gherkin/fixtures/i18n_no.feature +7 -0
  70. data/spec/gherkin/fixtures/i18n_zh-CN.feature +9 -0
  71. data/spec/gherkin/fixtures/simple_with_comments.feature +7 -0
  72. data/spec/gherkin/fixtures/simple_with_tags.feature +11 -0
  73. data/spec/gherkin/fixtures/with_bom.feature +3 -0
  74. data/spec/gherkin/formatter/argument_spec.rb +28 -0
  75. data/spec/gherkin/formatter/colors_spec.rb +19 -0
  76. data/spec/gherkin/formatter/pretty_formatter_spec.rb +162 -0
  77. data/spec/gherkin/formatter/spaces.feature +9 -0
  78. data/spec/gherkin/formatter/tabs.feature +9 -0
  79. data/spec/gherkin/i18n_lexer_spec.rb +26 -0
  80. data/spec/gherkin/i18n_spec.rb +144 -0
  81. data/spec/gherkin/java_lexer_spec.rb +21 -0
  82. data/spec/gherkin/parser/filter_listener_spec.rb +390 -0
  83. data/spec/gherkin/parser/parser_spec.rb +50 -0
  84. data/spec/gherkin/parser/tag_expression_spec.rb +116 -0
  85. data/spec/gherkin/rb_lexer_spec.rb +19 -0
  86. data/spec/gherkin/sexp_recorder.rb +32 -0
  87. data/spec/gherkin/shared/lexer_spec.rb +550 -0
  88. data/spec/gherkin/shared/py_string_spec.rb +150 -0
  89. data/spec/gherkin/shared/row_spec.rb +104 -0
  90. data/spec/gherkin/shared/tags_spec.rb +50 -0
  91. data/spec/spec_helper.rb +87 -0
  92. data/tasks/bench.rake +188 -0
  93. data/tasks/bench/feature_builder.rb +49 -0
  94. data/tasks/bench/generated/.gitignore +1 -0
  95. data/tasks/bench/null_listener.rb +4 -0
  96. data/tasks/compile.rake +89 -0
  97. data/tasks/cucumber.rake +26 -0
  98. data/tasks/gems.rake +45 -0
  99. data/tasks/ikvm.rake +47 -0
  100. data/tasks/ragel_task.rb +70 -0
  101. data/tasks/rdoc.rake +12 -0
  102. data/tasks/release.rake +26 -0
  103. data/tasks/rspec.rake +15 -0
  104. metadata +257 -0
@@ -0,0 +1,20 @@
1
+ #encoding: utf-8
2
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == "ironruby"
3
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
4
+
5
+ module Gherkin
6
+ module Lexer
7
+ describe "C# Lexer" do
8
+ before do
9
+ @listener = Gherkin::SexpRecorder.new
10
+ @lexer = Gherkin::Lexer.csharp['en'].new(@listener)
11
+ end
12
+
13
+ it_should_behave_like "a Gherkin lexer"
14
+ it_should_behave_like "a Gherkin lexer lexing tags"
15
+ it_should_behave_like "a Gherkin lexer lexing py_strings"
16
+ it_should_behave_like "a Gherkin lexer lexing rows"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,8 @@
1
+ Feature: Logging in
2
+ So that I can be myself
3
+ # Comment
4
+ Scenario: Anonymous user can get a login form.
5
+ Scenery here
6
+
7
+ @tag
8
+ Scenario: Another one
@@ -0,0 +1,9 @@
1
+ Feature: x
2
+
3
+ Scenario Outline: x
4
+ Then x is <state>
5
+
6
+ Examples:
7
+ | state |
8
+ # comment
9
+ | 1 |
@@ -0,0 +1,45 @@
1
+ #Comment on line 1
2
+ #Comment on line 2
3
+ @tag1 @tag2
4
+ Feature: Feature Text
5
+ In order to test multiline forms
6
+ As a ragel writer
7
+ I need to check for complex combinations
8
+
9
+ #Comment on line 9
10
+
11
+ #Comment on line 11
12
+
13
+ Background:
14
+ Given this is a background step
15
+ And this is another one
16
+
17
+ @tag3 @tag4
18
+ Scenario: Reading a Scenario
19
+ Given there is a step
20
+ But not another step
21
+
22
+ @tag3
23
+ Scenario: Reading a second scenario
24
+ With two lines of text
25
+ #Comment on line 24
26
+ Given a third step with a table
27
+ |a|b|
28
+ |c|d|
29
+ |e|f|
30
+ And I am still testing things
31
+ |g|h|
32
+ |e|r|
33
+ |k|i|
34
+ |n||
35
+ And I am done testing these tables
36
+ #Comment on line 29
37
+ Then I am happy
38
+
39
+ Scenario: Hammerzeit
40
+ Given All work and no play
41
+ """
42
+ Makes Homer something something
43
+ And something else
44
+ """
45
+ Then crazy
@@ -0,0 +1,45 @@
1
+ #Comment on line 1
2
+ #Comment on line 2
3
+ @tag1 @tag2
4
+ Feature: Feature Text
5
+ In order to test multiline forms
6
+ As a ragel writer
7
+ I need to check for complex combinations
8
+
9
+ #Comment on line 9
10
+
11
+ #Comment on line 11
12
+
13
+ Background:
14
+ Given this is a background step
15
+ And this is another one
16
+
17
+ @tag3 @tag4
18
+ Scenario: Reading a Scenario
19
+ Given there is a step
20
+ But not another step
21
+
22
+ @tag3
23
+ Scenario: Reading a second scenario
24
+ With two lines of text
25
+ #Comment on line 24
26
+ Given a third step with a table
27
+ |a|b|
28
+ |c|d|
29
+ |e|f|
30
+ And I am still testing things
31
+ |g|h|
32
+ |e|r|
33
+ |k|i|
34
+ |n||
35
+ And I am done testing these tables
36
+ #Comment on line 29
37
+ Then I am happy
38
+
39
+ Scenario: Hammerzeit
40
+ Given All work and no play
41
+ """
42
+ Makes Homer something something
43
+ And something else
44
+ """
45
+ Then crazy
@@ -0,0 +1,14 @@
1
+ #language:fr
2
+ Fonctionnalité: Addition
3
+ Plan du scénario: Addition de produits dérivés
4
+ Soit une calculatrice
5
+ Etant donné qu'on tape <a>
6
+ Et qu'on tape <b>
7
+ Lorsqu'on tape additionner
8
+ Alors le résultat doit être <somme>
9
+
10
+ Exemples:
11
+ | a | b | somme |
12
+ | 2 | 2 | 4 |
13
+ | 2 | 3 | 5 |
14
+
@@ -0,0 +1,7 @@
1
+ #language:no
2
+ Egenskap: i18n support
3
+
4
+ Scenario: Parsing many languages
5
+ Gitt Gherkin supports many languages
6
+ Når Norwegian keywords are parsed
7
+ Så they should be recognized
@@ -0,0 +1,9 @@
1
+ #language:zh-CN
2
+ 功能:加法
3
+
4
+ 场景: 两个数相加
5
+ 假如我已经在计算器里输入6
6
+ 而且我已经在计算器里输入7
7
+ 当我按相加按钮
8
+ 那么我应该在屏幕上看到的结果是13
9
+
@@ -0,0 +1,7 @@
1
+ # Here is a comment
2
+ Feature: Feature Text
3
+ # Here is another # comment
4
+ Scenario: Reading a Scenario
5
+ # Here is a third comment
6
+ Given there is a step
7
+ # Here is a fourth comment
@@ -0,0 +1,11 @@
1
+ # FC
2
+ @ft
3
+ Feature: hi
4
+
5
+ @st1 @st2
6
+ Scenario: First
7
+ Given Pepper
8
+
9
+ @st3
10
+ @st4 @ST5 @#^%&ST6**!
11
+ Scenario: Second
@@ -0,0 +1,3 @@
1
+ Feature: Feature Text
2
+ Scenario: Reading a Scenario
3
+ Given there is a step
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
+ require 'gherkin/formatter/argument'
4
+
5
+ module Gherkin
6
+ module Formatter
7
+ class BracketFormat
8
+ class << self
9
+ def new
10
+ defined?(JRUBY_VERSION) ? ::Java::GherkinFormatter::ArgumentFormat.new("[", "]") : super
11
+ end
12
+ end
13
+
14
+ def format_argument(s)
15
+ "[#{s}]"
16
+ end
17
+ end
18
+
19
+ describe Argument do
20
+ it "should replace one arg" do
21
+ argument_class = defined?(JRUBY_VERSION) ? ::Java::GherkinFormatter::Argument : Argument
22
+ argument_class.format("I have 10 cukes", BracketFormat.new, [Argument.new(7, '10')]).should == "I have [10] cukes"
23
+ end
24
+
25
+ # TODO: Add this spec: http://github.com/alg/cucumber/commit/33188e9db51f59ced74c4861524d7b2e69454630
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+ require 'gherkin/formatter/pretty_formatter'
3
+
4
+
5
+ module Gherkin
6
+ module Formatter
7
+ describe Colors do
8
+ include Colors
9
+
10
+ it "should colour stuff red" do
11
+ failed("hello").should == "\e[31mhello\e[0m"
12
+ end
13
+
14
+ it "should be possible to specify no colouring" do
15
+ failed("hello", true).should == "hello"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,162 @@
1
+ # encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
+ require 'gherkin/formatter/pretty_formatter'
4
+ require 'gherkin/formatter/argument'
5
+ require 'stringio'
6
+
7
+ module Gherkin
8
+ module Formatter
9
+ describe PrettyFormatter do
10
+ def assert_io(s)
11
+ @io.rewind
12
+ actual = @io.read
13
+ actual.should == s
14
+ end
15
+
16
+ def assert_pretty(input, output=input)
17
+ [true, false].each do |force_ruby|
18
+ io = StringIO.new
19
+ l = PrettyFormatter.new(io, true)
20
+ parser = Gherkin::Parser::Parser.new(l, true, "root")
21
+ lexer = Gherkin::I18nLexer.new(parser, force_ruby)
22
+ lexer.scan(input)
23
+ io.rewind
24
+ actual = io.read
25
+ actual.should == output
26
+ end
27
+ end
28
+
29
+ before do
30
+ @io = StringIO.new
31
+ @l = PrettyFormatter.new(@io, true)
32
+ end
33
+
34
+ it "should print comments when scenario is longer" do
35
+ @l.feature("Feature", "Hello\nWorld", 1)
36
+ @l.steps([
37
+ ['Given ', 'some stuff'],
38
+ ['When ', 'foo']
39
+ ])
40
+ @l.scenario("Scenario", "The scenario", 4, "features/foo.feature:4")
41
+ @l.step("Given ", "some stuff", 5, nil, nil, nil, "features/step_definitions/bar.rb:56")
42
+ @l.step("When ", "foo", 6, nil, nil, nil, "features/step_definitions/bar.rb:96")
43
+
44
+ assert_io(%{Feature: Hello
45
+ World
46
+
47
+ Scenario: The scenario # features/foo.feature:4
48
+ Given some stuff # features/step_definitions/bar.rb:56
49
+ When foo # features/step_definitions/bar.rb:96
50
+ })
51
+ end
52
+
53
+ it "should print comments when step is longer" do
54
+ @l.feature("Feature", "Hello\nWorld", 1)
55
+ @l.steps([
56
+ ['Given ', 'some stuff that is longer']
57
+ ])
58
+ @l.scenario("Scenario", "The scenario", 4, "features/foo.feature:4")
59
+ @l.step("Given ", "some stuff that is longer", 5, nil, nil, nil, "features/step_definitions/bar.rb:56")
60
+
61
+ assert_io(%{Feature: Hello
62
+ World
63
+
64
+ Scenario: The scenario # features/foo.feature:4
65
+ Given some stuff that is longer # features/step_definitions/bar.rb:56
66
+ })
67
+ end
68
+
69
+ it "should print ANSI coloured steps" do
70
+ @l.feature("Feature", "Hello\nWorld", 1)
71
+ @l.steps([
72
+ ['Given ', 'some stuff that is longer']
73
+ ])
74
+ @l.scenario("Scenario", "The scenario", 4, "features/foo.feature:4")
75
+ @l.step("Given ", "some stuff that is longer", 5, nil, nil, nil, "features/step_definitions/bar.rb:56")
76
+
77
+ assert_io(%{Feature: Hello
78
+ World
79
+
80
+ Scenario: The scenario # features/foo.feature:4
81
+ Given some stuff that is longer # features/step_definitions/bar.rb:56
82
+ })
83
+ end
84
+
85
+ it "should prettify a whole table with padding (typically ANSI)" do
86
+ @l.row(%w(a bb), 1)
87
+ @l.row(%w(ccc d), 2)
88
+ @l.row(%w(ee ffff), 3)
89
+ @l.flush_table
90
+
91
+ assert_io(
92
+ " | a | bb |\n" +
93
+ " | ccc | d |\n" +
94
+ " | ee | ffff |\n"
95
+ )
96
+ end
97
+
98
+ it "should highlight arguments for regular steps" do
99
+ passed = defined?(JRUBY_VERSION) ? 'passed' : :passed
100
+ @l.step("Given ", "I have 999 cukes in my belly", 3, passed, nil, [Gherkin::Formatter::Argument.new(7, '999')], nil)
101
+ assert_io(" Given I have 999 cukes in my belly\n")
102
+ end
103
+
104
+ it "should prettify scenario" do
105
+ assert_pretty(%{Feature: Feature Description
106
+ Some preamble
107
+
108
+ Scenario: Scenario Description
109
+ Given there is a step
110
+ """
111
+ with
112
+ pystrings
113
+ """
114
+ And there is another step
115
+ | æ | \\|o |
116
+ | \\|a | ø\\\\ |
117
+ Then we will see steps
118
+ })
119
+ end
120
+
121
+
122
+ it "should prettify scenario outline with table" do
123
+ assert_pretty(%{# A feature comment
124
+ @foo
125
+ Feature: Feature Description
126
+ Some preamble
127
+
128
+ # A Scenario Outline comment
129
+ @bar
130
+ Scenario Outline: Scenario Ouline Description
131
+ Given there is a
132
+ """
133
+ string with <foo>
134
+ """
135
+ And a table with
136
+ | <bar> |
137
+ | <baz> |
138
+
139
+ @zap @boing
140
+ Examples: Examples Description
141
+ | foo | bar | baz |
142
+ | Banana | I | am hungry |
143
+ | Beer | You | are thirsty |
144
+ | Bed | They | are tired |
145
+ })
146
+ end
147
+
148
+ it "should preserve tabs" do
149
+ assert_pretty(IO.read(File.dirname(__FILE__) + '/tabs.feature'), IO.read(File.dirname(__FILE__) + '/spaces.feature'))
150
+ end
151
+
152
+ it "should escape backslashes and pipes" do
153
+ io = StringIO.new
154
+ l = PrettyFormatter.new(io, true)
155
+ l.row(['|', '\\'], 1)
156
+ l.flush_table
157
+ io.rewind
158
+ io.read.should == ' | \\| | \\\\ |' + "\n"
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,9 @@
1
+ Feature: Adding
2
+
3
+ Scenario: Add two numbers
4
+ Given the following input:
5
+ """
6
+ hello
7
+ """
8
+ When the calculator is run
9
+ Then the output should be 4
@@ -0,0 +1,9 @@
1
+ Feature: Adding
2
+
3
+ Scenario: Add two numbers
4
+ Given the following input:
5
+ """
6
+ hello
7
+ """
8
+ When the calculator is run
9
+ Then the output should be 4
@@ -0,0 +1,26 @@
1
+ #encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
+
4
+ module Gherkin
5
+ describe I18nLexer do
6
+ before do
7
+ @lexer = I18nLexer.new(SexpRecorder.new, false)
8
+ end
9
+
10
+ it "should store the i18n language of the last scanned feature" do
11
+ @lexer.scan("# language: fr\n")
12
+ @lexer.i18n_language.iso_code.should == "fr"
13
+ @lexer.scan("# language: no\n")
14
+ @lexer.i18n_language.iso_code.should == "no"
15
+ end
16
+
17
+ it "should use English i18n by default" do
18
+ @lexer.scan("Feature: foo\n")
19
+ @lexer.i18n_language.iso_code.should == "en"
20
+ end
21
+
22
+ it "should === its ruby class, even when the impl is Java" do
23
+ I18nLexer.should === I18nLexer.new(SexpRecorder.new, true)
24
+ end
25
+ end
26
+ end