rspec 0.5.3 → 0.5.4

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 (100) hide show
  1. data/CHANGES +57 -32
  2. data/EXAMPLES.rd +0 -0
  3. data/Rakefile +22 -21
  4. data/bin/spec +9 -11
  5. data/doc/README +1 -3
  6. data/doc/plugin/syntax.rb +27 -5
  7. data/doc/src/core_team.page +22 -0
  8. data/doc/src/default.css +11 -11
  9. data/doc/src/default.template +0 -1
  10. data/doc/src/documentation/index.page +183 -8
  11. data/doc/src/documentation/meta.info +7 -7
  12. data/doc/src/documentation/mocks.page +168 -109
  13. data/doc/src/documentation/underscores.page +20 -0
  14. data/doc/src/examples.page +2 -1
  15. data/doc/src/images/David_and_Aslak.jpg +0 -0
  16. data/doc/src/images/Whats_That_Dude.jpg +0 -0
  17. data/doc/src/index.page +70 -3
  18. data/doc/src/meta.info +18 -11
  19. data/doc/src/tools/index.page +40 -134
  20. data/doc/src/tools/meta.info +9 -3
  21. data/doc/src/tools/rails.page +3 -1
  22. data/doc/src/tools/rake.page +20 -3
  23. data/doc/src/tools/rcov.page +19 -0
  24. data/doc/src/tools/spec.page +99 -0
  25. data/doc/src/tools/test2rspec.page +2 -4
  26. data/doc/src/tutorials/index.page +52 -0
  27. data/doc/src/tutorials/meta.info +31 -0
  28. data/doc/src/tutorials/notes.txt +252 -0
  29. data/doc/src/tutorials/stack.rb +11 -0
  30. data/doc/src/tutorials/stack_01.page +224 -0
  31. data/doc/src/tutorials/stack_02.page +180 -0
  32. data/doc/src/tutorials/stack_03.page +291 -0
  33. data/doc/src/tutorials/stack_04.page +203 -0
  34. data/doc/src/tutorials/stack_04.page.orig +123 -0
  35. data/doc/src/tutorials/stack_05.page +90 -0
  36. data/doc/src/tutorials/stack_05.page.orig +124 -0
  37. data/doc/src/tutorials/stack_06.page +359 -0
  38. data/doc/src/tutorials/stack_06.page.orig +359 -0
  39. data/doc/src/tutorials/stack_spec.rb +41 -0
  40. data/examples/airport_spec.rb +4 -4
  41. data/examples/{spec_framework_spec.rb → bdd_framework_spec.rb} +6 -7
  42. data/examples/mocking_spec.rb +0 -5
  43. data/examples/stack_spec.rb +6 -7
  44. data/examples/sugar_spec.rb +14 -0
  45. data/lib/spec/api.rb +5 -2
  46. data/lib/spec/api/helper/should_base.rb +17 -22
  47. data/lib/spec/api/helper/should_helper.rb +4 -3
  48. data/lib/spec/api/helper/should_negator.rb +3 -2
  49. data/lib/spec/api/mocks/argument_expectation.rb +104 -0
  50. data/lib/spec/api/{mock.rb → mocks/message_expectation.rb} +47 -96
  51. data/lib/spec/api/mocks/mock.rb +63 -0
  52. data/lib/spec/api/mocks/order_group.rb +21 -0
  53. data/lib/spec/api/sugar.rb +47 -0
  54. data/lib/spec/rake/rcov_verify.rb +45 -0
  55. data/lib/spec/rake/spectask.rb +41 -56
  56. data/lib/spec/runner.rb +4 -1
  57. data/lib/spec/runner/backtrace_tweaker.rb +24 -3
  58. data/lib/spec/runner/base_text_formatter.rb +28 -0
  59. data/lib/spec/runner/context.rb +21 -18
  60. data/lib/spec/runner/context_runner.rb +20 -31
  61. data/lib/spec/runner/execution_context.rb +3 -3
  62. data/lib/spec/runner/kernel_ext.rb +10 -1
  63. data/lib/spec/runner/option_parser.rb +32 -14
  64. data/lib/spec/runner/progress_bar_formatter.rb +21 -0
  65. data/lib/spec/runner/rdoc_formatter.rb +15 -5
  66. data/lib/spec/runner/reporter.rb +100 -0
  67. data/lib/spec/runner/specdoc_formatter.rb +20 -0
  68. data/lib/spec/runner/specification.rb +42 -22
  69. data/lib/spec/version.rb +1 -1
  70. data/test/rcov/rcov_testtask.rb +1 -0
  71. data/test/spec/api/duck_type_test.rb +4 -4
  72. data/test/spec/api/helper/raising_test.rb +37 -17
  73. data/test/spec/api/{mock_arg_constraints_test.rb → mocks/mock_arg_constraints_test.rb} +10 -4
  74. data/test/spec/api/mocks/mock_ordering_test.rb +62 -0
  75. data/test/spec/api/{mock_test.rb → mocks/mock_test.rb} +30 -7
  76. data/test/spec/api/mocks/null_object_test.rb +31 -0
  77. data/test/spec/api/sugar_test.rb +71 -0
  78. data/test/spec/runner/backtrace_tweaker_test.rb +52 -4
  79. data/test/spec/runner/context_runner_test.rb +41 -21
  80. data/test/spec/runner/context_test.rb +60 -32
  81. data/test/spec/runner/execution_context_test.rb +4 -3
  82. data/test/spec/runner/failure_dump_test.rb +92 -0
  83. data/test/spec/runner/kernel_ext_test.rb +1 -2
  84. data/test/spec/runner/option_parser_test.rb +48 -28
  85. data/test/spec/runner/progress_bar_formatter_test.rb +48 -0
  86. data/test/spec/runner/rdoc_formatter_test.rb +31 -4
  87. data/test/spec/runner/reporter_test.rb +103 -0
  88. data/test/spec/runner/specdoc_formatter_test.rb +50 -0
  89. data/test/spec/runner/specification_test.rb +49 -11
  90. data/test/test_helper.rb +1 -4
  91. metadata +46 -15
  92. data/doc/src/community.page +0 -7
  93. data/doc/src/documentation/api.page +0 -185
  94. data/doc/src/why_rspec.page +0 -7
  95. data/examples/empty_stack_spec.rb +0 -22
  96. data/examples/team_spec.rb +0 -30
  97. data/lib/spec/api/duck_type.rb +0 -16
  98. data/lib/spec/runner/simple_text_reporter.rb +0 -88
  99. data/test/rcov/rcov_verify.rb +0 -28
  100. data/test/spec/runner/simple_text_reporter_test.rb +0 -123
@@ -17,6 +17,7 @@ module RCov
17
17
  end
18
18
  @ruby_opts.unshift( "-I#{lib_path}" )
19
19
  @ruby_opts.unshift( "--exclude test.*.rb")
20
+ @ruby_opts.unshift( "--exclude lib.spec.sorted_find.rb")
20
21
  @ruby_opts.unshift( "-w" ) if @warning
21
22
  rcov @ruby_opts.join(" ") +
22
23
  " \"#{run_code}\" " +
@@ -5,13 +5,13 @@ module Spec
5
5
  class DuckTypeTest < Test::Unit::TestCase
6
6
 
7
7
  def test_should_talk_like_something_with_one_message_specified
8
- duck_type = DuckType.new(:length)
9
- assert(duck_type.walks_like? [])
8
+ duck_type = DuckTypeArgConstraint.new(:length)
9
+ assert duck_type.matches?([])
10
10
  end
11
11
 
12
12
  def test_should_talk_like_something_with_two_messages_specified
13
- duck_type = DuckType.new(:length, :empty?)
14
- assert(duck_type.walks_like? [])
13
+ duck_type = DuckTypeArgConstraint.new(:length, :empty?)
14
+ assert duck_type.matches?([])
15
15
  end
16
16
 
17
17
  end
@@ -3,39 +3,42 @@ require File.dirname(__FILE__) + '/../../../test_helper'
3
3
  module Spec
4
4
  module Api
5
5
  module Helper
6
- class RaisingTest < Test::Unit::TestCase
6
+ class ShouldRaiseTest < Test::Unit::TestCase
7
7
 
8
- # should.raise
9
-
10
- def test_should_raise_should_pass_when_proper_exception_is_raised
8
+ def test_should_raise_should_pass_when_exact_exception_is_raised
11
9
  assert_nothing_raised do
12
- proc { ''.nonexistant_method }.should.raise NoMethodError
10
+ proc { ''.nonexistent_method }.should.raise NoMethodError
13
11
  end
14
12
  end
15
13
 
16
- def test_should_raise_should_fail_when_wrong_exception_is_raised
17
- assert_raise(ExpectationNotMetError) do
18
- proc { ''.nonexistant_method }.should.raise SyntaxError
14
+ def test_should_raise_should_pass_when_subclass_exception_is_raised
15
+ assert_nothing_raised do
16
+ proc { ''.nonexistent_method }.should.raise
19
17
  end
20
18
  end
21
19
 
22
- def test_should_raise_should_fail_when_no_exception_is_raised
23
- assert_raise(ExpectationNotMetError) do
24
- proc {''.to_s}.should.raise NoMethodError
20
+ def test_should_raise_should_fail_when_wrong_exception_is_raised
21
+ begin
22
+ proc { ''.nonexistent_method }.should.raise SyntaxError
23
+ rescue => e
25
24
  end
25
+ assert_equal("<Proc> should raise <SyntaxError> but raised #<NoMethodError: undefined method `nonexistent_method' for \"\":String>", e.message)
26
26
  end
27
27
 
28
- # should.not.raise
29
-
30
- def test_should_not_raise_should_fail_when_specific_exception_is_raised
31
- assert_raise(ExpectationNotMetError) do
32
- proc { ''.nonexistant_method }.should.not.raise NoMethodError
28
+ def test_should_raise_should_fail_when_no_exception_is_raised
29
+ begin
30
+ proc { }.should.raise SyntaxError
31
+ rescue => e
33
32
  end
33
+ assert_equal("<Proc> should raise <SyntaxError> but raised nothing", e.message)
34
34
  end
35
+ end
36
+
37
+ class ShouldNotRaiseTest < Test::Unit::TestCase
35
38
 
36
39
  def test_should_not_raise_should_pass_when_other_exception_is_raised
37
40
  assert_nothing_raised do
38
- proc { ''.nonexistant_method }.should.not.raise SyntaxError
41
+ proc { ''.nonexistent_method }.should.not.raise SyntaxError
39
42
  end
40
43
  end
41
44
 
@@ -51,11 +54,28 @@ module Spec
51
54
  end
52
55
  end
53
56
 
57
+ def test_should_not_raise_should_fail_when_specific_exception_is_raised
58
+ begin
59
+ proc { ''.nonexistent_method }.should.not.raise NoMethodError
60
+ rescue => e
61
+ end
62
+ assert_equal("<Proc> should not raise <NoMethodError>", e.message)
63
+ end
64
+
65
+ def test_should_include_actual_error_in_failure_message
66
+ begin
67
+ proc { ''.nonexistent_method }.should.not.raise Exception
68
+ rescue => e
69
+ end
70
+ assert_equal("<Proc> should not raise <Exception> but raised #<NoMethodError: undefined method `nonexistent_method' for \"\":String>", e.message)
71
+ end
72
+
54
73
  def TODOtest_should_understand_raised_with_message_matching
55
74
  lambda do
56
75
  raise 'Hello'
57
76
  end.should.raise(StandardError).with.message.matching /ello/
58
77
  end
78
+
59
79
  end
60
80
  end
61
81
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../../test_helper'
1
+ require File.dirname(__FILE__) + '/../../../test_helper'
2
2
 
3
3
  module Spec
4
4
  module Api
@@ -44,14 +44,20 @@ module Spec
44
44
  @mock.__verify
45
45
  end
46
46
 
47
+ def test_should_match_non_special_symbol
48
+ @mock.should.receive(:random_call).with(:some_symbol)
49
+ @mock.random_call(:some_symbol)
50
+ @mock.__verify
51
+ end
52
+
47
53
  def test_should_process_duck_type_with_one_method
48
- @mock.should.receive(:random_call).with(DuckType.new(:length))
54
+ @mock.should.receive(:random_call).with(DuckTypeArgConstraint.new(:length))
49
55
  @mock.random_call([])
50
56
  @mock.__verify
51
57
  end
52
58
 
53
59
  def test_should_process_duck_type_with_two_methods
54
- @mock.should.receive(:random_call).with(DuckType.new(:abs, :div))
60
+ @mock.should.receive(:random_call).with(DuckTypeArgConstraint.new(:abs, :div))
55
61
  @mock.random_call(1)
56
62
  @mock.__verify
57
63
  end
@@ -89,7 +95,7 @@ module Spec
89
95
  end
90
96
 
91
97
  def test_should_reject_goose_when_expecting_a_duck
92
- @mock.should.receive(:random_call).with(DuckType.new(:abs, :div))
98
+ @mock.should.receive(:random_call).with(DuckTypeArgConstraint.new(:abs, :div))
93
99
  assert_raise(MockExpectationError) do
94
100
  @mock.random_call("I don't respond to :abs or :div")
95
101
  @mock.__verify
@@ -0,0 +1,62 @@
1
+ require File.dirname(__FILE__) + '/../../../test_helper'
2
+
3
+ module Spec
4
+ module Api
5
+
6
+ class MockTest < Test::Unit::TestCase
7
+
8
+ def setup
9
+ @mock = Mock.new("test mock")
10
+ end
11
+
12
+ def test_two_in_order_calls
13
+ @mock.should.receive(:one).ordered
14
+ @mock.should.receive(:two).ordered
15
+ @mock.one
16
+ @mock.two
17
+ @mock.__verify
18
+ end
19
+
20
+ def test_two_out_of_order_calls
21
+ @mock.should.receive(:one).ordered
22
+ @mock.should.receive(:two).ordered
23
+ assert_raise(MockExpectationError) do
24
+ @mock.two
25
+ end
26
+ end
27
+
28
+ def test_three_linear_calls
29
+ @mock.should.receive(:one).ordered
30
+ @mock.should.receive(:two).ordered
31
+ @mock.should.receive(:three).ordered
32
+ @mock.one
33
+ @mock.two
34
+ @mock.three
35
+ @mock.__verify
36
+ end
37
+
38
+ def test_three_out_of_order_calls
39
+ @mock.should.receive(:one).ordered
40
+ @mock.should.receive(:two).ordered
41
+ @mock.should.receive(:three).ordered
42
+ @mock.one
43
+ assert_raise(MockExpectationError) do
44
+ @mock.three
45
+ end
46
+ end
47
+
48
+ def test_two_ordered_calls_with_others_between
49
+ @mock.should.receive(:zero)
50
+ @mock.should.receive(:one).ordered
51
+ @mock.should.receive(:two).ordered
52
+ @mock.should.receive(:one_and_a_half)
53
+ @mock.one
54
+ @mock.one_and_a_half
55
+ @mock.zero
56
+ @mock.two
57
+ @mock.__verify
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../../test_helper'
1
+ require File.dirname(__FILE__) + '/../../../test_helper'
2
2
 
3
3
  module Spec
4
4
  module Api
@@ -59,12 +59,6 @@ module Spec
59
59
  }
60
60
  end
61
61
 
62
- def test_should_allow_unexpected_methods_if_ignore_missing_set
63
- m = Mock.new("null_object", :null_object=>true)
64
- m.random_call("a","d","c")
65
- m.__verify
66
- end
67
-
68
62
  # TODO: rename to should_raise_exception_telling_what_message_was_not_received
69
63
  def test_should_raise_exception_on_verify_if_call_counts_not_as_expected
70
64
  @mock.should.receive(:random_call).twice.with("a","b","c").and.return("booh")
@@ -305,6 +299,35 @@ module Spec
305
299
  end
306
300
  end
307
301
 
302
+ def test_should_yield_values
303
+ @mock.should.receive(:yield_back).with(:no_args).once.and.yield('wha', 'zup')
304
+ a, b = nil
305
+ @mock.yield_back {|a,b|}
306
+ a.should.equal 'wha'
307
+ b.should.equal 'zup'
308
+ @mock.__verify
309
+ end
310
+
311
+ def test_should_fail_when_calling_yielding_method_with_wrong_arity
312
+ @mock.should.receive(:yield_back).with(:no_args).once.and.yield('wha', 'zup')
313
+ assert_raise(MockExpectationError) do
314
+ @mock.yield_back {|a|}
315
+ end
316
+ end
317
+
318
+ def test_should_fail_when_calling_yielding_method_without_block
319
+ @mock.should.receive(:yield_back).with(:no_args).once.and.yield('wha', 'zup')
320
+ assert_raise(MockExpectationError) do
321
+ @mock.yield_back
322
+ end
323
+ end
324
+
325
+ def test_should_be_able_to_mock_object_methods_such_as_send
326
+ @mock.should.receive(:send).with(:any_args)
327
+ @mock.send 'hi'
328
+ @mock.__verify
329
+ end
330
+
308
331
  end
309
332
  end
310
333
  end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/../../../test_helper'
2
+
3
+ module Spec
4
+ module Api
5
+
6
+ class NullObjectTest < Test::Unit::TestCase
7
+
8
+ def setup
9
+ @mock = Mock.new("null_object", :null_object=>true)
10
+ end
11
+
12
+ def test_should_ignore_unexpected_methods
13
+ @mock.random_call("a","d","c")
14
+ @mock.__verify
15
+ end
16
+
17
+ def test_should_handle_passing_expectation
18
+ @mock.should_receive(:something)
19
+ @mock.something
20
+ @mock.__verify
21
+ end
22
+
23
+ def test_should_handle_failing_expectation
24
+ assert_raises(MockExpectationError) do
25
+ @mock.should_receive(:something)
26
+ @mock.__verify
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,71 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+
3
+ module Spec
4
+ module Api
5
+ class SugarTest < Test::Unit::TestCase
6
+
7
+ def test_should_allow_underscored_shoulds_on_regular_objects
8
+ 1.should_equal 1
9
+ lambda { 1.should_not_equal 1 }.should_raise
10
+ end
11
+
12
+ def test_should_allow_underscored_shoulds_on_mocks
13
+ sweetener = Mock.new "sweetener"
14
+ sweetener.should_receive(:natural?)
15
+ sweetener.natural?
16
+ sweetener.__verify
17
+ end
18
+
19
+ def test_should_allow_underscored_ats_on_mocks
20
+ sweetener = Mock.new "sweetener"
21
+ sweetener.should_receive(:natural?).at_least(:once)
22
+ sweetener.natural?
23
+ sweetener.__verify
24
+ end
25
+
26
+ def test_should_allow_underscored_ands_on_mocks
27
+ sweetener = Mock.new "sweetener"
28
+ sweetener.should_receive(:natural?).at_least(:once).and_return(true)
29
+ natural = sweetener.natural?
30
+ natural.should_be true
31
+ sweetener.__verify
32
+ end
33
+
34
+ def test_should_allow_underscored_anys_on_mocks
35
+ sweetener = Mock.new "sweetener"
36
+ sweetener.should_receive(:natural?).any_number_of_times
37
+ sweetener.natural?
38
+ sweetener.__verify
39
+ end
40
+
41
+ def test_should_allow_underscored_anys_on_mocks
42
+ sweetener = Mock.new "sweetener"
43
+ sweetener.should_receive(:natural?).once_and_return(false)
44
+ natural = sweetener.natural?
45
+ natural.should_be false
46
+ sweetener.__verify
47
+ end
48
+
49
+ def test_should_allow_multi_word_predicates_in_passing_specs
50
+ subject = ClassWithMultiWordPredicate.new
51
+ assert_nothing_raised do
52
+ subject.should_be_multi_word_predicate
53
+ end
54
+ end
55
+
56
+ def test_should_allow_multi_word_predicates_in_failing_specs
57
+ subject = ClassWithMultiWordPredicate.new
58
+ assert_raises(ExpectationNotMetError) do
59
+ subject.should_not_be_multi_word_predicate
60
+ end
61
+ end
62
+
63
+ end
64
+
65
+ class ClassWithMultiWordPredicate
66
+ def multi_word_predicate?
67
+ true
68
+ end
69
+ end
70
+ end
71
+ end
@@ -4,25 +4,73 @@ module Spec
4
4
  class BacktraceTweakerTest < Test::Unit::TestCase
5
5
  def setup
6
6
  @error = RuntimeError.new
7
- @tweaker = BacktraceTweaker.new
7
+ @tweaker = NoisyBacktraceTweaker.new
8
8
  end
9
9
 
10
10
  def test_should_not_barf_on_nil_backtrace
11
11
  proc { @tweaker.tweak_backtrace @error, 'spec name' }.should.not.raise
12
12
  end
13
13
 
14
- def test_should_remove___instance_exec
14
+ def test_should_replace___instance_exec_with_spec_name
15
15
  @error.set_backtrace ["./examples/airport_spec.rb:28:in `__instance_exec_1014688_1661744'"]
16
16
  @tweaker.tweak_backtrace @error, 'spec name'
17
17
  @error.backtrace[0].should.equal "./examples/airport_spec.rb:28:in `spec name'"
18
18
  end
19
+
20
+ def test_should_leave_anything_in_api_dir_in_full_backtrace_mode
21
+ @error.set_backtrace ["/lib/spec/api/anything.rb"]
22
+ @tweaker.tweak_backtrace @error, 'spec name'
23
+ @error.backtrace[0].should.equal "/lib/spec/api/anything.rb"
24
+ end
25
+
26
+ def test_should_leave_anything_in_runner_dir_in_full_backtrace_mode
27
+ @error.set_backtrace ["/lib/spec/runner/anything.rb"]
28
+ @tweaker.tweak_backtrace @error, 'spec name'
29
+ @error.backtrace.should.not.be.empty
30
+ end
31
+
32
+ def test_should_leave_bin_spec
33
+ @error.set_backtrace ["bin/spec:"]
34
+ @tweaker.tweak_backtrace @error, 'spec name'
35
+ @error.backtrace.should.not.be.empty
36
+ end
19
37
 
20
- def test_should_remove_helpers
38
+ end
39
+
40
+ class QuietBacktraceTweakerTest < Test::Unit::TestCase
41
+ def setup
21
42
  @error = RuntimeError.new
22
- @error.set_backtrace ["/lib/spec/api/helper/any_helper.rb"]
43
+ @tweaker = QuietBacktraceTweaker.new
44
+ end
45
+
46
+ def test_should_not_barf_on_nil_backtrace
47
+ proc { @tweaker.tweak_backtrace @error, 'spec name' }.should.not.raise
48
+ end
49
+
50
+ def test_should_replace___instance_exec_with_spec_name
51
+ @error.set_backtrace ["./examples/airport_spec.rb:28:in `__instance_exec_1014688_1661744'"]
52
+ @tweaker.tweak_backtrace @error, 'spec name'
53
+ @error.backtrace[0].should.equal "./examples/airport_spec.rb:28:in `spec name'"
54
+ end
55
+
56
+ def test_should_remove_anything_in_api_dir
57
+ @error.set_backtrace ["/lib/spec/api/anything.rb"]
58
+ @tweaker.tweak_backtrace @error, 'spec name'
59
+ @error.backtrace.should.be.empty
60
+ end
61
+
62
+ def test_should_remove_anything_in_runner_dir
63
+ @error.set_backtrace ["/lib/spec/runner/anything.rb"]
64
+ @tweaker.tweak_backtrace @error, 'spec name'
65
+ @error.backtrace.should.be.empty
66
+ end
67
+
68
+ def test_should_remove_bin_spec
69
+ @error.set_backtrace ["bin/spec:"]
23
70
  @tweaker.tweak_backtrace @error, 'spec name'
24
71
  @error.backtrace.should.be.empty
25
72
  end
73
+
26
74
  end
27
75
  end
28
76
  end