aslakhellesoy-cucumber 0.1.99.21 → 0.1.99.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/History.txt +20 -7
  2. data/Manifest.txt +24 -1
  3. data/examples/i18n/Rakefile +3 -3
  4. data/examples/i18n/fr/features/addition.feature +13 -11
  5. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +10 -12
  6. data/examples/i18n/fr/lib/calculatrice.rb +1 -1
  7. data/examples/i18n/ja/features/addition.feature +10 -10
  8. data/examples/i18n/ja/features/division.feature +2 -2
  9. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +3 -3
  10. data/examples/i18n/ko/features/addition.feature +3 -3
  11. data/examples/i18n/ko/features/division.feature +3 -3
  12. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +2 -9
  13. data/examples/i18n/no/features/support/env.rb +6 -0
  14. data/examples/i18n/zh-TW/Rakefile +6 -0
  15. data/examples/i18n/zh-TW/features/addition.feature +16 -0
  16. data/examples/i18n/zh-TW/features/division.feature +10 -0
  17. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  18. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  19. data/examples/self_test/features/step_definitions/sample_steps.rb +3 -1
  20. data/examples/sinatra/Rakefile +6 -0
  21. data/examples/sinatra/app.rb +14 -0
  22. data/examples/sinatra/features/add.feature +11 -0
  23. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  24. data/examples/sinatra/features/support/env.rb +20 -0
  25. data/examples/sinatra/views/add.erb +5 -0
  26. data/examples/sinatra/views/layout.erb +8 -0
  27. data/features/cucumber_cli.feature +7 -2
  28. data/features/step_definitions/cucumber_steps.rb +0 -1
  29. data/lib/autotest/cucumber_mixin.rb +3 -2
  30. data/lib/cucumber/ast/table.rb +23 -4
  31. data/lib/cucumber/ast/tags.rb +2 -2
  32. data/lib/cucumber/cli/configuration.rb +28 -11
  33. data/lib/cucumber/cli/language_help_formatter.rb +1 -1
  34. data/lib/cucumber/cli/main.rb +8 -1
  35. data/lib/cucumber/formatter/color_io.rb +6 -0
  36. data/lib/cucumber/languages.yml +37 -10
  37. data/lib/cucumber/parser/feature.rb +1 -1
  38. data/lib/cucumber/parser/feature.tt +1 -1
  39. data/lib/cucumber/rake/task.rb +39 -6
  40. data/lib/cucumber/step_definition.rb +7 -0
  41. data/lib/cucumber/step_mother.rb +12 -1
  42. data/lib/cucumber/version.rb +1 -1
  43. data/rails_generators/cucumber/cucumber_generator.rb +22 -3
  44. data/rails_generators/cucumber/templates/cucumber.rake +13 -5
  45. data/rails_generators/cucumber/templates/env.rb +2 -1
  46. data/rails_generators/cucumber/templates/paths.rb +18 -11
  47. data/rails_generators/cucumber/templates/webrat_steps.rb +23 -7
  48. data/spec/cucumber/ast/table_spec.rb +36 -9
  49. data/spec/cucumber/ast/tags_spec.rb +13 -1
  50. data/spec/cucumber/cli/configuration_spec.rb +33 -4
  51. data/spec/cucumber/cli/main_spec.rb +45 -6
  52. data/spec/cucumber/parser/feature_parser_spec.rb +2 -2
  53. data/spec/cucumber/step_definition_spec.rb +8 -0
  54. metadata +21 -4
  55. data/examples/i18n/ja/README.txt +0 -5
@@ -12,14 +12,14 @@ module Cucumber
12
12
  end
13
13
 
14
14
  def among?(tag_names)
15
- no_tags, yes_tags = tag_names.partition{|tag| tag =~ /^\!/}
15
+ no_tags, yes_tags = tag_names.partition{|tag| tag =~ /^~/}
16
16
  no_tags = no_tags.map{|tag| tag[1..-1]}
17
17
 
18
18
  # Strip @
19
19
  yes_tags = yes_tags.map{|tag| tag =~ /^@(.*)/ ? $1 : tag}
20
20
  no_tags = no_tags.map{|tag| tag =~ /^@(.*)/ ? $1 : tag}
21
21
 
22
- (@tag_names & yes_tags).any? && (@tag_names & no_tags).empty?
22
+ (yes_tags.empty? || (@tag_names & yes_tags).any?) && (no_tags.empty? || (@tag_names & no_tags).empty?)
23
23
  end
24
24
 
25
25
  def at_lines?(lines)
@@ -49,7 +49,7 @@ module Cucumber
49
49
  if v == 'help'
50
50
  list_languages
51
51
  elsif args==['help']
52
- list_keywords(v)
52
+ list_keywords_and_exit(v)
53
53
  else
54
54
  @options[:lang] = v
55
55
  end
@@ -73,7 +73,7 @@ module Cucumber
73
73
  end
74
74
  opts.on("-t TAGS", "--tags TAGS",
75
75
  "Only execute the features or scenarios with the specified tags.",
76
- "TAGS must be comma-separated without spaces. Prefix tags with ! to",
76
+ "TAGS must be comma-separated without spaces. Prefix tags with ~ to",
77
77
  "exclude features or scenarios having that tag. tags can be specified",
78
78
  "with or without the @ prefix.") do |v|
79
79
  @options[:tags] = v.split(",")
@@ -134,6 +134,12 @@ module Cucumber
134
134
  opts.on("-g", "--guess", "Guess best match for Ambiguous steps.") do
135
135
  @options[:guess] = true
136
136
  end
137
+ opts.on("--no-diff", "Disable diff output on failing expectations.") do
138
+ @options[:diff_enabled] = false
139
+ end
140
+ opts.on("-S", "--step-definitions", "Print the regexp and line of all step definitions, then exit.") do
141
+ @options[:print_step_definitions] = true
142
+ end
137
143
  opts.on_tail("--version", "Show version.") do
138
144
  @out_stream.puts VERSION::STRING
139
145
  Kernel.exit
@@ -166,14 +172,22 @@ module Cucumber
166
172
  end
167
173
 
168
174
  def guess?
169
- !!@options[:guess]
175
+ @options[:guess]
170
176
  end
171
177
 
178
+ def diff_enabled?
179
+ @options[:diff_enabled]
180
+ end
181
+
182
+ def print_step_definitions?
183
+ @options[:print_step_definitions]
184
+ end
185
+
172
186
  def load_language
173
- Cucumber.load_language(@options[:lang])
174
-
175
- if Cucumber.language_incomplete?
176
- list_keywords(Cucumber.lang)
187
+ if Cucumber.language_incomplete?(@options[:lang])
188
+ list_keywords_and_exit(@options[:lang])
189
+ else
190
+ Cucumber.load_language(@options[:lang])
177
191
  end
178
192
  end
179
193
 
@@ -219,7 +233,9 @@ module Cucumber
219
233
  path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
220
234
  File.directory?(path) ? Dir["#{path}/**/*.rb"] : path
221
235
  end.flatten.uniq
222
- files.sort { |a,b| (b =~ %r{/support/} || -1) <=> (a =~ %r{/support/} || -1) }.reject{|f| f =~ /^http/}
236
+ sorted_files = files.sort { |a,b| (b =~ %r{/support/} || -1) <=> (a =~ %r{/support/} || -1) }.reject{|f| f =~ /^http/}
237
+ env_files = sorted_files.select {|f| f =~ %r{/support/env.rb} }
238
+ env_files + sorted_files.reject {|f| f =~ %r{/support/env.rb} }
223
239
  end
224
240
 
225
241
  def feature_files
@@ -299,7 +315,7 @@ Defined profiles in cucumber.yml:
299
315
  return @cucumber_yml
300
316
  end
301
317
 
302
- def list_keywords(lang)
318
+ def list_keywords_and_exit(lang)
303
319
  unless Cucumber::LANGUAGES[lang]
304
320
  exit_with_error("No language with key #{lang}")
305
321
  end
@@ -321,7 +337,8 @@ Defined profiles in cucumber.yml:
321
337
  :formats => {},
322
338
  :excludes => [],
323
339
  :tags => [],
324
- :scenario_names => []
340
+ :scenario_names => [],
341
+ :diff_enabled => true
325
342
  }
326
343
  end
327
344
 
@@ -336,4 +353,4 @@ Defined profiles in cucumber.yml:
336
353
  end
337
354
 
338
355
  end
339
- end
356
+ end
@@ -48,7 +48,7 @@ http://wiki.github.com/aslakhellesoy/cucumber/spoken-languages
48
48
  end
49
49
  status = :comment
50
50
  elsif @incomplete
51
- status = :failed
51
+ status = :undefined
52
52
  end
53
53
 
54
54
  @col += 1
@@ -32,6 +32,13 @@ module Cucumber
32
32
  step_mother.options = configuration.options
33
33
 
34
34
  require_files
35
+
36
+ if(configuration.print_step_definitions?)
37
+ step_mother.print_step_definitions(@out_stream)
38
+ Kernel.exit(0)
39
+ return # In specs, exit is stubbed
40
+ end
41
+
35
42
  enable_diffing
36
43
 
37
44
  features = load_plain_text_features
@@ -86,7 +93,7 @@ module Cucumber
86
93
  end
87
94
 
88
95
  def enable_diffing
89
- if defined?(::Spec)
96
+ if configuration.diff_enabled? && defined?(::Spec)
90
97
  require 'spec/expectations/differs/default'
91
98
  options = OpenStruct.new(:diff_format => :unified, :context_lines => 3)
92
99
  ::Spec::Expectations.differ = ::Spec::Expectations::Differs::Default.new(options)
@@ -12,6 +12,12 @@ module Cucumber
12
12
  @kernel = Kernel
13
13
  @stdout = STDOUT
14
14
  end
15
+
16
+ # Ensure using << still gets colours in win32console
17
+ def <<(output)
18
+ print(output)
19
+ self
20
+ end
15
21
  end
16
22
  end
17
23
  end
@@ -161,10 +161,11 @@
161
161
  native: français
162
162
  encoding: UTF-8
163
163
  feature: Fonctionnalité
164
+ background: Contexte
164
165
  scenario: Scénario
165
- scenario_outline: Scénario esquisse
166
+ scenario_outline: Plan du Scénario
166
167
  examples: Exemples
167
- given: Etant donné
168
+ given: Soit
168
169
  when: Lorsque
169
170
  then: Alors
170
171
  and: Et
@@ -197,10 +198,12 @@
197
198
  "ja":
198
199
  name: Japanese
199
200
  native: 日本語
200
- encoding: Shift_JIS
201
+ encoding: UTF-8
201
202
  feature: フィーチャ
203
+ background: 背景
202
204
  scenario: シナリオ
203
- more_examples: 他のサンプル
205
+ scenario_outline: シナリオテンプレート|テンプレ|シナリオテンプレ
206
+ examples: 例|サンプル
204
207
  given: 前提
205
208
  when: もし
206
209
  then: ならば
@@ -292,15 +295,18 @@
292
295
  but: Dar
293
296
  "ru":
294
297
  name: Russian
295
- native: русский язык
298
+ native: русский
296
299
  encoding: UTF-8
297
300
  feature: Функционал
301
+ background: Предыстория
298
302
  scenario: Сценарий
299
- given: Сначала
303
+ scenario_outline: Структура сценария
304
+ examples: Значения
305
+ given: Допустим
300
306
  when: Если
301
307
  then: То
302
- and: И
303
- but: Но
308
+ and: И|К тому же
309
+ but: Но|А
304
310
  "se":
305
311
  name: Swedish
306
312
  native: Svenska
@@ -317,21 +323,42 @@
317
323
  but: Men
318
324
  "zh-CN":
319
325
  name: Chinese simplified
320
- native: 中文
326
+ native: 简体中文
321
327
  encoding: UTF-8
322
328
  feature: 功能
329
+ background: 背景
323
330
  scenario: 场景
331
+ scenario_outline: 场景大纲
332
+ examples: 例子
324
333
  given: 假如
325
334
  when: 当
326
335
  then: 那么
327
336
  and: 而且
328
337
  but: 但是
338
+ "zh-TW":
339
+ name: Chinese traditional
340
+ native: 繁體中文
341
+ encoding: UTF-8
342
+ feature: 功能
343
+ background: 背景
344
+ scenario: 場景|劇本
345
+ scenario_outline: 場景大綱|劇本大綱
346
+ examples: 例子
347
+ given: 假設
348
+ when: 當
349
+ then: 那麼
350
+ and: 而且|並且
351
+ but: 但是
329
352
  "ko":
330
353
  name: Korean
331
354
  native: 한국어
332
355
  encoding: UTF-8
356
+ background: 배경
333
357
  feature: 기능
334
- scenario:
358
+ scenario: 시나리오
359
+ scenario_outline: 시나리오 개요
360
+ examples: 예
361
+ more_examples: 다른 예
335
362
  given: 조건
336
363
  when: 만일
337
364
  then: 그러면
@@ -311,7 +311,7 @@ module Cucumber
311
311
  if r1
312
312
  s2, i2 = [], index
313
313
  loop do
314
- if input.index(Regexp.new('[a-z0-9]'), index) == index
314
+ if input.index(Regexp.new('[^@\\n\\t ]'), index) == index
315
315
  r3 = (SyntaxNode).new(input, index...(index + 1))
316
316
  @index += 1
317
317
  else
@@ -40,7 +40,7 @@ module Cucumber
40
40
  end
41
41
 
42
42
  rule tag
43
- '@' tag_name:([a-z0-9])+
43
+ '@' tag_name:([^@\n\t ])+
44
44
  end
45
45
 
46
46
  rule comment
@@ -2,21 +2,54 @@ require 'cucumber/platform'
2
2
 
3
3
  module Cucumber
4
4
  module Rake
5
- # Defines a task for running features.
5
+ # Defines a Rake task for running features.
6
+ #
7
+ # The simplest use of it goes something like:
8
+ #
9
+ # Cucumber::Rake::Task.new
10
+ #
11
+ # This will create a task named 'features' described as 'Run Features with
12
+ # Cucumber'. It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
13
+ #
14
+ # To further configure the task, you can pass a block:
15
+ #
16
+ # Cucumber::Rake::Task.new do |t|
17
+ # t.libs << 'lib'
18
+ # t.cucumber_opts = "--format progress"
19
+ # end
20
+ #
21
+ # This task can also be configured to be run with RCov:
22
+ #
23
+ # Cucumber::Rake::Task.new do |t|
24
+ # t.rcov = true
25
+ # end
26
+ #
27
+ # See the attributes for additional configuration possibilities.
6
28
  class Task
7
- LIB = File.expand_path(File.dirname(__FILE__) + '/../..')
29
+ LIB = File.expand_path(File.dirname(__FILE__) + '/../..') # :nodoc:
8
30
 
31
+ # Directories to add to the load path
9
32
  attr_accessor :libs
33
+ # Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
10
34
  attr_accessor :binary
35
+ # Array of paths to specific steps to use
11
36
  attr_accessor :step_list
37
+ # File pattern for finding step definitions. Defaults to
38
+ # 'features/**/*.rb'. Can be overriden by the SPEC environment variable.
12
39
  attr_accessor :step_pattern
40
+ # Array of paths to specific features to run.
13
41
  attr_accessor :feature_list
42
+ # File pattern for finding features to run. Defaults to
43
+ # 'features/**/*.feature'. Can be overriden by the FEATURE environment variable.
14
44
  attr_accessor :feature_pattern
45
+ # Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
15
46
  attr_accessor :cucumber_opts
47
+ # Run cucumber with RCov?
16
48
  attr_accessor :rcov
49
+ # Extra options to pass to rcov
17
50
  attr_accessor :rcov_opts
18
51
 
19
- # Define a task
52
+ # Define a Rake
20
53
  def initialize(task_name = "features", desc = "Run Features with Cucumber")
21
54
  @task_name, @desc = task_name, desc
22
55
  @libs = []
@@ -33,14 +66,14 @@ module Cucumber
33
66
  define_task
34
67
  end
35
68
 
36
- def define_task
69
+ def define_task # :nodoc:
37
70
  desc @desc
38
71
  task @task_name do
39
72
  ruby(arguments_for_ruby_execution.join(" ")) # ruby(*args) is broken on Windows
40
73
  end
41
74
  end
42
75
 
43
- def arguments_for_ruby_execution(task_args = nil)
76
+ def arguments_for_ruby_execution(task_args = nil) # :nodoc:
44
77
  lib_args = ['"%s"' % libs.join(File::PATH_SEPARATOR)]
45
78
  cucumber_bin = ['"%s"' % binary]
46
79
  cuc_opts = [(ENV['CUCUMBER_OPTS'] || cucumber_opts)]
@@ -89,7 +122,7 @@ module Cucumber
89
122
  super(task_name, desc)
90
123
  end
91
124
 
92
- def define_task
125
+ def define_task # :nodoc:
93
126
  desc @desc
94
127
  task @task_name, :feature_name do |t, args|
95
128
  ruby(arguments_for_ruby_execution(args).join(" ")) # ruby(*args) is broken on Windows
@@ -83,5 +83,12 @@ module Cucumber
83
83
  @proc.file_colon_line
84
84
  end
85
85
 
86
+ def text_length
87
+ @regexp.inspect.jlength
88
+ end
89
+
90
+ def to_s(indent = 0)
91
+ @regexp.inspect + (' # ').indent(indent) + file_colon_line
92
+ end
86
93
  end
87
94
  end
@@ -136,9 +136,20 @@ module Cucumber
136
136
  def snippet_text(step_keyword, step_name)
137
137
  @snippet_generator.snippet_text(step_keyword, step_name)
138
138
  end
139
+
140
+ def print_step_definitions(out)
141
+ step_definitions.each do |step_definition|
142
+ indent = max_step_definition_length - step_definition.text_length
143
+ out.puts(step_definition.to_s(indent))
144
+ end
145
+ end
139
146
 
140
147
  private
141
-
148
+
149
+ def max_step_definition_length
150
+ @max_step_definition_length ||= step_definitions.map{|step_definition| step_definition.text_length}.max
151
+ end
152
+
142
153
  def options
143
154
  @options || {}
144
155
  end
@@ -3,7 +3,7 @@ module Cucumber #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
5
  TINY = 99
6
- PATCH = 21 # Set to nil for official release
6
+ PATCH = 22 # Set to nil for official release
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
9
9
  end
@@ -4,13 +4,16 @@ require 'rbconfig'
4
4
  class CucumberGenerator < Rails::Generator::Base
5
5
  DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
6
6
  Config::CONFIG['ruby_install_name'])
7
+
8
+ attr_accessor :framework
9
+
7
10
  def manifest
8
11
  record do |m|
9
12
  m.directory 'features/step_definitions'
10
- m.file 'webrat_steps.rb', 'features/step_definitions/webrat_steps.rb'
13
+ m.template 'webrat_steps.rb', 'features/step_definitions/webrat_steps.rb'
11
14
 
12
15
  m.directory 'features/support'
13
- m.file 'env.rb', 'features/support/env.rb'
16
+ m.template 'env.rb', 'features/support/env.rb'
14
17
  m.file 'paths.rb', 'features/support/paths.rb'
15
18
 
16
19
  m.directory 'lib/tasks'
@@ -22,10 +25,26 @@ class CucumberGenerator < Rails::Generator::Base
22
25
  end
23
26
  end
24
27
 
28
+ def framework
29
+ options[:framework] || :rspec
30
+ end
31
+
25
32
  protected
26
33
 
27
34
  def banner
28
35
  "Usage: #{$0} cucumber"
29
36
  end
30
37
 
31
- end
38
+ def add_options!(opt)
39
+ opt.separator ''
40
+ opt.separator 'Options:'
41
+ opt.on('--rspec', 'Setup cucumber for use with RSpec (default)') do |value|
42
+ options[:framework] = :rspec
43
+ end
44
+
45
+ opt.on('--testunit', 'Setup cucumber for use with test/unit') do |value|
46
+ options[:framework] = :testunit
47
+ end
48
+ end
49
+
50
+ end
@@ -1,7 +1,15 @@
1
- $:.unshift(RAILS_ROOT + '/vendor/plugins/cucumber/lib')
2
- require 'cucumber/rake/task'
1
+ $LOAD_PATH.unshift(RAILS_ROOT + '/vendor/plugins/cucumber/lib') if File.directory?(RAILS_ROOT + '/vendor/plugins/cucumber/lib')
3
2
 
4
- Cucumber::Rake::Task.new(:features) do |t|
5
- t.cucumber_opts = "--format pretty"
3
+ begin
4
+ require 'cucumber/rake/task'
5
+
6
+ Cucumber::Rake::Task.new(:features) do |t|
7
+ t.cucumber_opts = "--format pretty"
8
+ end
9
+ task :features => 'db:test:prepare'
10
+ rescue LoadError
11
+ desc 'Cucumber rake task not available'
12
+ task :features do
13
+ abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
14
+ end
6
15
  end
7
- task :features => 'db:test:prepare'
@@ -10,7 +10,8 @@ require 'webrat'
10
10
  Webrat.configure do |config|
11
11
  config.mode = :rails
12
12
  end
13
+ <% if framework == :rspec -%>
13
14
 
14
- # Comment out the next two lines if you're not using RSpec's matchers (should / should_not) in your steps.
15
15
  require 'cucumber/rails/rspec'
16
16
  require 'webrat/core/matchers'
17
+ <% end -%>
@@ -1,12 +1,19 @@
1
- def path_to(page_name)
2
- case page_name
3
-
4
- when /the homepage/i
5
- root_path
6
-
7
- # Add more page name => path mappings here
8
-
9
- else
10
- raise "Can't find mapping from \"#{page_name}\" to a path."
1
+ module NavigationHelpers
2
+ def path_to(page_name)
3
+ case page_name
4
+
5
+ when /the homepage/i
6
+ root_path
7
+
8
+ # Add more page name => path mappings here
9
+
10
+ else
11
+ raise "Can't find mapping from \"#{page_name}\" to a path."
12
+ end
11
13
  end
12
- end
14
+ end
15
+
16
+ World do |world|
17
+ world.extend NavigationHelpers
18
+ world
19
+ end
@@ -3,6 +3,10 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "pat
3
3
  # Commonly used webrat steps
4
4
  # http://github.com/brynary/webrat
5
5
 
6
+ Given /^I am on (.+)$/ do |page_name|
7
+ visit path_to(page_name)
8
+ end
9
+
6
10
  When /^I go to (.+)$/ do |page_name|
7
11
  visit path_to(page_name)
8
12
  end
@@ -31,10 +35,10 @@ end
31
35
 
32
36
  # Use this step when using multiple datetime_select helpers on a page or
33
37
  # you want to specify which datetime to select. Given the following view:
34
- # <%= f.label :preferred %><br />
35
- # <%= f.datetime_select :preferred %>
36
- # <%= f.label :alternative %><br />
37
- # <%= f.datetime_select :alternative %>
38
+ # <%%= f.label :preferred %><br />
39
+ # <%%= f.datetime_select :preferred %>
40
+ # <%%= f.label :alternative %><br />
41
+ # <%%= f.datetime_select :alternative %>
38
42
  # The following steps would fill out the form:
39
43
  # When I select "November 23, 2004 11:20" as the "Preferred" data and time
40
44
  # And I select "November 25, 2004 10:30" as the "Alternative" data and time
@@ -42,7 +46,7 @@ When /^I select "(.*)" as the "(.*)" date and time$/ do |datetime, datetime_labe
42
46
  select_datetime(datetime, :from => datetime_label)
43
47
  end
44
48
 
45
- # Use this step in conjuction with Rail's time_select helper. For example:
49
+ # Use this step in conjunction with Rail's time_select helper. For example:
46
50
  # When I select "2:20PM" as the time
47
51
  # Note: Rail's default time helper provides 24-hour time-- not 12 hour time. Webrat
48
52
  # will convert the 2:20PM to 14:20 and then select it.
@@ -57,7 +61,7 @@ When /^I select "(.*)" as the "(.*)" time$/ do |time, time_label|
57
61
  select_time(time, :from => time_label)
58
62
  end
59
63
 
60
- # Use this step in conjuction with Rail's date_select helper. For example:
64
+ # Use this step in conjunction with Rail's date_select helper. For example:
61
65
  # When I select "February 20, 1981" as the date
62
66
  When /^I select "(.*)" as the date$/ do |date|
63
67
  select_date(date)
@@ -82,18 +86,30 @@ When /^I choose "(.*)"$/ do |field|
82
86
  choose(field)
83
87
  end
84
88
 
85
- When /^I attach the file at "(.*)" to "(.*)" $/ do |path, field|
89
+ When /^I attach the file at "(.*)" to "(.*)"$/ do |path, field|
86
90
  attach_file(field, path)
87
91
  end
88
92
 
89
93
  Then /^I should see "(.*)"$/ do |text|
94
+ <% if framework == :rspec -%>
90
95
  response.should contain(text)
96
+ <% else -%>
97
+ assert_contain text
98
+ <% end -%>
91
99
  end
92
100
 
93
101
  Then /^I should not see "(.*)"$/ do |text|
102
+ <% if framework == :rspec -%>
94
103
  response.should_not contain(text)
104
+ <% else -%>
105
+ assert_not_contain text
106
+ <% end -%>
95
107
  end
96
108
 
97
109
  Then /^the "(.*)" checkbox should be checked$/ do |label|
110
+ <% if framework == :rspec -%>
98
111
  field_labeled(label).should be_checked
112
+ <% else -%>
113
+ assert field_labeled(label).checked?
114
+ <% end -%>
99
115
  end
@@ -6,7 +6,7 @@ module Cucumber
6
6
  describe Table do
7
7
  before do
8
8
  @table = Table.new([
9
- %w{1 22 333},
9
+ %w{one four seven},
10
10
  %w{4444 55555 666666}
11
11
  ])
12
12
  @table.extend(Module.new{
@@ -17,11 +17,11 @@ module Cucumber
17
17
  end
18
18
 
19
19
  it "should have rows" do
20
- @table.cells_rows[0].map{|cell| cell.value}.should == %w{1 22 333}
20
+ @table.cells_rows[0].map{|cell| cell.value}.should == %w{one four seven}
21
21
  end
22
22
 
23
23
  it "should have columns" do
24
- @table.columns[1].map{|cell| cell.value}.should == %w{22 55555}
24
+ @table.columns[1].map{|cell| cell.value}.should == %w{four 55555}
25
25
  end
26
26
 
27
27
  it "should have same cell objects in rows and columns" do
@@ -35,10 +35,31 @@ module Cucumber
35
35
 
36
36
  it "should be convertible to an array of hashes" do
37
37
  @table.hashes.should == [
38
- {'1' => '4444', '22' => '55555', '333' => '666666'}
38
+ {'one' => '4444', 'four' => '55555', 'seven' => '666666'}
39
39
  ]
40
40
  end
41
41
 
42
+ it "should accept symbols as keys for the hashes" do
43
+ @table.hashes.first[:one].should == '4444'
44
+ end
45
+
46
+ it "should allow map'ing columns" do
47
+ @table.map_column!('one') { |v| v.to_i }
48
+ @table.hashes.first['one'].should == 4444
49
+ end
50
+
51
+ it "should pass silently if a mapped column does not exist in non-strict mode" do
52
+ lambda {
53
+ @table.map_column!('two', false) { |v| v.to_i }
54
+ }.should_not raise_error
55
+ end
56
+
57
+ it "should fail if a mapped column does not exist in strict mode" do
58
+ lambda {
59
+ @table.map_column!('two', true) { |v| v.to_i }
60
+ }.should raise_error('The column named "two" does not exist')
61
+ end
62
+
42
63
  describe "replacing arguments" do
43
64
 
44
65
  before(:each) do
@@ -54,10 +75,16 @@ module Cucumber
54
75
  table_with_replaced_args.hashes[0]['book'].should == 'Unbearable lightness of being'
55
76
  table_with_replaced_args.hashes[0]['qty'].should == '5'
56
77
  end
57
-
78
+
79
+ it "should replace nil values with nil" do
80
+ table_with_replaced_args = @table.arguments_replaced({'<book>' => nil})
81
+
82
+ table_with_replaced_args.hashes[0]['book'].should == nil
83
+ end
84
+
58
85
  it "should not change the original table" do
59
86
  table_with_replaced_args = @table.arguments_replaced({'<book>' => 'Unbearable lightness of being'})
60
-
87
+
61
88
  @table.hashes[0]['book'].should_not == 'Unbearable lightness of being'
62
89
  end
63
90
 
@@ -67,9 +94,9 @@ module Cucumber
67
94
  @table.to_sexp.should ==
68
95
  [:table,
69
96
  [:row,
70
- [:cell, "1"],
71
- [:cell, "22"],
72
- [:cell, "333"]
97
+ [:cell, "one"],
98
+ [:cell, "four"],
99
+ [:cell, "seven"]
73
100
  ],
74
101
  [:row,
75
102
  [:cell, "4444"],