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,67 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ context "TwiceCounts" do
6
+ setup do
7
+ @mock = Mock.new("test mock", {
8
+ :auto_verify => false
9
+ })
10
+ end
11
+
12
+ specify "twice should fail when call count is higher than expected" do
13
+ @mock.should_receive(:random_call).twice
14
+ @mock.random_call
15
+ @mock.random_call
16
+ @mock.random_call
17
+ lambda do
18
+ @mock.__verify
19
+ end.should_raise(MockExpectationError)
20
+ end
21
+
22
+ specify "twice should fail when call count is lower than expected" do
23
+ @mock.should_receive(:random_call).twice
24
+ @mock.random_call
25
+ lambda do
26
+ @mock.__verify
27
+ end.should_raise(MockExpectationError)
28
+ end
29
+
30
+ specify "twice should fail when called twice with wrong args on the first call" do
31
+ @mock.should_receive(:random_call).twice.with("1", 1)
32
+ lambda do
33
+ @mock.random_call(1, "1")
34
+ end.should_raise(MockExpectationError)
35
+ end
36
+
37
+ specify "twice should fail when called twice with wrong args on the second call" do
38
+ @mock.should_receive(:random_call).twice.with("1", 1)
39
+ @mock.random_call("1", 1)
40
+ lambda do
41
+ @mock.random_call(1, "1")
42
+ end.should_raise(MockExpectationError)
43
+ end
44
+
45
+ specify "twice should pass when called twice" do
46
+ @mock.should_receive(:random_call).twice
47
+ @mock.random_call
48
+ @mock.random_call
49
+ @mock.__verify
50
+ end
51
+
52
+ specify "twice should pass when called twice with specified args" do
53
+ @mock.should_receive(:random_call).twice.with("1", 1)
54
+ @mock.random_call("1", 1)
55
+ @mock.random_call("1", 1)
56
+ @mock.__verify
57
+ end
58
+
59
+ specify "twice should pass when called twice with unspecified args" do
60
+ @mock.should_receive(:random_call).twice
61
+ @mock.random_call("1")
62
+ @mock.random_call(1)
63
+ @mock.__verify
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,32 @@
1
+ require 'stringio'
2
+ context "CommandLine" do
3
+ specify "should run directory" do
4
+ file = File.dirname(__FILE__) + '/../../../examples'
5
+ err = StringIO.new
6
+ out = StringIO.new
7
+ Spec::Runner::CommandLine.run([file], err, out, false, true)
8
+
9
+ out.rewind
10
+ out.read.should =~ /60 specifications, 0 failures/n
11
+ end
12
+
13
+ specify "should run file" do
14
+ file = File.dirname(__FILE__) + '/../../../examples/io_processor_spec.rb'
15
+ err = StringIO.new
16
+ out = StringIO.new
17
+ Spec::Runner::CommandLine.run([file], err, out, false, true)
18
+
19
+ out.rewind
20
+ out.read.should =~ /2 specifications, 0 failures/n
21
+ end
22
+
23
+ specify "should raise when file does not exist" do
24
+ file = File.dirname(__FILE__) + '/doesntexist'
25
+ err = StringIO.new
26
+ out = StringIO.new
27
+
28
+ lambda {
29
+ Spec::Runner::CommandLine.run([file], err, out, false, true)
30
+ }.should_raise
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Runner
5
+ context "ContextMatching" do
6
+
7
+ setup do
8
+ @formatter = Spec::Mocks::Mock.new("formatter")
9
+ @context = Context.new("context") {}
10
+ @context_eval = @context.instance_eval { @context_eval_module }
11
+ end
12
+
13
+ specify "run all specs when spec is not specified" do
14
+ @context_eval.specify("spec1") {}
15
+ @context_eval.specify("spec2") {}
16
+ @context.run_single_spec("context")
17
+ @context.number_of_specs.should_equal(2)
18
+ end
19
+
20
+ specify "should only run specified specs when specified" do
21
+ @context_eval.specify("spec1") {}
22
+ @context_eval.specify("spec2") {}
23
+ @context.run_single_spec("context spec1")
24
+ @context.number_of_specs.should_equal(1)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,100 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ context "ContextRunner" do
4
+ specify "should call run on context" do
5
+ context1 = mock("context1", {
6
+ :null_object => true
7
+ })
8
+ context2 = mock("context2", {
9
+ :null_object => true
10
+ })
11
+ context1.should_receive(:run)
12
+ context1.should_receive(:number_of_specs).and_return(0)
13
+ context2.should_receive(:run)
14
+ context2.should_receive(:number_of_specs).and_return(0)
15
+ reporter = mock("reporter")
16
+ reporter.should_receive(:start).with(0)
17
+ reporter.should_receive(:end)
18
+ reporter.should_receive(:dump)
19
+
20
+ options = OpenStruct.new
21
+ options.reporter = reporter
22
+ runner = Spec::Runner::ContextRunner.new(options)
23
+ runner.add_context(context1)
24
+ runner.add_context(context2)
25
+ runner.run(false)
26
+ end
27
+
28
+ specify "should support single spec" do
29
+ desired_context = mock("desired context")
30
+ desired_context.should_receive(:matches?).at_least(:once).and_return(true)
31
+ desired_context.should_receive(:run)
32
+ desired_context.should_receive(:run_single_spec)
33
+ desired_context.should_receive(:number_of_specs).and_return(1)
34
+ other_context = mock("other context")
35
+ other_context.should_receive(:matches?).and_return(false)
36
+ other_context.should_receive(:run).never
37
+ other_context.should_receive(:number_of_specs).never
38
+ reporter = mock("reporter")
39
+ options = OpenStruct.new
40
+ options.reporter = reporter
41
+ options.spec_name = "desired context legal spec"
42
+
43
+ runner = Spec::Runner::ContextRunner.new(options)
44
+ runner.add_context(desired_context)
45
+ runner.add_context(other_context)
46
+ reporter.should_receive(:start)
47
+ reporter.should_receive(:end)
48
+ reporter.should_receive(:dump)
49
+ runner.run(false)
50
+ end
51
+
52
+ specify "should dump even if Interrupt exception is occurred" do
53
+ context = Spec::Runner::Context.new("context") do
54
+ specify "no error" do
55
+ end
56
+
57
+ specify "should interrupt" do
58
+ raise Interrupt
59
+ end
60
+ end
61
+
62
+ reporter = mock("reporter")
63
+ reporter.should_receive(:start)
64
+ reporter.should_receive(:add_context).with("context")
65
+ reporter.should_receive(:spec_started).with("no error")
66
+ reporter.should_receive(:spec_started).with("should interrupt")
67
+ reporter.should_receive(:spec_finished).twice
68
+ reporter.should_receive(:end)
69
+ reporter.should_receive(:dump)
70
+
71
+ options = OpenStruct.new
72
+ options.reporter = reporter
73
+ runner = Spec::Runner::ContextRunner.new(options)
74
+ runner.add_context(context)
75
+ runner.run(false)
76
+ end
77
+
78
+ specify "should heckle when options have heckle_runner" do
79
+ context = mock("context", :null_object => true)
80
+ context.should_receive(:number_of_specs).and_return(0)
81
+ context.should_receive(:run).and_return(0)
82
+
83
+ reporter = mock("reporter")
84
+ reporter.should_receive(:start).with(0)
85
+ reporter.should_receive(:end)
86
+ reporter.should_receive(:dump).and_return(0)
87
+
88
+ heckle_runner = mock("heckle_runner")
89
+ heckle_runner.should_receive(:heckle_with)
90
+
91
+ options = OpenStruct.new
92
+ options.reporter = reporter
93
+ options.heckle_runner = heckle_runner
94
+
95
+ runner = Spec::Runner::ContextRunner.new(options)
96
+ runner.add_context(context)
97
+ runner.run(false)
98
+
99
+ end
100
+ end
@@ -0,0 +1,405 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module Runner
5
+ context "Context" do
6
+
7
+ setup do
8
+ @formatter = Spec::Mocks::Mock.new "formatter", :register_as_spec_listener => false
9
+ @context = Context.new("context") {}
10
+ @context_eval = @context.instance_eval { @context_eval_module }
11
+ end
12
+
13
+ teardown do
14
+ @formatter.__verify
15
+ end
16
+
17
+ specify "should add itself to formatter on run" do
18
+ @formatter.should_receive(:add_context).with "context"
19
+ @context.run(@formatter)
20
+ end
21
+
22
+ specify "should run spec on run" do
23
+ @formatter.should_receive(:add_context).with :any_args
24
+ @formatter.should_receive(:spec_started).with "test"
25
+ @formatter.should_receive(:spec_finished).with "test", :anything, :anything
26
+ $spec_ran = false
27
+ @context_eval.specify("test") {$spec_ran = true}
28
+ @context.run(@formatter)
29
+ $spec_ran.should be_true
30
+ end
31
+
32
+ specify "should not run spec on dry run" do
33
+ @formatter.should_receive(:add_context).with :any_args
34
+ @formatter.should_receive(:spec_started).with "test"
35
+ @formatter.should_receive(:spec_finished).with "test"
36
+ $spec_ran = false
37
+ @context_eval.specify("test") {$spec_ran = true}
38
+ @context.run(@formatter, true)
39
+ $spec_ran.should be_false
40
+ end
41
+
42
+ specify "should not run context_setup or context_teardown on dry run" do
43
+ @formatter.should_receive(:add_context).with :any_args
44
+ @formatter.should_receive(:spec_started).with "test"
45
+ @formatter.should_receive(:spec_finished).with "test"
46
+
47
+ context_setup_ran = false
48
+ context_teardown_ran = false
49
+ @context_eval.context_setup { context_setup_ran = true }
50
+ @context_eval.context_teardown { context_teardown_ran = true }
51
+ @context_eval.specify("test") {true}
52
+ @context.run(@formatter, true)
53
+ context_setup_ran.should be_false
54
+ context_teardown_ran.should be_false
55
+ end
56
+
57
+ specify "should not run context if context_setup fails" do
58
+ @formatter.should_receive(:add_context).with :any_args
59
+ @formatter.should_receive(:spec_finished).with :any_args
60
+
61
+ spec_ran = false
62
+ @context_eval.context_setup { raise "help" }
63
+ @context_eval.specify("test") {spec_ran = true}
64
+ @context.run(@formatter)
65
+ spec_ran.should be_false
66
+ end
67
+
68
+ specify "should run context_teardown if any spec fails" do
69
+ @formatter.should_receive(:add_context).with :any_args
70
+ @formatter.should_receive(:spec_finished).with :any_args
71
+
72
+ context_teardown_ran = false
73
+ @context_eval.context_setup { raise "context_setup error" }
74
+ @context_eval.context_teardown { context_teardown_ran = true }
75
+ @context.run(@formatter)
76
+ context_teardown_ran.should be_true
77
+ end
78
+
79
+ specify "should run context_teardown if any context_setup fails" do
80
+ @formatter.should_receive(:add_context).with :any_args
81
+ @formatter.should_receive(:spec_started).with "test"
82
+ @formatter.should_receive(:spec_finished).with :any_args
83
+
84
+ context_teardown_ran = false
85
+ @context_eval.context_teardown { context_teardown_ran = true }
86
+ @context_eval.specify("test") {raise "spec error" }
87
+ @context.run(@formatter)
88
+ context_teardown_ran.should be_true
89
+ end
90
+
91
+
92
+ specify "should supply context_setup as spec name if failure in context_setup" do
93
+ @formatter.should_receive(:add_context).with :any_args
94
+
95
+ @formatter.should_receive(:spec_finished) do |name, error, location|
96
+ name.should_eql("context_setup")
97
+ error.message.should_eql("in context_setup")
98
+ location.should_eql("context_setup")
99
+ end
100
+
101
+ @context_eval.context_setup { raise "in context_setup" }
102
+ @context_eval.specify("test") {true}
103
+ @context.run(@formatter)
104
+ end
105
+
106
+ specify "should provide context_teardown as spec name if failure in context_teardown" do
107
+ @formatter.should_receive(:add_context).with :any_args
108
+
109
+ @formatter.should_receive(:spec_finished) do |name, error, location|
110
+ name.should_eql("context_teardown")
111
+ error.message.should_eql("in context_teardown")
112
+ location.should_eql("context_teardown")
113
+ end
114
+
115
+ @context_eval.context_teardown { raise "in context_teardown" }
116
+ @context.run(@formatter)
117
+ end
118
+
119
+ specify "should run superclass context_setup and context_setup block only once per context" do
120
+ @formatter.should_receive(:add_context).with :any_args
121
+ @formatter.should_receive(:spec_started).with "test"
122
+ @formatter.should_receive(:spec_started).with "test2"
123
+ @formatter.should_receive(:spec_finished).twice.with :any_args
124
+
125
+ super_class_context_setup_run_count = 0
126
+ super_class = Class.new do
127
+ define_method :context_setup do
128
+ super_class_context_setup_run_count += 1
129
+ end
130
+ end
131
+ # using @context.inherit_context_eval_module_from here, but other examples use @context_eval.inherit
132
+ # - inherit_context_eval_module_from is used by Spec::Rails to avoid confusion with Ruby's #include method
133
+ @context.inherit_context_eval_module_from super_class
134
+
135
+ context_setup_run_count = 0
136
+ @context_eval.context_setup {context_setup_run_count += 1}
137
+ @context_eval.specify("test") {true}
138
+ @context_eval.specify("test2") {true}
139
+ @context.run(@formatter)
140
+ super_class_context_setup_run_count.should_be 1
141
+ context_setup_run_count.should_be 1
142
+ end
143
+
144
+ specify "should run superclass setup method and setup block" do
145
+ @formatter.should_receive(:add_context).with :any_args
146
+ @formatter.should_receive(:spec_started).with "test"
147
+ @formatter.should_receive(:spec_finished).with :any_args
148
+
149
+ super_class_setup_ran = false
150
+ super_class = Class.new do
151
+ define_method :setup do
152
+ super_class_setup_ran = true
153
+ end
154
+ end
155
+ @context_eval.inherit super_class
156
+
157
+ setup_ran = false
158
+ @context_eval.setup {setup_ran = true}
159
+ @context_eval.specify("test") {true}
160
+ @context.run(@formatter)
161
+ super_class_setup_ran.should be_true
162
+ setup_ran.should be_true
163
+ end
164
+
165
+ specify "should run superclass context_teardown method and context_teardown block only once" do
166
+ @formatter.should_receive(:add_context).with :any_args
167
+ @formatter.should_receive(:spec_started).with "test"
168
+ @formatter.should_receive(:spec_started).with "test2"
169
+ @formatter.should_receive(:spec_finished).twice.with :any_args
170
+
171
+ super_class_context_teardown_run_count = 0
172
+ super_class = Class.new do
173
+ define_method :context_teardown do
174
+ super_class_context_teardown_run_count += 1
175
+ end
176
+ end
177
+ @context_eval.inherit super_class
178
+
179
+ context_teardown_run_count = 0
180
+ @context_eval.context_teardown {context_teardown_run_count += 1}
181
+ @context_eval.specify("test") {true}
182
+ @context_eval.specify("test2") {true}
183
+ @context.run(@formatter)
184
+ super_class_context_teardown_run_count.should_be 1
185
+ context_teardown_run_count.should_be 1
186
+ @formatter.__verify
187
+ end
188
+
189
+ specify "context_teardown should have access to all instance variables defined in context_setup" do
190
+ @formatter.should_receive(:add_context).with :any_args
191
+ @formatter.should_receive(:spec_started).with "test"
192
+ @formatter.should_receive(:spec_finished).with :any_args
193
+
194
+ context_instance_value_in = "Hello there"
195
+ context_instance_value_out = ""
196
+ @context_eval.context_setup { @instance_var = context_instance_value_in }
197
+ @context_eval.context_teardown { context_instance_value_out = @instance_var }
198
+ @context_eval.specify("test") {true}
199
+ @context.run(@formatter)
200
+ context_instance_value_in.should == context_instance_value_out
201
+ end
202
+
203
+ specify "should copy instance variables from context_setup's execution context into spec's execution context" do
204
+ @formatter.should_receive(:add_context).with :any_args
205
+ @formatter.should_receive(:spec_started).with "test"
206
+ @formatter.should_receive(:spec_finished).with :any_args
207
+
208
+ context_instance_value_in = "Hello there"
209
+ context_instance_value_out = ""
210
+ @context_eval.context_setup { @instance_var = context_instance_value_in }
211
+ @context_eval.specify("test") {context_instance_value_out = @instance_var}
212
+ @context.run(@formatter)
213
+ context_instance_value_in.should == context_instance_value_out
214
+ end
215
+
216
+ specify "should call context_setup before any setup" do
217
+ @formatter.should_receive(:add_context).with :any_args
218
+ @formatter.should_receive(:spec_started).with "test"
219
+ @formatter.should_receive(:spec_finished).with :any_args
220
+
221
+ fiddle = []
222
+ super_class = Class.new do
223
+ define_method :setup do
224
+ fiddle << "superclass setup"
225
+ end
226
+ end
227
+ @context_eval.inherit super_class
228
+
229
+ @context_eval.context_setup { fiddle << "context_setup" }
230
+ @context_eval.setup { fiddle << "setup" }
231
+ @context_eval.specify("test") {true}
232
+ @context.run(@formatter)
233
+ fiddle.first.should == "context_setup"
234
+ fiddle.last.should == "setup"
235
+ end
236
+
237
+ specify "should call context_teardown after any teardown" do
238
+ @formatter.should_receive(:add_context).with :any_args
239
+ @formatter.should_receive(:spec_started).with "test"
240
+ @formatter.should_receive(:spec_finished).with :any_args
241
+
242
+ fiddle = []
243
+ super_class = Class.new do
244
+ define_method :teardown do
245
+ fiddle << "superclass teardown"
246
+ end
247
+ end
248
+ @context_eval.inherit super_class
249
+
250
+ @context_eval.context_teardown { fiddle << "context_teardown" }
251
+ @context_eval.teardown { fiddle << "teardown" }
252
+ @context_eval.specify("test") {true}
253
+ @context.run(@formatter)
254
+ fiddle.first.should == "superclass teardown"
255
+ fiddle.last.should == "context_teardown"
256
+ end
257
+
258
+
259
+ specify "should run superclass teardown method and teardown block" do
260
+ @formatter.should_receive(:add_context).with :any_args
261
+ @formatter.should_receive(:spec_started).with "test"
262
+ @formatter.should_receive(:spec_finished).with :any_args
263
+
264
+ super_class_teardown_ran = false
265
+ super_class = Class.new do
266
+ define_method :teardown do
267
+ super_class_teardown_ran = true
268
+ end
269
+ end
270
+ @context_eval.inherit super_class
271
+
272
+ teardown_ran = false
273
+ @context_eval.teardown {teardown_ran = true}
274
+ @context_eval.specify("test") {true}
275
+ @context.run(@formatter)
276
+ super_class_teardown_ran.should be_true
277
+ teardown_ran.should be_true
278
+ @formatter.__verify
279
+ end
280
+
281
+ specify "should have accessible methods from inherited superclass" do
282
+ @formatter.should_receive(:add_context).with :any_args
283
+ @formatter.should_receive(:spec_started).with "test"
284
+ @formatter.should_receive(:spec_finished).with :any_args
285
+
286
+ helper_method_ran = false
287
+ super_class = Class.new do
288
+ define_method :helper_method do
289
+ helper_method_ran = true
290
+ end
291
+ end
292
+ @context_eval.inherit super_class
293
+
294
+ @context_eval.specify("test") {helper_method}
295
+ @context.run(@formatter)
296
+ helper_method_ran.should be_true
297
+ end
298
+
299
+ specify "should have accessible class methods from inherited superclass" do
300
+ class_method_ran = false
301
+ super_class = Class.new
302
+ (class << super_class; self; end).class_eval do
303
+ define_method :class_method do
304
+ class_method_ran = true
305
+ end
306
+ end
307
+ @context_eval.inherit super_class
308
+ @context.class_method
309
+ class_method_ran.should be_true
310
+
311
+ lambda {@context.foobar}.should_raise(NoMethodError)
312
+ end
313
+
314
+ specify "should include inherited class methods" do
315
+ class_method_ran = false
316
+ super_class = Class.new
317
+ class << super_class
318
+ def super_class_class_method; end
319
+ end
320
+ @context_eval.inherit super_class
321
+
322
+ @context.methods.should_include("super_class_class_method")
323
+ end
324
+
325
+ specify "should have accessible instance methods from included module" do
326
+ @formatter.should_receive(:add_context).with :any_args
327
+ @formatter.should_receive(:spec_started).with "test"
328
+ @formatter.should_receive(:spec_finished).with :any_args
329
+
330
+ mod1_method_called = false
331
+ mod1 = Module.new do
332
+ define_method :mod1_method do
333
+ mod1_method_called = true
334
+ end
335
+ end
336
+
337
+ mod2_method_called = false
338
+ mod2 = Module.new do
339
+ define_method :mod2_method do
340
+ mod2_method_called = true
341
+ end
342
+ end
343
+
344
+ @context_eval.include mod1
345
+ @context_eval.include mod2
346
+
347
+ @context_eval.specify("test") do
348
+ mod1_method
349
+ mod2_method
350
+ end
351
+ @context.run(@formatter)
352
+ mod1_method_called.should be_true
353
+ mod2_method_called.should be_true
354
+ end
355
+
356
+ specify "should have accessible class methods from included module" do
357
+ mod1_method_called = false
358
+ mod1 = Module.new do
359
+ class_methods = Module.new do
360
+ define_method :mod1_method do
361
+ mod1_method_called = true
362
+ end
363
+ end
364
+
365
+ (class << self; self; end).class_eval do
366
+ define_method(:included) do |receiver|
367
+ receiver.extend class_methods
368
+ end
369
+ end
370
+ end
371
+
372
+ mod2_method_called = false
373
+ mod2 = Module.new do
374
+ class_methods = Module.new do
375
+ define_method :mod2_method do
376
+ mod2_method_called = true
377
+ end
378
+ end
379
+
380
+ (class << self; self; end).class_eval do
381
+ define_method(:included) do |receiver|
382
+ receiver.extend class_methods
383
+ end
384
+ end
385
+ end
386
+
387
+ @context_eval.include mod1
388
+ @context_eval.include mod2
389
+
390
+ @context_eval.mod1_method
391
+ @context_eval.mod2_method
392
+ mod1_method_called.should_be true
393
+ mod2_method_called.should_be true
394
+ end
395
+
396
+ specify "should count number of specs" do
397
+ @context_eval.specify("one") {}
398
+ @context_eval.specify("two") {}
399
+ @context_eval.specify("three") {}
400
+ @context_eval.specify("four") {}
401
+ @context.number_of_specs.should_be 4
402
+ end
403
+ end
404
+ end
405
+ end