rspec 0.7.5.1 → 0.8.0

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 (194) hide show
  1. data/CHANGES +60 -1
  2. data/EXAMPLES.rd +38 -19
  3. data/MIT-LICENSE +1 -1
  4. data/README +24 -17
  5. data/RELEASE-PLAN +117 -0
  6. data/Rakefile +24 -18
  7. data/TODO.0.8.0 +5 -0
  8. data/examples/auto_spec_name_generation_example.rb +18 -0
  9. data/examples/custom_expectation_matchers.rb +53 -0
  10. data/examples/dynamic_spec.rb +9 -0
  11. data/examples/io_processor_spec.rb +2 -2
  12. data/examples/mocking_example.rb +4 -4
  13. data/examples/partial_mock_example.rb +2 -2
  14. data/examples/predicate_example.rb +2 -2
  15. data/examples/stack_spec.rb +32 -36
  16. data/examples/stubbing_example.rb +19 -19
  17. data/examples/test_case_spec.rb +6 -6
  18. data/lib/spec.rb +3 -0
  19. data/lib/spec/callback.rb +8 -0
  20. data/lib/spec/callback/extensions/object.rb +4 -0
  21. data/lib/spec/deprecated.rb +3 -0
  22. data/lib/spec/expectations.rb +44 -17
  23. data/lib/spec/expectations/extensions.rb +1 -2
  24. data/lib/spec/expectations/extensions/object.rb +78 -130
  25. data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  26. data/lib/spec/expectations/handler.rb +47 -0
  27. data/lib/spec/expectations/should/base.rb +32 -29
  28. data/lib/spec/expectations/should/change.rb +1 -1
  29. data/lib/spec/expectations/should/have.rb +9 -17
  30. data/lib/spec/expectations/should/not.rb +54 -56
  31. data/lib/spec/expectations/should/should.rb +59 -65
  32. data/lib/spec/expectations/sugar.rb +27 -4
  33. data/lib/spec/matchers.rb +160 -0
  34. data/lib/spec/matchers/be.rb +161 -0
  35. data/lib/spec/matchers/be_close.rb +37 -0
  36. data/lib/spec/matchers/change.rb +120 -0
  37. data/lib/spec/matchers/eql.rb +43 -0
  38. data/lib/spec/matchers/equal.rb +43 -0
  39. data/lib/spec/matchers/has.rb +44 -0
  40. data/lib/spec/matchers/have.rb +140 -0
  41. data/lib/spec/matchers/include.rb +50 -0
  42. data/lib/spec/matchers/match.rb +41 -0
  43. data/lib/spec/matchers/raise_error.rb +100 -0
  44. data/lib/spec/matchers/respond_to.rb +35 -0
  45. data/lib/spec/matchers/satisfy.rb +47 -0
  46. data/lib/spec/matchers/throw_symbol.rb +75 -0
  47. data/lib/spec/mocks.rb +224 -1
  48. data/lib/spec/mocks/argument_expectation.rb +16 -2
  49. data/lib/spec/mocks/error_generator.rb +5 -3
  50. data/lib/spec/mocks/errors.rb +2 -2
  51. data/lib/spec/mocks/extensions/object.rb +1 -1
  52. data/lib/spec/mocks/message_expectation.rb +29 -19
  53. data/lib/spec/mocks/{mock_methods.rb → methods.rb} +5 -5
  54. data/lib/spec/mocks/mock.rb +2 -2
  55. data/lib/spec/mocks/mock_handler.rb +81 -68
  56. data/lib/spec/rake/spectask.rb +7 -12
  57. data/lib/spec/rake/verify_rcov.rb +1 -1
  58. data/lib/spec/runner.rb +117 -0
  59. data/lib/spec/runner/command_line.rb +8 -5
  60. data/lib/spec/runner/context.rb +13 -37
  61. data/lib/spec/runner/context_eval.rb +4 -3
  62. data/lib/spec/runner/context_runner.rb +7 -4
  63. data/lib/spec/runner/drb_command_line.rb +1 -1
  64. data/lib/spec/runner/execution_context.rb +3 -11
  65. data/lib/spec/runner/extensions/kernel.rb +7 -5
  66. data/lib/spec/runner/extensions/object.rb +4 -1
  67. data/lib/spec/runner/formatter/base_text_formatter.rb +11 -3
  68. data/lib/spec/runner/formatter/html_formatter.rb +21 -10
  69. data/lib/spec/runner/heckle_runner.rb +24 -8
  70. data/lib/spec/runner/heckle_runner_win.rb +10 -0
  71. data/lib/spec/runner/option_parser.rb +58 -13
  72. data/lib/spec/runner/spec_matcher.rb +22 -29
  73. data/lib/spec/runner/spec_parser.rb +1 -0
  74. data/lib/spec/runner/specification.rb +36 -22
  75. data/lib/spec/translator.rb +87 -0
  76. data/lib/spec/version.rb +16 -7
  77. data/spec/spec/callback/callback_container_spec.rb +27 -0
  78. data/spec/spec/callback/module_spec.rb +37 -0
  79. data/spec/spec/callback/object_spec.rb +90 -0
  80. data/spec/spec/callback/object_with_class_callback_spec.rb +19 -0
  81. data/spec/spec/expectations/differs/default_spec.rb +107 -0
  82. data/spec/spec/expectations/extensions/object_spec.rb +46 -0
  83. data/spec/spec/expectations/fail_with_spec.rb +71 -0
  84. data/spec/spec/expectations/should/should_==_spec.rb +19 -0
  85. data/spec/spec/expectations/should/should_=~_spec.rb +13 -0
  86. data/spec/spec/expectations/should/should_be_a_kind_of_spec.rb +21 -0
  87. data/spec/spec/expectations/should/should_be_an_instance_of_spec.rb +30 -0
  88. data/spec/spec/expectations/should/should_be_arbitrary_predicate_spec.rb +81 -0
  89. data/spec/spec/expectations/should/should_be_close_spec.rb +18 -0
  90. data/spec/spec/expectations/should/should_be_comparison_operator_spec.rb +44 -0
  91. data/spec/spec/expectations/should/should_be_false_spec.rb +39 -0
  92. data/spec/spec/expectations/should/should_be_spec.rb +11 -0
  93. data/spec/spec/expectations/should/should_be_true_spec.rb +27 -0
  94. data/spec/spec/expectations/should/should_change_spec.rb +184 -0
  95. data/spec/spec/expectations/should/should_eql_spec.rb +11 -0
  96. data/spec/spec/expectations/should/should_equal_spec.rb +11 -0
  97. data/spec/spec/expectations/should/should_have_at_least_spec.rb +53 -0
  98. data/spec/spec/expectations/should/should_have_at_most_spec.rb +45 -0
  99. data/spec/spec/expectations/should/should_have_key_spec.rb +21 -0
  100. data/spec/spec/expectations/should/should_have_spec.rb +64 -0
  101. data/spec/spec/expectations/should/should_include_spec.rb +59 -0
  102. data/spec/spec/expectations/should/should_match_spec.rb +25 -0
  103. data/spec/spec/expectations/should/should_not_==_spec.rb +15 -0
  104. data/spec/spec/expectations/should/should_not_be_a_kind_of_spec.rb +21 -0
  105. data/spec/spec/expectations/should/should_not_be_an_instance_of_spec.rb +11 -0
  106. data/spec/spec/expectations/should/should_not_be_arbitrary_predicate_spec.rb +68 -0
  107. data/spec/spec/expectations/should/should_not_be_spec.rb +11 -0
  108. data/spec/spec/expectations/should/should_not_change_spec.rb +24 -0
  109. data/spec/spec/expectations/should/should_not_eql_spec.rb +11 -0
  110. data/spec/spec/expectations/should/should_not_equal_spec.rb +11 -0
  111. data/spec/spec/expectations/should/should_not_have_key_spec.rb +15 -0
  112. data/spec/spec/expectations/should/should_not_include_spec.rb +58 -0
  113. data/spec/spec/expectations/should/should_not_match_spec.rb +11 -0
  114. data/spec/spec/expectations/should/should_not_raise_spec.rb +75 -0
  115. data/spec/spec/expectations/should/should_not_respond_to_spec.rb +15 -0
  116. data/spec/spec/expectations/should/should_not_throw_spec.rb +35 -0
  117. data/spec/spec/expectations/should/should_raise_spec.rb +66 -0
  118. data/spec/spec/expectations/should/should_respond_to_spec.rb +15 -0
  119. data/spec/spec/expectations/should/should_satisfy_spec.rb +35 -0
  120. data/spec/spec/expectations/should/should_throw_spec.rb +27 -0
  121. data/spec/spec/matchers/be_close_spec.rb +33 -0
  122. data/spec/spec/matchers/be_spec.rb +182 -0
  123. data/spec/spec/matchers/change_spec.rb +232 -0
  124. data/spec/spec/matchers/description_generation_spec.rb +147 -0
  125. data/spec/spec/matchers/eql_spec.rb +41 -0
  126. data/spec/spec/matchers/equal_spec.rb +41 -0
  127. data/spec/spec/matchers/handler_spec.rb +75 -0
  128. data/spec/spec/matchers/has_spec.rb +37 -0
  129. data/spec/spec/matchers/have_spec.rb +259 -0
  130. data/spec/spec/matchers/include_spec.rb +33 -0
  131. data/spec/spec/matchers/match_spec.rb +37 -0
  132. data/spec/spec/matchers/matcher_methods_spec.rb +85 -0
  133. data/spec/spec/matchers/raise_error_spec.rb +147 -0
  134. data/spec/spec/matchers/respond_to_spec.rb +30 -0
  135. data/spec/spec/matchers/satisfy_spec.rb +36 -0
  136. data/spec/spec/matchers/throw_symbol_spec.rb +59 -0
  137. data/spec/spec/mocks/any_number_of_times_spec.rb +34 -0
  138. data/spec/spec/mocks/at_least_spec.rb +97 -0
  139. data/spec/spec/mocks/at_most_spec.rb +97 -0
  140. data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
  141. data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
  142. data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
  143. data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
  144. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +74 -0
  145. data/spec/spec/mocks/mock_ordering_spec.rb +80 -0
  146. data/spec/spec/mocks/mock_spec.rb +407 -0
  147. data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
  148. data/spec/spec/mocks/null_object_mock_spec.rb +40 -0
  149. data/spec/spec/mocks/once_counts_spec.rb +56 -0
  150. data/spec/spec/mocks/options_hash_spec.rb +31 -0
  151. data/spec/spec/mocks/partial_mock_spec.rb +52 -0
  152. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +64 -0
  153. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +92 -0
  154. data/spec/spec/mocks/precise_counts_spec.rb +56 -0
  155. data/spec/spec/mocks/record_messages_spec.rb +26 -0
  156. data/spec/spec/mocks/stub_spec.rb +159 -0
  157. data/spec/spec/mocks/twice_counts_spec.rb +67 -0
  158. data/spec/spec/runner/command_line_spec.rb +32 -0
  159. data/spec/spec/runner/context_matching_spec.rb +28 -0
  160. data/spec/spec/runner/context_runner_spec.rb +100 -0
  161. data/spec/spec/runner/context_spec.rb +405 -0
  162. data/spec/spec/runner/drb_command_line_spec.rb +74 -0
  163. data/spec/spec/runner/execution_context_spec.rb +52 -0
  164. data/spec/spec/runner/formatter/html_formatter_spec.rb +40 -0
  165. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +21 -0
  166. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +36 -0
  167. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +78 -0
  168. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +18 -0
  169. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +41 -0
  170. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +21 -0
  171. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +46 -0
  172. data/spec/spec/runner/heckle_runner_spec.rb +63 -0
  173. data/spec/spec/runner/heckler_spec.rb +14 -0
  174. data/spec/spec/runner/kernel_ext_spec.rb +16 -0
  175. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
  176. data/spec/spec/runner/object_ext_spec.rb +11 -0
  177. data/spec/spec/runner/option_parser_spec.rb +269 -0
  178. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +47 -0
  179. data/spec/spec/runner/reporter_spec.rb +126 -0
  180. data/spec/spec/runner/spec_matcher_spec.rb +107 -0
  181. data/spec/spec/runner/spec_name_generation_spec.rb +102 -0
  182. data/spec/spec/runner/spec_parser_spec.rb +37 -0
  183. data/spec/spec/runner/specification_class_spec.rb +72 -0
  184. data/spec/spec/runner/specification_instance_spec.rb +160 -0
  185. data/spec/spec/runner/specification_should_raise_spec.rb +136 -0
  186. data/spec/spec/spec_classes.rb +102 -0
  187. data/spec/spec/translator_spec.rb +79 -0
  188. data/spec/spec_helper.rb +35 -0
  189. metadata +141 -9
  190. data/bin/drbspec +0 -3
  191. data/lib/spec/expectations/diff.rb +0 -28
  192. data/lib/spec/expectations/extensions/numeric.rb +0 -19
  193. data/lib/spec/expectations/extensions/string.rb +0 -22
  194. data/lib/spec/expectations/message_builder.rb +0 -13
@@ -0,0 +1,107 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Runner
5
+ module SpecMatcherSpecHelper
6
+ class MatchDescription
7
+ def initialize(description)
8
+ @description = description
9
+ end
10
+
11
+ def matches?(matcher)
12
+ matcher.matches?(@description)
13
+ end
14
+
15
+ def failure_message
16
+ "expected matcher.matches?(#{@description.inspect}) to return true, got false"
17
+ end
18
+
19
+ def negative_failure_message
20
+ "expected matcher.matches?(#{@description.inspect}) to return false, got true"
21
+ end
22
+ end
23
+ def match_description(description)
24
+ MatchDescription.new(description)
25
+ end
26
+ end
27
+
28
+ context "SpecMatcher" do
29
+ include SpecMatcherSpecHelper
30
+
31
+ specify "should match correct context and spec" do
32
+ matcher=SpecMatcher.new("context", "spec")
33
+ matcher.should match_description("context spec")
34
+ end
35
+
36
+ specify "should not match wrong spec" do
37
+ matcher=SpecMatcher.new("context", "other spec")
38
+ matcher.should_not match_description("context spec")
39
+ end
40
+
41
+ specify "should not match wrong context" do
42
+ matcher=SpecMatcher.new("other context", "spec")
43
+ matcher.should_not match_description("context spec")
44
+ end
45
+
46
+ specify "should match spec only" do
47
+ matcher=SpecMatcher.new("context", "spec")
48
+ matcher.should match_description("spec")
49
+ end
50
+
51
+ specify "should match context only" do
52
+ matcher=SpecMatcher.new("context", "spec")
53
+ matcher.should match_description("context")
54
+ end
55
+
56
+ specify "should escape regexp chars" do
57
+ matcher=SpecMatcher.new("(con|text)", "[spec]")
58
+ matcher.should_not match_description("con p")
59
+ end
60
+
61
+ # specify "should match context only" do
62
+ # matcher=SpecMatcher.new("context", "a context")
63
+ # matcher.should match_description("a context")
64
+ # end
65
+ #
66
+ # specify "should match spec only" do
67
+ # matcher=SpecMatcher.new("with a spec", "a context")
68
+ # matcher.should match_description("with a spec")
69
+ # end
70
+
71
+ # specify "should match with regexp reserved (characters) in the spec" do
72
+ # matcher=SpecMatcher.new("with ([#]) a spec", "a context")
73
+ # matcher.should match_description("a context")
74
+ # matcher.should match_description("with ([#]) a spec")
75
+ # matcher.should match_description("a context with ([#]) a spec")
76
+ # end
77
+ #
78
+ # specify "should match with regexp reserved (characters) in the context" do
79
+ # matcher=SpecMatcher.new("with a spec", "a ([#]) context")
80
+ # matcher.should match_description("a ([#]) context with a spec")
81
+ # matcher.should match_description("a ([#]) context with a spec")
82
+ # matcher.should match_description("a ([#]) context with a spec")
83
+ # end
84
+
85
+ # specify "should not match wrong spec only" do
86
+ # matcher=SpecMatcher.new("with another spec", "a context")
87
+ # matcher.should_not match_description("with a spec")
88
+ # end
89
+ #
90
+ # specify "should not match wrong context" do
91
+ # matcher=SpecMatcher.new("another context with a spec", "a context")
92
+ # matcher.should_not match_description("with a spec")
93
+ # end
94
+ #
95
+ # specify "should not match wrong context only" do
96
+ # matcher=SpecMatcher.new("another context", "a context")
97
+ # matcher.should_not match_description("with a spec")
98
+ # end
99
+ #
100
+ # specify "should not match wrong spec" do
101
+ # matcher=SpecMatcher.new("a context with another spec", "a context")
102
+ # matcher.should_not match_description("with a spec")
103
+ # end
104
+
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,102 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Runner
5
+ module SpecNameSpecHelper
6
+ def run_spec
7
+ @spec.run(reporter, nil, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
8
+ end
9
+
10
+ def reporter
11
+ @reporter ||= mock("reporter")
12
+ end
13
+
14
+ def spec_class
15
+ @spec_class ||= generate_spec_class
16
+ end
17
+
18
+ def generate_spec_class
19
+ callback_container = Callback::CallbackContainer.new
20
+ spec_class = Specification.dup
21
+ spec_class.stub!(:callbacks).and_return {callback_container}
22
+ spec_class
23
+ end
24
+ end
25
+
26
+ # context "Specification with given name" do
27
+ # include SpecNameSpecHelper
28
+ # setup do
29
+ # @spec = spec_class.new("given name")
30
+ # end
31
+ #
32
+ # specify "should start spec with given name" do
33
+ # reporter.stub!(:spec_finished)
34
+ # reporter.should_receive(:spec_started).with("given name")
35
+ # run_spec
36
+ # end
37
+ #
38
+ # specify "should finish spec with given name" do
39
+ # reporter.stub!(:spec_started)
40
+ # reporter.should_receive(:spec_finished).with("given name", :anything, :anything)
41
+ # run_spec
42
+ # end
43
+ # end
44
+ #
45
+ # context "Specification with given name and error" do
46
+ # include SpecNameSpecHelper
47
+ # setup do
48
+ # @spec = spec_class.new("given name") { raise }
49
+ # end
50
+ #
51
+ # specify "should start spec with given name" do
52
+ # reporter.stub!(:spec_finished)
53
+ # reporter.should_receive(:spec_started).with("given name")
54
+ # run_spec
55
+ # end
56
+ #
57
+ # specify "should finish spec with given name" do
58
+ # reporter.stub!(:spec_started)
59
+ # reporter.should_receive(:spec_finished).with("given name", :anything, :anything)
60
+ # run_spec
61
+ # end
62
+ # end
63
+
64
+ context "Specification with generated name" do
65
+ include SpecNameSpecHelper
66
+ setup do
67
+ @spec = spec_class.new(:__generate_description) { 5.should == 5 }
68
+ end
69
+
70
+ # specify "should start spec with given name" do
71
+ # reporter.stub!(:spec_finished)
72
+ # reporter.should_receive(:spec_started).with("NAME NOT GENERATED")
73
+ # run_spec
74
+ # end
75
+
76
+ specify "should finish spec with given name" do
77
+ reporter.stub!(:spec_started)
78
+ reporter.should_receive(:spec_finished).with("should == 5", :anything, :anything)
79
+ run_spec
80
+ end
81
+ end
82
+
83
+ # context "Specification with generated name and error" do
84
+ # include SpecNameSpecHelper
85
+ # setup do
86
+ # @spec = spec_class.new(:__generate_description) { raise }
87
+ # end
88
+ #
89
+ # specify "should start spec with given name" do
90
+ # reporter.stub!(:spec_finished)
91
+ # reporter.should_receive(:spec_started).with("NAME NOT GENERATED")
92
+ # run_spec
93
+ # end
94
+ #
95
+ # specify "should finish spec with given name" do
96
+ # reporter.stub!(:spec_started)
97
+ # reporter.should_receive(:spec_finished).with("NAME NOT GENERATED", :anything, :anything)
98
+ # run_spec
99
+ # end
100
+ # end
101
+ end
102
+ end
@@ -0,0 +1,37 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ context "c" do
4
+
5
+ specify "1" do
6
+ end
7
+
8
+ specify "2" do
9
+ end
10
+
11
+ end
12
+
13
+ context "SpecParser" do
14
+ setup do
15
+ @p = Spec::Runner::SpecParser.new
16
+ end
17
+
18
+ specify "should find spec name at same line" do
19
+ @p.spec_name_for(File.open(__FILE__), 5).should_eql "c 1"
20
+ end
21
+
22
+ specify "should find spec name at end of spec line" do
23
+ @p.spec_name_for(File.open(__FILE__), 6).should_eql "c 1"
24
+ end
25
+
26
+ specify "should find context name above all specs" do
27
+ @p.spec_name_for(File.open(__FILE__), 4).should_eql "c"
28
+ end
29
+
30
+ # specify "should find context name between specs" do
31
+ # @p.spec_name_for(File.open(__FILE__), 7).should_eql "c"
32
+ # end
33
+
34
+ specify "should find nothing outside a context" do
35
+ @p.spec_name_for(File.open(__FILE__), 2).should_be_nil
36
+ end
37
+ end
@@ -0,0 +1,72 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Runner
5
+ context "A Specification class" do
6
+ setup do
7
+ @reporter = mock("reporter")
8
+ callback_container = Callback::CallbackContainer.new
9
+ @specification = Specification.dup
10
+ @specification.stub!(:callbacks).and_return {callback_container}
11
+ end
12
+
13
+ specify "should have a before_setup callback for all specs" do
14
+ @reporter.stub!(:spec_started)
15
+ @reporter.stub!(:spec_finished)
16
+
17
+ before_setup_called = false
18
+ @specification.before_setup {before_setup_called = true}
19
+
20
+ spec = @specification.new("spec") {}
21
+ spec.run(@reporter, nil, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
22
+
23
+ before_setup_called.should == true
24
+ end
25
+
26
+ specify "should have before_setup callback add errors to spec run" do
27
+ error=Exception.new
28
+ @specification.before_setup do
29
+ raise(error)
30
+ end
31
+ spec=@specification.new("spec") {}
32
+ @reporter.should_receive(:spec_started).with("spec")
33
+ @reporter.should_receive(:spec_finished).with("spec", error, "setup")
34
+ spec.run(@reporter, nil, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
35
+ end
36
+
37
+ specify "should report exceptions in spec" do
38
+ error = Exception.new
39
+ spec=@specification.new("spec") do
40
+ raise(error)
41
+ end
42
+ @reporter.should_receive(:spec_started).with("spec")
43
+ @reporter.should_receive(:spec_finished).with("spec", error, "spec")
44
+ spec.run(@reporter, nil, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
45
+ end
46
+
47
+ specify "should have an after_teardown callback for all specs" do
48
+ @reporter.stub!(:spec_started)
49
+ @reporter.stub!(:spec_finished)
50
+
51
+ after_teardown_called = false
52
+ @specification.after_teardown {after_teardown_called = true}
53
+
54
+ spec = @specification.new("spec") {}
55
+ spec.run(@reporter, nil, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
56
+
57
+ after_teardown_called.should == true
58
+ end
59
+
60
+ specify "should have after_teardown callback add errors to spec run" do
61
+ error=Exception.new
62
+ @specification.after_teardown do
63
+ raise(error)
64
+ end
65
+ spec=@specification.new("spec") {}
66
+ @reporter.should_receive(:spec_started).with("spec")
67
+ @reporter.should_receive(:spec_finished).with("spec", error, "teardown")
68
+ spec.run(@reporter, nil, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,160 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Runner
5
+ context "A Specification instance" do
6
+ setup do
7
+ @reporter = mock("reporter")
8
+ Specification.send(:current=, nil)
9
+ end
10
+
11
+ specify "should add itself to reporter when calling run dry" do
12
+ spec=Specification.new("spec") {}
13
+ @reporter.should_receive(:spec_started).with("spec")
14
+ @reporter.should_receive(:spec_finished).with("spec")
15
+ spec.run(@reporter, nil, nil, true, nil)
16
+ end
17
+
18
+ specify "should add itself to reporter when fails" do
19
+ error=RuntimeError.new
20
+ spec=Specification.new("spec") do
21
+ raise(error)
22
+ end
23
+ @reporter.should_receive(:spec_started).with("spec")
24
+ @reporter.should_receive(:spec_finished).with("spec", error, "spec")
25
+ spec.run(@reporter, nil, nil, nil, nil)
26
+ end
27
+
28
+ specify "should add itself to reporter when passes" do
29
+ spec=Specification.new("spec") {}
30
+ @reporter.should_receive(:spec_started).with("spec")
31
+ @reporter.should_receive(:spec_finished).with("spec", nil, nil)
32
+ spec.run(@reporter, nil, nil, nil, nil)
33
+ end
34
+
35
+ specify "should not run spec if setup fails" do
36
+ spec_ran = false
37
+ spec=Specification.new("should pass") do
38
+ spec_ran = true
39
+ end
40
+ @reporter.stub!(:spec_started)
41
+ @reporter.stub!(:spec_finished)
42
+ setup = proc {raise "Setup error"}
43
+ spec.run(@reporter, setup, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
44
+ spec_ran.should == false
45
+ @reporter.__verify
46
+ end
47
+
48
+ specify "should run spec in scope of execution context" do
49
+ spec=Specification.new("should pass") do
50
+ self.instance_of?(Specification).should == false
51
+ self.instance_of?(ExecutionContext).should == true
52
+ end
53
+ @reporter.should_receive(:spec_started).with("should pass")
54
+ @reporter.should_receive(:spec_finished).with("should pass", nil, nil)
55
+ spec.run(@reporter, nil, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
56
+ @reporter.__verify
57
+ end
58
+
59
+ specify "should run teardown even when main block fails" do
60
+ spec=Specification.new("spec") do
61
+ raise("in body")
62
+ end
63
+ teardown=lambda do
64
+ raise("in teardown")
65
+ end
66
+ @reporter.should_receive(:spec_started).with("spec")
67
+ @reporter.should_receive(:spec_finished) do |spec, error, location|
68
+ spec.should_eql("spec")
69
+ location.should_eql("spec")
70
+ error.message.should_eql("in body")
71
+ end
72
+ spec.run(@reporter, nil, teardown, nil, nil)
73
+ end
74
+
75
+ specify "should supply setup as spec name if failure in setup" do
76
+ spec=Specification.new("spec") {}
77
+ setup=lambda { raise("in setup") }
78
+ @reporter.should_receive(:spec_started).with("spec")
79
+ @reporter.should_receive(:spec_finished) do |name, error, location|
80
+ name.should_eql("spec")
81
+ error.message.should_eql("in setup")
82
+ location.should_eql("setup")
83
+ end
84
+ spec.run(@reporter, setup, nil, nil, nil)
85
+ end
86
+
87
+ specify "should supply teardown as failure location if failure in teardown" do
88
+ spec = Specification.new("spec") {}
89
+ teardown = lambda { raise("in teardown") }
90
+ @reporter.should_receive(:spec_started).with("spec")
91
+ @reporter.should_receive(:spec_finished) do |name, error, location|
92
+ name.should_eql("spec")
93
+ error.message.should_eql("in teardown")
94
+ location.should_eql("teardown")
95
+ end
96
+ spec.run(@reporter, nil, teardown, nil, nil)
97
+ end
98
+
99
+ specify "should verify mocks after teardown" do
100
+ spec=Specification.new("spec") do
101
+ mock=Spec::Mocks::Mock.new("a mock")
102
+ mock.should_receive(:poke)
103
+ end
104
+ @reporter.should_receive(:spec_started).with("spec")
105
+ @reporter.should_receive(:spec_finished) do |spec_name, error|
106
+ spec_name.should_eql("spec")
107
+ error.message.should_match(/expected :poke with \(any args\) once, but received it 0 times/)
108
+ end
109
+ spec.run(@reporter, nil, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
110
+ end
111
+
112
+ specify "should accept an options hash following the spec name" do
113
+ spec = Specification.new("name", :key => 'value')
114
+ end
115
+
116
+ specify "should update the current spec only when running the spec" do
117
+ @reporter.stub!(:spec_started)
118
+ @reporter.stub!(:spec_finished)
119
+
120
+ spec = Specification.new("spec") do
121
+ Specification.current.should == spec
122
+ end
123
+
124
+ Specification.current.should_be_nil
125
+ setup = proc {Specification.current.should == spec}
126
+ teardown = proc {Specification.current.should == spec}
127
+ spec.run(@reporter, setup, teardown, nil, ::Spec::Runner::ExecutionContext.new(nil))
128
+ Specification.current.should_be_nil
129
+ end
130
+
131
+ specify "should notify before_setup callbacks before setup" do
132
+ spec = Specification.new("spec")
133
+ @reporter.stub!(:spec_started)
134
+ @reporter.stub!(:spec_finished)
135
+
136
+ mock = mock("setup mock")
137
+ mock.should_receive(:before_setup).ordered
138
+ mock.should_receive(:setup).ordered
139
+
140
+ spec.before_setup {mock.before_setup}
141
+ setup = proc {mock.setup}
142
+ spec.run(@reporter, setup, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
143
+ end
144
+
145
+ specify "should notify after_teardown callbacks after teardown" do
146
+ spec = Specification.new("spec")
147
+ @reporter.stub!(:spec_started)
148
+ @reporter.stub!(:spec_finished)
149
+
150
+ mock = mock("teardown mock")
151
+ mock.should_receive(:teardown).ordered
152
+ mock.should_receive(:after_teardown).ordered
153
+
154
+ spec.after_teardown {mock.after_teardown}
155
+ teardown = proc {mock.teardown}
156
+ spec.run(@reporter, nil, teardown, nil, ::Spec::Runner::ExecutionContext.new(nil))
157
+ end
158
+ end
159
+ end
160
+ end