rspec 0.7.3 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/CHANGES +23 -1
  2. data/Rakefile +11 -9
  3. data/bin/spec +0 -1
  4. data/lib/spec.rb +1 -0
  5. data/lib/spec/callback.rb +3 -0
  6. data/lib/spec/callback/callback_container.rb +60 -0
  7. data/lib/spec/callback/extensions/module.rb +24 -0
  8. data/lib/spec/callback/extensions/object.rb +33 -0
  9. data/lib/spec/expectations/diff.rb +10 -14
  10. data/lib/spec/expectations/extensions.rb +1 -3
  11. data/lib/spec/expectations/extensions/numeric.rb +6 -1
  12. data/lib/spec/expectations/extensions/object.rb +72 -18
  13. data/lib/spec/expectations/should/base.rb +27 -5
  14. data/lib/spec/expectations/should/have.rb +2 -2
  15. data/lib/spec/expectations/should/should.rb +5 -4
  16. data/lib/spec/mocks/error_generator.rb +23 -12
  17. data/lib/spec/mocks/message_expectation.rb +4 -0
  18. data/lib/spec/mocks/mock_handler.rb +9 -8
  19. data/lib/spec/rake/spectask.rb +2 -1
  20. data/lib/spec/runner.rb +0 -1
  21. data/lib/spec/runner/backtrace_tweaker.rb +1 -0
  22. data/lib/spec/runner/context_eval.rb +1 -1
  23. data/lib/spec/runner/formatter/base_text_formatter.rb +1 -1
  24. data/lib/spec/runner/formatter/html_formatter.rb +94 -74
  25. data/lib/spec/runner/option_parser.rb +5 -1
  26. data/lib/spec/runner/specification.rb +64 -37
  27. data/lib/spec/version.rb +3 -3
  28. data/vendor/{selenium → web_spec/selenium}/README.txt +0 -0
  29. data/vendor/{selenium → web_spec/selenium}/find_rspecs_home_page.rb +0 -0
  30. data/vendor/{selenium → web_spec/selenium}/rspec_selenium.rb +0 -0
  31. data/vendor/{selenium → web_spec/selenium}/start_browser_once.patch +0 -0
  32. data/vendor/{watir → web_spec/watir}/README.txt +2 -2
  33. data/vendor/web_spec/watir/find_rspecs_home_page.rb +27 -0
  34. data/vendor/{watir → web_spec/watir}/find_rspecs_home_page.txt +0 -0
  35. data/vendor/{watir → web_spec/watir}/rspec_watir.rb +13 -12
  36. data/vendor/web_spec/web_test_html_formatter.rb +8 -0
  37. data/vendor/web_spec/web_test_html_formatter_helper.rb +26 -0
  38. data/vendor/web_spec/web_test_html_formatter_osx_helper.rb +19 -0
  39. data/vendor/web_spec/web_test_html_formatter_win_helper.rb +14 -0
  40. metadata +19 -14
  41. data/lib/spec/expectations/extensions/inspect_for_expectation_not_met_error.rb +0 -15
  42. data/lib/spec/expectations/extensions/symbol.rb +0 -5
  43. data/lib/spec/runner/extensions/object.rb +0 -21
  44. data/vendor/watir/find_rspecs_home_page.rb +0 -21
@@ -74,7 +74,11 @@ module Spec
74
74
  opts.on("-s", "--spec SPECIFICATION_NAME", "Execute context or specification with matching name") do |spec_name|
75
75
  options.spec_name = spec_name
76
76
  end
77
-
77
+
78
+ opts.on("-o", "--out OUTPUT_FILE", "Path to output file (defaults to STDOUT)") do |outfile|
79
+ options.out = File.new(outfile, 'w')
80
+ end
81
+
78
82
  opts.on("-l", "--line LINE_NUMBER", Integer, "Execute context or specification at given line") do |line_number|
79
83
  options.line_number = line_number.to_i
80
84
  end
@@ -1,68 +1,95 @@
1
1
  module Spec
2
2
  module Runner
3
3
  class Specification
4
-
5
- @@current_spec = nil
6
-
7
- def self.add_listener listener
8
- @@current_spec.add_listener listener unless @@current_spec.nil?
4
+ module ClassMethods
5
+ attr_accessor :current
6
+ protected :current=
7
+
8
+ callback_events :before_setup, :after_teardown
9
9
  end
10
-
10
+ extend ClassMethods
11
+
12
+ attr_reader :command
13
+ callback_events :before_setup, :after_teardown
14
+
11
15
  def initialize(name, opts={}, &block)
12
16
  @from = caller(0)[3]
13
17
  @name = name
14
18
  @options = opts
15
- @block = block
16
- @listeners = []
19
+ @command = block
17
20
  end
18
21
 
19
22
  def run(reporter, setup_block, teardown_block, dry_run, execution_context)
20
- reporter.spec_started(@name) unless reporter.nil?
23
+ reporter.spec_started(@name) if reporter
21
24
  return reporter.spec_finished(@name) if dry_run
22
- @@current_spec = self
23
- errors = []
24
- begin
25
- execution_context.instance_exec(&setup_block) unless setup_block.nil?
26
- setup_ok = true
27
- execution_context.instance_exec(&@block)
28
- spec_ok = true
29
- rescue => e
30
- errors << e
31
- end
32
25
 
26
+ errors = []
33
27
  begin
34
- execution_context.instance_exec(&teardown_block) unless teardown_block.nil?
35
- teardown_ok = true
36
- rescue => e
37
- errors << e
28
+ set_current
29
+ setup_ok = setup_spec(execution_context, errors, &setup_block)
30
+ spec_ok = execute_spec(execution_context, errors) if setup_ok
31
+ teardown_ok = teardown_spec(execution_context, errors, &teardown_block)
38
32
  ensure
39
- notify_after_teardown errors
40
- @@current_spec = nil
33
+ clear_current
41
34
  end
42
35
 
43
36
  SpecShouldRaiseHandler.new(@from, @options).handle(errors)
44
- reporter.spec_finished(@name, errors.first, failure_location(setup_ok, spec_ok, teardown_ok)) unless reporter.nil?
37
+ reporter.spec_finished(@name, errors.first, failure_location(setup_ok, spec_ok, teardown_ok)) if reporter
45
38
  end
46
39
 
47
40
  def matches_matcher?(matcher)
48
41
  matcher.matches? @name
49
42
  end
50
43
 
51
- def add_listener listener
52
- @listeners << listener
44
+ private
45
+ def setup_spec(execution_context, errors, &setup_block)
46
+ notify_before_setup(errors)
47
+ execution_context.instance_eval(&setup_block) if setup_block
48
+ return errors.empty?
49
+ rescue => e
50
+ errors << e
51
+ return false
53
52
  end
54
53
 
55
- def notify_after_teardown errors
56
- @listeners.each do |listener|
57
- begin
58
- listener.spec_finished(self) if listener.respond_to?(:spec_finished)
59
- rescue => e
60
- errors << e
61
- end
62
- end
54
+ def execute_spec(execution_context, errors)
55
+ execution_context.instance_eval(&command)
56
+ return true
57
+ rescue => e
58
+ errors << e
59
+ return false
60
+ end
61
+
62
+ def teardown_spec(execution_context, errors, &teardown_block)
63
+ execution_context.instance_eval(&teardown_block) if teardown_block
64
+ notify_after_teardown(errors)
65
+ return errors.empty?
66
+ rescue => e
67
+ errors << e
68
+ return false
69
+ end
70
+
71
+ def notify_before_setup(errors)
72
+ self.class.send(:notify_callbacks, :before_setup, self, &append_errors(errors))
73
+ notify_callbacks(:before_setup, self, &append_errors(errors))
74
+ end
75
+
76
+ def notify_after_teardown(errors)
77
+ notify_callbacks(:after_teardown, self, &append_errors(errors))
78
+ self.class.send(:notify_callbacks, :after_teardown, self, &append_errors(errors))
79
+ end
80
+
81
+ def append_errors(errors)
82
+ proc {|error| errors << error}
83
+ end
84
+
85
+ def set_current
86
+ self.class.send(:current=, self)
87
+ end
88
+
89
+ def clear_current
90
+ self.class.send(:current=, nil)
63
91
  end
64
92
 
65
- private
66
93
  def failure_location(setup_ok, spec_ok, teardown_ok)
67
94
  return 'setup' unless setup_ok
68
95
  return @name unless spec_ok
@@ -3,9 +3,9 @@ module Spec
3
3
  unless defined? MAJOR
4
4
  MAJOR = 0
5
5
  MINOR = 7
6
- TINY = 3
7
- # RANDOM_TOKEN: 0.690694587701409
8
- REV = "$LastChangedRevision: 1137 $".match(/LastChangedRevision: (\d+)/)[1]
6
+ TINY = 4
7
+ # RANDOM_TOKEN: 0.644898830762263
8
+ REV = "$LastChangedRevision: 1201 $".match(/LastChangedRevision: (\d+)/)[1]
9
9
 
10
10
  STRING = [MAJOR, MINOR, TINY].join('.')
11
11
  FULL_VERSION = "#{STRING} (r#{REV})"
@@ -22,9 +22,9 @@ and type:
22
22
 
23
23
  ruby find_rspecs_home_page.rb --format specdoc
24
24
 
25
- Or better:
25
+ Or better - if you want to generate a super-hot HTML report with screenshots:
26
26
 
27
- ruby find_rspecs_home_page.rb --format html > find_rspecs_home_page.html
27
+ spec find_rspecs_home_page.rb --require ../web_test_html_formatter.rb --format WebTestHtmlFormatter > report/report.html
28
28
 
29
29
  And upload find_rspecs_home_page.html to your project's web page or intranet.
30
30
  This will give immediate visibility to the intended behaviour of your web app,
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/rspec_watir'
2
+
3
+ context "Google's search page" do
4
+
5
+ setup do
6
+ @browser.goto('http://www.google.com')
7
+ end
8
+
9
+ specify "should find rspec's home page when I search for rspec" do
10
+ @browser.text_field(:name, "q").set("rspec")
11
+ @browser.button(:name, "btnG").click
12
+ @browser.contains_text("rspec.rubyforge.org").should_not_be nil # should_contain_text is RSpec sugar
13
+ end
14
+
15
+ specify "should find rspec's home page when I search for 'better than fudge' (will probably fail)" do
16
+ @browser.text_field(:name, "q").set("better than fudge")
17
+ @browser.button(:name, "btnG").click
18
+ @browser.contains_text("rspec.rubyforge.org").should_not_be nil
19
+ end
20
+
21
+ specify "should not find Ali G when I search for respec" do
22
+ @browser.text_field(:name, "q").set("respec")
23
+ @browser.button(:name, "btnG").click
24
+ @browser.contains_text("Ali G").should_be nil
25
+ end
26
+
27
+ end
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'spec'
3
- require 'watir'
3
+ require 'fileutils'
4
+ require File.dirname(__FILE__) + '/../web_test_html_formatter_helper'
4
5
 
5
6
  # Comment out to enable ActiveRecord fixtures
6
7
  #require 'active_record'
@@ -11,13 +12,22 @@ require 'watir'
11
12
  #ActiveRecord::Base.establish_connection(config['db'])
12
13
 
13
14
  class RSpecWatir
15
+ include WebTestHtmlFormatterHelper
16
+
17
+ @@img_dir = File.dirname(__FILE__) + '/report/images'
18
+ FileUtils.mkdir_p(@@img_dir) unless File.exist?(@@img_dir)
19
+ @@n = 1
20
+
14
21
  def setup
15
22
  #Fixtures.create_fixtures($fixture_path, @@fixtures)
16
- @browser = Watir::IE.new
23
+ @browser = Watir::Browser.new
17
24
  end
18
25
 
19
26
  def teardown
20
- @browser.close
27
+ save_screenshots(@@img_dir, @@n)
28
+ save_source(@@img_dir, @@n, @browser.html)
29
+ @@n += 1
30
+ @browser.close unless RUBY_PLATFORM =~ /darwin/
21
31
  end
22
32
 
23
33
  #def self.fixtures(*testdata)
@@ -34,12 +44,3 @@ module Spec
34
44
  end
35
45
  end
36
46
  end
37
-
38
- # Extensions to Watir to make it play nicer with RSpec
39
- module Watir
40
- class IE
41
- # @browser.should_contain("bla bla")
42
- # @browser.should_not_contain("bla bla")
43
- alias_method :contain?, :contains_text
44
- end
45
- end
@@ -0,0 +1,8 @@
1
+ # Customizes the HTML report to include screenshots and browser source, which
2
+ # are saved in teardown defined in rspec_watir.rb
3
+ class WebTestHtmlFormatter < Spec::Runner::Formatter::HtmlFormatter
4
+ def extra_failure_content
5
+ @output.puts " <div><a href=\"images/#{@current_count}.png\"><img src=\"images/#{@current_count}_thumb.png\"></a></div>"
6
+ @output.puts " <div><a href=\"images/#{@current_count}.html\">HTML source</a></div>"
7
+ end
8
+ end
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'RMagick'
3
+
4
+ # include this module in your spec and call +save_screenshot+ and +save_source+ from
5
+ # teardown.
6
+ module WebTestHtmlFormatterHelper
7
+ if RUBY_PLATFORM =~ /darwin/
8
+ require File.dirname(__FILE__) + '/web_test_html_formatter_osx_helper'
9
+ include WebTestHtmlFormatterOsxHelper
10
+ Watir::Browser = Watir::Safari
11
+ else
12
+ require File.dirname(__FILE__) + '/web_test_html_formatter_win_helper'
13
+ include WebTestHtmlFormatterWinHelper
14
+ Watir::Browser = Watir::IE
15
+ end
16
+
17
+ def save_thumb(img, dir, spec_number)
18
+ thumb = img.scale(0.25)
19
+ thumb_file = "#{dir}/#{spec_number}_thumb.png"
20
+ thumb.write(thumb_file)
21
+ end
22
+
23
+ def save_source(dir, spec_number, html)
24
+ File.open("#{dir}/#{spec_number}.html", "w") {|io| io.write(html)}
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'safariwatir'
3
+
4
+ module WebTestHtmlFormatterOsxHelper
5
+ def save_screenshots(dir, spec_number)
6
+ img_path = "#{dir}/#{spec_number}.png"
7
+ # How do we capture the current window??
8
+ `screencapture #{img_path}`
9
+
10
+ img = Magick::Image.read(img_path)[0]
11
+ save_thumb(img, dir, spec_number)
12
+ end
13
+ end
14
+
15
+ class Watir::AppleScripter
16
+ def document_html
17
+ execute(%|document.documentElement.innerHTML;|)
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require 'rubygems'
2
+ require 'win32screenshot'
3
+ require 'watir'
4
+
5
+ module WebTestHtmlFormatterWinHelper
6
+ def save_screenshots(dir, spec_number)
7
+ width, height, bmp = Win32::Screenshot.foreground
8
+
9
+ img = Magick::Image.from_blob(bmp)[0]
10
+ img_path = "#{dir}/#{spec_number}.png"
11
+ img.write(img_path)
12
+ save_thumb(img, dir, spec_number)
13
+ end
14
+ end
metadata CHANGED
@@ -3,9 +3,9 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: rspec
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.7.3
7
- date: 2006-11-25 00:00:00 +00:00
8
- summary: RSpec-0.7.3 (r1137) - BDD for Ruby http://rspec.rubyforge.org/
6
+ version: 0.7.4
7
+ date: 2006-12-02 00:00:00 +01:00
8
+ summary: RSpec-0.7.4 (r1201) - BDD for Ruby http://rspec.rubyforge.org/
9
9
  require_paths:
10
10
  - lib
11
11
  email: rspec-devel@rubyforge.org
@@ -39,20 +39,22 @@ files:
39
39
  - Rakefile
40
40
  - README
41
41
  - lib/spec.rb
42
+ - lib/spec/callback.rb
42
43
  - lib/spec/expectations.rb
43
44
  - lib/spec/mocks.rb
44
45
  - lib/spec/runner.rb
45
46
  - lib/spec/version.rb
47
+ - lib/spec/callback/callback_container.rb
48
+ - lib/spec/callback/extensions/module.rb
49
+ - lib/spec/callback/extensions/object.rb
46
50
  - lib/spec/expectations/diff.rb
47
51
  - lib/spec/expectations/errors.rb
48
52
  - lib/spec/expectations/extensions.rb
49
53
  - lib/spec/expectations/should.rb
50
54
  - lib/spec/expectations/sugar.rb
51
55
  - lib/spec/expectations/differs/default.rb
52
- - lib/spec/expectations/extensions/inspect_for_expectation_not_met_error.rb
53
56
  - lib/spec/expectations/extensions/numeric.rb
54
57
  - lib/spec/expectations/extensions/object.rb
55
- - lib/spec/expectations/extensions/symbol.rb
56
58
  - lib/spec/expectations/should/base.rb
57
59
  - lib/spec/expectations/should/change.rb
58
60
  - lib/spec/expectations/should/have.rb
@@ -84,7 +86,6 @@ files:
84
86
  - lib/spec/runner/spec_should_raise_handler.rb
85
87
  - lib/spec/runner/specification.rb
86
88
  - lib/spec/runner/extensions/kernel.rb
87
- - lib/spec/runner/extensions/object.rb
88
89
  - lib/spec/runner/formatter/base_text_formatter.rb
89
90
  - lib/spec/runner/formatter/html_formatter.rb
90
91
  - lib/spec/runner/formatter/progress_bar_formatter.rb
@@ -103,14 +104,18 @@ files:
103
104
  - examples/stack_spec.rb
104
105
  - examples/stubbing_example.rb
105
106
  - examples/test_case_spec.rb
106
- - vendor/watir/find_rspecs_home_page.rb
107
- - vendor/watir/rspec_watir.rb
108
- - vendor/watir/find_rspecs_home_page.txt
109
- - vendor/watir/README.txt
110
- - vendor/selenium/find_rspecs_home_page.rb
111
- - vendor/selenium/rspec_selenium.rb
112
- - vendor/selenium/start_browser_once.patch
113
- - vendor/selenium/README.txt
107
+ - vendor/web_spec/web_test_html_formatter.rb
108
+ - vendor/web_spec/web_test_html_formatter_helper.rb
109
+ - vendor/web_spec/web_test_html_formatter_osx_helper.rb
110
+ - vendor/web_spec/web_test_html_formatter_win_helper.rb
111
+ - vendor/web_spec/selenium/find_rspecs_home_page.rb
112
+ - vendor/web_spec/selenium/rspec_selenium.rb
113
+ - vendor/web_spec/watir/find_rspecs_home_page.rb
114
+ - vendor/web_spec/watir/rspec_watir.rb
115
+ - vendor/web_spec/selenium/README.txt
116
+ - vendor/web_spec/watir/find_rspecs_home_page.txt
117
+ - vendor/web_spec/watir/README.txt
118
+ - vendor/web_spec/selenium/start_browser_once.patch
114
119
  test_files: []
115
120
 
116
121
  rdoc_options:
@@ -1,15 +0,0 @@
1
- class Object
2
- def inspect_for_expectation_not_met_error
3
- return "#{inspect}" if inspect.include? "<"
4
- return "<#{inspect}>" unless inspect.include? "<"
5
- end
6
- end
7
- class TrueClass; def inspect_for_expectation_not_met_error; "true" end end
8
- class FalseClass; def inspect_for_expectation_not_met_error; "false" end end
9
- class NilClass; def inspect_for_expectation_not_met_error; "nil" end end
10
- class Class; def inspect_for_expectation_not_met_error; "<#{name}>" end end
11
- class Proc; def inspect_for_expectation_not_met_error; "<Proc>" end end
12
- class Array; def inspect_for_expectation_not_met_error; inspect end end
13
- class String; def inspect_for_expectation_not_met_error; inspect end end
14
- class Numeric; def inspect_for_expectation_not_met_error; inspect end end
15
- class Hash; def inspect_for_expectation_not_met_error; inspect end end
@@ -1,5 +0,0 @@
1
- class Symbol
2
- def supported_by_rspec?
3
- return ["<","<=",">=",">","==","=~"].include?(to_s)
4
- end
5
- end
@@ -1,21 +0,0 @@
1
- # http://eigenclass.org/hiki.rb?bounded+space+instance_exec
2
- class Object
3
- module InstanceExecHelper; end
4
- include InstanceExecHelper
5
- def instance_exec(*args, &block)
6
- begin
7
- old_critical, Thread.critical = Thread.critical, true
8
- n = 0
9
- n += 1 while respond_to?(mname="__instance_exec#{n}")
10
- InstanceExecHelper.module_eval{ define_method(mname, &block) }
11
- ensure
12
- Thread.critical = old_critical
13
- end
14
- begin
15
- ret = send(mname, *args)
16
- ensure
17
- InstanceExecHelper.module_eval{ remove_method(mname) } rescue nil
18
- end
19
- ret
20
- end
21
- end