cucumber 0.4.5.rc2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/History.txt +11 -2
- data/Rakefile +12 -11
- data/VERSION.yml +2 -3
- data/cucumber.gemspec +39 -31
- data/cucumber.yml +1 -1
- data/features/language_help.feature +2 -2
- data/features/wire_protocol.feature +167 -48
- data/features/wire_protocol_table_diffing.feature +95 -0
- data/lib/cucumber/cli/configuration.rb +7 -1
- data/lib/cucumber/cli/main.rb +6 -2
- data/lib/cucumber/cli/options.rb +9 -9
- data/lib/cucumber/feature_file.rb +1 -1
- data/lib/cucumber/formatter/color_io.rb +4 -4
- data/lib/cucumber/formatter/html.rb +4 -3
- data/lib/cucumber/formatter/tag_cloud.rb +1 -0
- data/lib/cucumber/formatter/unicode.rb +28 -23
- data/lib/cucumber/languages.yml +1 -1
- data/lib/cucumber/step_argument.rb +3 -3
- data/lib/cucumber/step_match.rb +2 -2
- data/lib/cucumber/wire_support/connection.rb +4 -0
- data/lib/cucumber/wire_support/request_handler.rb +1 -1
- data/lib/cucumber/wire_support/wire_exception.rb +23 -1
- data/lib/cucumber/wire_support/wire_language.rb +4 -1
- data/lib/cucumber/wire_support/wire_packet.rb +0 -4
- data/lib/cucumber/wire_support/wire_protocol.rb +51 -7
- data/lib/cucumber/wire_support/wire_step_definition.rb +14 -9
- data/spec/cucumber/cli/options_spec.rb +4 -8
- data/spec/cucumber/formatter/color_io_spec.rb +7 -5
- data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +2 -2
- data/spec/cucumber/step_match_spec.rb +6 -1
- data/spec/cucumber/wire_support/wire_exception_spec.rb +44 -0
- data/spec/cucumber/wire_support/wire_step_definition_spec.rb +20 -0
- metadata +30 -15
data/.gitignore
CHANGED
data/History.txt
CHANGED
@@ -1,24 +1,33 @@
|
|
1
|
-
==
|
1
|
+
== 0.5.0 2009-12-15
|
2
|
+
|
3
|
+
We're bumping to 0.5.0 for this release since all of the Rails code has now moved to a new gem - cucumber-rails.
|
4
|
+
Please see History.txt in cucumber-rails for details about what's new on the Rails side.
|
2
5
|
|
3
6
|
=== New features
|
7
|
+
* "Given" in Dutch is now aliased to "Gegeven" or "Stel". (Iain Hecker)
|
8
|
+
* New --i18n option to list keywords in various languages. (Aslak Hellesøy)
|
4
9
|
* Added a Tcl example using Sam Stephenson's ruby-tcl (Aslak Hellesøy)
|
5
10
|
* Added * as a synonym for Given/When/Then/And/But (for all i18n languages). (#462 Aslak Hellesøy)
|
6
11
|
* The HTML formatter produces a much nicer report, with TextMate link integration. (Rob Aldred)
|
12
|
+
* Wire protocol now supports table arguments, step definition source & regexp, snippets, pending, table diffing (Matt Wynne)
|
7
13
|
|
8
14
|
=== Changed Features
|
9
15
|
* Per-word trailing-space setting for step keywords using '<'. See 'fr' in languages.yml for example. (#525 Gregory Hnatiuk)
|
10
|
-
* --language is deprecated and will be removed in 0.5.0: http://wiki.github.com/aslakhellesoy/cucumber/spoken-languages (Aslak Hellesøy)
|
11
16
|
* Formatters will no longer be passed File objects. They must use ensure_io, ensure_file or ensure_dir. (Aslak Hellesøy)
|
12
17
|
|
13
18
|
=== Bugfixes
|
19
|
+
* Exception messages are properly escaped in the HTML report. (Aslak Hellesøy)
|
20
|
+
* Improved UTF-8 support for Windows. (Aslak Hellesøy)
|
14
21
|
* Make #element_at / #table_at work on Webrat 0.6.0. This is now deprecated it in favour of #tableish from the cucumber-rails gem. (Aslak Hellesøy)
|
15
22
|
* JUnit formatter not handling multiline table steps inside Scenario Outlines (#538 Matt Wynne)
|
16
23
|
* Pending in scenario outline is red (#399 Matt Wynne)
|
17
24
|
* Allow optional step arguments to play happily with step transforms (Rob Holland)
|
18
25
|
* Regex escape the path when filtering the backtrace (Corey Donohoe & Simon Rozet)
|
26
|
+
* Add gem dependency on JSON gem, required by wire protocol (#533 Matt Wynne)
|
19
27
|
|
20
28
|
=== Removed Features
|
21
29
|
* All Rails-related code is in a separate gem: cucumber-rails. Install that if you're working with Rails. (#483 Aslak Hellesøy)
|
30
|
+
* --language is removed: http://wiki.github.com/aslakhellesoy/cucumber/spoken-languages (Aslak Hellesøy)
|
22
31
|
|
23
32
|
== 0.4.4 2009-11-13
|
24
33
|
|
data/Rakefile
CHANGED
@@ -16,17 +16,18 @@ begin
|
|
16
16
|
gem.authors = ["Aslak Hellesøy"]
|
17
17
|
gem.rubyforge_project = "rspec"
|
18
18
|
|
19
|
-
gem.add_dependency 'term-ansicolor', '1.0.4'
|
20
|
-
gem.add_dependency 'treetop', '1.4.2'
|
21
|
-
gem.add_dependency 'polyglot', '0.2.9'
|
22
|
-
gem.add_dependency 'builder', '2.1.2'
|
23
|
-
gem.add_dependency 'diff-lcs', '1.1.2'
|
24
|
-
|
25
|
-
|
26
|
-
gem.add_development_dependency '
|
27
|
-
gem.add_development_dependency '
|
28
|
-
gem.add_development_dependency '
|
29
|
-
|
19
|
+
gem.add_dependency 'term-ansicolor', '>= 1.0.4'
|
20
|
+
gem.add_dependency 'treetop', '>= 1.4.2'
|
21
|
+
gem.add_dependency 'polyglot', '>= 0.2.9'
|
22
|
+
gem.add_dependency 'builder', '>= 2.1.2'
|
23
|
+
gem.add_dependency 'diff-lcs', '>= 1.1.2'
|
24
|
+
gem.add_dependency defined?(JRUBY_VERSION) ? 'json_pure' : 'json', '>= 1.2.0'
|
25
|
+
|
26
|
+
gem.add_development_dependency 'nokogiri', '>= 1.4.0'
|
27
|
+
gem.add_development_dependency 'prawn', '>= 0.5.1'
|
28
|
+
gem.add_development_dependency 'rspec', '>= 1.2.9'
|
29
|
+
gem.add_development_dependency 'spork', '>= 0.7.4'
|
30
|
+
|
30
31
|
extend Cucumber::Formatter::ANSIColor
|
31
32
|
gem.post_install_message = <<-POST_INSTALL_MESSAGE
|
32
33
|
|
data/VERSION.yml
CHANGED
data/cucumber.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{cucumber}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Aslak Helles\303\270y"]
|
12
|
-
s.date = %q{2009-12-
|
12
|
+
s.date = %q{2009-12-15}
|
13
13
|
s.default_executable = %q{cucumber}
|
14
14
|
s.description = %q{A BDD tool written in Ruby}
|
15
15
|
s.email = %q{cukes@googlegroups.com}
|
@@ -366,6 +366,7 @@ Gem::Specification.new do |s|
|
|
366
366
|
"features/unicode_table.feature",
|
367
367
|
"features/usage_and_stepdefs_formatter.feature",
|
368
368
|
"features/wire_protocol.feature",
|
369
|
+
"features/wire_protocol_table_diffing.feature",
|
369
370
|
"features/work_in_progress.feature",
|
370
371
|
"gem_tasks/contributors.rake",
|
371
372
|
"gem_tasks/environment.rake",
|
@@ -524,8 +525,10 @@ Gem::Specification.new do |s|
|
|
524
525
|
"spec/cucumber/treetop_parser/test_dos.feature",
|
525
526
|
"spec/cucumber/treetop_parser/with_comments.feature",
|
526
527
|
"spec/cucumber/treetop_parser/with_tags.feature",
|
528
|
+
"spec/cucumber/wire_support/wire_exception_spec.rb",
|
527
529
|
"spec/cucumber/wire_support/wire_language_spec.rb",
|
528
530
|
"spec/cucumber/wire_support/wire_packet_spec.rb",
|
531
|
+
"spec/cucumber/wire_support/wire_step_definition_spec.rb",
|
529
532
|
"spec/cucumber/world/pending_spec.rb",
|
530
533
|
"spec/spec.opts",
|
531
534
|
"spec/spec_helper.rb"
|
@@ -536,7 +539,7 @@ Gem::Specification.new do |s|
|
|
536
539
|
|
537
540
|
(::) U P G R A D I N G (::)
|
538
541
|
|
539
|
-
Thank you for installing cucumber-0.
|
542
|
+
Thank you for installing cucumber-0.5.0.
|
540
543
|
Please be sure to read http://wiki.github.com/aslakhellesoy/cucumber/upgrading
|
541
544
|
for important information about this release. Happy cuking!
|
542
545
|
|
@@ -583,8 +586,10 @@ for important information about this release. Happy cuking!
|
|
583
586
|
"spec/cucumber/rb_support/regexp_argument_matcher_spec.rb",
|
584
587
|
"spec/cucumber/step_match_spec.rb",
|
585
588
|
"spec/cucumber/step_mother_spec.rb",
|
589
|
+
"spec/cucumber/wire_support/wire_exception_spec.rb",
|
586
590
|
"spec/cucumber/wire_support/wire_language_spec.rb",
|
587
591
|
"spec/cucumber/wire_support/wire_packet_spec.rb",
|
592
|
+
"spec/cucumber/wire_support/wire_step_definition_spec.rb",
|
588
593
|
"spec/cucumber/world/pending_spec.rb",
|
589
594
|
"spec/spec_helper.rb",
|
590
595
|
"examples/i18n/ar/features/step_definitons/calculator_steps.rb",
|
@@ -706,36 +711,39 @@ for important information about this release. Happy cuking!
|
|
706
711
|
s.specification_version = 3
|
707
712
|
|
708
713
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
709
|
-
s.add_runtime_dependency(%q<term-ansicolor>, ["
|
710
|
-
s.add_runtime_dependency(%q<treetop>, ["
|
711
|
-
s.add_runtime_dependency(%q<polyglot>, ["
|
712
|
-
s.add_runtime_dependency(%q<builder>, ["
|
713
|
-
s.add_runtime_dependency(%q<diff-lcs>, ["
|
714
|
-
s.
|
715
|
-
s.add_development_dependency(%q<
|
716
|
-
s.add_development_dependency(%q<
|
717
|
-
s.add_development_dependency(%q<
|
714
|
+
s.add_runtime_dependency(%q<term-ansicolor>, [">= 1.0.4"])
|
715
|
+
s.add_runtime_dependency(%q<treetop>, [">= 1.4.2"])
|
716
|
+
s.add_runtime_dependency(%q<polyglot>, [">= 0.2.9"])
|
717
|
+
s.add_runtime_dependency(%q<builder>, [">= 2.1.2"])
|
718
|
+
s.add_runtime_dependency(%q<diff-lcs>, [">= 1.1.2"])
|
719
|
+
s.add_runtime_dependency(%q<json>, [">= 1.2.0"])
|
720
|
+
s.add_development_dependency(%q<nokogiri>, [">= 1.4.0"])
|
721
|
+
s.add_development_dependency(%q<prawn>, [">= 0.5.1"])
|
722
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
723
|
+
s.add_development_dependency(%q<spork>, [">= 0.7.4"])
|
718
724
|
else
|
719
|
-
s.add_dependency(%q<term-ansicolor>, ["
|
720
|
-
s.add_dependency(%q<treetop>, ["
|
721
|
-
s.add_dependency(%q<polyglot>, ["
|
722
|
-
s.add_dependency(%q<builder>, ["
|
723
|
-
s.add_dependency(%q<diff-lcs>, ["
|
724
|
-
s.add_dependency(%q<
|
725
|
-
s.add_dependency(%q<
|
726
|
-
s.add_dependency(%q<
|
727
|
-
s.add_dependency(%q<
|
725
|
+
s.add_dependency(%q<term-ansicolor>, [">= 1.0.4"])
|
726
|
+
s.add_dependency(%q<treetop>, [">= 1.4.2"])
|
727
|
+
s.add_dependency(%q<polyglot>, [">= 0.2.9"])
|
728
|
+
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
729
|
+
s.add_dependency(%q<diff-lcs>, [">= 1.1.2"])
|
730
|
+
s.add_dependency(%q<json>, [">= 1.2.0"])
|
731
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.0"])
|
732
|
+
s.add_dependency(%q<prawn>, [">= 0.5.1"])
|
733
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
734
|
+
s.add_dependency(%q<spork>, [">= 0.7.4"])
|
728
735
|
end
|
729
736
|
else
|
730
|
-
s.add_dependency(%q<term-ansicolor>, ["
|
731
|
-
s.add_dependency(%q<treetop>, ["
|
732
|
-
s.add_dependency(%q<polyglot>, ["
|
733
|
-
s.add_dependency(%q<builder>, ["
|
734
|
-
s.add_dependency(%q<diff-lcs>, ["
|
735
|
-
s.add_dependency(%q<
|
736
|
-
s.add_dependency(%q<
|
737
|
-
s.add_dependency(%q<
|
738
|
-
s.add_dependency(%q<
|
737
|
+
s.add_dependency(%q<term-ansicolor>, [">= 1.0.4"])
|
738
|
+
s.add_dependency(%q<treetop>, [">= 1.4.2"])
|
739
|
+
s.add_dependency(%q<polyglot>, [">= 0.2.9"])
|
740
|
+
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
741
|
+
s.add_dependency(%q<diff-lcs>, [">= 1.1.2"])
|
742
|
+
s.add_dependency(%q<json>, [">= 1.2.0"])
|
743
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.0"])
|
744
|
+
s.add_dependency(%q<prawn>, [">= 0.5.1"])
|
745
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
746
|
+
s.add_dependency(%q<spork>, [">= 0.7.4"])
|
739
747
|
end
|
740
748
|
end
|
741
749
|
|
data/cucumber.yml
CHANGED
@@ -4,7 +4,7 @@ rerun_opts = rerun.to_s.strip.empty? ? "--format progress features" : "--format
|
|
4
4
|
std_opts = "#{rerun_opts} --format rerun --out rerun.txt --strict --tags ~@wip"
|
5
5
|
%>
|
6
6
|
default: <%= std_opts %>
|
7
|
-
jruby: <%= std_opts %>,~@spork
|
7
|
+
jruby: <%= std_opts %>,~@spork,~@wire
|
8
8
|
run_code_run: <%= std_opts %>,~@spork
|
9
9
|
windows_mri: <%= std_opts %>,~@spork
|
10
10
|
wip: --tags @wip:3 --wip features
|
@@ -3,7 +3,7 @@ Feature: Language help
|
|
3
3
|
I want to be able to get help on the language from the CLI
|
4
4
|
|
5
5
|
Scenario: Get help for Portuguese language
|
6
|
-
When I run cucumber
|
6
|
+
When I run cucumber --i18n pt help
|
7
7
|
Then it should pass with
|
8
8
|
"""
|
9
9
|
| name | Portuguese |
|
@@ -21,7 +21,7 @@ Feature: Language help
|
|
21
21
|
|
22
22
|
"""
|
23
23
|
Scenario: List languages
|
24
|
-
When I run cucumber
|
24
|
+
When I run cucumber --i18n help
|
25
25
|
Then it should pass with
|
26
26
|
"""
|
27
27
|
| ar | Arabic | العربية |
|
@@ -5,19 +5,26 @@ Feature: Wire Protocol
|
|
5
5
|
I want a low-level protocol which Cucumber can use to run steps within my app
|
6
6
|
|
7
7
|
#
|
8
|
-
# Cucumber's wire protocol is an implementation of Cucumber's internal
|
9
|
-
# and allows step definitions to be
|
8
|
+
# Cucumber's wire protocol is an implementation of Cucumber's internal
|
9
|
+
# 'programming language' abstraction, and allows step definitions to be
|
10
|
+
# implemented and invoked on any platform.
|
10
11
|
#
|
11
|
-
# Communication is over a TCP socket, which Cucumber connects to when it finds
|
12
|
-
# .wire extension in the step_definitions folder
|
12
|
+
# Communication is over a TCP socket, which Cucumber connects to when it finds
|
13
|
+
# a definition file with the .wire extension in the step_definitions folder
|
14
|
+
# (or other load path).
|
13
15
|
#
|
14
|
-
#
|
16
|
+
# Cucumber currently sends the following messages over the wire:
|
15
17
|
#
|
16
|
-
# * step_matches
|
17
|
-
#
|
18
|
+
# * step_matches : this is used to find out whether the wire end has a
|
19
|
+
# definition for a given step
|
20
|
+
# * invoke : this is used to ask for a step definition to be invoked
|
21
|
+
# * begin_scenario : signals that cucumber is about to execute a scenario
|
22
|
+
# * end_scenario : signals that cucumber has finished executing a scenario
|
23
|
+
# * snippet_text : requests a snippet for an undefined step
|
18
24
|
#
|
19
|
-
# Message packets are formatted as JSON-encoded strings, with a newline
|
20
|
-
# packet. These messages are described
|
25
|
+
# Message packets are formatted as JSON-encoded strings, with a newline
|
26
|
+
# character signalling the end of a packet. These messages are described
|
27
|
+
# below, with examples.
|
21
28
|
#
|
22
29
|
|
23
30
|
Background:
|
@@ -39,16 +46,18 @@ Feature: Wire Protocol
|
|
39
46
|
#
|
40
47
|
# step_matches
|
41
48
|
#
|
42
|
-
# When the features have been parsed, Cucumber will send a step_matches
|
43
|
-
# if it can match a step name. This happens for
|
44
|
-
#
|
45
|
-
#
|
49
|
+
# When the features have been parsed, Cucumber will send a step_matches
|
50
|
+
# message to ask the wire end if it can match a step name. This happens for
|
51
|
+
# each of the steps in each of the features.
|
52
|
+
#
|
53
|
+
# The wire end replies with a step_match array, containing the IDs of any step
|
54
|
+
# definitions that could be invoked for the given step name.
|
46
55
|
|
47
56
|
Scenario: Dry run finds no step match
|
48
57
|
Given there is a wire server running on port 54321 which understands the following protocol:
|
49
58
|
| request | response |
|
50
59
|
| ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[]] |
|
51
|
-
When I run cucumber --dry-run -f progress
|
60
|
+
When I run cucumber --dry-run -f progress
|
52
61
|
And it should pass with
|
53
62
|
"""
|
54
63
|
U
|
@@ -58,17 +67,18 @@ Feature: Wire Protocol
|
|
58
67
|
|
59
68
|
"""
|
60
69
|
|
61
|
-
# When a step match is returned, it contains an identifier for the step
|
62
|
-
# later when referring to this step definition again if
|
63
|
-
# can take any form (as long as it's
|
64
|
-
# reference.
|
65
|
-
#
|
66
|
-
#
|
70
|
+
# When a step match is returned, it contains an identifier for the step
|
71
|
+
# definition to be used later when referring to this step definition again if
|
72
|
+
# it needs to be invoked. The identifier can take any form (as long as it's
|
73
|
+
# within a string) and is simply used for the wire end's own reference.
|
74
|
+
#
|
75
|
+
# The step match also contains any argument values as parsed out by the wire
|
76
|
+
# end's own regular expression or other argument matching process.
|
67
77
|
Scenario: Dry run finds a step match
|
68
78
|
Given there is a wire server running on port 54321 which understands the following protocol:
|
69
79
|
| request | response |
|
70
80
|
| ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[{"id":"1", "args":[]}]] |
|
71
|
-
When I run cucumber --dry-run -f progress
|
81
|
+
When I run cucumber --dry-run -f progress
|
72
82
|
And it should pass with
|
73
83
|
"""
|
74
84
|
-
|
@@ -78,16 +88,60 @@ Feature: Wire Protocol
|
|
78
88
|
|
79
89
|
"""
|
80
90
|
|
91
|
+
# Optionally, the step match can also contain the a source reference, and a
|
92
|
+
# native regexp string which will be used by some formatters
|
93
|
+
Scenario: Step matches returns details about the remote step definition
|
94
|
+
Given there is a wire server running on port 54321 which understands the following protocol:
|
95
|
+
| request | response |
|
96
|
+
| ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[{"id":"1", "args":[], "source":"MyApp.MyClass:123", "regexp":"we.*"}]] |
|
97
|
+
When I run cucumber -f stepdefs --dry-run
|
98
|
+
Then STDERR should be empty
|
99
|
+
And it should pass with
|
100
|
+
"""
|
101
|
+
-
|
102
|
+
|
103
|
+
we.* # MyApp.MyClass:123
|
104
|
+
|
105
|
+
1 scenario (1 skipped)
|
106
|
+
1 step (1 skipped)
|
107
|
+
|
108
|
+
"""
|
109
|
+
|
81
110
|
|
82
111
|
#
|
83
112
|
# invoke
|
84
113
|
#
|
85
|
-
# Assuming a step_match was returned for a given step name, when it's time to
|
86
|
-
# step definition, Cucumber will send an invoke message.
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
114
|
+
# Assuming a step_match was returned for a given step name, when it's time to
|
115
|
+
# invoke that step definition, Cucumber will send an invoke message.
|
116
|
+
#
|
117
|
+
# The message contains the ID of the step definition, as returned by the wire
|
118
|
+
# end from the step_matches call, along with the arguments that were parsed
|
119
|
+
# from the step name during the same step_matches call.
|
120
|
+
#
|
121
|
+
# The wire end will reply with either a step_failed, success, or pending message.
|
122
|
+
|
123
|
+
# The message argument which accompanies the pending message is optional
|
124
|
+
Scenario: Invoke a step definition which is pending
|
125
|
+
Given there is a wire server running on port 54321 which understands the following protocol:
|
126
|
+
| request | response |
|
127
|
+
| ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[{"id":"1", "args":[]}]] |
|
128
|
+
| ["begin_scenario",null] | ["success", null] |
|
129
|
+
| ["invoke",{"id":"1","args":[]}] | ["pending", "I'll do it later"] |
|
130
|
+
| ["end_scenario",null] | ["success", null] |
|
131
|
+
When I run cucumber -f pretty -q
|
132
|
+
And it should pass with
|
133
|
+
"""
|
134
|
+
|
135
|
+
|
136
|
+
Scenario: Wired
|
137
|
+
Given we're all wired
|
138
|
+
I'll do it later (Cucumber::Pending)
|
139
|
+
features/wired.feature:2:in `Given we're all wired'
|
140
|
+
|
141
|
+
1 scenario (1 pending)
|
142
|
+
1 step (1 pending)
|
143
|
+
|
144
|
+
"""
|
91
145
|
|
92
146
|
Scenario: Invoke a step definition which passes
|
93
147
|
Given there is a wire server running on port 54321 which understands the following protocol:
|
@@ -96,7 +150,7 @@ Feature: Wire Protocol
|
|
96
150
|
| ["begin_scenario",null] | ["success",null] |
|
97
151
|
| ["invoke",{"id":"1","args":[]}] | ["success",null] |
|
98
152
|
| ["end_scenario",null] | ["success",null] |
|
99
|
-
When I run cucumber -f progress
|
153
|
+
When I run cucumber -f progress
|
100
154
|
And it should pass with
|
101
155
|
"""
|
102
156
|
.
|
@@ -106,17 +160,18 @@ Feature: Wire Protocol
|
|
106
160
|
|
107
161
|
"""
|
108
162
|
|
109
|
-
# When
|
110
|
-
# will then be passed by Cucumber to the formatters
|
163
|
+
# When an invoked step definition fails, it can return details of the exception
|
164
|
+
# in the reply to invoke. These will then be passed by Cucumber to the formatters
|
165
|
+
# for display to the user.
|
111
166
|
#
|
112
167
|
Scenario: Invoke a step definition which fails
|
113
168
|
Given there is a wire server running on port 54321 which understands the following protocol:
|
114
|
-
| request | response
|
115
|
-
| ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[{"id":"1", "args":[]}]]
|
116
|
-
| ["begin_scenario",null] | ["success",null]
|
117
|
-
| ["invoke",{"id":"1","args":[]}] | ["step_failed",{"message":"The wires are down"}] |
|
118
|
-
| ["end_scenario",null] | ["success",null]
|
119
|
-
When I run cucumber -f progress
|
169
|
+
| request | response |
|
170
|
+
| ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[{"id":"1", "args":[]}]] |
|
171
|
+
| ["begin_scenario",null] | ["success",null] |
|
172
|
+
| ["invoke",{"id":"1","args":[]}] | ["step_failed",{"message":"The wires are down", "exception":"Some.Foreign.ExceptionType"}] |
|
173
|
+
| ["end_scenario",null] | ["success",null] |
|
174
|
+
When I run cucumber -f progress
|
120
175
|
Then STDERR should be empty
|
121
176
|
And it should fail with
|
122
177
|
"""
|
@@ -124,7 +179,7 @@ Feature: Wire Protocol
|
|
124
179
|
|
125
180
|
(::) failed steps (::)
|
126
181
|
|
127
|
-
The wires are down (
|
182
|
+
The wires are down (Some.Foreign.ExceptionType from localhost:54321)
|
128
183
|
features/wired.feature:2:in `Given we're all wired'
|
129
184
|
|
130
185
|
Failing Scenarios:
|
@@ -137,24 +192,27 @@ Feature: Wire Protocol
|
|
137
192
|
|
138
193
|
# Imagine we have a step definition like:
|
139
194
|
#
|
140
|
-
# Given /we're all (.*)/ do |what_we_are|
|
195
|
+
# Given /we're all (.*)/ do | what_we_are |
|
141
196
|
# end
|
142
197
|
#
|
143
|
-
# When this step definition matches the step name in our feature, the word
|
144
|
-
# argument.
|
198
|
+
# When this step definition matches the step name in our feature, the word
|
199
|
+
# 'wired' will be parsed as an argument.
|
145
200
|
#
|
146
|
-
# Cucumber expects this StepArgument to be returned in the StepMatch. The keys
|
147
|
-
#
|
148
|
-
# *
|
201
|
+
# Cucumber expects this StepArgument to be returned in the StepMatch. The keys
|
202
|
+
# have the following meanings:
|
203
|
+
# * val : the value of the string captured for that argument from the step
|
204
|
+
# name passed in step_matches
|
205
|
+
# * pos : the position within the step name that the argument was matched
|
206
|
+
# (used for formatter highlighting)
|
149
207
|
#
|
150
|
-
Scenario: Invoke a step definition which takes arguments (and passes)
|
208
|
+
Scenario: Invoke a step definition which takes string arguments (and passes)
|
151
209
|
Given there is a wire server running on port 54321 which understands the following protocol:
|
152
210
|
| request | response |
|
153
211
|
| ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[{"id":"1", "args":[{"val":"wired", "pos":10}]}]] |
|
154
212
|
| ["begin_scenario",null] | ["success",null] |
|
155
213
|
| ["invoke",{"id":"1","args":["wired"]}] | ["success",null] |
|
156
214
|
| ["end_scenario",null] | ["success",null] |
|
157
|
-
When I run cucumber -f progress
|
215
|
+
When I run cucumber -f progress
|
158
216
|
Then STDERR should be empty
|
159
217
|
And it should pass with
|
160
218
|
"""
|
@@ -165,12 +223,73 @@ Feature: Wire Protocol
|
|
165
223
|
|
166
224
|
"""
|
167
225
|
|
226
|
+
# When the step has a multiline table argument, it will be passed with the
|
227
|
+
# invoke message as a string - a serialized JSON array of array of strings.
|
228
|
+
# In the following scenario our step definition takes two arguments - one
|
229
|
+
# captures the "we're" and the other takes the table.
|
230
|
+
Scenario: Invoke a step definition which takes table arguments (and passes)
|
231
|
+
Given a file named "features/wired_on_tables.feature" with:
|
232
|
+
"""
|
233
|
+
Scenario: Wired and more
|
234
|
+
Given we're all:
|
235
|
+
| wired |
|
236
|
+
| high |
|
237
|
+
| happy |
|
238
|
+
"""
|
239
|
+
And there is a wire server running on port 54321 which understands the following protocol:
|
240
|
+
| request | response |
|
241
|
+
| ["step_matches",{"name_to_match":"we're all:"}] | ["step_matches",[{"id":"1", "args":[{"val":"we're", "pos":0}]}]] |
|
242
|
+
| ["begin_scenario",null] | ["success",null] |
|
243
|
+
| ["invoke",{"id":"1","args":["we're",[["wired"],["high"],["happy"]]]}] | ["success",null] |
|
244
|
+
| ["end_scenario",null] | ["success",null] |
|
245
|
+
When I run cucumber -f progress features/wired_on_tables.feature
|
246
|
+
Then STDERR should be empty
|
247
|
+
And it should pass with
|
248
|
+
"""
|
249
|
+
.
|
250
|
+
|
251
|
+
1 scenario (1 passed)
|
252
|
+
1 step (1 passed)
|
253
|
+
|
254
|
+
"""
|
255
|
+
|
256
|
+
|
257
|
+
#
|
258
|
+
# snippets
|
259
|
+
#
|
260
|
+
Scenario: Wire server returns snippets for a step that didn't match
|
261
|
+
Given there is a wire server running on port 54321 which understands the following protocol:
|
262
|
+
| request | response |
|
263
|
+
| ["step_matches",{"name_to_match":"we're all wired"}] | ["step_matches",[]] |
|
264
|
+
| ["snippet_text",{"step_keyword":"Given","multiline_arg_class":"","step_name":"we're all wired"}] | ["snippet_text","foo()\n bar;\nbaz"] |
|
265
|
+
| ["begin_scenario",null] | ["success",null] |
|
266
|
+
| ["end_scenario",null] | ["success",null] |
|
267
|
+
When I run cucumber -f pretty
|
268
|
+
And it should pass with
|
269
|
+
"""
|
270
|
+
|
271
|
+
|
272
|
+
Scenario: Wired # features/wired.feature:1
|
273
|
+
Given we're all wired # features/wired.feature:2
|
274
|
+
|
275
|
+
1 scenario (1 undefined)
|
276
|
+
1 step (1 undefined)
|
277
|
+
|
278
|
+
You can implement step definitions for undefined steps with these snippets:
|
279
|
+
|
280
|
+
foo()
|
281
|
+
bar;
|
282
|
+
baz
|
283
|
+
|
284
|
+
|
285
|
+
"""
|
286
|
+
|
168
287
|
|
169
288
|
Scenario: Unexpected response
|
170
289
|
Given there is a wire server running on port 54321 which understands the following protocol:
|
171
|
-
| request
|
172
|
-
| ["begin_scenario",null]
|
173
|
-
When I run cucumber -f progress
|
290
|
+
| request | response |
|
291
|
+
| ["begin_scenario",null] | ["yikes"] |
|
292
|
+
When I run cucumber -f progress
|
174
293
|
Then STDERR should match
|
175
294
|
"""
|
176
295
|
undefined method `handle_yikes'
|