rspec 0.8.2 → 0.9.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 (245) hide show
  1. data/CHANGES +125 -9
  2. data/EXAMPLES.rd +50 -27
  3. data/README +14 -1
  4. data/Rakefile +95 -42
  5. data/UPGRADE +31 -0
  6. data/bin/spec +0 -1
  7. data/bin/spec_translator +6 -0
  8. data/examples/auto_spec_description_example.rb +19 -0
  9. data/examples/{setup_teardown_example.rb → before_and_after_example.rb} +6 -6
  10. data/examples/behave_as_example.rb +45 -0
  11. data/examples/custom_expectation_matchers.rb +13 -12
  12. data/examples/dynamic_spec.rb +2 -2
  13. data/examples/file_accessor_spec.rb +2 -2
  14. data/examples/greeter_spec.rb +3 -3
  15. data/examples/helper_method_example.rb +2 -2
  16. data/examples/io_processor_spec.rb +4 -4
  17. data/examples/legacy_spec.rb +10 -0
  18. data/examples/mocking_example.rb +5 -5
  19. data/examples/multi_threaded_behaviour_runner.rb +25 -0
  20. data/examples/partial_mock_example.rb +4 -4
  21. data/examples/predicate_example.rb +4 -4
  22. data/examples/priority.txt +1 -0
  23. data/examples/shared_behaviours_example.rb +31 -0
  24. data/examples/stack_spec.rb +52 -69
  25. data/examples/stubbing_example.rb +10 -10
  26. data/examples/test_case_adapter_example.rb +26 -0
  27. data/examples/test_case_spec.rb +6 -6
  28. data/lib/spec.rb +9 -4
  29. data/lib/spec/dsl.rb +10 -0
  30. data/lib/spec/dsl/behaviour.rb +189 -0
  31. data/lib/spec/dsl/behaviour_callbacks.rb +43 -0
  32. data/lib/spec/dsl/behaviour_eval.rb +170 -0
  33. data/lib/spec/dsl/behaviour_factory.rb +32 -0
  34. data/lib/spec/dsl/composite_proc_builder.rb +28 -0
  35. data/lib/spec/dsl/configuration.rb +38 -0
  36. data/lib/spec/dsl/description.rb +34 -0
  37. data/lib/spec/dsl/example.rb +114 -0
  38. data/lib/spec/dsl/example_matcher.rb +28 -0
  39. data/lib/spec/{runner/spec_should_raise_handler.rb → dsl/example_should_raise_handler.rb} +4 -4
  40. data/lib/spec/expectations.rb +0 -3
  41. data/lib/spec/expectations/differs/default.rb +0 -1
  42. data/lib/spec/expectations/extensions.rb +0 -1
  43. data/lib/spec/expectations/extensions/object.rb +10 -53
  44. data/lib/spec/expectations/handler.rb +14 -18
  45. data/lib/spec/extensions.rb +1 -0
  46. data/lib/spec/extensions/object.rb +6 -0
  47. data/lib/spec/matchers.rb +19 -21
  48. data/lib/spec/matchers/be.rb +40 -11
  49. data/lib/spec/matchers/be_close.rb +2 -2
  50. data/lib/spec/matchers/operator_matcher.rb +52 -0
  51. data/lib/spec/matchers/respond_to.rb +21 -11
  52. data/lib/spec/mocks.rb +5 -28
  53. data/lib/spec/mocks/argument_constraint_matchers.rb +12 -0
  54. data/lib/spec/mocks/argument_expectation.rb +7 -4
  55. data/lib/spec/mocks/methods.rb +11 -16
  56. data/lib/spec/mocks/mock.rb +6 -3
  57. data/lib/spec/mocks/{mock_handler.rb → proxy.rb} +4 -7
  58. data/lib/spec/mocks/space.rb +28 -0
  59. data/lib/spec/mocks/spec_methods.rb +30 -0
  60. data/lib/spec/rake/spectask.rb +23 -21
  61. data/lib/spec/rake/verify_rcov.rb +1 -0
  62. data/lib/spec/runner.rb +88 -35
  63. data/lib/spec/runner/backtrace_tweaker.rb +2 -1
  64. data/lib/spec/runner/behaviour_runner.rb +102 -0
  65. data/lib/spec/runner/command_line.rb +5 -17
  66. data/lib/spec/runner/drb_command_line.rb +2 -2
  67. data/lib/spec/runner/extensions/kernel.rb +22 -9
  68. data/lib/spec/runner/formatter.rb +4 -0
  69. data/lib/spec/runner/formatter/base_formatter.rb +63 -0
  70. data/lib/spec/runner/formatter/base_text_formatter.rb +22 -52
  71. data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +25 -0
  72. data/lib/spec/runner/formatter/failing_examples_formatter.rb +22 -0
  73. data/lib/spec/runner/formatter/html_formatter.rb +74 -29
  74. data/lib/spec/runner/formatter/progress_bar_formatter.rb +6 -8
  75. data/lib/spec/runner/formatter/rdoc_formatter.rb +6 -6
  76. data/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
  77. data/lib/spec/runner/formatter/specdoc_formatter.rb +6 -6
  78. data/lib/spec/runner/heckle_runner.rb +8 -7
  79. data/lib/spec/runner/option_parser.rb +136 -55
  80. data/lib/spec/runner/options.rb +26 -0
  81. data/lib/spec/runner/reporter.rb +38 -31
  82. data/lib/spec/runner/spec_parser.rb +22 -13
  83. data/lib/spec/test_case_adapter.rb +10 -0
  84. data/lib/spec/translator.rb +103 -86
  85. data/lib/spec/version.rb +7 -15
  86. data/plugins/mock_frameworks/flexmock.rb +27 -0
  87. data/plugins/mock_frameworks/mocha.rb +21 -0
  88. data/plugins/mock_frameworks/rspec.rb +18 -0
  89. data/spec/spec/dsl/behaviour_eval_spec.rb +49 -0
  90. data/spec/spec/dsl/behaviour_factory_spec.rb +30 -0
  91. data/spec/spec/dsl/behaviour_spec.rb +508 -0
  92. data/spec/spec/dsl/composite_proc_builder_spec.rb +57 -0
  93. data/spec/spec/dsl/configuration_spec.rb +43 -0
  94. data/spec/spec/dsl/description_spec.rb +51 -0
  95. data/spec/spec/dsl/example_class_spec.rb +24 -0
  96. data/spec/spec/dsl/example_instance_spec.rb +140 -0
  97. data/spec/spec/dsl/example_should_raise_spec.rb +137 -0
  98. data/spec/spec/dsl/predicate_matcher_spec.rb +21 -0
  99. data/spec/spec/dsl/shared_behaviour_spec.rb +186 -0
  100. data/spec/spec/expectations/differs/default_spec.rb +12 -12
  101. data/spec/spec/expectations/extensions/object_spec.rb +10 -10
  102. data/spec/spec/expectations/fail_with_spec.rb +20 -20
  103. data/spec/spec/matchers/be_close_spec.rb +37 -31
  104. data/spec/spec/matchers/be_spec.rb +50 -41
  105. data/spec/spec/matchers/change_spec.rb +54 -54
  106. data/spec/spec/matchers/description_generation_spec.rb +43 -31
  107. data/spec/spec/matchers/eql_spec.rb +24 -37
  108. data/spec/spec/matchers/equal_spec.rb +24 -37
  109. data/spec/spec/matchers/exist_spec.rb +48 -0
  110. data/spec/spec/matchers/handler_spec.rb +36 -23
  111. data/spec/spec/matchers/has_spec.rb +8 -8
  112. data/spec/spec/matchers/have_spec.rb +38 -38
  113. data/spec/spec/matchers/include_spec.rb +6 -6
  114. data/spec/spec/matchers/match_spec.rb +8 -8
  115. data/spec/spec/matchers/matcher_methods_spec.rb +24 -31
  116. data/spec/spec/matchers/raise_error_spec.rb +34 -34
  117. data/spec/spec/matchers/respond_to_spec.rb +32 -8
  118. data/spec/spec/matchers/satisfy_spec.rb +6 -6
  119. data/spec/spec/matchers/should_===_spec.rb +38 -0
  120. data/spec/spec/matchers/should_==_spec.rb +37 -0
  121. data/spec/spec/matchers/should_=~_spec.rb +36 -0
  122. data/spec/spec/matchers/throw_symbol_spec.rb +47 -55
  123. data/spec/spec/mocks/any_number_of_times_spec.rb +16 -21
  124. data/spec/spec/mocks/argument_expectation_spec.rb +3 -3
  125. data/spec/spec/mocks/at_least_spec.rb +30 -30
  126. data/spec/spec/mocks/at_most_spec.rb +53 -57
  127. data/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
  128. data/spec/spec/mocks/bug_report_7611_spec.rb +3 -3
  129. data/spec/spec/mocks/bug_report_7805_spec.rb +3 -3
  130. data/spec/spec/mocks/bug_report_8165_spec.rb +5 -5
  131. data/spec/spec/mocks/bug_report_8302_spec.rb +5 -5
  132. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +26 -27
  133. data/spec/spec/mocks/mock_ordering_spec.rb +19 -15
  134. data/spec/spec/mocks/mock_space_spec.rb +54 -0
  135. data/spec/spec/mocks/mock_spec.rb +111 -141
  136. data/spec/spec/mocks/multiple_return_value_spec.rb +48 -48
  137. data/spec/spec/mocks/null_object_mock_spec.rb +10 -10
  138. data/spec/spec/mocks/once_counts_spec.rb +32 -35
  139. data/spec/spec/mocks/options_hash_spec.rb +12 -10
  140. data/spec/spec/mocks/partial_mock_spec.rb +15 -15
  141. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +24 -22
  142. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +19 -19
  143. data/spec/spec/mocks/precise_counts_spec.rb +28 -32
  144. data/spec/spec/mocks/record_messages_spec.rb +10 -10
  145. data/spec/spec/mocks/stub_spec.rb +45 -45
  146. data/spec/spec/mocks/twice_counts_spec.rb +21 -21
  147. data/spec/spec/package/bin_spec_spec.rb +12 -0
  148. data/spec/spec/runner/behaviour_runner_spec.rb +114 -0
  149. data/spec/spec/runner/command_line_spec.rb +8 -8
  150. data/spec/spec/runner/context_matching_spec.rb +14 -15
  151. data/spec/spec/runner/drb_command_line_spec.rb +12 -12
  152. data/spec/spec/runner/execution_context_spec.rb +8 -29
  153. data/spec/spec/runner/extensions/kernel_spec.rb +36 -0
  154. data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +27 -0
  155. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +28 -0
  156. data/spec/spec/runner/formatter/html_formatter_spec.rb +9 -8
  157. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +6 -6
  158. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +10 -10
  159. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +22 -27
  160. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +6 -5
  161. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +17 -17
  162. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +11 -0
  163. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +6 -6
  164. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +17 -17
  165. data/spec/spec/runner/heckle_runner_spec.rb +21 -21
  166. data/spec/spec/runner/heckler_spec.rb +5 -5
  167. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +12 -12
  168. data/spec/spec/runner/object_ext_spec.rb +3 -3
  169. data/spec/spec/runner/option_parser_spec.rb +171 -102
  170. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +21 -12
  171. data/spec/spec/runner/reporter_spec.rb +106 -97
  172. data/spec/spec/runner/spec_matcher_spec.rb +46 -51
  173. data/spec/spec/runner/spec_parser_spec.rb +72 -16
  174. data/spec/spec/spec_classes.rb +12 -3
  175. data/spec/spec/translator_spec.rb +165 -36
  176. metadata +66 -76
  177. data/RELEASE-PLAN +0 -117
  178. data/examples/auto_spec_name_generation_example.rb +0 -18
  179. data/lib/spec/callback.rb +0 -11
  180. data/lib/spec/callback/callback_container.rb +0 -60
  181. data/lib/spec/callback/extensions/module.rb +0 -24
  182. data/lib/spec/callback/extensions/object.rb +0 -37
  183. data/lib/spec/deprecated.rb +0 -3
  184. data/lib/spec/expectations/extensions/proc.rb +0 -57
  185. data/lib/spec/expectations/should.rb +0 -5
  186. data/lib/spec/expectations/should/base.rb +0 -64
  187. data/lib/spec/expectations/should/change.rb +0 -69
  188. data/lib/spec/expectations/should/have.rb +0 -128
  189. data/lib/spec/expectations/should/not.rb +0 -74
  190. data/lib/spec/expectations/should/should.rb +0 -81
  191. data/lib/spec/expectations/sugar.rb +0 -47
  192. data/lib/spec/runner/context.rb +0 -154
  193. data/lib/spec/runner/context_eval.rb +0 -142
  194. data/lib/spec/runner/context_runner.rb +0 -55
  195. data/lib/spec/runner/execution_context.rb +0 -17
  196. data/lib/spec/runner/spec_matcher.rb +0 -25
  197. data/lib/spec/runner/specification.rb +0 -114
  198. data/spec/spec/callback/callback_container_spec.rb +0 -27
  199. data/spec/spec/callback/module_spec.rb +0 -37
  200. data/spec/spec/callback/object_spec.rb +0 -90
  201. data/spec/spec/callback/object_with_class_callback_spec.rb +0 -19
  202. data/spec/spec/expectations/should/should_==_spec.rb +0 -19
  203. data/spec/spec/expectations/should/should_=~_spec.rb +0 -13
  204. data/spec/spec/expectations/should/should_be_a_kind_of_spec.rb +0 -21
  205. data/spec/spec/expectations/should/should_be_an_instance_of_spec.rb +0 -30
  206. data/spec/spec/expectations/should/should_be_arbitrary_predicate_spec.rb +0 -81
  207. data/spec/spec/expectations/should/should_be_close_spec.rb +0 -18
  208. data/spec/spec/expectations/should/should_be_comparison_operator_spec.rb +0 -44
  209. data/spec/spec/expectations/should/should_be_false_spec.rb +0 -39
  210. data/spec/spec/expectations/should/should_be_spec.rb +0 -11
  211. data/spec/spec/expectations/should/should_be_true_spec.rb +0 -27
  212. data/spec/spec/expectations/should/should_change_spec.rb +0 -184
  213. data/spec/spec/expectations/should/should_eql_spec.rb +0 -11
  214. data/spec/spec/expectations/should/should_equal_spec.rb +0 -11
  215. data/spec/spec/expectations/should/should_have_at_least_spec.rb +0 -53
  216. data/spec/spec/expectations/should/should_have_at_most_spec.rb +0 -45
  217. data/spec/spec/expectations/should/should_have_key_spec.rb +0 -21
  218. data/spec/spec/expectations/should/should_have_spec.rb +0 -64
  219. data/spec/spec/expectations/should/should_include_spec.rb +0 -59
  220. data/spec/spec/expectations/should/should_match_spec.rb +0 -25
  221. data/spec/spec/expectations/should/should_not_==_spec.rb +0 -15
  222. data/spec/spec/expectations/should/should_not_be_a_kind_of_spec.rb +0 -21
  223. data/spec/spec/expectations/should/should_not_be_an_instance_of_spec.rb +0 -11
  224. data/spec/spec/expectations/should/should_not_be_arbitrary_predicate_spec.rb +0 -68
  225. data/spec/spec/expectations/should/should_not_be_spec.rb +0 -11
  226. data/spec/spec/expectations/should/should_not_change_spec.rb +0 -24
  227. data/spec/spec/expectations/should/should_not_eql_spec.rb +0 -11
  228. data/spec/spec/expectations/should/should_not_equal_spec.rb +0 -11
  229. data/spec/spec/expectations/should/should_not_have_key_spec.rb +0 -15
  230. data/spec/spec/expectations/should/should_not_include_spec.rb +0 -58
  231. data/spec/spec/expectations/should/should_not_match_spec.rb +0 -11
  232. data/spec/spec/expectations/should/should_not_raise_spec.rb +0 -75
  233. data/spec/spec/expectations/should/should_not_respond_to_spec.rb +0 -15
  234. data/spec/spec/expectations/should/should_not_throw_spec.rb +0 -35
  235. data/spec/spec/expectations/should/should_raise_spec.rb +0 -66
  236. data/spec/spec/expectations/should/should_respond_to_spec.rb +0 -15
  237. data/spec/spec/expectations/should/should_satisfy_spec.rb +0 -35
  238. data/spec/spec/expectations/should/should_throw_spec.rb +0 -27
  239. data/spec/spec/runner/context_runner_spec.rb +0 -100
  240. data/spec/spec/runner/context_spec.rb +0 -405
  241. data/spec/spec/runner/kernel_ext_spec.rb +0 -16
  242. data/spec/spec/runner/spec_name_generation_spec.rb +0 -102
  243. data/spec/spec/runner/specification_class_spec.rb +0 -72
  244. data/spec/spec/runner/specification_instance_spec.rb +0 -160
  245. data/spec/spec/runner/specification_should_raise_spec.rb +0 -136
@@ -0,0 +1,57 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module DSL
5
+ describe CompositeProcBuilder do
6
+ before(:each) do
7
+ @klass = Class.new do
8
+ attr_reader :an_attribute
9
+
10
+ def an_attribute_setter
11
+ @an_attribute = :the_value
12
+ end
13
+ end
14
+
15
+ @parent = @klass.new
16
+ @builder = CompositeProcBuilder.new {}
17
+ end
18
+
19
+ it "calls all of its child procs" do
20
+ @builder << proc {:proc1}
21
+ @builder << proc {:proc2}
22
+ @builder.proc.call.should == [:proc1, :proc2]
23
+ end
24
+
25
+ it "calls block on exceptions" do
26
+ exception1 = Exception.new("Proc1 Error")
27
+ exception2 = Exception.new("Proc2 Error")
28
+ @builder << proc {raise exception1}
29
+ @builder << proc {raise exception2}
30
+ @builder << proc {:successful}
31
+
32
+ errors = []
33
+ @builder.proc {|e| errors << e }.call.should == [exception1, exception2, :successful]
34
+
35
+ errors.should == [exception1, exception2]
36
+ end
37
+
38
+ it "evals procs in the caller's instance" do
39
+ the_proc = proc do
40
+ @an_attribute = :the_value
41
+ end
42
+ the_proc.class.should == Proc
43
+ @builder << the_proc
44
+ @parent.instance_eval &@builder.proc
45
+ @parent.an_attribute.should == :the_value
46
+ end
47
+
48
+ it "binds unbound methods to the parent" do
49
+ unbound_method = @klass.instance_method(:an_attribute_setter)
50
+ unbound_method.class.should == UnboundMethod
51
+ @builder << unbound_method
52
+ @parent.instance_eval &@builder.proc
53
+ @parent.an_attribute.should == :the_value
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module DSL
5
+ describe Configuration do
6
+ before(:each) do
7
+ @config = Configuration.new
8
+ @behaviour = mock("behaviour")
9
+ end
10
+
11
+ it "should default mock framework to rspec" do
12
+ @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rspec$/
13
+ end
14
+
15
+ it "should let you set rspec explicitly" do
16
+ @config.mock_with(:rspec)
17
+ @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rspec$/
18
+ end
19
+
20
+ it "should let you set mocha" do
21
+ @config.mock_with(:mocha)
22
+ @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/mocha$/
23
+ end
24
+
25
+ it "should let you set flexmock" do
26
+ @config.mock_with(:flexmock)
27
+ @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/flexmock$/
28
+ end
29
+
30
+ it "should let you set an arbitrary adapter module" do
31
+ adapter = Module.new
32
+ @config.mock_with(adapter)
33
+ @config.mock_framework.should == adapter
34
+ end
35
+
36
+ it "should let you define modules to be included" do
37
+ mod = Module.new
38
+ @config.include mod
39
+ @config.included_modules.should include(mod)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,51 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module DSL
5
+ describe Description, " constructed with a single String" do before(:each) {@description = Description.new("abc")}
6
+ it "should provide that string as its name" do
7
+ @description.description.should == "abc"
8
+ end
9
+ it "should provide nil as its type" do
10
+ @description.described_type.should be_nil
11
+ end
12
+ it "should respond to []" do
13
+ @description[:key].should be_nil
14
+ end
15
+ it "should respond to []=" do
16
+ @description[:key] = :value
17
+ @description[:key].should == :value
18
+ end
19
+ it "should return for == when value matches description" do
20
+ @description.should == "abc"
21
+ end
22
+ it "should return for == when value is other description that matches description" do
23
+ @description.should == Description.new("abc")
24
+ end
25
+ end
26
+
27
+ describe Description, " constructed with a Type" do before(:each) {@description = Description.new(Behaviour)}
28
+ it "should provide a String representation of that type (fully qualified) as its name" do
29
+ @description.description.should == "Spec::DSL::Behaviour"
30
+ end
31
+ it "should provide that type (fully qualified) as its type" do
32
+ @description.described_type.should == Spec::DSL::Behaviour
33
+ end
34
+ end
35
+
36
+ describe Description, " constructed with a Type and a String" do before(:each) {@description = Description.new(Behaviour, " behaving")}
37
+ it "should include the type and second String in its name" do
38
+ @description.description.should == "Spec::DSL::Behaviour behaving"
39
+ end
40
+ it "should provide that type (fully qualified) as its type" do
41
+ @description.described_type.should == Spec::DSL::Behaviour
42
+ end
43
+ end
44
+
45
+ describe Description, " constructed with options" do before(:each) {@description = Description.new(Behaviour, :a => "b")}
46
+ it "should provide its options" do
47
+ @description[:a].should == "b"
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,24 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module DSL
5
+ describe Example, " class" do
6
+
7
+ def run(example)
8
+ example.run(@reporter, nil, nil, nil, Object.new)
9
+ end
10
+
11
+ before do
12
+ @reporter = stub("reporter", :example_started => nil, :example_finished => nil)
13
+ @example_class = Example.dup
14
+ end
15
+
16
+ it "should report errors in example" do
17
+ error = Exception.new
18
+ @reporter.should_receive(:example_finished).with("example", error, "example")
19
+
20
+ run(@example_class.new("example") {raise(error)})
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,140 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module DSL
5
+ describe Example, " instance" do
6
+ # TODO - this should be
7
+ # predicate_matchers :is_a
8
+ def is_a(error)
9
+ be_is_a(error)
10
+ end
11
+
12
+ before do
13
+ @reporter = stub("reporter", :example_started => nil, :example_finished => nil)
14
+ end
15
+
16
+ it "should send reporter example_started" do
17
+ example=Example.new("example") {}
18
+ @reporter.should_receive(:example_started).with("example")
19
+ example.run(@reporter, nil, nil, false, nil)
20
+ end
21
+
22
+ it "should report its name for dry run" do
23
+ example=Example.new("example") {}
24
+ @reporter.should_receive(:example_finished).with("example")
25
+ example.run(@reporter, nil, nil, true, nil) #4th arg indicates dry run
26
+ end
27
+
28
+ it "should report success" do
29
+ example=Example.new("example") {}
30
+ @reporter.should_receive(:example_finished).with("example", nil, nil)
31
+ example.run(@reporter, nil, nil, nil, nil)
32
+ end
33
+
34
+ it "should report failure due to failure" do
35
+ example=Example.new("example") do
36
+ (2+2).should == 5
37
+ end
38
+ @reporter.should_receive(:example_finished).with("example", is_a(Spec::Expectations::ExpectationNotMetError), "example")
39
+ example.run(@reporter, nil, nil, nil, nil)
40
+ end
41
+
42
+ it "should report failure due to error" do
43
+ error=RuntimeError.new
44
+ example=Example.new("example") do
45
+ raise(error)
46
+ end
47
+ @reporter.should_receive(:example_finished).with("example", error, "example")
48
+ example.run(@reporter, nil, nil, nil, nil)
49
+ end
50
+
51
+ it "should run example in scope of supplied object" do
52
+ scope_class = Class.new
53
+ example=Example.new("should pass") do
54
+ self.instance_of?(Example).should == false
55
+ self.instance_of?(scope_class).should == true
56
+ end
57
+ @reporter.should_receive(:example_finished).with("should pass", nil, nil)
58
+ example.run(@reporter, nil, nil, nil, scope_class.new)
59
+ end
60
+
61
+ it "should not run example block if before_each fails" do
62
+ example_ran = false
63
+ example=Example.new("should pass") {example_ran = true}
64
+ before_each = lambda {raise "Setup error"}
65
+ example.run(@reporter, before_each, nil, nil, Object.new)
66
+ example_ran.should == false
67
+ end
68
+
69
+ it "should run after_each block if before_each fails" do
70
+ after_each_ran = false
71
+ example=Example.new("should pass") {}
72
+ before_each = lambda {raise "Setup error"}
73
+ after_each = lambda {after_each_ran = true}
74
+ example.run(@reporter, before_each, after_each, nil, Object.new)
75
+ after_each_ran.should == true
76
+ end
77
+
78
+ it "should run after_each block when example fails" do
79
+ example=Example.new("example") do
80
+ raise("in body")
81
+ end
82
+ after_each=lambda do
83
+ raise("in after_each")
84
+ end
85
+ @reporter.should_receive(:example_finished) do |example, error, location|
86
+ example.should eql("example")
87
+ location.should eql("example")
88
+ error.message.should eql("in body")
89
+ end
90
+ example.run(@reporter, nil, after_each, nil, nil)
91
+ end
92
+
93
+ it "should report failure location when in before_each" do
94
+ example=Example.new("example") {}
95
+ before_each=lambda { raise("in before_each") }
96
+ @reporter.should_receive(:example_finished) do |name, error, location|
97
+ name.should eql("example")
98
+ error.message.should eql("in before_each")
99
+ location.should eql("before(:each)")
100
+ end
101
+ example.run(@reporter, before_each, nil, nil, nil)
102
+ end
103
+
104
+ it "should report failure location when in after_each" do
105
+ example = Example.new("example") {}
106
+ after_each = lambda { raise("in after_each") }
107
+ @reporter.should_receive(:example_finished) do |name, error, location|
108
+ name.should eql("example")
109
+ error.message.should eql("in after_each")
110
+ location.should eql("after(:each)")
111
+ end
112
+ example.run(@reporter, nil, after_each, nil, nil)
113
+ end
114
+
115
+ it "should accept an options hash following the example name" do
116
+ example = Example.new("name", :key => 'value')
117
+ end
118
+
119
+ it "should report NAME NOT GENERATED when told to use generated description but none is generated" do
120
+ example = Example.new(:__generate_description)
121
+ @reporter.should_receive(:example_finished).with("NAME NOT GENERATED", :anything, :anything)
122
+ example.run(@reporter, nil, nil, nil, Object.new)
123
+ end
124
+
125
+ it "should report generated description when told to and it is available" do
126
+ example = Example.new(:__generate_description) {
127
+ 5.should == 5
128
+ }
129
+ @reporter.should_receive(:example_finished).with("should == 5", :anything, :anything)
130
+ example.run(@reporter, nil, nil, nil, Object.new)
131
+ end
132
+
133
+ it "should unregister description_generated callback (lest a memory leak should build up)" do
134
+ example = Example.new("something")
135
+ Spec::Matchers.should_receive(:unregister_description_generated).with(is_a(Proc))
136
+ example.run(@reporter, nil, nil, nil, Object.new)
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,137 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module DSL
5
+ describe Example, " declared with {:should_raise => ...}" do
6
+ before(:each) do
7
+ @reporter = mock("reporter")
8
+ @reporter.stub!(:example_started)
9
+ end
10
+
11
+ def verify_error(error, message=nil)
12
+ error.should be_an_instance_of(Spec::Expectations::ExpectationNotMetError)
13
+ unless message.nil?
14
+ return error.message.should =~ message if Regexp === message
15
+ return error.message.should == message
16
+ end
17
+ end
18
+
19
+ it "true} should pass when there is an ExpectationNotMetError" do
20
+ example = Spec::DSL:: Example.new("example", :should_raise => true) do
21
+ raise Spec::Expectations::ExpectationNotMetError
22
+ end
23
+ @reporter.should_receive(:example_finished) do |description, error|
24
+ error.should be_nil
25
+ end
26
+ example.run(@reporter, nil, nil, nil, nil)
27
+ end
28
+
29
+ it "true} should fail if nothing is raised" do
30
+ example = Spec::DSL:: Example.new("example", :should_raise => true) {}
31
+ @reporter.should_receive(:example_finished) do |example_name, error|
32
+ verify_error(error, /example block expected Exception but nothing was raised/)
33
+ end
34
+ example.run(@reporter, nil, nil, nil, nil)
35
+ end
36
+
37
+ it "NameError} should pass when there is a NameError" do
38
+ example = Spec::DSL:: Example.new("example", :should_raise => NameError) do
39
+ raise NameError
40
+ end
41
+ @reporter.should_receive(:example_finished) do |example_name, error|
42
+ error.should be_nil
43
+ end
44
+ example.run(@reporter, nil, nil, nil, nil)
45
+ end
46
+
47
+ it "NameError} should fail when there is no error" do
48
+ example = Spec::DSL:: Example.new("example", :should_raise => NameError) do
49
+ #do nothing
50
+ end
51
+ @reporter.should_receive(:example_finished) do |example_name, error|
52
+ verify_error(error,/example block expected NameError but nothing was raised/)
53
+ end
54
+ example.run(@reporter, nil, nil, nil, nil)
55
+ end
56
+
57
+ it "NameError} should fail when there is the wrong error" do
58
+ example = Spec::DSL:: Example.new("example", :should_raise => NameError) do
59
+ raise RuntimeError
60
+ end
61
+ @reporter.should_receive(:example_finished) do |example_name, error|
62
+ verify_error(error, /example block expected NameError but raised.+RuntimeError/)
63
+ end
64
+ example.run(@reporter, nil, nil, nil, nil)
65
+ end
66
+
67
+ it "[NameError]} should pass when there is a NameError" do
68
+ example = Spec::DSL:: Example.new("spec", :should_raise => [NameError]) do
69
+ raise NameError
70
+ end
71
+ @reporter.should_receive(:example_finished) do |description, error|
72
+ error.should be_nil
73
+ end
74
+ example.run(@reporter, nil, nil, nil, nil)
75
+ end
76
+
77
+ it "[NameError]} should fail when there is no error" do
78
+ example = Spec::DSL:: Example.new("spec", :should_raise => [NameError]) do
79
+ end
80
+ @reporter.should_receive(:example_finished) do |description, error|
81
+ verify_error(error, /example block expected NameError but nothing was raised/)
82
+ end
83
+ example.run(@reporter, nil, nil, nil, nil)
84
+ end
85
+
86
+ it "[NameError]} should fail when there is the wrong error" do
87
+ example = Spec::DSL:: Example.new("spec", :should_raise => [NameError]) do
88
+ raise RuntimeError
89
+ end
90
+ @reporter.should_receive(:example_finished) do |description, error|
91
+ verify_error(error, /example block expected NameError but raised.+RuntimeError/)
92
+ end
93
+ example.run(@reporter, nil, nil, nil, nil)
94
+ end
95
+
96
+ it "[NameError, 'message'} should pass when there is a NameError with the right message" do
97
+ example = Spec::DSL:: Example.new("spec", :should_raise => [NameError, 'expected']) do
98
+ raise NameError, 'expected'
99
+ end
100
+ @reporter.should_receive(:example_finished) do |description, error|
101
+ error.should be_nil
102
+ end
103
+ example.run(@reporter, nil, nil, nil, nil)
104
+ end
105
+
106
+ it "[NameError, 'message'} should pass when there is a NameError with a message matching a regex" do
107
+ example = Spec::DSL:: Example.new("spec", :should_raise => [NameError, /xpec/]) do
108
+ raise NameError, 'expected'
109
+ end
110
+ @reporter.should_receive(:example_finished) do |description, error|
111
+ error.should be_nil
112
+ end
113
+ example.run(@reporter, nil, nil, nil, nil)
114
+ end
115
+
116
+ it "[NameError, 'message'} should fail when there is a NameError with the wrong message" do
117
+ example = Spec::DSL:: Example.new("spec", :should_raise => [NameError, 'expected']) do
118
+ raise NameError, 'wrong message'
119
+ end
120
+ @reporter.should_receive(:example_finished) do |description, error|
121
+ verify_error(error, /example block expected #<NameError: expected> but raised #<NameError: wrong message>/)
122
+ end
123
+ example.run(@reporter, nil, nil, nil, nil)
124
+ end
125
+
126
+ it "[NameError, 'message'} should fail when there is a NameError with a message not matching regexp" do
127
+ example = Spec::DSL:: Example.new("spec", :should_raise => [NameError, /exp/]) do
128
+ raise NameError, 'wrong message'
129
+ end
130
+ @reporter.should_receive(:example_finished) do |description, error|
131
+ verify_error(error, /example block expected #<NameError: \(\?-mix:exp\)> but raised #<NameError: wrong message>/)
132
+ end
133
+ example.run(@reporter, nil, nil, nil, nil)
134
+ end
135
+ end
136
+ end
137
+ end