gherkin 1.0.30-universal-dotnet

Sign up to get free protection for your applications and to get access to all the features.
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