rspec 0.7.5.1 → 0.8.0

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