rspec 0.5.2 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
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'