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,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