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,14 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+ unless ['i386-mswin32', 'java'].index(PLATFORM)
3
+ require 'spec/runner/heckle_runner'
4
+
5
+ context "Heckler" do
6
+ specify "should run context_runner on tests_pass?" do
7
+ context_runner = mock("context_runner")
8
+ context_runner.should_receive(:run)
9
+ heckler = Spec::Runner::Heckler.new('Array', 'push', context_runner)
10
+
11
+ heckler.tests_pass?
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Runner
5
+ context "KernelExt" do
6
+ specify "should add context method to kernel" do
7
+ lambda do
8
+ context "" do
9
+
10
+ end
11
+ end.should_not_raise
12
+
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Runner
5
+ context "NoisyBacktraceTweaker" do
6
+ setup do
7
+ @error = RuntimeError.new
8
+ @tweaker = NoisyBacktraceTweaker.new
9
+ end
10
+
11
+ specify "should leave anything in lib spec dir" do
12
+ ["expectations", "mocks", "runner", "stubs"].each do |child|
13
+ @error.set_backtrace(["/lib/spec/#{child}/anything.rb"])
14
+ @tweaker.tweak_backtrace(@error, "spec name")
15
+ @error.backtrace.should_not_be_empty
16
+ end
17
+ end
18
+
19
+ specify "should leave anything in spec dir" do
20
+ @error.set_backtrace(["/lib/spec/expectations/anything.rb"])
21
+ @tweaker.tweak_backtrace(@error, "spec name")
22
+ @error.backtrace.should_not_be_empty
23
+ end
24
+
25
+ specify "should leave bin spec" do
26
+ @error.set_backtrace(["bin/spec:"])
27
+ @tweaker.tweak_backtrace(@error, "spec name")
28
+ @error.backtrace.should_not_be_empty
29
+ end
30
+
31
+ specify "should not barf on nil backtrace" do
32
+ lambda do
33
+ @tweaker.tweak_backtrace(@error, "spec name")
34
+ end.should_not_raise
35
+ end
36
+
37
+ specify "should clean up double slashes" do
38
+ @error.set_backtrace(["/a//b/c//d.rb"])
39
+ @tweaker.tweak_backtrace(@error, "spec name")
40
+ @error.backtrace.should_include "/a/b/c/d.rb"
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Runner
5
+ context "ObjectExt" do
6
+ specify "should add copy_instance_variables_from to object" do
7
+ Object.new.should_respond_to :copy_instance_variables_from
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,269 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ context "OptionParser" do
4
+ setup do
5
+ @out = StringIO.new
6
+ @err = StringIO.new
7
+ @parser = Spec::Runner::OptionParser.new
8
+ end
9
+
10
+ def parse(args)
11
+ @parser.parse(args, @err, @out, true)
12
+ end
13
+
14
+ specify "should accept dry run option" do
15
+ options = parse(["--dry-run"])
16
+ options.dry_run.should_be(true)
17
+ end
18
+
19
+ specify "should eval and use custom formatter when none of the builtins" do
20
+ options = parse(["--format", "Custom::Formatter"])
21
+ options.formatter_type.should equal(Custom::Formatter)
22
+ end
23
+
24
+ specify "should not be verbose by default" do
25
+ options = parse([])
26
+ options.verbose.should_be(nil)
27
+ end
28
+
29
+ specify "should not use colour by default" do
30
+ options = parse([])
31
+ options.colour.should_be(nil)
32
+ end
33
+
34
+ specify "should print help to stdout" do
35
+ options = parse(["--help"])
36
+ @out.rewind
37
+ @out.read.should_match(/Usage: spec \[options\] \(FILE\|DIRECTORY\|GLOB\)\+/n)
38
+ end
39
+
40
+ specify "should print instructions about how to fix bad formatter" do
41
+ options = parse(["--format", "Custom::BadFormatter"])
42
+ @err.string.should_match(/Couldn't find formatter class Custom::BadFormatter/n)
43
+ end
44
+
45
+ specify "should print usage to err if no dir specified" do
46
+ options = parse([])
47
+ @err.string.should_match(/Usage: spec/)
48
+ end
49
+
50
+ specify "should print version to stdout" do
51
+ options = parse(["--version"])
52
+ @out.rewind
53
+ @out.read.should_match(/RSpec-\d+\.\d+\.\d+ \(r\d+\) - BDD for Ruby\nhttp:\/\/rspec.rubyforge.org\/\n/n)
54
+ end
55
+
56
+ specify "should accept -o option" do
57
+ options = parse(["-o", "#{File.expand_path(File.dirname(__FILE__))}/output_file.txt"])
58
+ options.out.should_be_an_instance_of File
59
+ options.out.path.should == "#{File.expand_path(File.dirname(__FILE__))}/output_file.txt"
60
+ File.delete(options.out.path) rescue nil
61
+ end
62
+
63
+ specify "should require file when require specified" do
64
+ lambda do
65
+ parse(["--require", "whatever"])
66
+ end.should_raise(LoadError)
67
+ end
68
+
69
+ specify "should select dry run for rdoc formatter" do
70
+ options = parse(["--format", "rdoc"])
71
+ options.dry_run.should_be(true)
72
+ end
73
+
74
+ specify "should support c option" do
75
+ options = parse(["-c"])
76
+ options.colour.should_be(true)
77
+ end
78
+
79
+ specify "should support queens colour option" do
80
+ options = parse(["--colour"])
81
+ options.colour.should_be(true)
82
+ end
83
+
84
+ specify "should support us color option" do
85
+ options = parse(["--color"])
86
+ options.colour.should_be(true)
87
+ end
88
+
89
+ specify "should support single spec with s option" do
90
+ options = parse(["-s", "something or other"])
91
+ options.spec_name.should_eql("something or other")
92
+ end
93
+
94
+ specify "should support single spec with spec option" do
95
+ options = parse(["--spec", "something or other"])
96
+ options.spec_name.should_eql("something or other")
97
+ end
98
+
99
+ specify "should use html formatter when format is h" do
100
+ options = parse(["--format", "h"])
101
+ options.formatter_type.should equal(Spec::Runner::Formatter::HtmlFormatter)
102
+ end
103
+
104
+ specify "should use html formatter when format is html" do
105
+ options = parse(["--format", "html"])
106
+ options.formatter_type.should equal(Spec::Runner::Formatter::HtmlFormatter)
107
+ end
108
+
109
+ specify "should use noisy backtrace tweaker with b option" do
110
+ options = parse(["-b"])
111
+ options.backtrace_tweaker.should_be_instance_of(Spec::Runner::NoisyBacktraceTweaker)
112
+ end
113
+
114
+ specify "should use noisy backtrace tweaker with backtrace option" do
115
+ options = parse(["--backtrace"])
116
+ options.backtrace_tweaker.should_be_instance_of(Spec::Runner::NoisyBacktraceTweaker)
117
+ end
118
+
119
+ specify "should use quiet backtrace tweaker by default" do
120
+ options = parse([])
121
+ options.backtrace_tweaker.should_be_instance_of(Spec::Runner::QuietBacktraceTweaker)
122
+ end
123
+
124
+ specify "should use progress bar formatter by default" do
125
+ options = parse([])
126
+ options.formatter_type.should equal(Spec::Runner::Formatter::ProgressBarFormatter)
127
+ end
128
+
129
+ specify "should use rdoc formatter when format is r" do
130
+ options = parse(["--format", "r"])
131
+ options.formatter_type.should equal(Spec::Runner::Formatter::RdocFormatter)
132
+ end
133
+
134
+ specify "should use rdoc formatter when format is rdoc" do
135
+ options = parse(["--format", "rdoc"])
136
+ options.formatter_type.should equal(Spec::Runner::Formatter::RdocFormatter)
137
+ end
138
+
139
+ specify "should use specdoc formatter when format is s" do
140
+ options = parse(["--format", "s"])
141
+ options.formatter_type.should equal(Spec::Runner::Formatter::SpecdocFormatter)
142
+ end
143
+
144
+ specify "should use specdoc formatter when format is specdoc" do
145
+ options = parse(["--format", "specdoc"])
146
+ options.formatter_type.should equal(Spec::Runner::Formatter::SpecdocFormatter)
147
+ end
148
+
149
+ specify "should support diff option when format is not specified" do
150
+ options = parse(["--diff"])
151
+ options.diff_format.should_be :unified
152
+ end
153
+
154
+ specify "should use unified diff format option when format is unified" do
155
+ options = parse(["--diff", "unified"])
156
+ options.diff_format.should_be :unified
157
+ options.differ_class.should_be Spec::Expectations::Differs::Default
158
+ end
159
+
160
+ specify "should use context diff format option when format is context" do
161
+ options = parse(["--diff", "context"])
162
+ options.diff_format.should eql(:context)
163
+ options.differ_class.should_eql Spec::Expectations::Differs::Default
164
+ end
165
+
166
+ specify "should use custom diff format option when format is a custom format" do
167
+ options = parse(["--diff", "Custom::Formatter"])
168
+ options.diff_format.should_be :custom
169
+ options.differ_class.should_eql Custom::Formatter
170
+ end
171
+
172
+ specify "should print instructions about how to fix bad differ" do
173
+ options = parse(["--diff", "Custom::BadFormatter"])
174
+ @err.string.should_match(/Couldn't find differ class Custom::BadFormatter/n)
175
+ end
176
+
177
+ specify "should support --line to identify spec" do
178
+ spec_parser = mock("spec_parser")
179
+ @parser.instance_variable_set('@spec_parser', spec_parser)
180
+
181
+ file_factory = mock("File")
182
+ file_factory.should_receive(:file?).and_return(true)
183
+ file_factory.should_receive(:open).and_return("fake_io")
184
+ @parser.instance_variable_set('@file_factory', file_factory)
185
+
186
+ spec_parser.should_receive(:spec_name_for).with("fake_io", 169).and_return("some spec")
187
+
188
+ options = parse(["some file", "--line", "169"])
189
+ options.spec_name.should_eql("some spec")
190
+ File.__verify
191
+ end
192
+
193
+ specify "should fail with error message if file is dir along with --line" do
194
+ spec_parser = mock("spec_parser")
195
+ @parser.instance_variable_set('@spec_parser', spec_parser)
196
+
197
+ file_factory = mock("File")
198
+ file_factory.should_receive(:file?).and_return(false)
199
+ file_factory.should_receive(:directory?).and_return(true)
200
+ @parser.instance_variable_set('@file_factory', file_factory)
201
+
202
+ options = parse(["some file", "--line", "169"])
203
+ @err.string.should_match(/You must specify one file, not a directory when using the --line option/n)
204
+ end
205
+
206
+ specify "should fail with error message if file is dir along with --line" do
207
+ spec_parser = mock("spec_parser")
208
+ @parser.instance_variable_set('@spec_parser', spec_parser)
209
+
210
+ file_factory = mock("File")
211
+ file_factory.should_receive(:file?).and_return(false)
212
+ file_factory.should_receive(:directory?).and_return(false)
213
+ @parser.instance_variable_set('@file_factory', file_factory)
214
+
215
+ options = parse(["some file", "--line", "169"])
216
+ @err.string.should_match(/some file does not exist/n)
217
+ end
218
+
219
+ specify "should fail with error message if more than one files are specified along with --line" do
220
+ spec_parser = mock("spec_parser")
221
+ @parser.instance_variable_set('@spec_parser', spec_parser)
222
+
223
+ options = parse(["some file", "some other file", "--line", "169"])
224
+ @err.string.should_match(/Only one file can be specified when using the --line option/n)
225
+ end
226
+
227
+ specify "should fail with error message if --spec and --line are used simultaneously" do
228
+ spec_parser = mock("spec_parser")
229
+ @parser.instance_variable_set('@spec_parser', spec_parser)
230
+
231
+ options = parse(["some file", "--spec", "some spec", "--line", "169"])
232
+ @err.string.should_match(/You cannot use both --line and --spec/n)
233
+ end
234
+
235
+ if(PLATFORM != "i386-mswin32")
236
+ specify "should heckle when --heckle is specified (and platform is not windows)" do
237
+ options = parse(["--heckle", "Spec"])
238
+ options.heckle_runner.should_be_instance_of(Spec::Runner::HeckleRunner)
239
+ end
240
+ else
241
+ specify "should barf when --heckle is specified (and platform is windows)" do
242
+ lambda do
243
+ options = parse(["--heckle", "Spec"])
244
+ end.should_raise(StandardError, "Heckle not supported on Windows")
245
+ end
246
+ end
247
+
248
+ specify "should read options from file when --options is specified" do
249
+ Spec::Runner::CommandLine.should_receive(:run).with(["--diff", "--colour"], @err, @out, true, true)
250
+ options = parse(["--options", File.dirname(__FILE__) + "/spec.opts"])
251
+ end
252
+
253
+ specify "should append options from file when --options is specified" do
254
+ Spec::Runner::CommandLine.should_receive(:run).with(["some/spec.rb", "--diff", "--colour"], @err, @out, true, true)
255
+ options = parse(["some/spec.rb", "--options", File.dirname(__FILE__) + "/spec.opts"])
256
+ end
257
+
258
+ specify "should save config to file when --generate-options is specified" do
259
+ FileUtils.rm 'spec.opts' rescue nil
260
+ options = parse(["--colour", "--generate-options", "spec.opts", "--diff"])
261
+ File.open('spec.opts').read.should == "--colour\n--diff\n"
262
+ FileUtils.rm 'spec.opts' rescue nil
263
+ end
264
+
265
+ specify "should call DrbCommandLine when --drb is specified" do
266
+ Spec::Runner::DrbCommandLine.should_receive(:run).with(["some/spec.rb", "--diff", "--colour"], @err, @out, true, true)
267
+ options = parse(["some/spec.rb", "--diff", "--drb", "--colour"])
268
+ end
269
+ end
@@ -0,0 +1,47 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Runner
5
+ context "QuietBacktraceTweaker" do
6
+ setup do
7
+ @error = RuntimeError.new
8
+ @tweaker = QuietBacktraceTweaker.new
9
+ end
10
+
11
+ specify "should not barf on nil backtrace" do
12
+ lambda do
13
+ @tweaker.tweak_backtrace(@error, "spec name")
14
+ end.should_not_raise
15
+ end
16
+
17
+ specify "should remove anything from textmate ruby bundle" do
18
+ @error.set_backtrace(["/Applications/TextMate.app/Contents/SharedSupport/Bundles/Ruby.tmbundle/Support/tmruby.rb:147"])
19
+ @tweaker.tweak_backtrace(@error, "spec name")
20
+ @error.backtrace.should_be_empty
21
+ end
22
+
23
+ specify "should remove anything in lib spec dir" do
24
+ ["expectations", "mocks", "runner", "callback"].each do |child|
25
+ element="/lib/spec/#{child}/anything.rb"
26
+ @error.set_backtrace([element])
27
+ @tweaker.tweak_backtrace(@error, "spec name")
28
+ unless (@error.backtrace.empty?)
29
+ raise("Should have tweaked away '#{element}'")
30
+ end
31
+ end
32
+ end
33
+
34
+ specify "should remove bin spec" do
35
+ @error.set_backtrace(["bin/spec:"])
36
+ @tweaker.tweak_backtrace(@error, "spec name")
37
+ @error.backtrace.should_be_empty
38
+ end
39
+
40
+ specify "should clean up double slashes" do
41
+ @error.set_backtrace(["/a//b/c//d.rb"])
42
+ @tweaker.tweak_backtrace(@error, "spec name")
43
+ @error.backtrace.should_include "/a/b/c/d.rb"
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,126 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Runner
5
+ context "Reporter" do
6
+ setup do
7
+ @io = StringIO.new
8
+ @backtrace_tweaker = Spec::Mocks::Mock.new("backtrace tweaker", {
9
+ :auto_verify => false
10
+ })
11
+ @formatter = Spec::Mocks::Mock.new("formatter", {
12
+ :auto_verify => false
13
+ })
14
+ @reporter = Reporter.new(@formatter, @backtrace_tweaker)
15
+
16
+ end
17
+ specify "should account for context in stats" do
18
+ @formatter.should_receive(:add_context).with("context", true)
19
+ @reporter.add_context("context")
20
+
21
+ end
22
+ specify "should account for spec and error in stats for pass" do
23
+ @formatter.should_receive(:add_context)
24
+ @formatter.should_receive(:spec_started).with("spec")
25
+ @formatter.should_receive(:spec_failed).with("spec", 1, failure)
26
+ @formatter.should_receive(:start_dump)
27
+ @formatter.should_receive(:dump_failure).with(1, :anything)
28
+ @formatter.should_receive(:dump_summary).with(:anything, 1, 1)
29
+ @backtrace_tweaker.should_receive(:tweak_backtrace)
30
+ @reporter.add_context("context")
31
+ @reporter.spec_started("spec")
32
+ @reporter.spec_finished("spec", RuntimeError.new)
33
+ @reporter.dump
34
+
35
+ end
36
+ specify "should account for spec in stats for pass" do
37
+ @formatter.should_receive(:spec_started)
38
+ @formatter.should_receive(:spec_passed)
39
+ @formatter.should_receive(:start_dump)
40
+ @formatter.should_receive(:dump_summary).with(:anything, 1, 0)
41
+ @reporter.spec_started("spec")
42
+ @reporter.spec_finished("spec")
43
+ @reporter.dump
44
+
45
+ end
46
+ specify "should delegate to backtrace tweaker" do
47
+ @formatter.should_receive(:add_context)
48
+ @formatter.should_receive(:spec_failed)
49
+ @backtrace_tweaker.should_receive(:tweak_backtrace)
50
+ @reporter.add_context("context")
51
+ @reporter.spec_finished("spec", RuntimeError.new)
52
+ @backtrace_tweaker.__verify
53
+
54
+ end
55
+ specify "should handle multiple contexts with same name" do
56
+ @formatter.should_receive(:add_context).exactly(3).times
57
+ @formatter.should_receive(:spec_started).exactly(3).times
58
+ @formatter.should_receive(:spec_passed).exactly(3).times
59
+ @formatter.should_receive(:start_dump)
60
+ @formatter.should_receive(:dump_summary).with(:anything, 3, 0)
61
+ @reporter.add_context("context")
62
+ @reporter.spec_started("spec 1")
63
+ @reporter.spec_finished("spec 1")
64
+ @reporter.add_context("context")
65
+ @reporter.spec_started("spec 2")
66
+ @reporter.spec_finished("spec 2")
67
+ @reporter.add_context("context")
68
+ @reporter.spec_started("spec 3")
69
+ @reporter.spec_finished("spec 3")
70
+ @reporter.dump
71
+
72
+ end
73
+ specify "should handle multiple specs same name" do
74
+
75
+ error=RuntimeError.new
76
+ @formatter.should_receive(:add_context).exactly(2).times
77
+ @formatter.should_receive(:spec_started).with("spec").exactly(4).times
78
+ @formatter.should_receive(:spec_passed).with("spec").exactly(2).times
79
+ @formatter.should_receive(:spec_failed).with("spec", 1, failure)
80
+ @formatter.should_receive(:spec_failed).with("spec", 2, failure)
81
+ @formatter.should_receive(:dump_failure).exactly(2).times
82
+ @formatter.should_receive(:start_dump)
83
+ @formatter.should_receive(:dump_summary).with(:anything, 4, 2)
84
+ @backtrace_tweaker.should_receive(:tweak_backtrace)
85
+ @reporter.add_context("context")
86
+ @reporter.spec_started("spec")
87
+ @reporter.spec_finished("spec")
88
+ @reporter.spec_started("spec")
89
+ @reporter.spec_finished("spec", error)
90
+ @reporter.add_context("context")
91
+ @reporter.spec_started("spec")
92
+ @reporter.spec_finished("spec")
93
+ @reporter.spec_started("spec")
94
+ @reporter.spec_finished("spec", error)
95
+ @reporter.dump
96
+
97
+ end
98
+ specify "should push context to formatter" do
99
+ @formatter.should_receive(:add_context).never
100
+ @reporter.add_context("context")
101
+
102
+ end
103
+ specify "should push stats to reporter even with no data" do
104
+ @formatter.should_receive(:start_dump)
105
+ @formatter.should_receive(:dump_summary).with(:anything, 0, 0)
106
+ @reporter.dump
107
+
108
+ end
109
+ specify "should push time to reporter" do
110
+ @formatter.should_receive(:start).with(5)
111
+ @formatter.should_receive(:start_dump)
112
+ @formatter.should_receive(:dump_summary) do |time, a, b|
113
+ time.to_s.should_match(/[0-9].[0-9|e|-]+/)
114
+ end
115
+ @reporter.start(5)
116
+ @reporter.end
117
+ @reporter.dump
118
+
119
+ end
120
+ def failure
121
+ Mocks::DuckTypeArgConstraint.new(:header, :exception)
122
+ end
123
+
124
+ end
125
+ end
126
+ end