rspec 0.7.2 → 0.7.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/CHANGES +72 -1
  2. data/EXAMPLES.rd +6 -0
  3. data/README +27 -6
  4. data/Rakefile +32 -81
  5. data/bin/drbspec +3 -0
  6. data/bin/spec +2 -3
  7. data/examples/file_accessor_spec.rb +1 -1
  8. data/examples/greeter_spec.rb +30 -0
  9. data/examples/helper_method_example.rb +1 -1
  10. data/examples/io_processor_spec.rb +1 -1
  11. data/examples/mocking_example.rb +1 -1
  12. data/examples/partial_mock_example.rb +1 -1
  13. data/examples/predicate_example.rb +1 -1
  14. data/examples/setup_teardown_example.rb +34 -0
  15. data/examples/spec_helper.rb +1 -0
  16. data/examples/stack_spec.rb +1 -1
  17. data/examples/stubbing_example.rb +1 -1
  18. data/examples/test_case_spec.rb +1 -1
  19. data/lib/spec/callback/callback_container.rb +60 -0
  20. data/lib/spec/callback/extensions/module.rb +24 -0
  21. data/lib/spec/callback/extensions/object.rb +33 -0
  22. data/lib/spec/callback.rb +3 -0
  23. data/lib/spec/expectations/diff.rb +10 -14
  24. data/lib/spec/expectations/extensions/numeric.rb +17 -3
  25. data/lib/spec/expectations/extensions/object.rb +145 -0
  26. data/lib/spec/expectations/extensions/proc.rb +57 -0
  27. data/lib/spec/expectations/extensions/string.rb +22 -0
  28. data/lib/spec/expectations/extensions.rb +2 -2
  29. data/lib/spec/expectations/message_builder.rb +13 -0
  30. data/lib/spec/expectations/should/base.rb +29 -10
  31. data/lib/spec/expectations/should/change.rb +69 -0
  32. data/lib/spec/expectations/should/have.rb +94 -37
  33. data/lib/spec/expectations/should/not.rb +6 -2
  34. data/lib/spec/expectations/should/should.rb +9 -5
  35. data/lib/spec/expectations/should.rb +1 -0
  36. data/lib/spec/expectations/sugar.rb +2 -2
  37. data/lib/spec/expectations.rb +28 -0
  38. data/lib/spec/mocks/error_generator.rb +23 -12
  39. data/lib/spec/mocks/message_expectation.rb +18 -15
  40. data/lib/spec/mocks/mock_handler.rb +10 -9
  41. data/lib/spec/mocks/mock_methods.rb +1 -1
  42. data/lib/spec/rake/spectask.rb +8 -2
  43. data/lib/spec/runner/backtrace_tweaker.rb +34 -25
  44. data/lib/spec/runner/context.rb +56 -7
  45. data/lib/spec/runner/context_eval.rb +33 -3
  46. data/lib/spec/runner/context_runner.rb +24 -11
  47. data/lib/spec/runner/drb_command_line.rb +21 -0
  48. data/lib/spec/runner/execution_context.rb +1 -0
  49. data/lib/spec/runner/extensions/kernel.rb +2 -0
  50. data/lib/spec/runner/extensions/object.rb +26 -18
  51. data/lib/spec/runner/formatter/base_text_formatter.rb +1 -1
  52. data/lib/spec/runner/formatter/html_formatter.rb +94 -74
  53. data/lib/spec/runner/heckle_runner.rb +55 -0
  54. data/lib/spec/runner/option_parser.rb +15 -3
  55. data/lib/spec/runner/reporter.rb +13 -8
  56. data/lib/spec/runner/specification.rb +67 -42
  57. data/lib/spec/runner.rb +1 -1
  58. data/lib/spec/version.rb +6 -5
  59. data/lib/spec.rb +1 -0
  60. metadata +20 -19
  61. data/lib/spec/expectations/extensions/inspect_for_expectation_not_met_error.rb +0 -14
  62. data/lib/spec/expectations/extensions/symbol.rb +0 -5
  63. data/vendor/selenium/README.txt +0 -23
  64. data/vendor/selenium/find_rspecs_home_page.rb +0 -23
  65. data/vendor/selenium/rspec_selenium.rb +0 -33
  66. data/vendor/selenium/start_browser_once.patch +0 -65
  67. data/vendor/watir/README.txt +0 -32
  68. data/vendor/watir/find_rspecs_home_page.rb +0 -21
  69. data/vendor/watir/find_rspecs_home_page.txt +0 -15
  70. data/vendor/watir/rspec_watir.rb +0 -45
data/CHANGES CHANGED
@@ -1,6 +1,77 @@
1
1
  = RSpec Changelog
2
2
 
3
- == Version 0.7.2 (in SVN)
3
+ == Version 0.7.5.1
4
+
5
+ Bug fix release to allow downloads of rspec gem using rubygems 0.9.1.
6
+
7
+ == Version 0.7.5
8
+
9
+ This release adds support for Heckle - Seattle'rb's code mutation tool.
10
+ There are also several bug fixes to the RSpec core and the RSpec on Rails plugin.
11
+
12
+ * Removed svn:externals on rails versions and plugins
13
+ * Applied [#7345] Adding context_setup and context_teardown, with specs and 100% rcov
14
+ * Applied [#7320] [PATCH] Allow XHR requests in controller specs to render RJS templates
15
+ * Applied [#7319] Migration code uses drop_column when it should use remove_column (patch from Pat Maddox)
16
+ * Added support for Heckle
17
+ * Applied [#7282] dump results even if spec is interrupted (patch from Kouhei Sutou)
18
+ * Applied [#7277] model.should_have(n).errors_on(:attribute) (patch from Wilson Bilkovich)
19
+ * Applied [#7270] RSpec render_partial colliding with simply_helpful (patch from David Goodlad)
20
+ * Added [#7250] stubs should support throwing
21
+ * Added [#7249] stubs should support yielding
22
+ * Fixed [#6760] fatal error when accessing nested finders in rspec
23
+ * Fixed [#7179] script/generate rspec_resource generates incorrect helper name
24
+ * Added preliminary support for assert_select (response.should_have)
25
+ * Fixed [#6971] and_yield does not work when the arity is -1
26
+ * Fixed [#6898] Can we separate rspec from the plugins?
27
+ * Added [#7025] should_change should accept a block
28
+ * Applied [#6989] partials with locals (patch from Micah Martin)
29
+ * Applied [#7023] Typo in team.page
30
+
31
+ == Version 0.7.4
32
+
33
+ This release features a complete redesign of the reports generated with --format html.
34
+ As usual there are many bug fixes - mostly related to spec/rails.
35
+
36
+ * Applied [#7010] Fixes :spacer_template does not work w/ view spec (patch from Shintaro Kakutani)
37
+ * Applied [#6798] ensure two ':' in the first backtrace line for Emacs's 'next-error' command (patch from Kouhei Sutou)
38
+ * Added Much nicer reports to generated website
39
+ * Much nicer reports with --format --html (patch from Luke Redpath)
40
+ * Applied [#6959] Calls to render and redirect in controllers should return true
41
+ * Fixed [#6981] helper method is not available in partial template.
42
+ * Added [#6978] mock should tell you the expected and actual args when receiving the right message with the wrong args
43
+ * Added the possibility to tweak the output of the HtmlFormatter (by overriding extra_failure_content).
44
+ * Fixed [#6936] View specs don't include ApplicationHelper by default
45
+ * Fixed [#6903] Rendering a partial in a view makes the view spec blow up
46
+ * Added callback library from Brian Takita
47
+ * Added [#6925] support controller.should_render :action_name
48
+ * Fixed [#6884] intermittent errors related to method binding
49
+ * Fixed [#6870] rspec on edge rails spec:controller fixture loading fails
50
+ * Using obj.inspect for all messages
51
+ * Improved performance by getting rid of instance_exec (instance_eval is good enough because we never need to pass it args)
52
+
53
+ == Version 0.7.3
54
+
55
+ Almost normal bug fix/new feature release.
56
+
57
+ A couple of things you need to change in your rails specs:
58
+ # spec_helper.rb is a little different (see http://rspec.rubyforge.org/upgrade.html)
59
+ # use controller.should_render before OR after the action (controller.should_have_rendered is deprecated)
60
+
61
+ * Applied [#6577] messy mock backtrace when frozen to edge rails (patch from Jay Levitt)
62
+ * Fixed [#6674] rspec_on_rails fails on @session deprecation warning
63
+ * Fixed [#6780] routing() was failing...fix included - works for 1.1.6 and edge (1.2)
64
+ * Fixed [#6835] bad message with arbitrary predicate
65
+ * Added [#6731] Partial templates rendered
66
+ * Fixed [#6713] helper methods not rendered in view tests?
67
+ * Fixed [#6707] cannot run controller / helper tests via rails_spec or spec only works with rake
68
+ * Applied [#6417] lambda {...}.should_change(receiver, :message) (patch from Wilson Bilkovich)
69
+ * Eliminated dependency on ZenTest
70
+ * Fixed [#6650] Reserved characters in the TextMate bundle break svn on Win32
71
+ * Fixed [#6643] script/generate rspec_controller: invalid symbol generation for 'controller_name' for *modularized* controllers
72
+ * The script/rails_spec command has been moved to bin/drbspec in RSpec core (installed by the gem)
73
+
74
+ == Version 0.7.2
4
75
 
5
76
  This release introduces a brand new RSpec bundle for TextMate, plus some small bugfixes.
6
77
 
data/EXAMPLES.rd CHANGED
@@ -1,5 +1,8 @@
1
1
  # A FileAccessor
2
2
  # * should open a file and pass it to the processor's process method
3
+ # Greeter
4
+ # * should say Hi to person
5
+ # * should say Hi to nobody
3
6
  # a context with helper a method
4
7
  # * should make that method available to specs
5
8
  # An IoProcessor
@@ -17,6 +20,9 @@
17
20
  # BDD framework
18
21
  # * should be adopted quickly
19
22
  # * should be intuitive
23
+ # State created in context_setup
24
+ # * should be accessible from spec
25
+ # * should not have sideffects
20
26
  # A stack which is neither empty nor full
21
27
  # * should add to the top when sent 'push'
22
28
  # * should return the top item when sent 'peek'
data/README CHANGED
@@ -1,4 +1,28 @@
1
- == Building the RSpec gem ==
1
+ == RSpec
2
+
3
+ RSpec is a framework for developing ruby applications using Behaviour Driven Development.
4
+
5
+ == Expectations
6
+
7
+ RSpec adds expectation methods to every object, with specific types of expectations
8
+ set on specific classes. For example ...
9
+
10
+ <code>
11
+ @message = "some message"
12
+ @message.should == "some message"
13
+ </code>
14
+
15
+ ... will be available on every object, whereas ...
16
+
17
+ <code>
18
+ proc { @number = @number + 1 }.should_change{ @number }.by(1)
19
+ </code>
20
+
21
+ ... will only be available for proc objects.
22
+
23
+ See Spec::Expectations for details on the different expectations you can set.
24
+
25
+ == Building the RSpec gem
2
26
  rake gem
3
27
  gem install pkg/rspec-0.x.x.gem (you may have to sudo)
4
28
 
@@ -13,16 +37,13 @@ In order to run RSpec's full suite of specs (rake pre_commit) you must install t
13
37
  * diff-lcs # Required if you use the --diff switch
14
38
  * win32console # Required by the --colour switch if you're on Windows
15
39
  * meta_project # Required in order to make releases at RubyForge
16
- * sqlite3-ruby # Required by RSpec on Rails specs
17
- * ZenTest # Required by RSpec on Rails specs
18
- * Rails # Required by RSpec on Rails specs
19
-
20
- You must also install SQLite - which is needed to test the Rails plugin.
40
+ * heckle # Required if you use the --heckle switch
21
41
 
22
42
  Note that RSpec itself - once built - doesn't have any dependencies outside the Ruby core
23
43
  and stdlib - with a few exceptions:
24
44
 
25
45
  * The spec command line uses diff-lcs when --diff is specified.
46
+ * The spec command line uses heckle when --heckle is specified.
26
47
  * The Spec::Rake::SpecTask needs RCov if RCov is enabled in the task.
27
48
  * RSpec on Rails needs the ZenTest gem to be installed (and Rails and its dependencies of course)
28
49
 
data/Rakefile CHANGED
@@ -21,11 +21,9 @@ PKG_FILES = FileList[
21
21
  'lib/**/*.rb',
22
22
  'test/**/*.rb',
23
23
  'examples/**/*',
24
- 'vendor/watir/*.rb',
25
- 'vendor/watir/*.txt',
26
- 'vendor/selenium/*.rb',
27
- 'vendor/selenium/*.patch',
28
- 'vendor/selenium/*.txt'
24
+ File.dirname(__FILE__) + '../web_spec/**/*.rb',
25
+ File.dirname(__FILE__) + '../web_spec/**/*.txt',
26
+ File.dirname(__FILE__) + '../web_spec/**/*.patch'
29
27
  ]
30
28
 
31
29
  task :default => [:spec, :verify_rcov]
@@ -33,10 +31,16 @@ task :default => [:spec, :verify_rcov]
33
31
  desc "Run all specs"
34
32
  Spec::Rake::SpecTask.new do |t|
35
33
  t.spec_files = FileList['spec/**/*_spec.rb', 'vendor/RSpec.tmbundle/Support/spec/*_spec.rb']
36
- t.spec_opts = ['--diff','--color','--backtrace']
34
+ t.spec_opts = ['--color','--backtrace']
37
35
  t.rcov = true
38
- t.rcov_dir = 'doc/output/coverage'
39
- t.rcov_opts = ['--exclude', 'spec\/spec,bin\/spec,examples']
36
+ t.rcov_dir = '../doc/output/coverage'
37
+ t.rcov_opts = ['--exclude', 'spec\/spec,bin\/spec,bin\/drbspec,examples']
38
+ end
39
+
40
+ desc "Run all specs and store html output in doc/output/report.html"
41
+ Spec::Rake::SpecTask.new('spec_html') do |t|
42
+ t.spec_files = FileList['spec/**/*_spec.rb', 'vendor/RSpec.tmbundle/Support/spec/*_spec.rb']
43
+ t.spec_opts = ['--diff','--format html','--backtrace','--out ../doc/output/report.html']
40
44
  end
41
45
 
42
46
  desc "Run all failing examples"
@@ -48,26 +52,28 @@ desc 'Verify that no warnings occur'
48
52
  task :verify_warnings do
49
53
  `ruby -w #{File.dirname(__FILE__) + '/bin/spec'} --help 2> warnings.txt`
50
54
  warnings = File.open('warnings.txt').read
51
- File.rm 'warnings.txt'
55
+ File.rm 'warnings.txt' rescue nil
52
56
  raise "There were warnings:\n#{warnings}" if warnings =~ /warning/n
53
57
  end
54
58
 
55
59
  desc 'Generate HTML documentation for website'
56
60
  task :webgen do
57
- Dir.chdir 'doc' do
61
+ Dir.chdir '../doc' do
58
62
  output = nil
59
63
  IO.popen('webgen 2>&1') do |io|
60
64
  output = io.read
61
65
  end
62
66
  raise "ERROR while running webgen: #{output}" if output =~ /ERROR/n || $? != 0
63
67
  end
68
+ spec_page = File.open(File.dirname(__FILE__) + '/../doc/output/tools/spec.html').read
69
+ raise "It seems like the output in the generated documentation is broken" unless spec_page =~/\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\./m
64
70
  end
65
71
 
66
72
  desc 'Generate RDoc'
67
73
  rd = Rake::RDocTask.new do |rdoc|
68
- rdoc.rdoc_dir = 'doc/output/rdoc'
74
+ rdoc.rdoc_dir = '../doc/output/rdoc'
69
75
  rdoc.options << '--title' << 'RSpec' << '--line-numbers' << '--inline-source' << '--main' << 'README'
70
- rdoc.rdoc_files.include('README', 'CHANGES', 'EXAMPLES.rd', 'lib/**/*.rb')
76
+ rdoc.rdoc_files.include('README', 'CHANGES', 'MIT-LICENSE', 'EXAMPLES.rd', 'lib/**/*.rb')
71
77
  end
72
78
  task :rdoc => :examples_specdoc # We generate EXAMPLES.rd
73
79
 
@@ -89,13 +95,11 @@ spec = Gem::Specification.new do |s|
89
95
  s.rdoc_options = rd.options
90
96
  s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$|^EXAMPLES.rd$/ }.to_a
91
97
 
92
- s.test_files = Dir.glob('test/*_test.rb')
93
- s.require_path = 'lib'
94
98
  s.autorequire = 'spec'
95
- s.bindir = "bin"
96
- s.executables = ["spec"]
97
- s.default_executable = "spec"
98
- s.author = ["Steven Baker", "Aslak Hellesoy", "Dave Astels", "David Chelimsky", "Brian Takita"]
99
+ s.bindir = 'bin'
100
+ s.executables = ['spec', 'drbspec']
101
+ s.default_executable = 'spec'
102
+ s.author = ["RSpec Development Team"]
99
103
  s.email = "rspec-devel@rubyforge.org"
100
104
  s.homepage = "http://rspec.rubyforge.org"
101
105
  s.rubyforge_project = "rspec"
@@ -126,40 +130,10 @@ task :todo do
126
130
  end
127
131
 
128
132
  task :clobber do
129
- rm_rf 'doc/output'
130
- end
131
-
132
- desc "Touches files storing revisions so that svn will update $LastChangedRevision"
133
- task :touch_revision_storing_files do
134
- # See http://svnbook.red-bean.com/en/1.0/ch07s02.html - the section on svn:keywords
135
- files = [
136
- 'lib/spec/version.rb',
137
- 'vendor/rspec_on_rails/vendor/plugins/rspec/lib/spec/rails/version.rb'
138
- ]
139
- touch_needed = false
140
- IO.popen('svn stat') do |io|
141
- io.each_line do |line|
142
- if line =~ /^M\s*(.*)/
143
- touch_needed = !files.index($1)
144
- break if touch_needed
145
- end
146
- end
147
- end
148
-
149
- if touch_needed
150
- new_token = rand
151
- files.each do |path|
152
- abs_path = File.join(File.dirname(__FILE__), path)
153
- content = File.open(abs_path).read
154
- touched_content = content.gsub(/# RANDOM_TOKEN: (.*)\n/n, "# RANDOM_TOKEN: #{new_token}\n")
155
- File.open(abs_path, 'w') do |io|
156
- io.write touched_content
157
- end
158
- end
159
- end
133
+ rm_rf '../doc/output'
160
134
  end
161
135
 
162
- task :release => [:clobber, :verify_committed, :verify_user, :verify_password, :spec, :publish_packages, :tag, :publish_website, :publish_news]
136
+ task :release => [:clobber, :verify_committed, :verify_user, :spec, :publish_packages, :tag, :publish_website, :publish_news]
163
137
 
164
138
  desc "Verifies that there is no uncommitted code"
165
139
  task :verify_committed do
@@ -179,46 +153,25 @@ end
179
153
 
180
154
  desc "Run this task before you commit. You should see 'OK TO COMMIT'"
181
155
  task :pre_commit => [
182
- :touch_revision_storing_files,
183
156
  :verify_warnings,
184
- :website,
185
- :examples,
157
+ :website,
158
+ :examples,
186
159
  :failing_examples_with_html,
187
- :rails_pre_commit,
188
- :commit_ok]
189
-
190
- task :rails_pre_commit do
191
- Dir.chdir 'vendor/rspec_on_rails' do
192
- IO.popen("rake pre_commit --verbose") do |io|
193
- io.each do |line|
194
- puts line
195
- end
196
- end
197
- raise "RSpec on Rails pre_commit failed" if $? != 0
198
- end
199
- end
200
-
201
- task :commit_ok do |t|
202
- puts "OK TO COMMIT"
203
- end
160
+ ]
204
161
 
205
162
  desc "Build the website, but do not publish it"
206
- task :website => [:clobber, :verify_rcov, :webgen, :failing_examples_with_html, :spec, :examples_specdoc, :rdoc]
163
+ task :website => [:clobber, :verify_rcov, :spec_html, :webgen, :failing_examples_with_html, :examples_specdoc, :rdoc]
207
164
 
208
165
  task :verify_user do
209
166
  raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER']
210
167
  end
211
168
 
212
- task :verify_password do
213
- raise "RUBYFORGE_PASSWORD environment variable not set!" unless ENV['RUBYFORGE_PASSWORD']
214
- end
215
-
216
169
  desc "Upload Website to RubyForge"
217
170
  task :publish_website => [:verify_user, :website] do
218
171
  publisher = Rake::SshDirPublisher.new(
219
172
  "rspec-website@rubyforge.org",
220
173
  "/var/www/gforge-projects/#{PKG_NAME}",
221
- "doc/output"
174
+ "../doc/output"
222
175
  )
223
176
 
224
177
  publisher.upload
@@ -227,7 +180,7 @@ end
227
180
  desc "Package the RSpec.tmbundle"
228
181
  task :package_tmbundle => :pkg do
229
182
  rm_rf 'pkg/RSpec.tmbundle'
230
- `svn export vendor/RSpec.tmbundle pkg/RSpec.tmbundle`
183
+ `svn export ../RSpec.tmbundle pkg/RSpec.tmbundle`
231
184
  Dir.chdir 'pkg' do
232
185
  `tar cvzf RSpec-#{PKG_VERSION}.tmbundle.tgz RSpec.tmbundle`
233
186
  end
@@ -235,7 +188,7 @@ end
235
188
  task :package => :package_tmbundle
236
189
 
237
190
  desc "Publish gem+tgz+zip on RubyForge. You must make sure lib/version.rb is aligned with the CHANGELOG file"
238
- task :publish_packages => [:verify_user, :verify_password, :package] do
191
+ task :publish_packages => [:verify_user, :package] do
239
192
  require 'meta_project'
240
193
  require 'rake/contrib/xforge'
241
194
  release_files = FileList[
@@ -248,19 +201,17 @@ task :publish_packages => [:verify_user, :verify_password, :package] do
248
201
  Rake::XForge::Release.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |xf|
249
202
  # Never hardcode user name and password in the Rakefile!
250
203
  xf.user_name = ENV['RUBYFORGE_USER']
251
- xf.password = ENV['RUBYFORGE_PASSWORD']
252
204
  xf.files = release_files.to_a
253
205
  xf.release_name = "RSpec #{PKG_VERSION}"
254
206
  end
255
207
  end
256
208
 
257
209
  desc "Publish news on RubyForge"
258
- task :publish_news => [:verify_user, :verify_password] do
210
+ task :publish_news => [:verify_user] do
259
211
  require 'meta_project'
260
212
  require 'rake/contrib/xforge'
261
213
  Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |news|
262
214
  # Never hardcode user name and password in the Rakefile!
263
215
  news.user_name = ENV['RUBYFORGE_USER']
264
- news.password = ENV['RUBYFORGE_PASSWORD']
265
216
  end
266
217
  end
data/bin/drbspec ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/spec")
3
+ ::Spec::Runner::DrbCommandLine.run(ARGV, STDERR, STDOUT)
data/bin/spec CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- $LOAD_PATH.push File.dirname(__FILE__) + "/../lib"
3
- require File.expand_path(File.dirname(__FILE__) + "/../lib/spec") # better stack traces this way
2
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
3
+ require 'spec'
4
4
  ::Spec::Runner::CommandLine.run(ARGV, STDERR, STDOUT, true, true)
5
-
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
2
  require File.dirname(__FILE__) + '/file_accessor'
3
3
  require 'stringio'
4
4
 
@@ -0,0 +1,30 @@
1
+ # greeter.rb
2
+ #
3
+ # Based on http://glu.ttono.us/articles/2006/12/19/tormenting-your-tests-with-heckle
4
+ #
5
+ # Run with:
6
+ #
7
+ # spec greeter_spec.rb --heckle Greeter
8
+ #
9
+ class Greeter
10
+ def initialize(person = nil)
11
+ @person = person
12
+ end
13
+
14
+ def greet
15
+ @person.nil? ? "Hi there!" : "Hi #{@person}!"
16
+ end
17
+ end
18
+
19
+ context "Greeter" do
20
+ specify "should say Hi to person" do
21
+ greeter = Greeter.new("Kevin")
22
+ greeter.greet.should == "Hi Kevin!"
23
+ end
24
+
25
+ specify "should say Hi to nobody" do
26
+ greeter = Greeter.new
27
+ # Uncomment the next line to make Heckle happy
28
+ #greeter.greet.should == "Hi there!"
29
+ end
30
+ end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
3
  context "a context with helper a method" do
4
4
  def helper_method
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
2
  require File.dirname(__FILE__) + '/io_processor'
3
3
  require 'stringio'
4
4
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
3
  context "A consumer of a mock" do
4
4
  specify "should be able to send messages to the mock" do
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
3
  class MockableClass
4
4
  def self.find id
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
3
  class BddFramework
4
4
  def intuitive?
@@ -0,0 +1,34 @@
1
+ $global = 0
2
+
3
+ context "State created in context_setup" do
4
+ context_setup do
5
+ @sideeffect = 1
6
+ $global +=1
7
+ end
8
+
9
+ setup do
10
+ @isolated = 1
11
+ end
12
+
13
+ specify "should be accessible from spec" do
14
+ @sideeffect.should == 1
15
+ $global.should == 1
16
+ @isolated.should == 1
17
+
18
+ @sideeffect += 1
19
+ @isolated += 1
20
+ end
21
+
22
+ specify "should not have sideffects" do
23
+ @sideeffect.should == 1
24
+ $global.should == 1
25
+ @isolated.should == 1
26
+
27
+ @sideeffect += 1
28
+ @isolated += 1
29
+ end
30
+
31
+ context_teardown do
32
+ $global = 0
33
+ end
34
+ end
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + '/../lib/spec'
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
2
  require File.dirname(__FILE__) + "/stack"
3
3
 
4
4
  context "A stack which is neither empty nor full" do
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
3
  context "A consumer of a stub" do
4
4
  specify "should be able to stub methods on any Object" do
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
2
  require 'test/unit'
3
3
 
4
4
  class RSpecIntegrationTest < Test::Unit::TestCase
@@ -0,0 +1,60 @@
1
+ module Callback
2
+ class CallbackContainer
3
+ def initialize
4
+ @callback_registry = Hash.new do |hash, key|
5
+ hash[key] = Array.new
6
+ end
7
+ end
8
+
9
+ # Defines the callback with the key in this container.
10
+ def define(key, callback_proc=nil, &callback_block)
11
+ callback = extract_callback(callback_block, callback_proc) do
12
+ raise "You must define the callback that accepts the call method."
13
+ end
14
+ @callback_registry[key] << callback
15
+ callback
16
+ end
17
+
18
+ # Undefines the callback with the key in this container.
19
+ def undefine(key, callback_proc)
20
+ callback = extract_callback(callback_proc) do
21
+ raise "You may only undefine callbacks that use the call method."
22
+ end
23
+ @callback_registry[key].delete callback
24
+ callback
25
+ end
26
+
27
+ # Notifies the callbacks for the key. Arguments may be passed.
28
+ # An error handler may be passed in as a block. If there is an error, the block is called with
29
+ # error object as an argument.
30
+ # An array of the return values of the callbacks is returned.
31
+ def notify(key, *args, &error_handler)
32
+ @callback_registry[key].collect do |callback|
33
+ begin
34
+ callback.call(*args)
35
+ rescue Exception => e
36
+ yield(e) if error_handler
37
+ end
38
+ end
39
+ end
40
+
41
+ # Clears all of the callbacks in this container.
42
+ def clear
43
+ @callback_registry.clear
44
+ end
45
+
46
+ protected
47
+ def extract_callback(first_choice_callback, second_choice_callback = nil)
48
+ callback = nil
49
+ if first_choice_callback
50
+ callback = first_choice_callback
51
+ elsif second_choice_callback
52
+ callback = second_choice_callback
53
+ end
54
+ unless callback.respond_to? :call
55
+ yield
56
+ end
57
+ return callback
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,24 @@
1
+ module Callback
2
+ module ModuleMethods
3
+ # For each event_name submitted, defines a callback event with this name.
4
+ # Client code can then register as a callback listener using object.event_name.
5
+ def callback_events(*event_names)
6
+ event_names.each do |event_name|
7
+ define_callback_event(event_name)
8
+ end
9
+ end
10
+
11
+ private
12
+ def define_callback_event(event_name)
13
+ module_eval <<-EOS
14
+ def #{event_name}(&block)
15
+ register_callback(:#{event_name}, &block)
16
+ end
17
+ EOS
18
+ end
19
+ end
20
+ end
21
+
22
+ class Module
23
+ include Callback::ModuleMethods
24
+ end
@@ -0,0 +1,33 @@
1
+ module Callback
2
+ module InstanceMethods
3
+ # Registers a callback for the event on the object. The callback can either be a block or a proc.
4
+ # When the callbacks are notified, the return value of the proc is passed to the caller.
5
+ def register_callback(event, callback_proc=nil, &callback_block)
6
+ callbacks.define(event, callback_proc, &callback_block)
7
+ end
8
+
9
+ # Removes the callback from the event. The callback proc must be the same
10
+ # object as the one that was passed to register_callback.
11
+ def unregister_callback(event, callback_proc)
12
+ callbacks.undefine(event, callback_proc)
13
+ end
14
+
15
+ protected
16
+ # Notifies the callbacks registered with the event on the object. Arguments can be passed to the callbacks.
17
+ # An error handler may be passed in as a block. If there is an error, the block is called with
18
+ # error object as an argument.
19
+ # An array of the return values of the callbacks is returned.
20
+ def notify_callbacks(event, *args, &error_handler)
21
+ callbacks.notify(event, *args, &error_handler)
22
+ end
23
+
24
+ # The CallbackContainer for this object.
25
+ def callbacks
26
+ @callbacks ||= CallbackContainer.new
27
+ end
28
+ end
29
+ end
30
+
31
+ class Object
32
+ include Callback::InstanceMethods
33
+ end
@@ -0,0 +1,3 @@
1
+ require 'spec/callback/callback_container'
2
+ require 'spec/callback/extensions/module'
3
+ require 'spec/callback/extensions/object'