rspec 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. data/CHANGES +10 -2
  2. data/Rakefile +22 -30
  3. data/doc/src/default.css +11 -10
  4. data/doc/src/documentation/api.page +15 -82
  5. data/doc/src/documentation/mocks.page +12 -55
  6. data/doc/src/meta.info +4 -1
  7. data/examples/airport_spec.rb +0 -1
  8. data/examples/empty_stack_spec.rb +1 -0
  9. data/examples/stack_spec.rb +1 -0
  10. data/examples/team_spec.rb +30 -0
  11. data/lib/spec/api.rb +1 -0
  12. data/lib/spec/api/duck_type.rb +16 -0
  13. data/lib/spec/api/expectations.rb +4 -4
  14. data/lib/spec/api/mock.rb +1 -0
  15. data/lib/spec/runner/backtrace_tweaker.rb +1 -2
  16. data/lib/spec/runner/context.rb +2 -3
  17. data/lib/spec/runner/context_runner.rb +2 -2
  18. data/lib/spec/runner/execution_context.rb +4 -0
  19. data/lib/spec/runner/option_parser.rb +3 -2
  20. data/lib/spec/runner/simple_text_reporter.rb +11 -25
  21. data/lib/spec/runner/specification.rb +1 -2
  22. data/lib/spec/version.rb +1 -1
  23. data/test/{rake → rcov}/rcov_testtask.rb +4 -4
  24. data/test/rcov/rcov_verify.rb +28 -0
  25. data/test/spec/api/duck_type_test.rb +19 -0
  26. data/test/spec/api/mock_arg_constraints_test.rb +20 -0
  27. data/test/spec/runner/backtrace_tweaker_test.rb +16 -8
  28. data/test/spec/runner/context_runner_test.rb +3 -3
  29. data/test/spec/runner/context_test.rb +2 -2
  30. data/test/spec/runner/execution_context_test.rb +7 -0
  31. data/test/spec/runner/option_parser_test.rb +12 -2
  32. data/test/spec/runner/simple_text_reporter_test.rb +18 -47
  33. data/test/spec/runner/specification_test.rb +5 -5
  34. data/test/spec/tool/command_line_test.rb +0 -1
  35. data/test/test_helper.rb +1 -0
  36. metadata +9 -7
  37. data/doc/src/download.page +0 -7
@@ -7,7 +7,6 @@ module Spec
7
7
  @block = block
8
8
  @mocks = []
9
9
  @errors = []
10
- @calling_line = caller(0)[2].split(":in")[0]
11
10
  end
12
11
 
13
12
  def run(reporter=nil, setup_block=nil, teardown_block=nil)
@@ -28,7 +27,7 @@ module Spec
28
27
  @errors << e
29
28
  end
30
29
 
31
- reporter.add_spec(@name, @calling_line, @errors) unless reporter.nil?
30
+ reporter.add_spec(@name, @errors) unless reporter.nil?
32
31
  end
33
32
 
34
33
  def run_docs(reporter)
@@ -3,7 +3,7 @@ module Spec
3
3
  unless defined? MAJOR
4
4
  MAJOR = 0
5
5
  MINOR = 5
6
- TINY = 2
6
+ TINY = 3
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY].join('.')
9
9
 
@@ -1,9 +1,9 @@
1
- module Rake
2
- class TestTask < TaskLib
1
+ module RCov
2
+ class TestTask < Rake::TestTask
3
3
  def define
4
4
  lib_path = @libs.join(File::PATH_SEPARATOR)
5
- desc "Run tests" + (@name==:test ? "" : " for #{@name}")
6
- task @name do
5
+ desc "Run tests with rcov"
6
+ task 'test_with_rcov' do
7
7
  run_code = ''
8
8
  RakeFileUtils.verbose(@verbose) do
9
9
  run_code =
@@ -0,0 +1,28 @@
1
+ module RCov
2
+ class VerifyTask < Rake::TaskLib
3
+ attr_accessor :name
4
+ attr_accessor :index_html
5
+ attr_accessor :threshold
6
+
7
+ def initialize(name=:rcov_verify)
8
+ @name = name
9
+ yield self if block_given?
10
+ raise "Threshold must be set" if @threshold.nil?
11
+ define
12
+ end
13
+
14
+ def define
15
+ desc "Verify that rcov coverage is at least #{threshold}"
16
+ task @name do
17
+ total_coverage = nil
18
+ File.open(index_html).each_line do |line|
19
+ if line =~ /<tt>(\d+\.\d+)%<\/tt>&nbsp;<\/td>/
20
+ total_coverage = eval($1)
21
+ break
22
+ end
23
+ end
24
+ raise "Coverage must be at least #{threshold}% but was #{total_coverage}%" if total_coverage < threshold
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+
3
+ module Spec
4
+ module Api
5
+ class DuckTypeTest < Test::Unit::TestCase
6
+
7
+ def test_should_talk_like_something_with_one_message_specified
8
+ duck_type = DuckType.new(:length)
9
+ assert(duck_type.walks_like? [])
10
+ end
11
+
12
+ def test_should_talk_like_something_with_two_messages_specified
13
+ duck_type = DuckType.new(:length, :empty?)
14
+ assert(duck_type.walks_like? [])
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -44,6 +44,18 @@ module Spec
44
44
  @mock.__verify
45
45
  end
46
46
 
47
+ def test_should_process_duck_type_with_one_method
48
+ @mock.should.receive(:random_call).with(DuckType.new(:length))
49
+ @mock.random_call([])
50
+ @mock.__verify
51
+ end
52
+
53
+ def test_should_process_duck_type_with_two_methods
54
+ @mock.should.receive(:random_call).with(DuckType.new(:abs, :div))
55
+ @mock.random_call(1)
56
+ @mock.__verify
57
+ end
58
+
47
59
  end
48
60
 
49
61
  class FailingConstraintsTest < Test::Unit::TestCase
@@ -76,6 +88,14 @@ module Spec
76
88
  end
77
89
  end
78
90
 
91
+ def test_should_reject_goose_when_expecting_a_duck
92
+ @mock.should.receive(:random_call).with(DuckType.new(:abs, :div))
93
+ assert_raise(MockExpectationError) do
94
+ @mock.random_call("I don't respond to :abs or :div")
95
+ @mock.__verify
96
+ end
97
+ end
98
+
79
99
  end
80
100
  end
81
101
  end
@@ -2,18 +2,26 @@ require File.dirname(__FILE__) + '/../../test_helper'
2
2
  module Spec
3
3
  module Runner
4
4
  class BacktraceTweakerTest < Test::Unit::TestCase
5
+ def setup
6
+ @error = RuntimeError.new
7
+ @tweaker = BacktraceTweaker.new
8
+ end
9
+
5
10
  def test_should_not_barf_on_nil_backtrace
6
- error = RuntimeError.new
7
- tweaker = BacktraceTweaker.new
8
- proc { tweaker.tweak_backtrace error, 'spec name' }.should.not.raise
11
+ proc { @tweaker.tweak_backtrace @error, 'spec name' }.should.not.raise
9
12
  end
10
13
 
11
14
  def test_should_remove___instance_exec
12
- error = RuntimeError.new
13
- error.set_backtrace ["./examples/airport_spec.rb:28:in `__instance_exec_1014688_1661744'"]
14
- tweaker = BacktraceTweaker.new
15
- tweaker.tweak_backtrace error, 'spec name'
16
- error.backtrace[0].should.equal "./examples/airport_spec.rb:28:in `spec name'"
15
+ @error.set_backtrace ["./examples/airport_spec.rb:28:in `__instance_exec_1014688_1661744'"]
16
+ @tweaker.tweak_backtrace @error, 'spec name'
17
+ @error.backtrace[0].should.equal "./examples/airport_spec.rb:28:in `spec name'"
18
+ end
19
+
20
+ def test_should_remove_helpers
21
+ @error = RuntimeError.new
22
+ @error.set_backtrace ["/lib/spec/api/helper/any_helper.rb"]
23
+ @tweaker.tweak_backtrace @error, 'spec name'
24
+ @error.backtrace.should.be.empty
17
25
  end
18
26
  end
19
27
  end
@@ -1,4 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../../test_helper'
2
+
2
3
  module Spec
3
4
  module Runner
4
5
  class ContextRunnerTest < Test::Unit::TestCase
@@ -21,19 +22,18 @@ module Spec
21
22
  context2 = Api::Mock.new "context2"
22
23
  context1.should.receive(:run)
23
24
  context2.should.receive(:run)
24
- runner = ContextRunner.new [], false, StringIO.new
25
+ runner = ContextRunner.new ["-o","stringio"], false, StringIO.new
25
26
  runner.add_context context1
26
27
  runner.add_context context2
27
28
  runner.run
28
29
  context1.__verify
29
30
  context2.__verify
30
31
  end
31
-
32
32
 
33
33
  def test_should_call_run_for_standalone
34
34
  context1 = Api::Mock.new "context1"
35
35
  context1.should.receive(:run)
36
- runner = ContextRunner.standalone context1
36
+ runner = ContextRunner.standalone context1, ["-o","stringio"]
37
37
  context1.__verify
38
38
  end
39
39
 
@@ -10,7 +10,7 @@ module Spec
10
10
  end
11
11
 
12
12
  def test_should_add_itself_to_listener_on_run
13
- @listener.should.receive(:add_context).with "context", :anything
13
+ @listener.should.receive(:add_context).with "context"
14
14
  @context.run(@listener)
15
15
  @listener.__verify
16
16
  end
@@ -23,7 +23,7 @@ module Spec
23
23
 
24
24
  def test_spec
25
25
  @listener.should.receive(:add_context).with :any_args
26
- @listener.should.receive(:add_spec).with "test", :anything, :anything
26
+ @listener.should.receive(:add_spec).with "test", :anything
27
27
  $spec_ran = false
28
28
  @context.specify("test") {$spec_ran = true}
29
29
  @context.run(@listener)
@@ -15,6 +15,13 @@ module Spec
15
15
  ExecutionContext.new(nil).violated
16
16
  end
17
17
  end
18
+
19
+ def test_duck_type
20
+ ec = ExecutionContext.new(Api::Mock.new("spec", :null_object => true))
21
+ duck_type = ec.duck_type(:length)
22
+ assert(duck_type.is_a? Api::DuckType)
23
+ assert(duck_type.walks_like? [])
24
+ end
18
25
  end
19
26
  end
20
27
  end
@@ -1,5 +1,4 @@
1
1
  require File.dirname(__FILE__) + '/../../test_helper'
2
- require 'stringio'
3
2
 
4
3
  module Spec
5
4
  module Runner
@@ -10,11 +9,17 @@ module Spec
10
9
  @err = StringIO.new
11
10
  end
12
11
 
13
- def test_should_print_version
12
+ def test_should_print_version_to_stdout
14
13
  options = OptionParser.parse(["--version"], false, @err, @out)
15
14
  @out.rewind
16
15
  assert_match(/RSpec-\d+\.\d+\.\d+ - BDD for Ruby\nhttp:\/\/rspec.rubyforge.org\/\n/n, @out.read)
17
16
  end
17
+
18
+ def test_should_print_help_to_stdout
19
+ options = OptionParser.parse(["--help"], false, @err, @out)
20
+ @out.rewind
21
+ assert_match(/Usage: spec \[options\] \(FILE\|DIRECTORY\)\+/n, @out.read)
22
+ end
18
23
 
19
24
  def test_verbose_should_be_true_by_default
20
25
  options = OptionParser.parse([], false, @err, @out)
@@ -60,6 +65,11 @@ module Spec
60
65
  options = OptionParser.parse([], false, @err, @out)
61
66
  assert_match(/Usage: spec/, @err.string)
62
67
  end
68
+
69
+ def test_out_should_be_stringio_if_set_to_stringio
70
+ options = OptionParser.parse(["-o","stringio"], false, @err, @out)
71
+ options.out.should.be.an.instance.of StringIO
72
+ end
63
73
  end
64
74
  end
65
75
  end
@@ -1,5 +1,4 @@
1
1
  require File.dirname(__FILE__) + '/../../test_helper'
2
- require 'stringio'
3
2
 
4
3
  module Spec
5
4
  module Runner
@@ -25,21 +24,21 @@ module Spec
25
24
  end
26
25
 
27
26
  def test_should_account_for_context_in_stats_for_pass
28
- @reporter.add_context "context", "calling line"
27
+ @reporter.add_context "context"
29
28
  @reporter.dump
30
29
  assert_match(/1 context, 0 specifications, 0 failures/, @io.string)
31
30
  end
32
31
 
33
32
  def test_should_account_for_spec_in_stats_for_pass
34
- @reporter.add_spec Specification.new("spec"), "calling line", {}
33
+ @reporter.add_spec Specification.new("spec"), {}
35
34
  @reporter.dump
36
35
  assert_match(/0 contexts, 1 specification, 0 failures/, @io.string)
37
36
  end
38
37
 
39
38
  def test_should_account_for_spec_and_error_in_stats_for_pass
40
39
  @backtrace_tweaker.should.receive(:tweak_backtrace)
41
- @reporter.add_context "context", "calling line"
42
- @reporter.add_spec Specification.new("spec"), "calling line", [RuntimeError.new]
40
+ @reporter.add_context "context"
41
+ @reporter.add_spec Specification.new("spec"), [RuntimeError.new]
43
42
  @reporter.dump
44
43
  assert_match(/1 context, 1 specification, 1 failure/, @io.string)
45
44
  end
@@ -54,59 +53,31 @@ module Spec
54
53
 
55
54
  def test_should_handle_multiple_specs_same_name
56
55
  @backtrace_tweaker.should.receive(:tweak_backtrace)
57
- @reporter.add_context "context", "calling line"
58
- @reporter.add_spec "spec", "calling line"
59
- @reporter.add_spec "spec", "calling line", [RuntimeError.new]
60
- @reporter.add_context "context", "calling line"
61
- @reporter.add_spec "spec", "calling line"
62
- @reporter.add_spec "spec", "calling line", [RuntimeError.new]
56
+ @reporter.add_context "context"
57
+ @reporter.add_spec "spec"
58
+ @reporter.add_spec "spec", [RuntimeError.new]
59
+ @reporter.add_context "context"
60
+ @reporter.add_spec "spec"
61
+ @reporter.add_spec "spec", [RuntimeError.new]
63
62
  @reporter.dump
64
63
  assert_match(/2 contexts, 4 specifications, 2 failures/, @io.string)
65
64
  end
66
65
 
67
66
  def test_should_delegate_to_backtrace_tweaker
68
67
  @backtrace_tweaker.should.receive(:tweak_backtrace)
69
- @reporter.add_context "context", "calling line"
70
- @reporter.add_spec "spec", "calling line", [RuntimeError.new]
68
+ @reporter.add_context "context"
69
+ @reporter.add_spec "spec", [RuntimeError.new]
71
70
  @backtrace_tweaker.__verify
72
71
  end
73
72
 
74
73
  end
75
-
76
- class FailureDumpTest < Test::Unit::TestCase
77
-
78
- def setup
79
- @io = StringIO.new
80
- @reporter = SimpleTextReporter.new(@io)
81
- @reporter.add_context "failing context", "calling line for context"
82
- @reporter.add_spec "failing spec", "calling line for spec", [RuntimeError.new]
83
- @reporter.dump
84
- end
85
-
86
- def test_should_include_context
87
- assert_match(/failing context/, @io.string)
88
- end
89
-
90
- def test_should_include_context_calling_line
91
- assert_match(/\[calling line for context\]/, @io.string)
92
- end
93
-
94
- def test_should_include_spec
95
- assert_match(/failing spec/, @io.string)
96
- end
97
-
98
- def test_should_include_spec_calling_line
99
- assert_match(/[calling line for spec]/, @io.string)
100
- end
101
-
102
- end
103
74
 
104
75
  class SimpleTextReporterQuietOutputTest < Test::Unit::TestCase
105
76
 
106
77
  def setup
107
78
  @io = StringIO.new
108
79
  @reporter = SimpleTextReporter.new(@io)
109
- @reporter.add_context "context", "calling line for context"
80
+ @reporter.add_context "context"
110
81
  end
111
82
 
112
83
  def test_should_remain_silent_when_context_name_provided
@@ -114,12 +85,12 @@ module Spec
114
85
  end
115
86
 
116
87
  def test_should_output_dot_when_spec_passed
117
- @reporter.add_spec "spec", "calling line"
88
+ @reporter.add_spec "spec"
118
89
  assert_equal("\n.", @io.string)
119
90
  end
120
91
 
121
92
  def test_should_output_F_when_spec_failed
122
- @reporter.add_spec "spec", "calling line", [RuntimeError.new]
93
+ @reporter.add_spec "spec", [RuntimeError.new]
123
94
  assert_equal("\nF", @io.string)
124
95
  end
125
96
 
@@ -130,7 +101,7 @@ module Spec
130
101
  def setup
131
102
  @io = StringIO.new
132
103
  @reporter = SimpleTextReporter.new(@io, true)
133
- @reporter.add_context "context", "calling line for context"
104
+ @reporter.add_context "context"
134
105
  end
135
106
 
136
107
  def test_should_output_when_context_name_provided
@@ -138,12 +109,12 @@ module Spec
138
109
  end
139
110
 
140
111
  def test_should_output_spec_name_when_spec_passed
141
- @reporter.add_spec "spec", "calling line"
112
+ @reporter.add_spec "spec"
142
113
  assert_match(/- spec\n/, @io.string)
143
114
  end
144
115
 
145
116
  def test_should_output_failure_when_spec_failed
146
- @reporter.add_spec "spec", "calling line", [RuntimeError.new]
117
+ @reporter.add_spec "spec", [RuntimeError.new]
147
118
  assert_match(/spec \(FAILED - 1\)/, @io.string)
148
119
  end
149
120
 
@@ -12,20 +12,20 @@ module Spec
12
12
  self.should.not.be.instance_of Specification
13
13
  self.should.be.instance_of ExecutionContext
14
14
  end
15
- @reporter.should.receive(:add_spec).with "should pass", :anything, []
15
+ @reporter.should.receive(:add_spec).with "should pass", []
16
16
  spec.run @reporter
17
17
  end
18
18
 
19
19
  def test_should_add_itself_to_reporter_when_passes
20
20
  spec = Specification.new("spec") {}
21
- @reporter.should.receive(:add_spec).with "spec", :anything, []
21
+ @reporter.should.receive(:add_spec).with "spec", []
22
22
  spec.run(@reporter)
23
23
  end
24
24
 
25
25
  def test_should_add_itself_to_reporter_when_fails
26
26
  error = RuntimeError.new
27
27
  spec = Specification.new("spec") { raise error }
28
- @reporter.should.receive(:add_spec).with "spec", :anything, [error]
28
+ @reporter.should.receive(:add_spec).with "spec", [error]
29
29
  spec.run(@reporter)
30
30
  end
31
31
 
@@ -40,7 +40,7 @@ module Spec
40
40
  mock = mock("a mock")
41
41
  mock.should.receive(:poke)
42
42
  end
43
- @reporter.should.receive(:add_spec) do |spec_name, calling_line, errors|
43
+ @reporter.should.receive(:add_spec) do |spec_name, errors|
44
44
  spec_name.should.equal "spec"
45
45
  errors[0].message.should.match /expected poke once, but received it 0 times/
46
46
  end
@@ -54,7 +54,7 @@ module Spec
54
54
  teardown = lambda do
55
55
  raise "in teardown"
56
56
  end
57
- @reporter.should.receive(:add_spec) do |spec, calling_line, errors|
57
+ @reporter.should.receive(:add_spec) do |spec, errors|
58
58
  errors.length.should.equal 2
59
59
  errors[0].message.should.equal "in body"
60
60
  errors[1].message.should.equal "in teardown"
@@ -1,6 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../../test_helper'
2
2
  require 'spec/tool/command_line'
3
- require 'stringio'
4
3
 
5
4
  module Spec
6
5
  module Tool
@@ -1,4 +1,5 @@
1
1
  require 'test/unit'
2
+ require 'stringio'
2
3
  $LOAD_PATH.push File.dirname(__FILE__) + '/../lib'
3
4
  $LOAD_PATH.push File.dirname(__FILE__) + '/../test'
4
5
  require 'spec'