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.
- data/CHANGES +60 -1
- data/EXAMPLES.rd +38 -19
- data/MIT-LICENSE +1 -1
- data/README +24 -17
- data/RELEASE-PLAN +117 -0
- data/Rakefile +24 -18
- data/TODO.0.8.0 +5 -0
- data/examples/auto_spec_name_generation_example.rb +18 -0
- data/examples/custom_expectation_matchers.rb +53 -0
- data/examples/dynamic_spec.rb +9 -0
- data/examples/io_processor_spec.rb +2 -2
- data/examples/mocking_example.rb +4 -4
- data/examples/partial_mock_example.rb +2 -2
- data/examples/predicate_example.rb +2 -2
- data/examples/stack_spec.rb +32 -36
- data/examples/stubbing_example.rb +19 -19
- data/examples/test_case_spec.rb +6 -6
- data/lib/spec.rb +3 -0
- data/lib/spec/callback.rb +8 -0
- data/lib/spec/callback/extensions/object.rb +4 -0
- data/lib/spec/deprecated.rb +3 -0
- data/lib/spec/expectations.rb +44 -17
- data/lib/spec/expectations/extensions.rb +1 -2
- data/lib/spec/expectations/extensions/object.rb +78 -130
- data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
- data/lib/spec/expectations/handler.rb +47 -0
- data/lib/spec/expectations/should/base.rb +32 -29
- data/lib/spec/expectations/should/change.rb +1 -1
- data/lib/spec/expectations/should/have.rb +9 -17
- data/lib/spec/expectations/should/not.rb +54 -56
- data/lib/spec/expectations/should/should.rb +59 -65
- data/lib/spec/expectations/sugar.rb +27 -4
- data/lib/spec/matchers.rb +160 -0
- data/lib/spec/matchers/be.rb +161 -0
- data/lib/spec/matchers/be_close.rb +37 -0
- data/lib/spec/matchers/change.rb +120 -0
- data/lib/spec/matchers/eql.rb +43 -0
- data/lib/spec/matchers/equal.rb +43 -0
- data/lib/spec/matchers/has.rb +44 -0
- data/lib/spec/matchers/have.rb +140 -0
- data/lib/spec/matchers/include.rb +50 -0
- data/lib/spec/matchers/match.rb +41 -0
- data/lib/spec/matchers/raise_error.rb +100 -0
- data/lib/spec/matchers/respond_to.rb +35 -0
- data/lib/spec/matchers/satisfy.rb +47 -0
- data/lib/spec/matchers/throw_symbol.rb +75 -0
- data/lib/spec/mocks.rb +224 -1
- data/lib/spec/mocks/argument_expectation.rb +16 -2
- data/lib/spec/mocks/error_generator.rb +5 -3
- data/lib/spec/mocks/errors.rb +2 -2
- data/lib/spec/mocks/extensions/object.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +29 -19
- data/lib/spec/mocks/{mock_methods.rb → methods.rb} +5 -5
- data/lib/spec/mocks/mock.rb +2 -2
- data/lib/spec/mocks/mock_handler.rb +81 -68
- data/lib/spec/rake/spectask.rb +7 -12
- data/lib/spec/rake/verify_rcov.rb +1 -1
- data/lib/spec/runner.rb +117 -0
- data/lib/spec/runner/command_line.rb +8 -5
- data/lib/spec/runner/context.rb +13 -37
- data/lib/spec/runner/context_eval.rb +4 -3
- data/lib/spec/runner/context_runner.rb +7 -4
- data/lib/spec/runner/drb_command_line.rb +1 -1
- data/lib/spec/runner/execution_context.rb +3 -11
- data/lib/spec/runner/extensions/kernel.rb +7 -5
- data/lib/spec/runner/extensions/object.rb +4 -1
- data/lib/spec/runner/formatter/base_text_formatter.rb +11 -3
- data/lib/spec/runner/formatter/html_formatter.rb +21 -10
- data/lib/spec/runner/heckle_runner.rb +24 -8
- data/lib/spec/runner/heckle_runner_win.rb +10 -0
- data/lib/spec/runner/option_parser.rb +58 -13
- data/lib/spec/runner/spec_matcher.rb +22 -29
- data/lib/spec/runner/spec_parser.rb +1 -0
- data/lib/spec/runner/specification.rb +36 -22
- data/lib/spec/translator.rb +87 -0
- data/lib/spec/version.rb +16 -7
- data/spec/spec/callback/callback_container_spec.rb +27 -0
- data/spec/spec/callback/module_spec.rb +37 -0
- data/spec/spec/callback/object_spec.rb +90 -0
- data/spec/spec/callback/object_with_class_callback_spec.rb +19 -0
- data/spec/spec/expectations/differs/default_spec.rb +107 -0
- data/spec/spec/expectations/extensions/object_spec.rb +46 -0
- data/spec/spec/expectations/fail_with_spec.rb +71 -0
- data/spec/spec/expectations/should/should_==_spec.rb +19 -0
- data/spec/spec/expectations/should/should_=~_spec.rb +13 -0
- data/spec/spec/expectations/should/should_be_a_kind_of_spec.rb +21 -0
- data/spec/spec/expectations/should/should_be_an_instance_of_spec.rb +30 -0
- data/spec/spec/expectations/should/should_be_arbitrary_predicate_spec.rb +81 -0
- data/spec/spec/expectations/should/should_be_close_spec.rb +18 -0
- data/spec/spec/expectations/should/should_be_comparison_operator_spec.rb +44 -0
- data/spec/spec/expectations/should/should_be_false_spec.rb +39 -0
- data/spec/spec/expectations/should/should_be_spec.rb +11 -0
- data/spec/spec/expectations/should/should_be_true_spec.rb +27 -0
- data/spec/spec/expectations/should/should_change_spec.rb +184 -0
- data/spec/spec/expectations/should/should_eql_spec.rb +11 -0
- data/spec/spec/expectations/should/should_equal_spec.rb +11 -0
- data/spec/spec/expectations/should/should_have_at_least_spec.rb +53 -0
- data/spec/spec/expectations/should/should_have_at_most_spec.rb +45 -0
- data/spec/spec/expectations/should/should_have_key_spec.rb +21 -0
- data/spec/spec/expectations/should/should_have_spec.rb +64 -0
- data/spec/spec/expectations/should/should_include_spec.rb +59 -0
- data/spec/spec/expectations/should/should_match_spec.rb +25 -0
- data/spec/spec/expectations/should/should_not_==_spec.rb +15 -0
- data/spec/spec/expectations/should/should_not_be_a_kind_of_spec.rb +21 -0
- data/spec/spec/expectations/should/should_not_be_an_instance_of_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_be_arbitrary_predicate_spec.rb +68 -0
- data/spec/spec/expectations/should/should_not_be_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_change_spec.rb +24 -0
- data/spec/spec/expectations/should/should_not_eql_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_equal_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_have_key_spec.rb +15 -0
- data/spec/spec/expectations/should/should_not_include_spec.rb +58 -0
- data/spec/spec/expectations/should/should_not_match_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_raise_spec.rb +75 -0
- data/spec/spec/expectations/should/should_not_respond_to_spec.rb +15 -0
- data/spec/spec/expectations/should/should_not_throw_spec.rb +35 -0
- data/spec/spec/expectations/should/should_raise_spec.rb +66 -0
- data/spec/spec/expectations/should/should_respond_to_spec.rb +15 -0
- data/spec/spec/expectations/should/should_satisfy_spec.rb +35 -0
- data/spec/spec/expectations/should/should_throw_spec.rb +27 -0
- data/spec/spec/matchers/be_close_spec.rb +33 -0
- data/spec/spec/matchers/be_spec.rb +182 -0
- data/spec/spec/matchers/change_spec.rb +232 -0
- data/spec/spec/matchers/description_generation_spec.rb +147 -0
- data/spec/spec/matchers/eql_spec.rb +41 -0
- data/spec/spec/matchers/equal_spec.rb +41 -0
- data/spec/spec/matchers/handler_spec.rb +75 -0
- data/spec/spec/matchers/has_spec.rb +37 -0
- data/spec/spec/matchers/have_spec.rb +259 -0
- data/spec/spec/matchers/include_spec.rb +33 -0
- data/spec/spec/matchers/match_spec.rb +37 -0
- data/spec/spec/matchers/matcher_methods_spec.rb +85 -0
- data/spec/spec/matchers/raise_error_spec.rb +147 -0
- data/spec/spec/matchers/respond_to_spec.rb +30 -0
- data/spec/spec/matchers/satisfy_spec.rb +36 -0
- data/spec/spec/matchers/throw_symbol_spec.rb +59 -0
- data/spec/spec/mocks/any_number_of_times_spec.rb +34 -0
- data/spec/spec/mocks/at_least_spec.rb +97 -0
- data/spec/spec/mocks/at_most_spec.rb +97 -0
- data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
- data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
- data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
- data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +74 -0
- data/spec/spec/mocks/mock_ordering_spec.rb +80 -0
- data/spec/spec/mocks/mock_spec.rb +407 -0
- data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
- data/spec/spec/mocks/null_object_mock_spec.rb +40 -0
- data/spec/spec/mocks/once_counts_spec.rb +56 -0
- data/spec/spec/mocks/options_hash_spec.rb +31 -0
- data/spec/spec/mocks/partial_mock_spec.rb +52 -0
- data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +64 -0
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +92 -0
- data/spec/spec/mocks/precise_counts_spec.rb +56 -0
- data/spec/spec/mocks/record_messages_spec.rb +26 -0
- data/spec/spec/mocks/stub_spec.rb +159 -0
- data/spec/spec/mocks/twice_counts_spec.rb +67 -0
- data/spec/spec/runner/command_line_spec.rb +32 -0
- data/spec/spec/runner/context_matching_spec.rb +28 -0
- data/spec/spec/runner/context_runner_spec.rb +100 -0
- data/spec/spec/runner/context_spec.rb +405 -0
- data/spec/spec/runner/drb_command_line_spec.rb +74 -0
- data/spec/spec/runner/execution_context_spec.rb +52 -0
- data/spec/spec/runner/formatter/html_formatter_spec.rb +40 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +21 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +36 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +78 -0
- data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +18 -0
- data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +41 -0
- data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +21 -0
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +46 -0
- data/spec/spec/runner/heckle_runner_spec.rb +63 -0
- data/spec/spec/runner/heckler_spec.rb +14 -0
- data/spec/spec/runner/kernel_ext_spec.rb +16 -0
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
- data/spec/spec/runner/object_ext_spec.rb +11 -0
- data/spec/spec/runner/option_parser_spec.rb +269 -0
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +47 -0
- data/spec/spec/runner/reporter_spec.rb +126 -0
- data/spec/spec/runner/spec_matcher_spec.rb +107 -0
- data/spec/spec/runner/spec_name_generation_spec.rb +102 -0
- data/spec/spec/runner/spec_parser_spec.rb +37 -0
- data/spec/spec/runner/specification_class_spec.rb +72 -0
- data/spec/spec/runner/specification_instance_spec.rb +160 -0
- data/spec/spec/runner/specification_should_raise_spec.rb +136 -0
- data/spec/spec/spec_classes.rb +102 -0
- data/spec/spec/translator_spec.rb +79 -0
- data/spec/spec_helper.rb +35 -0
- metadata +141 -9
- data/bin/drbspec +0 -3
- data/lib/spec/expectations/diff.rb +0 -28
- data/lib/spec/expectations/extensions/numeric.rb +0 -19
- data/lib/spec/expectations/extensions/string.rb +0 -22
- data/lib/spec/expectations/message_builder.rb +0 -13
@@ -0,0 +1,147 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
context "Matchers should be able to generate a description" do
|
4
|
+
setup do
|
5
|
+
@desc = nil
|
6
|
+
@callback = lambda { |desc| @desc = desc }
|
7
|
+
Spec::Matchers.description_generated(&@callback)
|
8
|
+
end
|
9
|
+
|
10
|
+
specify "should == expected" do
|
11
|
+
"this".should == "this"
|
12
|
+
@desc.should == "should == \"this\""
|
13
|
+
end
|
14
|
+
|
15
|
+
specify "should_not == expected" do
|
16
|
+
"this".should_not == "that"
|
17
|
+
@desc.should == "should not == \"that\""
|
18
|
+
end
|
19
|
+
|
20
|
+
specify "should be empty (arbitrary predicate)" do
|
21
|
+
[].should be_empty
|
22
|
+
@desc.should == "should be empty"
|
23
|
+
end
|
24
|
+
|
25
|
+
specify "should not be empty (arbitrary predicate)" do
|
26
|
+
[1].should_not be_empty
|
27
|
+
@desc.should == "should not be empty"
|
28
|
+
end
|
29
|
+
|
30
|
+
specify "should be true" do
|
31
|
+
true.should be_true
|
32
|
+
@desc.should == "should be true"
|
33
|
+
end
|
34
|
+
|
35
|
+
specify "should be false" do
|
36
|
+
false.should be_false
|
37
|
+
@desc.should == "should be false"
|
38
|
+
end
|
39
|
+
|
40
|
+
specify "should be nil" do
|
41
|
+
nil.should be_nil
|
42
|
+
@desc.should == "should be nil"
|
43
|
+
end
|
44
|
+
|
45
|
+
specify "should be > n" do
|
46
|
+
5.should be > 3
|
47
|
+
@desc.should == "should be > 3"
|
48
|
+
end
|
49
|
+
|
50
|
+
specify "should be close" do
|
51
|
+
5.0.should be_close(5.0, 0.5)
|
52
|
+
@desc.should == "should be close to 5.0 (+- 0.5)"
|
53
|
+
end
|
54
|
+
|
55
|
+
specify "should equal" do
|
56
|
+
expected = "expected"
|
57
|
+
expected.should equal(expected)
|
58
|
+
@desc.should == "should equal \"expected\""
|
59
|
+
end
|
60
|
+
|
61
|
+
specify "should_not equal" do
|
62
|
+
5.should_not equal(37)
|
63
|
+
@desc.should == "should not equal 37"
|
64
|
+
end
|
65
|
+
|
66
|
+
specify "should eql" do
|
67
|
+
"string".should eql("string")
|
68
|
+
@desc.should == "should eql \"string\""
|
69
|
+
end
|
70
|
+
|
71
|
+
specify "should not eql" do
|
72
|
+
"a".should_not eql(:a)
|
73
|
+
@desc.should == "should not eql :a"
|
74
|
+
end
|
75
|
+
|
76
|
+
specify "should have_key" do
|
77
|
+
{:a => "a"}.should have_key(:a)
|
78
|
+
@desc.should == "should have key :a"
|
79
|
+
end
|
80
|
+
|
81
|
+
specify "should have n items" do
|
82
|
+
team.should have(3).players
|
83
|
+
@desc.should == "should have 3 players"
|
84
|
+
end
|
85
|
+
|
86
|
+
specify "should have at least n items" do
|
87
|
+
team.should have_at_least(2).players
|
88
|
+
@desc.should == "should have at least 2 players"
|
89
|
+
end
|
90
|
+
|
91
|
+
specify "should have at most n items" do
|
92
|
+
team.should have_at_most(4).players
|
93
|
+
@desc.should == "should have at most 4 players"
|
94
|
+
end
|
95
|
+
|
96
|
+
specify "should include" do
|
97
|
+
[1,2,3].should include(3)
|
98
|
+
@desc.should == "should include 3"
|
99
|
+
end
|
100
|
+
|
101
|
+
specify "should match" do
|
102
|
+
"this string".should match(/this string/)
|
103
|
+
@desc.should == "should match /this string/"
|
104
|
+
end
|
105
|
+
|
106
|
+
specify "should raise_error" do
|
107
|
+
lambda { raise }.should raise_error
|
108
|
+
@desc.should == "should raise Exception"
|
109
|
+
end
|
110
|
+
|
111
|
+
specify "should raise_error with type" do
|
112
|
+
lambda { raise }.should raise_error(RuntimeError)
|
113
|
+
@desc.should == "should raise RuntimeError"
|
114
|
+
end
|
115
|
+
|
116
|
+
specify "should raise_error with type and message" do
|
117
|
+
lambda { raise "there was an error" }.should raise_error(RuntimeError, "there was an error")
|
118
|
+
@desc.should == "should raise RuntimeError with \"there was an error\""
|
119
|
+
end
|
120
|
+
|
121
|
+
specify "should respond_to" do
|
122
|
+
[].should respond_to(:insert)
|
123
|
+
@desc.should == "should respond to #insert"
|
124
|
+
end
|
125
|
+
|
126
|
+
specify "should throw symbol" do
|
127
|
+
lambda { throw :what_a_mess }.should throw_symbol
|
128
|
+
@desc.should == "should throw a Symbol"
|
129
|
+
end
|
130
|
+
|
131
|
+
specify "should throw symbol (with named symbol)" do
|
132
|
+
lambda { throw :what_a_mess }.should throw_symbol(:what_a_mess)
|
133
|
+
@desc.should == "should throw :what_a_mess"
|
134
|
+
end
|
135
|
+
|
136
|
+
def team
|
137
|
+
Class.new do
|
138
|
+
def players
|
139
|
+
[1,2,3]
|
140
|
+
end
|
141
|
+
end.new
|
142
|
+
end
|
143
|
+
|
144
|
+
teardown do
|
145
|
+
Spec::Matchers.unregister_callback(:description_generated, @callback)
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
context "should eql(expected)" do
|
4
|
+
|
5
|
+
specify "should pass if target.eql?(expected)" do
|
6
|
+
1.should eql(1)
|
7
|
+
end
|
8
|
+
|
9
|
+
specify "should fail unless target.eql?(expected)" do
|
10
|
+
lambda {
|
11
|
+
1.should eql("1")
|
12
|
+
}.should fail
|
13
|
+
end
|
14
|
+
|
15
|
+
specify "should provide message, expected and actual on failure" do
|
16
|
+
matcher = eql("1")
|
17
|
+
matcher.matches?(1)
|
18
|
+
matcher.failure_message.should == ["expected \"1\", got 1 (using .eql?)", "1", 1]
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
context "should_not eql(expected)" do
|
24
|
+
|
25
|
+
specify "should pass unless target.eql?(expected)" do
|
26
|
+
1.should_not eql("1")
|
27
|
+
end
|
28
|
+
|
29
|
+
specify "should fail if target.eql?(expected)" do
|
30
|
+
lambda {
|
31
|
+
1.should_not eql(1)
|
32
|
+
}.should fail
|
33
|
+
end
|
34
|
+
|
35
|
+
specify "should provide message, expected and actual on failure" do
|
36
|
+
matcher = eql(1)
|
37
|
+
matcher.matches?(1)
|
38
|
+
matcher.negative_failure_message.should == ["expected 1 not to equal 1 (using .eql?)", 1, 1]
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
context "should equal(expected)" do
|
4
|
+
|
5
|
+
specify "should pass if target.equal?(expected)" do
|
6
|
+
1.should equal(1)
|
7
|
+
end
|
8
|
+
|
9
|
+
specify "should fail unless target.equal?(expected)" do
|
10
|
+
lambda {
|
11
|
+
"1".should equal("1")
|
12
|
+
}.should fail
|
13
|
+
end
|
14
|
+
|
15
|
+
specify "should provide message, expected and actual on failure" do
|
16
|
+
matcher = equal("1")
|
17
|
+
matcher.matches?("1")
|
18
|
+
matcher.failure_message.should == ["expected \"1\", got \"1\" (using .equal?)", "1", "1"]
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
context "should_not equal(expected)" do
|
24
|
+
|
25
|
+
specify "should pass unless target.equal?(expected)" do
|
26
|
+
"1".should_not equal("1")
|
27
|
+
end
|
28
|
+
|
29
|
+
specify "should fail if target.equal?(expected)" do
|
30
|
+
lambda {
|
31
|
+
1.should_not equal(1)
|
32
|
+
}.should fail
|
33
|
+
end
|
34
|
+
|
35
|
+
specify "should provide message, expected and actual on failure" do
|
36
|
+
matcher = equal(1)
|
37
|
+
matcher.matches?(1)
|
38
|
+
matcher.negative_failure_message.should == ["expected 1 not to equal 1 (using .equal?)", 1, 1]
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
module ExampleExpectations
|
4
|
+
|
5
|
+
class ArbitraryMatcher
|
6
|
+
def initialize(*args,&block)
|
7
|
+
if args.last.is_a?Hash
|
8
|
+
@expected = args.last[:expected]
|
9
|
+
end
|
10
|
+
if block_given?
|
11
|
+
@expected = block.call
|
12
|
+
end
|
13
|
+
@block = block
|
14
|
+
end
|
15
|
+
|
16
|
+
def matches?(target)
|
17
|
+
@target = target
|
18
|
+
return @expected == target
|
19
|
+
end
|
20
|
+
|
21
|
+
def with(new_value)
|
22
|
+
@expected = new_value
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def failure_message
|
27
|
+
"expected #{@expected}, got #{@target}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def negative_failure_message
|
31
|
+
"expected not #{@expected}, got #{@target}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class PositiveOnlyMatcher < ArbitraryMatcher
|
36
|
+
undef negative_failure_message
|
37
|
+
end
|
38
|
+
|
39
|
+
def arbitrary_matcher(*args, &block)
|
40
|
+
ArbitraryMatcher.new(*args, &block)
|
41
|
+
end
|
42
|
+
|
43
|
+
def positive_only_matcher(*args, &block)
|
44
|
+
PositiveOnlyMatcher.new(*args, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
context "ExpectationMatcherHandler" do
|
50
|
+
include ExampleExpectations
|
51
|
+
|
52
|
+
specify "should handle submitted args" do
|
53
|
+
5.should arbitrary_matcher(:expected => 5)
|
54
|
+
5.should arbitrary_matcher(:expected => "wrong").with(5)
|
55
|
+
lambda { 5.should arbitrary_matcher(:expected => 4) }.should fail_with("expected 4, got 5")
|
56
|
+
lambda { 5.should arbitrary_matcher(:expected => 5).with(4) }.should fail_with("expected 4, got 5")
|
57
|
+
5.should_not arbitrary_matcher(:expected => 4)
|
58
|
+
5.should_not arbitrary_matcher(:expected => 5).with(4)
|
59
|
+
lambda { 5.should_not arbitrary_matcher(:expected => 5) }.should fail_with("expected not 5, got 5")
|
60
|
+
lambda { 5.should_not arbitrary_matcher(:expected => 4).with(5) }.should fail_with("expected not 5, got 5")
|
61
|
+
end
|
62
|
+
|
63
|
+
specify "should handle the submitted block" do
|
64
|
+
5.should arbitrary_matcher { 5 }
|
65
|
+
5.should arbitrary_matcher(:expected => 4) { 5 }
|
66
|
+
5.should arbitrary_matcher(:expected => 4).with(5) { 3 }
|
67
|
+
end
|
68
|
+
|
69
|
+
specify "should explain when matcher does not support should_not" do
|
70
|
+
lambda {
|
71
|
+
5.should_not positive_only_matcher(:expected => 5)
|
72
|
+
}.should fail_with(/Matcher does not support should_not.\n/)
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
context "should have_sym(*args)" do
|
4
|
+
specify "should pass if #has_sym?(*args) returns true" do
|
5
|
+
{:a => "A"}.should have_key(:a)
|
6
|
+
end
|
7
|
+
|
8
|
+
specify "should fail if #has_sym?(*args) returns false" do
|
9
|
+
lambda {
|
10
|
+
{:b => "B"}.should have_key(:a)
|
11
|
+
}.should fail_with("expected #has_key?(:a) to return true, got false")
|
12
|
+
end
|
13
|
+
|
14
|
+
specify "should fail if target does not respond to #has_sym?" do
|
15
|
+
lambda {
|
16
|
+
Object.new.should have_key(:a)
|
17
|
+
}.should raise_error(NoMethodError)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "should_not have_sym(*args)" do
|
22
|
+
specify "should pass if #has_sym?(*args) returns false" do
|
23
|
+
{:a => "A"}.should_not have_key(:b)
|
24
|
+
end
|
25
|
+
|
26
|
+
specify "should fail if #has_sym?(*args) returns true" do
|
27
|
+
lambda {
|
28
|
+
{:a => "A"}.should_not have_key(:a)
|
29
|
+
}.should fail_with("expected #has_key?(:a) to return false, got true")
|
30
|
+
end
|
31
|
+
|
32
|
+
specify "should fail if target does not respond to #has_sym?" do
|
33
|
+
lambda {
|
34
|
+
Object.new.should have_key(:a)
|
35
|
+
}.should raise_error(NoMethodError)
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,259 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
module HaveSpecHelper
|
4
|
+
def create_collection_owner_with(n)
|
5
|
+
owner = Spec::Expectations::Helper::CollectionOwner.new
|
6
|
+
(1..n).each do |n|
|
7
|
+
owner.add_to_collection_with_length_method(n)
|
8
|
+
owner.add_to_collection_with_size_method(n)
|
9
|
+
end
|
10
|
+
owner
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "should have(n).items" do
|
15
|
+
include HaveSpecHelper
|
16
|
+
|
17
|
+
specify "should pass if target has a collection of items with n members" do
|
18
|
+
owner = create_collection_owner_with(3)
|
19
|
+
owner.should have(3).items_in_collection_with_length_method
|
20
|
+
owner.should have(3).items_in_collection_with_size_method
|
21
|
+
end
|
22
|
+
|
23
|
+
specify "should convert :no to 0" do
|
24
|
+
owner = create_collection_owner_with(0)
|
25
|
+
owner.should have(:no).items_in_collection_with_length_method
|
26
|
+
owner.should have(:no).items_in_collection_with_size_method
|
27
|
+
end
|
28
|
+
|
29
|
+
specify "should fail if target has a collection of items with < n members" do
|
30
|
+
owner = create_collection_owner_with(3)
|
31
|
+
lambda {
|
32
|
+
owner.should have(4).items_in_collection_with_length_method
|
33
|
+
}.should fail_with("expected 4 items_in_collection_with_length_method, got 3")
|
34
|
+
lambda {
|
35
|
+
owner.should have(4).items_in_collection_with_size_method
|
36
|
+
}.should fail_with("expected 4 items_in_collection_with_size_method, got 3")
|
37
|
+
end
|
38
|
+
|
39
|
+
specify "should fail if target has a collection of items with > n members" do
|
40
|
+
owner = create_collection_owner_with(3)
|
41
|
+
lambda {
|
42
|
+
owner.should have(2).items_in_collection_with_length_method
|
43
|
+
}.should fail_with("expected 2 items_in_collection_with_length_method, got 3")
|
44
|
+
lambda {
|
45
|
+
owner.should have(2).items_in_collection_with_size_method
|
46
|
+
}.should fail_with("expected 2 items_in_collection_with_size_method, got 3")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "should_not have(n).items" do
|
51
|
+
include HaveSpecHelper
|
52
|
+
|
53
|
+
specify "should pass if target has a collection of items with < n members" do
|
54
|
+
owner = create_collection_owner_with(3)
|
55
|
+
owner.should_not have(4).items_in_collection_with_length_method
|
56
|
+
owner.should_not have(4).items_in_collection_with_size_method
|
57
|
+
end
|
58
|
+
|
59
|
+
specify "should pass if target has a collection of items with > n members" do
|
60
|
+
owner = create_collection_owner_with(3)
|
61
|
+
owner.should_not have(2).items_in_collection_with_length_method
|
62
|
+
owner.should_not have(2).items_in_collection_with_size_method
|
63
|
+
end
|
64
|
+
|
65
|
+
specify "should fail if target has a collection of items with n members" do
|
66
|
+
owner = create_collection_owner_with(3)
|
67
|
+
lambda {
|
68
|
+
owner.should_not have(3).items_in_collection_with_length_method
|
69
|
+
}.should fail_with("expected target not to have 3 items_in_collection_with_length_method, got 3")
|
70
|
+
lambda {
|
71
|
+
owner.should_not have(3).items_in_collection_with_size_method
|
72
|
+
}.should fail_with("expected target not to have 3 items_in_collection_with_size_method, got 3")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "should have_exactly(n).items" do
|
77
|
+
include HaveSpecHelper
|
78
|
+
|
79
|
+
specify "should pass if target has a collection of items with n members" do
|
80
|
+
owner = create_collection_owner_with(3)
|
81
|
+
owner.should have_exactly(3).items_in_collection_with_length_method
|
82
|
+
owner.should have_exactly(3).items_in_collection_with_size_method
|
83
|
+
end
|
84
|
+
|
85
|
+
specify "should convert :no to 0" do
|
86
|
+
owner = create_collection_owner_with(0)
|
87
|
+
owner.should have_exactly(:no).items_in_collection_with_length_method
|
88
|
+
owner.should have_exactly(:no).items_in_collection_with_size_method
|
89
|
+
end
|
90
|
+
|
91
|
+
specify "should fail if target has a collection of items with < n members" do
|
92
|
+
owner = create_collection_owner_with(3)
|
93
|
+
lambda {
|
94
|
+
owner.should have_exactly(4).items_in_collection_with_length_method
|
95
|
+
}.should fail_with("expected 4 items_in_collection_with_length_method, got 3")
|
96
|
+
lambda {
|
97
|
+
owner.should have_exactly(4).items_in_collection_with_size_method
|
98
|
+
}.should fail_with("expected 4 items_in_collection_with_size_method, got 3")
|
99
|
+
end
|
100
|
+
|
101
|
+
specify "should fail if target has a collection of items with > n members" do
|
102
|
+
owner = create_collection_owner_with(3)
|
103
|
+
lambda {
|
104
|
+
owner.should have_exactly(2).items_in_collection_with_length_method
|
105
|
+
}.should fail_with("expected 2 items_in_collection_with_length_method, got 3")
|
106
|
+
lambda {
|
107
|
+
owner.should have_exactly(2).items_in_collection_with_size_method
|
108
|
+
}.should fail_with("expected 2 items_in_collection_with_size_method, got 3")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "should have_at_least(n).items" do
|
113
|
+
include HaveSpecHelper
|
114
|
+
|
115
|
+
specify "should pass if target has a collection of items with n members" do
|
116
|
+
owner = create_collection_owner_with(3)
|
117
|
+
owner.should have_at_least(3).items_in_collection_with_length_method
|
118
|
+
owner.should have_at_least(3).items_in_collection_with_size_method
|
119
|
+
end
|
120
|
+
|
121
|
+
specify "should pass if target has a collection of items with > n members" do
|
122
|
+
owner = create_collection_owner_with(3)
|
123
|
+
owner.should have_at_least(2).items_in_collection_with_length_method
|
124
|
+
owner.should have_at_least(2).items_in_collection_with_size_method
|
125
|
+
end
|
126
|
+
|
127
|
+
specify "should fail if target has a collection of items with < n members" do
|
128
|
+
owner = create_collection_owner_with(3)
|
129
|
+
lambda {
|
130
|
+
owner.should have_at_least(4).items_in_collection_with_length_method
|
131
|
+
}.should fail_with("expected at least 4 items_in_collection_with_length_method, got 3")
|
132
|
+
lambda {
|
133
|
+
owner.should have_at_least(4).items_in_collection_with_size_method
|
134
|
+
}.should fail_with("expected at least 4 items_in_collection_with_size_method, got 3")
|
135
|
+
end
|
136
|
+
|
137
|
+
specify "should provide educational negative failure messages" do
|
138
|
+
#given
|
139
|
+
owner = create_collection_owner_with(3)
|
140
|
+
length_matcher = have_at_least(3).items_in_collection_with_length_method
|
141
|
+
size_matcher = have_at_least(3).items_in_collection_with_size_method
|
142
|
+
|
143
|
+
#when
|
144
|
+
length_matcher.matches?(owner)
|
145
|
+
size_matcher.matches?(owner)
|
146
|
+
|
147
|
+
#then
|
148
|
+
length_matcher.negative_failure_message.should == <<-EOF
|
149
|
+
Isn't life confusing enough?
|
150
|
+
Instead of having to figure out the meaning of this:
|
151
|
+
should_not have_at_least(3).items_in_collection_with_length_method
|
152
|
+
We recommend that you use this instead:
|
153
|
+
should have_at_most(2).items_in_collection_with_length_method
|
154
|
+
EOF
|
155
|
+
|
156
|
+
size_matcher.negative_failure_message.should == <<-EOF
|
157
|
+
Isn't life confusing enough?
|
158
|
+
Instead of having to figure out the meaning of this:
|
159
|
+
should_not have_at_least(3).items_in_collection_with_size_method
|
160
|
+
We recommend that you use this instead:
|
161
|
+
should have_at_most(2).items_in_collection_with_size_method
|
162
|
+
EOF
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context "should have_at_most(n).items" do
|
167
|
+
include HaveSpecHelper
|
168
|
+
|
169
|
+
specify "should pass if target has a collection of items with n members" do
|
170
|
+
owner = create_collection_owner_with(3)
|
171
|
+
owner.should have_at_most(3).items_in_collection_with_length_method
|
172
|
+
owner.should have_at_most(3).items_in_collection_with_size_method
|
173
|
+
end
|
174
|
+
|
175
|
+
specify "should fail if target has a collection of items with > n members" do
|
176
|
+
owner = create_collection_owner_with(3)
|
177
|
+
lambda {
|
178
|
+
owner.should have_at_most(2).items_in_collection_with_length_method
|
179
|
+
}.should fail_with("expected at most 2 items_in_collection_with_length_method, got 3")
|
180
|
+
lambda {
|
181
|
+
owner.should have_at_most(2).items_in_collection_with_size_method
|
182
|
+
}.should fail_with("expected at most 2 items_in_collection_with_size_method, got 3")
|
183
|
+
end
|
184
|
+
|
185
|
+
specify "should pass if target has a collection of items with < n members" do
|
186
|
+
owner = create_collection_owner_with(3)
|
187
|
+
owner.should have_at_most(4).items_in_collection_with_length_method
|
188
|
+
owner.should have_at_most(4).items_in_collection_with_size_method
|
189
|
+
end
|
190
|
+
|
191
|
+
specify "should provide educational negative failure messages" do
|
192
|
+
#given
|
193
|
+
owner = create_collection_owner_with(3)
|
194
|
+
length_matcher = have_at_most(3).items_in_collection_with_length_method
|
195
|
+
size_matcher = have_at_most(3).items_in_collection_with_size_method
|
196
|
+
|
197
|
+
#when
|
198
|
+
length_matcher.matches?(owner)
|
199
|
+
size_matcher.matches?(owner)
|
200
|
+
|
201
|
+
#then
|
202
|
+
length_matcher.negative_failure_message.should == <<-EOF
|
203
|
+
Isn't life confusing enough?
|
204
|
+
Instead of having to figure out the meaning of this:
|
205
|
+
should_not have_at_most(3).items_in_collection_with_length_method
|
206
|
+
We recommend that you use this instead:
|
207
|
+
should have_at_least(4).items_in_collection_with_length_method
|
208
|
+
EOF
|
209
|
+
|
210
|
+
size_matcher.negative_failure_message.should == <<-EOF
|
211
|
+
Isn't life confusing enough?
|
212
|
+
Instead of having to figure out the meaning of this:
|
213
|
+
should_not have_at_most(3).items_in_collection_with_size_method
|
214
|
+
We recommend that you use this instead:
|
215
|
+
should have_at_least(4).items_in_collection_with_size_method
|
216
|
+
EOF
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
context "have(n).items(args, block)" do
|
221
|
+
specify "should pass args to target" do
|
222
|
+
target = mock("target")
|
223
|
+
target.should_receive(:items).with("arg1","arg2").and_return([1,2,3])
|
224
|
+
target.should have(3).items("arg1","arg2")
|
225
|
+
end
|
226
|
+
|
227
|
+
specify "should pass block to target" do
|
228
|
+
target = mock("target")
|
229
|
+
block = lambda { 5 }
|
230
|
+
target.should_receive(:items).with("arg1","arg2", block).and_return([1,2,3])
|
231
|
+
target.should have(3).items("arg1","arg2", block)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
context "have(n).items where target IS a collection" do
|
236
|
+
specify "should reference the number of items IN the collection" do
|
237
|
+
[1,2,3].should have(3).items
|
238
|
+
end
|
239
|
+
|
240
|
+
specify "should reference the number of items IN the collection" do
|
241
|
+
lambda { [1,2,3].should have(7).items }.should_fail_with("expected 7 items, got 3")
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
context "have(n).characters where target IS a String" do
|
246
|
+
specify "should pass if the length is correct" do
|
247
|
+
"this string".should have(11).characters
|
248
|
+
end
|
249
|
+
|
250
|
+
specify "should fail if the length is incorrect" do
|
251
|
+
lambda { "this string".should have(12).characters }.should_fail_with("expected 12 characters, got 11")
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
context "have(n).things on an object which is not a collection nor contains one" do
|
256
|
+
specify "should fail" do
|
257
|
+
lambda { Object.new.should have(2).things }.should_raise(NoMethodError, /undefined method `things' for #<Object:/)
|
258
|
+
end
|
259
|
+
end
|