cucumber 0.1.9 → 0.1.10
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +31 -1
- data/Manifest.txt +15 -0
- data/bin/cucumber +2 -1
- data/config/hoe.rb +2 -1
- data/examples/calculator_ruby_features/features/addition.rb +1 -1
- data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -0
- data/examples/i18n/de/Rakefile +6 -0
- data/examples/i18n/de/features/addition.feature +17 -0
- data/examples/i18n/de/features/division.feature +10 -0
- data/examples/i18n/de/features/step_definitons/calculator_steps.rb +30 -0
- data/examples/i18n/de/lib/calculator.rb +14 -0
- data/examples/i18n/en/Rakefile +1 -0
- data/examples/i18n/lt/Rakefile +6 -0
- data/examples/i18n/lt/features/addition.feature +17 -0
- data/examples/i18n/lt/features/division.feature +10 -0
- data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +31 -0
- data/examples/i18n/lt/lib/calculator.rb +14 -0
- data/examples/test_unit/Rakefile +6 -0
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +26 -0
- data/examples/test_unit/features/test_unit.feature +9 -0
- data/examples/tickets/features/tickets.feature +4 -2
- data/lib/autotest/discover.rb +1 -1
- data/lib/cucumber.rb +3 -3
- data/lib/cucumber/cli.rb +16 -6
- data/lib/cucumber/core_ext/proc.rb +31 -16
- data/lib/cucumber/executor.rb +35 -15
- data/lib/cucumber/formatters/ansicolor.rb +11 -13
- data/lib/cucumber/languages.yml +13 -1
- data/lib/cucumber/platform.rb +12 -0
- data/lib/cucumber/step_mother.rb +7 -1
- data/lib/cucumber/tree/feature.rb +3 -1
- data/lib/cucumber/tree/scenario.rb +17 -1
- data/lib/cucumber/treetop_parser/feature_de.rb +8 -8
- data/lib/cucumber/treetop_parser/feature_lt.rb +1591 -0
- data/lib/cucumber/version.rb +1 -1
- data/rails_generators/cucumber/templates/webrat_steps.rb +49 -0
- data/rails_generators/feature/templates/feature.erb +3 -3
- data/spec/cucumber/cli_spec.rb +33 -1
- data/spec/cucumber/executor_spec.rb +104 -28
- data/spec/cucumber/step_mother_spec.rb +7 -7
- data/spec/cucumber/tree/feature_spec.rb +31 -0
- data/spec/cucumber/tree/row_scenario_spec.rb +30 -0
- data/spec/spec_helper.rb +1 -0
- metadata +22 -7
data/History.txt
CHANGED
@@ -1,4 +1,34 @@
|
|
1
|
-
== 0.1.
|
1
|
+
== 0.1.10 2008-11-25
|
2
|
+
|
3
|
+
This release mostly has smaller bugfixes. The most significant new feature is how
|
4
|
+
line numbers are specified. You can now run multiple features at specific lines numbers like this:
|
5
|
+
|
6
|
+
cucumber foo.feature:15 bar.feature:6:45:111
|
7
|
+
|
8
|
+
This will run foo.feature at line 15 and bar.feature at line 6, 45 and 111.
|
9
|
+
|
10
|
+
=== New features
|
11
|
+
* Added example showing how to use Cucumber with Test::Unit + Matchy instead of RSpec (Aslak Hellesøy)
|
12
|
+
* Yield existing world object to World block (#87 Aslak Hellesøy)
|
13
|
+
* AUTOFEATURE=tRue works (case insensitive) (Aslak Hellesøy)
|
14
|
+
* Initial support for .NET via IronRuby. (Aslak Hellesøy)
|
15
|
+
* Lithuanian translation (sauliusgrigaitis)
|
16
|
+
* New webrat step defintions to wrap the new selects_time, selects_date, and selects_datetime methods. (Ben Mabey)
|
17
|
+
* Try to load webrat gem if it's not installed as a plugin (Aslak Hellesøy)
|
18
|
+
* Support example.feature:20 or example.feature:10:20:30 syntax for running features at specific line number(s). (#88 Joseph Wilk)
|
19
|
+
|
20
|
+
=== Bugfixes
|
21
|
+
* Windows - all the 'a' characters in the output have gone on strike (#81 Luis Lavena, Joseph Wilk, Aslak Hellesøy)
|
22
|
+
* Raise a nice error when encountering step definition without block (#95 Aslak Hellesøy)
|
23
|
+
* Features written using Ruby where breaking due to missing a line number (#91 Joseph Wilk)
|
24
|
+
* Directly creating a Table meant the scenario table header was never set which was causing a formatter error (#91 Joseph Wilk)
|
25
|
+
|
26
|
+
=== Removed features
|
27
|
+
* $KCODE='u' is no longer done automatically. Developers should do that explicitly when needed in step definitions or env.rb.
|
28
|
+
* Step definition without a block being treated as pending (#64 Joseph Wilk)
|
29
|
+
* The --line option has been removed. Use the new file.feature:line format instead.
|
30
|
+
|
31
|
+
== 0.1.9 2008-11-12
|
2
32
|
|
3
33
|
With this release Cucumber supports 19 (!) natural languages:
|
4
34
|
|
data/Manifest.txt
CHANGED
@@ -30,6 +30,11 @@ examples/i18n/da/Rakefile
|
|
30
30
|
examples/i18n/da/features/step_definitons/kalkulator_steps.rb
|
31
31
|
examples/i18n/da/features/summering.feature
|
32
32
|
examples/i18n/da/lib/kalkulator.rb
|
33
|
+
examples/i18n/de/Rakefile
|
34
|
+
examples/i18n/de/features/addition.feature
|
35
|
+
examples/i18n/de/features/division.feature
|
36
|
+
examples/i18n/de/features/step_definitons/calculator_steps.rb
|
37
|
+
examples/i18n/de/lib/calculator.rb
|
33
38
|
examples/i18n/en/Rakefile
|
34
39
|
examples/i18n/en/features/addition.feature
|
35
40
|
examples/i18n/en/features/division.feature
|
@@ -62,6 +67,11 @@ examples/i18n/ja/features/addition.feature
|
|
62
67
|
examples/i18n/ja/features/division.feature
|
63
68
|
examples/i18n/ja/features/step_definitons/calculator_steps.rb
|
64
69
|
examples/i18n/ja/lib/calculator.rb
|
70
|
+
examples/i18n/lt/Rakefile
|
71
|
+
examples/i18n/lt/features/addition.feature
|
72
|
+
examples/i18n/lt/features/division.feature
|
73
|
+
examples/i18n/lt/features/step_definitons/calculator_steps.rb
|
74
|
+
examples/i18n/lt/lib/calculator.rb
|
65
75
|
examples/i18n/no/Rakefile
|
66
76
|
examples/i18n/no/features/step_definitons/kalkulator_steps.rb
|
67
77
|
examples/i18n/no/features/summering.feature
|
@@ -92,6 +102,9 @@ examples/java/src/cucumber/demo/Hello.java
|
|
92
102
|
examples/selenium/Rakefile
|
93
103
|
examples/selenium/features/search.feature
|
94
104
|
examples/selenium/features/step_definitons/stories_steps.rb
|
105
|
+
examples/test_unit/Rakefile
|
106
|
+
examples/test_unit/features/step_definitions/test_unit_steps.rb
|
107
|
+
examples/test_unit/features/test_unit.feature
|
95
108
|
examples/tickets/Rakefile
|
96
109
|
examples/tickets/cucumber.yml
|
97
110
|
examples/tickets/features/step_definitons/tickets_steps.rb
|
@@ -134,6 +147,7 @@ lib/cucumber/formatters/progress_formatter.rb
|
|
134
147
|
lib/cucumber/languages.yml
|
135
148
|
lib/cucumber/model.rb
|
136
149
|
lib/cucumber/model/table.rb
|
150
|
+
lib/cucumber/platform.rb
|
137
151
|
lib/cucumber/rails/rspec.rb
|
138
152
|
lib/cucumber/rails/world.rb
|
139
153
|
lib/cucumber/rake/task.rb
|
@@ -160,6 +174,7 @@ lib/cucumber/treetop_parser/feature_fr.rb
|
|
160
174
|
lib/cucumber/treetop_parser/feature_id.rb
|
161
175
|
lib/cucumber/treetop_parser/feature_it.rb
|
162
176
|
lib/cucumber/treetop_parser/feature_ja.rb
|
177
|
+
lib/cucumber/treetop_parser/feature_lt.rb
|
163
178
|
lib/cucumber/treetop_parser/feature_nl.rb
|
164
179
|
lib/cucumber/treetop_parser/feature_no.rb
|
165
180
|
lib/cucumber/treetop_parser/feature_parser.rb
|
data/bin/cucumber
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# Add '.rb' to work around a bug in IronRuby's File#dirname
|
3
|
+
$:.unshift(File.dirname(__FILE__ + '.rb') + '/../lib') unless $:.include?(File.dirname(__FILE__ + '.rb') + '/../lib')
|
2
4
|
|
3
|
-
$:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
|
4
5
|
require 'cucumber/cli'
|
5
6
|
Cucumber::CLI.execute
|
data/config/hoe.rb
CHANGED
@@ -57,7 +57,8 @@ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
57
57
|
# == Optional
|
58
58
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
59
59
|
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
60
|
-
p.extra_deps = [ ['term-ansicolor', '>= 1.0.3'], ['treetop', '>= 1.2.4'], ['
|
60
|
+
p.extra_deps = [ ['term-ansicolor', '>= 1.0.3'], ['treetop', '>= 1.2.4'], ['diff-lcs', '>= 1.1.2'] ]
|
61
|
+
p.extra_dev_deps = [ ['rspec', '>= 1.1.11'] ]
|
61
62
|
|
62
63
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
63
64
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Funktionalität: Addition
|
2
|
+
Um dumme Fehler zu vermeiden
|
3
|
+
möchte ich als Matheidiot
|
4
|
+
die Summe zweier Zahlen gesagt bekommen
|
5
|
+
|
6
|
+
Szenario: Zwei Zahlen hinzufügen
|
7
|
+
Gegeben sei ich habe 50 in den Taschenrechner eingegeben
|
8
|
+
Und ich habe 70 in den Taschenrechner eingegeben
|
9
|
+
Wenn ich add drücke
|
10
|
+
Dann sollte das Ergebniss auf dem Bildschirm 120 sein
|
11
|
+
Und die Ergebnissklasse sollte eine Fixnum sein
|
12
|
+
|
13
|
+
Mehr Beispiele:
|
14
|
+
| Eingabe_1 | Eingabe_2 | Knopf | Ausgabe | Klasse |
|
15
|
+
| 20 | 30 | add | 50 | Fixnum |
|
16
|
+
| 2 | 5 | add | 7 | Fixnum |
|
17
|
+
| 0 | 40 | add | 40 | Fixnum |
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Funktionalität: Division
|
2
|
+
Um dumme Fehler zu vermeiden
|
3
|
+
müssen Kassierer in der Lage sein einen Bruchteil zu berechnen
|
4
|
+
|
5
|
+
Szenario: Normale Zahlen
|
6
|
+
Gegeben sei ich habe 3 in den Taschenrechner eingegeben
|
7
|
+
Und ich habe 2 in den Taschenrechner eingegeben
|
8
|
+
Wenn ich divide drücke
|
9
|
+
Dann sollte das Ergebniss auf dem Bildschirm 1.5 sein
|
10
|
+
Und die Ergebnissklasse sollte eine Float sein
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec'
|
2
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
3
|
+
require 'calculator'
|
4
|
+
|
5
|
+
Before do
|
6
|
+
@calc = Calculator.new
|
7
|
+
end
|
8
|
+
|
9
|
+
After do
|
10
|
+
end
|
11
|
+
|
12
|
+
Given "ich habe $n in den Taschenrechner eingegeben" do |n|
|
13
|
+
@calc.push n.to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
When /ich (\w+) drücke/ do |op|
|
17
|
+
@result = @calc.send op
|
18
|
+
end
|
19
|
+
|
20
|
+
Then /sollte das Ergebniss auf dem Bildschirm (.*) sein/ do |result|
|
21
|
+
@result.should == result.to_f
|
22
|
+
end
|
23
|
+
|
24
|
+
Then /die Ergebnissklasse sollte eine (\w*) sein/ do |class_name|
|
25
|
+
@result.class.name.should == class_name
|
26
|
+
end
|
27
|
+
|
28
|
+
Given /it should rain on (\w+)/ do |day|
|
29
|
+
@calc.rain?(day).should == true
|
30
|
+
end
|
data/examples/i18n/en/Rakefile
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
Sąvybė: Sudėtis
|
2
|
+
Norint išvengti kvailų klaidų
|
3
|
+
Kaip matematinis idiotas
|
4
|
+
Aš noriu, kad man pasakytų dviejų skaičių sumą
|
5
|
+
|
6
|
+
Scenarijus: dviejų skaičių sudėtis
|
7
|
+
Duota aš įvedžiau 50 į skaičiuotuvą
|
8
|
+
Ir aš įvedžiau 70 į skaičiuotuvą
|
9
|
+
Kai aš paspaudžiu "add"
|
10
|
+
Tada rezultatas ekrane turi būti 120
|
11
|
+
Ir rezultato klasė turi būti "Fixnum"
|
12
|
+
|
13
|
+
Daugiau pavyzdžių
|
14
|
+
| įvestis_1 | įvestis_2 | mygtukas | išvestis | klasė |
|
15
|
+
| 20 | 30 | add | 50 | Fixnum |
|
16
|
+
| 2 | 5 | add | 7 | Fixnum |
|
17
|
+
| 0 | 40 | add | 40 | Fixnum |
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Feature: Dalyba
|
2
|
+
Norint išvengti klaidų
|
3
|
+
Kasininkai privalo mokėti skaičiuoti trupmenas
|
4
|
+
|
5
|
+
Scenarijus: Realieji skaičiai
|
6
|
+
Duota aš įvedžiau 3 į skaičiuotuvą
|
7
|
+
Ir aš įvedžiau 2 į skaičiuotuvą
|
8
|
+
Kai aš paspaudžiu "divide"
|
9
|
+
Tada rezultatas ekrane turi būti 1.5
|
10
|
+
Ir rezultato klasė turi būti "Float"
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec'
|
2
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
3
|
+
require 'calculator'
|
4
|
+
|
5
|
+
Before do
|
6
|
+
@calc = Calculator.new
|
7
|
+
end
|
8
|
+
|
9
|
+
After do
|
10
|
+
end
|
11
|
+
|
12
|
+
Given "aš įvedžiau $n į skaičiuotuvą" do |n|
|
13
|
+
@calc.push n.to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
When /aš paspaudžiu "(\w+)"/ do |op|
|
17
|
+
@result = @calc.send op
|
18
|
+
end
|
19
|
+
|
20
|
+
Then /rezultatas ekrane turi būti (.*)/ do |result|
|
21
|
+
@result.should == result.to_f
|
22
|
+
end
|
23
|
+
|
24
|
+
Then /rezultato klasė turi būti "(\w*)"/ do |class_name|
|
25
|
+
@result.class.name.should == class_name
|
26
|
+
end
|
27
|
+
|
28
|
+
Given /turi lyti (\w+)/ do |day|
|
29
|
+
@calc.rain?(day).should == true
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test/unit/assertions'
|
2
|
+
World do |o|
|
3
|
+
o.extend(Test::Unit::Assertions)
|
4
|
+
o
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^(\w+) = (\w+)$/ do |var, value|
|
8
|
+
instance_variable_set("@#{var}", value)
|
9
|
+
end
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'rubygems'
|
13
|
+
require 'matchy'
|
14
|
+
Then /^I can assert that (\w+) == (\w+)$/ do |var_a, var_b|
|
15
|
+
a = instance_variable_get("@#{var_a}")
|
16
|
+
b = instance_variable_get("@#{var_b}")
|
17
|
+
a.should == b
|
18
|
+
end
|
19
|
+
rescue LoadError
|
20
|
+
STDERR.puts "***** You should install matchy *****"
|
21
|
+
Then /^I can assert that (\w+) == (\w+)$/ do |var_a, var_b|
|
22
|
+
a = instance_variable_get("@#{var_a}")
|
23
|
+
b = instance_variable_get("@#{var_b}")
|
24
|
+
assert_equal(a, b)
|
25
|
+
end
|
26
|
+
end
|
data/lib/autotest/discover.rb
CHANGED
data/lib/cucumber.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)) unless
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'jcode'
|
5
|
+
require 'cucumber/platform'
|
3
6
|
require 'rubygems'
|
4
7
|
require 'treetop/runtime'
|
5
8
|
require 'treetop/ruby_extensions'
|
@@ -14,9 +17,6 @@ require 'cucumber/treetop_parser/feature_parser'
|
|
14
17
|
require 'cucumber/cli'
|
15
18
|
require 'cucumber/broadcaster'
|
16
19
|
|
17
|
-
$KCODE='u'
|
18
|
-
require 'jcode'
|
19
|
-
|
20
20
|
module Cucumber
|
21
21
|
LANGUAGE_FILE = File.expand_path(File.dirname(__FILE__) + '/cucumber/languages.yml')
|
22
22
|
|
data/lib/cucumber/cli.rb
CHANGED
@@ -22,7 +22,7 @@ module Cucumber
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
attr_reader :options
|
25
|
+
attr_reader :options, :paths
|
26
26
|
FORMATS = %w{pretty profile progress html autotest}
|
27
27
|
DEFAULT_FORMAT = 'pretty'
|
28
28
|
|
@@ -56,9 +56,6 @@ module Cucumber
|
|
56
56
|
@options[:require] ||= []
|
57
57
|
@options[:require] << v
|
58
58
|
end
|
59
|
-
opts.on("-l LINE", "--line LINE", "Only execute the scenario at the given line") do |v|
|
60
|
-
@options[:line] = v
|
61
|
-
end
|
62
59
|
opts.on("-s SCENARIO", "--scenario SCENARIO", "Only execute the scenario with the given name.",
|
63
60
|
"If this option is given more than once, run all",
|
64
61
|
"the specified scenarios.") do |v|
|
@@ -130,8 +127,9 @@ module Cucumber
|
|
130
127
|
if @options[:formats].empty?
|
131
128
|
@options[:formats][DEFAULT_FORMAT] = [@out_stream]
|
132
129
|
end
|
133
|
-
|
130
|
+
|
134
131
|
# Whatever is left after option parsing is the FILE arguments
|
132
|
+
args = extract_and_store_line_numbers(args)
|
135
133
|
@paths += args
|
136
134
|
end
|
137
135
|
|
@@ -164,7 +162,7 @@ Defined profiles in cucumber.yml:
|
|
164
162
|
executor.formatters = build_formatter_broadcaster(step_mother)
|
165
163
|
require_files
|
166
164
|
load_plain_text_features(features)
|
167
|
-
executor.
|
165
|
+
executor.lines_for_features = @options[:lines_for_features]
|
168
166
|
executor.scenario_names = @options[:scenario_names] if @options[:scenario_names]
|
169
167
|
executor.visit_features(features)
|
170
168
|
exit 1 if executor.failed
|
@@ -172,6 +170,18 @@ Defined profiles in cucumber.yml:
|
|
172
170
|
|
173
171
|
private
|
174
172
|
|
173
|
+
def extract_and_store_line_numbers(file_arguments)
|
174
|
+
@options[:lines_for_features] = Hash.new{|k,v| k[v] = []}
|
175
|
+
file_arguments.map do |arg|
|
176
|
+
_, file, lines = */^([\w\W]*?):([\d:]+)$/.match(arg)
|
177
|
+
unless file.nil?
|
178
|
+
@options[:lines_for_features][file] += lines.split(':').map { |line| line.to_i }
|
179
|
+
arg = file
|
180
|
+
end
|
181
|
+
arg
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
175
185
|
# Requires files - typically step files and ruby feature files.
|
176
186
|
def require_files
|
177
187
|
ARGV.clear # Shut up RSpec
|
@@ -6,6 +6,37 @@ module Cucumber
|
|
6
6
|
# Proc extension that allows a proc to be called in the context of any object.
|
7
7
|
# Also makes it possible to tack a name onto a Proc.
|
8
8
|
module CallIn
|
9
|
+
PROC_PATTERN = /[\d\w]+@(.*):(.*)>/
|
10
|
+
|
11
|
+
if Proc.new{}.to_s =~ PROC_PATTERN
|
12
|
+
def to_backtrace_line
|
13
|
+
"#{file_colon_line}:in `#{name}'"
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_comment_line
|
17
|
+
"# #{file_colon_line}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def file_colon_line
|
21
|
+
path, line = *to_s.match(PROC_PATTERN)[1..2]
|
22
|
+
path = File.expand_path(path)
|
23
|
+
pwd = Dir.pwd
|
24
|
+
path = path[pwd.length+1..-1]
|
25
|
+
"#{path}:#{line}"
|
26
|
+
end
|
27
|
+
else
|
28
|
+
# This Ruby implementation doesn't implement Proc#to_s correctly
|
29
|
+
STDERR.puts "*** THIS RUBY IMPLEMENTATION DOESN'T REPORT FILE AND LINE FOR PROCS ***"
|
30
|
+
|
31
|
+
def to_backtrace_line
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_comment_line
|
36
|
+
""
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
9
40
|
attr_accessor :name
|
10
41
|
|
11
42
|
def call_in(obj, *args)
|
@@ -22,22 +53,6 @@ module Cucumber
|
|
22
53
|
arity == -1 ? 0 : arity
|
23
54
|
end
|
24
55
|
|
25
|
-
def to_backtrace_line
|
26
|
-
"#{file_colon_line}:in `#{name}'"
|
27
|
-
end
|
28
|
-
|
29
|
-
def to_comment_line
|
30
|
-
"# #{file_colon_line}"
|
31
|
-
end
|
32
|
-
|
33
|
-
def file_colon_line
|
34
|
-
path, line = *to_s.match(/[\d\w]+@(.*):(.*)>/)[1..2]
|
35
|
-
path = File.expand_path(path)
|
36
|
-
pwd = Dir.pwd
|
37
|
-
path = path[pwd.length+1..-1]
|
38
|
-
"#{path}:#{line}"
|
39
|
-
end
|
40
|
-
|
41
56
|
def meth
|
42
57
|
@meth ||= "__cucumber_#{object_id}"
|
43
58
|
end
|