cucumber 0.3.96 → 0.3.97
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +22 -3
- data/License.txt +2 -0
- data/Manifest.txt +9 -5
- data/config/hoe.rb +1 -0
- data/examples/i18n/Rakefile +5 -3
- data/examples/i18n/fi/features/yhteenlasku.feature +5 -4
- data/examples/python/features/step_definitions/fib_steps.py +3 -0
- data/examples/python/features/support/env.rb +21 -21
- data/gem_tasks/contributors.rake +8 -0
- data/gem_tasks/features.rake +1 -0
- data/gem_tasks/sdoc.rake +7 -0
- data/lib/README.rdoc +12 -0
- data/lib/cucumber/ast/background.rb +1 -1
- data/lib/cucumber/ast/comment.rb +1 -1
- data/lib/cucumber/ast/examples.rb +9 -4
- data/lib/cucumber/ast/feature.rb +1 -1
- data/lib/cucumber/ast/feature_element.rb +1 -1
- data/lib/cucumber/ast/features.rb +1 -1
- data/lib/cucumber/ast/outline_table.rb +2 -2
- data/lib/cucumber/ast/py_string.rb +1 -1
- data/lib/cucumber/ast/scenario.rb +1 -1
- data/lib/cucumber/ast/scenario_outline.rb +8 -7
- data/lib/cucumber/ast/step.rb +1 -1
- data/lib/cucumber/ast/step_collection.rb +1 -1
- data/lib/cucumber/ast/step_invocation.rb +1 -1
- data/lib/cucumber/ast/table.rb +65 -45
- data/lib/cucumber/ast/tags.rb +2 -2
- data/lib/cucumber/ast/visitor.rb +6 -8
- data/lib/cucumber/broadcaster.rb +1 -1
- data/lib/cucumber/cli/language_help_formatter.rb +1 -1
- data/lib/cucumber/cli/main.rb +15 -52
- data/lib/cucumber/constantize.rb +1 -1
- data/lib/cucumber/core_ext/exception.rb +1 -1
- data/lib/cucumber/core_ext/instance_exec.rb +8 -3
- data/lib/cucumber/core_ext/proc.rb +1 -1
- data/lib/cucumber/core_ext/string.rb +1 -1
- data/lib/cucumber/feature_file.rb +4 -3
- data/lib/cucumber/filter.rb +2 -1
- data/lib/cucumber/formatter/ansicolor.rb +6 -5
- data/lib/cucumber/formatter/color_io.rb +2 -2
- data/lib/cucumber/formatter/console.rb +2 -0
- data/lib/cucumber/formatter/duration.rb +3 -0
- data/lib/cucumber/formatter/html.rb +1 -0
- data/lib/cucumber/formatter/junit.rb +1 -0
- data/lib/cucumber/formatter/ordered_xml_markup.rb +1 -1
- data/lib/cucumber/formatter/pretty.rb +18 -4
- data/lib/cucumber/formatter/profile.rb +1 -0
- data/lib/cucumber/formatter/progress.rb +1 -0
- data/lib/cucumber/formatter/rerun.rb +2 -0
- data/lib/cucumber/formatter/steps.rb +1 -0
- data/lib/cucumber/formatter/tag_cloud.rb +2 -1
- data/lib/cucumber/formatter/unicode.rb +1 -1
- data/lib/cucumber/formatter/usage.rb +1 -0
- data/lib/cucumber/language_support.rb +30 -0
- data/lib/cucumber/language_support/language_methods.rb +34 -12
- data/lib/cucumber/parser/feature.rb +81 -57
- data/lib/cucumber/parser/feature.tt +3 -3
- data/lib/cucumber/parser/natural_language.rb +1 -1
- data/lib/cucumber/parser/table.rb +3 -0
- data/lib/cucumber/parser/treetop_ext.rb +6 -5
- data/lib/cucumber/platform.rb +1 -2
- data/lib/cucumber/py_support/py_dsl.py +8 -0
- data/lib/cucumber/py_support/py_language.py +2 -0
- data/lib/cucumber/py_support/py_language.rb +68 -0
- data/lib/cucumber/rails/world.rb +2 -1
- data/lib/cucumber/rake/task.rb +13 -11
- data/lib/cucumber/rb_support/rb_dsl.rb +27 -15
- data/lib/cucumber/rb_support/rb_hook.rb +1 -2
- data/lib/cucumber/rb_support/rb_language.rb +57 -33
- data/lib/cucumber/rb_support/rb_step_definition.rb +42 -38
- data/lib/cucumber/rb_support/rb_world.rb +93 -0
- data/lib/cucumber/rspec_neuter.rb +3 -3
- data/lib/cucumber/step_match.rb +2 -2
- data/lib/cucumber/step_mother.rb +91 -65
- data/lib/cucumber/version.rb +1 -1
- data/lib/cucumber/webrat/element_locator.rb +3 -3
- data/rails_generators/cucumber/templates/cucumber.rake +2 -0
- data/rails_generators/cucumber/templates/webrat_steps.rb +4 -0
- data/spec/cucumber/ast/background_spec.rb +8 -1
- data/spec/cucumber/ast/scenario_outline_spec.rb +1 -0
- data/spec/cucumber/ast/table_spec.rb +10 -0
- data/spec/cucumber/cli/options_spec.rb +1 -1
- data/spec/cucumber/parser/feature_parser_spec.rb +4 -0
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +114 -0
- data/spec/cucumber/step_mother_spec.rb +29 -10
- data/spec/cucumber/treetop_parser/with_comments.feature +14 -1
- data/spec/cucumber/world/pending_spec.rb +1 -1
- metadata +21 -7
- data/gem_tasks/yard.rake +0 -8
- data/lib/cucumber/language_support/hook_methods.rb +0 -9
- data/lib/cucumber/world.rb +0 -89
- data/spec/cucumber/ast/visitor_spec.rb +0 -27
- data/spec/cucumber/step_definition_spec.rb +0 -102
data/gem_tasks/yard.rake
DELETED
data/lib/cucumber/world.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
module Cucumber
|
2
|
-
# All steps are run in the context of an object that extends this module
|
3
|
-
module World
|
4
|
-
class << self
|
5
|
-
def alias_adverb(adverb)
|
6
|
-
alias_method adverb, :__cucumber_invoke
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
attr_writer :__cucumber_step_mother
|
11
|
-
|
12
|
-
# Call a step from within a step definition
|
13
|
-
def __cucumber_invoke(name, multiline_argument=nil) #:nodoc:
|
14
|
-
begin
|
15
|
-
step_match = @__cucumber_step_mother.step_match(name)
|
16
|
-
step_match.invoke(multiline_argument)
|
17
|
-
rescue Exception => e
|
18
|
-
e.nested! if Undefined === e
|
19
|
-
raise e
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Returns a Cucumber::Ast::Table for +text_or_table+, which can either
|
24
|
-
# be a String:
|
25
|
-
#
|
26
|
-
# table(%{
|
27
|
-
# | account | description | amount |
|
28
|
-
# | INT-100 | Taxi | 114 |
|
29
|
-
# | CUC-101 | Peeler | 22 |
|
30
|
-
# })
|
31
|
-
#
|
32
|
-
# or a 2D Array:
|
33
|
-
#
|
34
|
-
# table([
|
35
|
-
# %w{ account description amount },
|
36
|
-
# %w{ INT-100 Taxi 114 },
|
37
|
-
# %w{ CUC-101 Peeler 22 }
|
38
|
-
# ])
|
39
|
-
#
|
40
|
-
def table(text_or_table, file=nil, line_offset=0)
|
41
|
-
if Array === text_or_table
|
42
|
-
Ast::Table.new(text_or_table)
|
43
|
-
else
|
44
|
-
@table_parser ||= Parser::TableParser.new
|
45
|
-
@table_parser.parse_or_fail(text_or_table.strip, file, line_offset)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# Output +announcement+ alongside the formatted output.
|
50
|
-
# This is an alternative to using Kernel#puts - it will display
|
51
|
-
# nicer, and in all outputs (in case you use several formatters)
|
52
|
-
#
|
53
|
-
# Beware that the output will be printed *before* the corresponding
|
54
|
-
# step. This is because the step itself will not be printed until
|
55
|
-
# after it has run, so it can be coloured according to its status.
|
56
|
-
def announce(announcement)
|
57
|
-
@__cucumber_step_mother.announce(announcement)
|
58
|
-
end
|
59
|
-
|
60
|
-
def pending(message = "TODO")
|
61
|
-
if block_given?
|
62
|
-
begin
|
63
|
-
yield
|
64
|
-
rescue Exception => e
|
65
|
-
raise Pending.new(message)
|
66
|
-
end
|
67
|
-
raise Pending.new("Expected pending '#{message}' to fail. No Error was raised. No longer pending?")
|
68
|
-
else
|
69
|
-
raise Pending.new(message)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
# The default implementation of Object#inspect recursively
|
74
|
-
# traverses all instance variables and invokes inspect.
|
75
|
-
# This can be time consuming if the object graph is large.
|
76
|
-
#
|
77
|
-
# This can cause unnecessary delays when certain exceptions
|
78
|
-
# occur. For example, MRI internally invokes #inspect on an
|
79
|
-
# object that raises a NoMethodError. (JRuby does not do this).
|
80
|
-
#
|
81
|
-
# A World object can have many references created by the user
|
82
|
-
# or frameworks (Rails), so to avoid long waiting times on
|
83
|
-
# such errors in World we define it to just return a simple String.
|
84
|
-
#
|
85
|
-
def inspect
|
86
|
-
sprintf("#<%s:0x%x>", self.class, self.object_id)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
-
require 'cucumber/step_mother'
|
3
|
-
require 'cucumber/ast'
|
4
|
-
|
5
|
-
module Cucumber
|
6
|
-
module Ast
|
7
|
-
describe Visitor do
|
8
|
-
|
9
|
-
it "should support checking scenario name matches regexps" do
|
10
|
-
visitor = Visitor.new(mock("step mother"))
|
11
|
-
scenario = Scenario.new(background=nil,
|
12
|
-
comment=Comment.new(""),
|
13
|
-
tags=Tags.new(0, []),
|
14
|
-
line=99,
|
15
|
-
keyword="",
|
16
|
-
name="test name",
|
17
|
-
steps=[])
|
18
|
-
|
19
|
-
visitor.options = {:name_regexps => [/name/]}
|
20
|
-
|
21
|
-
visitor.matches_scenario_names?(scenario).should be_true
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
@@ -1,102 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
|
3
|
-
require 'cucumber/ast'
|
4
|
-
require 'cucumber/step_mother'
|
5
|
-
require 'cucumber/rb_support/rb_language'
|
6
|
-
|
7
|
-
module Cucumber
|
8
|
-
describe RbStepDefinition do
|
9
|
-
before do
|
10
|
-
@step_mother = StepMother.new
|
11
|
-
@step_mother.load_natural_language('en')
|
12
|
-
@rb = @step_mother.load_programming_language('rb')
|
13
|
-
@dsl = Object.new
|
14
|
-
@dsl.extend RbSupport::RbDsl
|
15
|
-
@step_mother.begin_scenario
|
16
|
-
|
17
|
-
$inside = nil
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should allow calling of other steps" do
|
21
|
-
@dsl.Given /Outside/ do
|
22
|
-
Given "Inside"
|
23
|
-
end
|
24
|
-
@dsl.Given /Inside/ do
|
25
|
-
$inside = true
|
26
|
-
end
|
27
|
-
|
28
|
-
@step_mother.step_match("Outside").invoke(nil)
|
29
|
-
$inside.should == true
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should allow calling of other steps with inline arg" do
|
33
|
-
@dsl.Given /Outside/ do
|
34
|
-
Given "Inside", Ast::Table.new([['inside']])
|
35
|
-
end
|
36
|
-
@dsl.Given /Inside/ do |table|
|
37
|
-
$inside = table.raw[0][0]
|
38
|
-
end
|
39
|
-
|
40
|
-
@step_mother.step_match("Outside").invoke(nil)
|
41
|
-
$inside.should == 'inside'
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should raise Undefined when inside step is not defined" do
|
45
|
-
@dsl.Given /Outside/ do
|
46
|
-
Given 'Inside'
|
47
|
-
end
|
48
|
-
|
49
|
-
lambda do
|
50
|
-
@step_mother.step_match('Outside').invoke(nil)
|
51
|
-
end.should raise_error(Undefined, 'Undefined step: "Inside"')
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should allow forced pending" do
|
55
|
-
@dsl.Given /Outside/ do
|
56
|
-
pending("Do me!")
|
57
|
-
end
|
58
|
-
|
59
|
-
lambda do
|
60
|
-
@step_mother.step_match("Outside").invoke(nil)
|
61
|
-
end.should raise_error(Pending, "Do me!")
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should allow announce" do
|
65
|
-
v = mock('visitor')
|
66
|
-
v.should_receive(:announce).with('wasup')
|
67
|
-
@step_mother.visitor = v
|
68
|
-
@dsl.Given /Loud/ do
|
69
|
-
announce 'wasup'
|
70
|
-
end
|
71
|
-
@step_mother.step_match("Loud").invoke(nil)
|
72
|
-
end
|
73
|
-
|
74
|
-
def unindented(s)
|
75
|
-
s.split("\n")[1..-2].join("\n").indent(-8)
|
76
|
-
end
|
77
|
-
|
78
|
-
it "should recognise quotes in name and make according regexp" do
|
79
|
-
@rb.snippet_text('Given', 'A "first" arg').should == unindented(%{
|
80
|
-
Given /^A "([^\\"]*)" arg$/ do |arg1|
|
81
|
-
pending
|
82
|
-
end
|
83
|
-
})
|
84
|
-
end
|
85
|
-
|
86
|
-
it "should recognise several quoted words in name and make according regexp and args" do
|
87
|
-
@rb.snippet_text('Given', 'A "first" and "second" arg').should == unindented(%{
|
88
|
-
Given /^A "([^\\"]*)" and "([^\\"]*)" arg$/ do |arg1, arg2|
|
89
|
-
pending
|
90
|
-
end
|
91
|
-
})
|
92
|
-
end
|
93
|
-
|
94
|
-
it "should not use quote group when there are no quotes" do
|
95
|
-
@rb.snippet_text('Given', 'A first arg').should == unindented(%{
|
96
|
-
Given /^A first arg$/ do
|
97
|
-
pending
|
98
|
-
end
|
99
|
-
})
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|