rspec 1.2.6 → 1.2.7
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/History.rdoc +22 -0
- data/Manifest.txt +9 -4
- data/Rakefile +13 -12
- data/Upgrade.rdoc +1 -1
- data/features/command_line/line_number_option.feature +56 -0
- data/features/command_line/line_number_option_with_example_with_no_name.feature +22 -0
- data/features/mocks/stub_implementation.feature +26 -0
- data/lib/autotest/rspec.rb +7 -7
- data/lib/spec/autorun.rb +1 -1
- data/lib/spec/deprecation.rb +3 -3
- data/lib/spec/dsl.rb +0 -1
- data/lib/spec/dsl/main.rb +6 -6
- data/lib/spec/example.rb +28 -29
- data/lib/spec/example/args_and_options.rb +1 -1
- data/lib/spec/example/before_and_after_hooks.rb +10 -10
- data/lib/spec/example/errors.rb +8 -3
- data/lib/spec/example/example_group.rb +0 -1
- data/lib/spec/example/example_group_factory.rb +3 -3
- data/lib/spec/example/example_group_hierarchy.rb +10 -10
- data/lib/spec/example/example_group_methods.rb +37 -29
- data/lib/spec/example/example_group_proxy.rb +9 -10
- data/lib/spec/example/example_matcher.rb +3 -3
- data/lib/spec/example/example_methods.rb +11 -11
- data/lib/spec/example/example_proxy.rb +5 -5
- data/lib/spec/example/module_reopening_fix.rb +7 -7
- data/lib/spec/example/pending.rb +1 -1
- data/lib/spec/example/predicate_matchers.rb +0 -1
- data/lib/spec/example/shared_example_group.rb +5 -5
- data/lib/spec/example/subject.rb +12 -16
- data/lib/spec/expectations/extensions/kernel.rb +1 -1
- data/lib/spec/expectations/fail_with.rb +4 -0
- data/lib/spec/matchers/generated_descriptions.rb +4 -16
- data/lib/spec/matchers/match.rb +5 -4
- data/lib/spec/matchers/matcher.rb +21 -3
- data/lib/spec/matchers/operator_matcher.rb +1 -1
- data/lib/spec/mocks/errors.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +3 -2
- data/lib/spec/mocks/methods.rb +8 -5
- data/lib/spec/mocks/proxy.rb +2 -2
- data/lib/spec/rake/spectask.rb +9 -3
- data/lib/spec/runner.rb +1 -1
- data/lib/spec/runner/{spec_parser.rb → line_number_query.rb} +20 -9
- data/lib/spec/runner/options.rb +10 -2
- data/lib/spec/version.rb +3 -2
- data/spec/autotest/failed_results_re_spec.rb +7 -0
- data/spec/spec/example/example_group_methods_spec.rb +61 -0
- data/spec/spec/example/example_matcher_spec.rb +7 -0
- data/spec/spec/example/example_methods_spec.rb +35 -7
- data/spec/spec/expectations/fail_with_spec.rb +18 -1
- data/spec/spec/matchers/match_spec.rb +20 -0
- data/spec/spec/matchers/matcher_spec.rb +27 -28
- data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_10263_spec.rb +4 -1
- data/spec/spec/mocks/bug_report_830_spec.rb +21 -0
- data/spec/spec/mocks/options_hash_spec.rb +1 -1
- data/spec/spec/mocks/stub_chain_spec.rb +7 -0
- data/spec/spec/mocks/stub_implementation_spec.rb +31 -0
- data/spec/spec/rake/spectask_spec.rb +150 -0
- data/spec/spec/runner/{spec_parser/spec_parser_fixture.rb → line_number_query/line_number_query_fixture.rb} +4 -4
- data/spec/spec/runner/{spec_parser_spec.rb → line_number_query_spec.rb} +31 -10
- data/spec/spec/runner/option_parser_spec.rb +1 -1
- data/spec/spec/runner/options_spec.rb +33 -25
- metadata +15 -10
- data/.autotest +0 -5
data/lib/spec/mocks/proxy.rb
CHANGED
@@ -56,9 +56,9 @@ module Spec
|
|
56
56
|
@expectations.last
|
57
57
|
end
|
58
58
|
|
59
|
-
def add_stub(expected_from, sym, opts={})
|
59
|
+
def add_stub(expected_from, sym, opts={}, &implementation)
|
60
60
|
__add sym
|
61
|
-
@stubs.unshift MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, nil, :any, opts)
|
61
|
+
@stubs.unshift MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, nil, :any, opts, &implementation)
|
62
62
|
@stubs.first
|
63
63
|
end
|
64
64
|
|
data/lib/spec/rake/spectask.rb
CHANGED
@@ -118,6 +118,9 @@ module Spec
|
|
118
118
|
# Use verbose output. If this is set to true, the task will print
|
119
119
|
# the executed spec command to stdout. Defaults to false.
|
120
120
|
attr_accessor :verbose
|
121
|
+
|
122
|
+
# Explicitly define the path to the ruby binary, or its proxy (e.g. multiruby)
|
123
|
+
attr_accessor :ruby_cmd
|
121
124
|
|
122
125
|
# Defines a new task, using the name +name+.
|
123
126
|
def initialize(name=:spec)
|
@@ -152,7 +155,7 @@ module Spec
|
|
152
155
|
# ruby [ruby_opts] -Ilib -S rcov [rcov_opts] bin/spec -- examples [spec_opts]
|
153
156
|
# or
|
154
157
|
# ruby [ruby_opts] -Ilib bin/spec examples [spec_opts]
|
155
|
-
cmd_parts = [RUBY]
|
158
|
+
cmd_parts = [ruby_cmd || RUBY]
|
156
159
|
cmd_parts += ruby_opts
|
157
160
|
cmd_parts << %[-I"#{lib_path}"]
|
158
161
|
cmd_parts << "-S rcov" if rcov
|
@@ -192,8 +195,11 @@ module Spec
|
|
192
195
|
end
|
193
196
|
|
194
197
|
def rcov_option_list # :nodoc:
|
195
|
-
|
196
|
-
|
198
|
+
if rcov
|
199
|
+
ENV['RCOV_OPTS'] || rcov_opts.join(" ") || ""
|
200
|
+
else
|
201
|
+
""
|
202
|
+
end
|
197
203
|
end
|
198
204
|
|
199
205
|
def spec_option_list # :nodoc:
|
data/lib/spec/runner.rb
CHANGED
@@ -6,7 +6,7 @@ require 'spec/runner/command_line'
|
|
6
6
|
require 'spec/runner/drb_command_line'
|
7
7
|
require 'spec/runner/backtrace_tweaker'
|
8
8
|
require 'spec/runner/reporter'
|
9
|
-
require 'spec/runner/
|
9
|
+
require 'spec/runner/line_number_query'
|
10
10
|
require 'spec/runner/class_and_arguments_parser'
|
11
11
|
require 'spec/runner/extensions/kernel'
|
12
12
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spec
|
2
2
|
module Runner
|
3
3
|
# Parses a spec file and finds the nearest example for a given line number.
|
4
|
-
class
|
4
|
+
class LineNumberQuery
|
5
5
|
attr_reader :best_match
|
6
6
|
|
7
7
|
def initialize(run_options)
|
@@ -12,14 +12,7 @@ module Spec
|
|
12
12
|
def spec_name_for(file, line_number)
|
13
13
|
best_match.clear
|
14
14
|
file = File.expand_path(file)
|
15
|
-
|
16
|
-
next unless example_group.location
|
17
|
-
consider_example_group_for_best_match(example_group, file, line_number)
|
18
|
-
|
19
|
-
example_group.examples.each do |example|
|
20
|
-
consider_example_for_best_match(example, example_group, file, line_number)
|
21
|
-
end
|
22
|
-
end
|
15
|
+
determine_best_match(file, line_number)
|
23
16
|
if best_match[:example_group]
|
24
17
|
if best_match[:example]
|
25
18
|
"#{best_match[:example_group].description} #{best_match[:example].description}"
|
@@ -31,7 +24,25 @@ module Spec
|
|
31
24
|
end
|
32
25
|
end
|
33
26
|
|
27
|
+
def example_line_for(file, line_number)
|
28
|
+
determine_best_match(file, line_number)
|
29
|
+
best_match[:line]
|
30
|
+
end
|
31
|
+
|
34
32
|
protected
|
33
|
+
|
34
|
+
def determine_best_match(file, line_number)
|
35
|
+
best_match.clear
|
36
|
+
file = File.expand_path(file)
|
37
|
+
@run_options.example_groups.each do |example_group|
|
38
|
+
next unless example_group.location
|
39
|
+
consider_example_group_for_best_match(example_group, file, line_number)
|
40
|
+
|
41
|
+
example_group.examples.each do |example|
|
42
|
+
consider_example_for_best_match(example, example_group, file, line_number)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
35
46
|
|
36
47
|
def consider_example_group_for_best_match(example_group, file, line_number)
|
37
48
|
example_group_file, example_group_line = parse_location(example_group.location)
|
data/lib/spec/runner/options.rb
CHANGED
@@ -74,10 +74,18 @@ module Spec
|
|
74
74
|
@files_loaded = false
|
75
75
|
@out_used = nil
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
def add_example_group(example_group)
|
79
79
|
@example_groups << example_group
|
80
80
|
end
|
81
|
+
|
82
|
+
def line_number_requested?
|
83
|
+
!!line_number
|
84
|
+
end
|
85
|
+
|
86
|
+
def example_line
|
87
|
+
Spec::Runner::LineNumberQuery.new(self).example_line_for(files.first, line_number)
|
88
|
+
end
|
81
89
|
|
82
90
|
def remove_example_group(example_group)
|
83
91
|
@example_groups.delete(example_group)
|
@@ -340,7 +348,7 @@ module Spec
|
|
340
348
|
error_stream.puts "You must specify one file, not a directory when providing a line number"
|
341
349
|
exit(1) if stderr?
|
342
350
|
else
|
343
|
-
example =
|
351
|
+
example = LineNumberQuery.new(self).spec_name_for(files[0], line_number)
|
344
352
|
@examples = [example]
|
345
353
|
end
|
346
354
|
else
|
data/lib/spec/version.rb
CHANGED
@@ -8,6 +8,13 @@ describe "failed_results_re" do
|
|
8
8
|
$2.should == "reason\n/path.rb:37:"
|
9
9
|
end
|
10
10
|
|
11
|
+
it "should match a failure when matcher outputs multiple lines" do
|
12
|
+
re = Autotest::Rspec.new.failed_results_re
|
13
|
+
re =~ "1)\n'other example' FAILED\n\nreason line 1\nreason line 2\n\n(additional info)\n/path.rb:37:\n\n"
|
14
|
+
$1.should == "other example"
|
15
|
+
$2.should == "reason line 1\nreason line 2\n\n(additional info)\n/path.rb:37:"
|
16
|
+
end
|
17
|
+
|
11
18
|
it "should match an Error" do
|
12
19
|
re = Autotest::Rspec.new.failed_results_re
|
13
20
|
re =~ "1)\nRuntimeError in 'this example'\nreason\n/path.rb:37:\n\n"
|
@@ -670,6 +670,67 @@ module Spec
|
|
670
670
|
example_group.__send__ :run_after_all, true, {}, nil
|
671
671
|
end
|
672
672
|
end
|
673
|
+
|
674
|
+
describe "#examples_to_run" do
|
675
|
+
it "runs only the example identified by a line number" do
|
676
|
+
example_group = Class.new(ExampleGroupDouble).describe("this") do
|
677
|
+
it { 3.should == 3 }
|
678
|
+
it "has another example which raises" do
|
679
|
+
raise "this shouldn't have run"
|
680
|
+
end
|
681
|
+
end
|
682
|
+
options.examples << :ignore
|
683
|
+
options.line_number = __LINE__ - 6
|
684
|
+
options.files << __FILE__
|
685
|
+
example_group.run(options).should be_true
|
686
|
+
end
|
687
|
+
|
688
|
+
it "runs the example identified by a line number even if it's not the example line number" do
|
689
|
+
example_group = Class.new(ExampleGroupDouble).describe("this") do
|
690
|
+
|
691
|
+
it { raise "foo" }
|
692
|
+
|
693
|
+
end
|
694
|
+
options.examples << :ignore
|
695
|
+
options.line_number = __LINE__ - 3
|
696
|
+
options.files << __FILE__
|
697
|
+
example_group.run(options).should be_false
|
698
|
+
end
|
699
|
+
|
700
|
+
it "runs all the examples in the group " do
|
701
|
+
first_example_ran = false
|
702
|
+
second_example_ran = false
|
703
|
+
example_group = Class.new(ExampleGroupDouble).describe("this") do
|
704
|
+
|
705
|
+
it { first_example_ran = true }
|
706
|
+
it { second_example_ran = true }
|
707
|
+
|
708
|
+
end
|
709
|
+
options.line_number = __LINE__ - 6
|
710
|
+
options.files << __FILE__
|
711
|
+
options.examples << :ignore
|
712
|
+
example_group.run(options)
|
713
|
+
first_example_ran.should be_true
|
714
|
+
second_example_ran.should be_true
|
715
|
+
end
|
716
|
+
|
717
|
+
it "doesn't run any examples in another group" do
|
718
|
+
example_ran = false
|
719
|
+
example_group_1 = Class.new(ExampleGroupDouble).describe("this") do
|
720
|
+
it "ignore" do
|
721
|
+
example_ran = true
|
722
|
+
end
|
723
|
+
end
|
724
|
+
example_group_2 = Class.new(ExampleGroupDouble).describe("that") do
|
725
|
+
end
|
726
|
+
options.examples << :ignore
|
727
|
+
options.line_number = __LINE__ - 3
|
728
|
+
options.files << __FILE__
|
729
|
+
example_group_1.run(options)
|
730
|
+
example_group_2.run(options)
|
731
|
+
example_ran.should be_false
|
732
|
+
end
|
733
|
+
end
|
673
734
|
|
674
735
|
end
|
675
736
|
end
|
@@ -75,5 +75,12 @@ module Spec
|
|
75
75
|
matcher.matches?(["no match1", "no match2"]).should == false
|
76
76
|
end
|
77
77
|
end
|
78
|
+
|
79
|
+
describe ExampleMatcher, "called with nil example" do
|
80
|
+
it "does not puke" do
|
81
|
+
matcher = ExampleMatcher.new("Foo::Bar", nil)
|
82
|
+
matcher.matches?(["anything"]).should == false
|
83
|
+
end
|
84
|
+
end
|
78
85
|
end
|
79
86
|
end
|
@@ -27,7 +27,7 @@ module Spec
|
|
27
27
|
end
|
28
28
|
|
29
29
|
describe "with an included module that is reopened" do
|
30
|
-
it "should have
|
30
|
+
it "should have reopened methods" do
|
31
31
|
method(:module_that_is_reopened_method).should_not be_nil
|
32
32
|
end
|
33
33
|
end
|
@@ -56,11 +56,26 @@ module Spec
|
|
56
56
|
@example_group.run(@options).should be_true
|
57
57
|
end
|
58
58
|
end
|
59
|
+
|
60
|
+
context "in an ExampleGroup using 'self' as an explicit subject" do
|
61
|
+
it "delegates matcher to the ExampleGroup" do
|
62
|
+
@example_group.describe(::Thing)
|
63
|
+
@example_group.subject { self }
|
64
|
+
@example_group.example { should == self }
|
65
|
+
@example_group.example { should eql(self) }
|
66
|
+
@example_group.example do
|
67
|
+
self.instance_eval("def method_ok?; true end")
|
68
|
+
should be_method_ok
|
69
|
+
end
|
70
|
+
@example_group.run(@options).should be_true
|
71
|
+
end
|
72
|
+
end
|
59
73
|
end
|
60
74
|
|
61
75
|
describe "#should_not" do
|
62
76
|
before(:each) do
|
63
77
|
@example_group = Class.new(ExampleGroupDouble)
|
78
|
+
@options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new)
|
64
79
|
end
|
65
80
|
|
66
81
|
context "in an ExampleGroup with an implicit subject" do
|
@@ -68,7 +83,7 @@ module Spec
|
|
68
83
|
@example_group.describe(::Thing)
|
69
84
|
@example_group.example { should_not == ::Thing.new(:other) }
|
70
85
|
@example_group.example { should_not eql(::Thing.new(:other)) }
|
71
|
-
@example_group.run(
|
86
|
+
@example_group.run(@options).should be_true
|
72
87
|
end
|
73
88
|
end
|
74
89
|
|
@@ -78,7 +93,21 @@ module Spec
|
|
78
93
|
@example_group.subject { ::Thing.new(:other) }
|
79
94
|
@example_group.example { should_not == ::Thing.new(:default) }
|
80
95
|
@example_group.example { should_not eql(::Thing.new(:default)) }
|
81
|
-
@example_group.run(
|
96
|
+
@example_group.run(@options).should be_true
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "in an ExampleGroup using 'self' as an explicit subject" do
|
101
|
+
it "delegates matcher to the ExampleGroup" do
|
102
|
+
@example_group.describe(::Thing)
|
103
|
+
@example_group.subject { self }
|
104
|
+
@example_group.example { should_not == ::Thing.new(:default) }
|
105
|
+
@example_group.example { should_not eql(::Thing.new(:default)) }
|
106
|
+
@example_group.example do
|
107
|
+
self.instance_eval("def method_ok?; false end")
|
108
|
+
should_not be_method_ok
|
109
|
+
end
|
110
|
+
@example_group.run(@options).should be_true
|
82
111
|
end
|
83
112
|
end
|
84
113
|
end
|
@@ -109,12 +138,11 @@ module Spec
|
|
109
138
|
Spec::Matchers.stub!(:generated_description).and_return('this message')
|
110
139
|
example.description.should == "this message"
|
111
140
|
end
|
112
|
-
it "
|
141
|
+
it "warns if there is no supplied or generated description" do
|
113
142
|
example = ExampleGroupDouble.new ExampleProxy.new(nil, {}, "this backtrace") do; end
|
114
143
|
Spec::Matchers.stub!(:generated_description).and_return(nil)
|
115
|
-
|
116
|
-
|
117
|
-
end.should raise_error(/No description supplied for example declared on this backtrace/)
|
144
|
+
Spec.should_receive(:warn).with("No description supplied for example declared on this backtrace")
|
145
|
+
example.description
|
118
146
|
end
|
119
147
|
end
|
120
148
|
|
@@ -64,7 +64,24 @@ describe Spec::Expectations, "#fail_with with diff" do
|
|
64
64
|
Spec::Expectations.fail_with "the message", lambda {}, lambda {}
|
65
65
|
}.should fail_with("the message")
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
|
+
after(:each) do
|
69
|
+
Spec::Expectations.differ = @old_differ
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe Spec::Expectations, "#fail_with with a nil message" do
|
74
|
+
before(:each) do
|
75
|
+
@old_differ = Spec::Expectations.differ
|
76
|
+
Spec::Expectations.differ = nil
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should handle just a message" do
|
80
|
+
lambda {
|
81
|
+
Spec::Expectations.fail_with nil
|
82
|
+
}.should raise_error(ArgumentError, /Failure message is nil\. Does your matcher define the appropriate failure_message_for_\* method to return a string\?/)
|
83
|
+
end
|
84
|
+
|
68
85
|
after(:each) do
|
69
86
|
Spec::Expectations.differ = @old_differ
|
70
87
|
end
|
@@ -5,11 +5,21 @@ describe "should match(expected)" do
|
|
5
5
|
"string".should match(/tri/)
|
6
6
|
end
|
7
7
|
|
8
|
+
it "should pass when target (String) matches expected (String)" do
|
9
|
+
"string".should match("tri")
|
10
|
+
end
|
11
|
+
|
8
12
|
it "should fail when target (String) does not match expected (Regexp)" do
|
9
13
|
lambda {
|
10
14
|
"string".should match(/rings/)
|
11
15
|
}.should fail
|
12
16
|
end
|
17
|
+
|
18
|
+
it "should fail when target (String) does not match expected (String)" do
|
19
|
+
lambda {
|
20
|
+
"string".should match("rings")
|
21
|
+
}.should fail
|
22
|
+
end
|
13
23
|
|
14
24
|
it "should provide message, expected and actual on failure" do
|
15
25
|
matcher = match(/rings/)
|
@@ -23,12 +33,22 @@ describe "should_not match(expected)" do
|
|
23
33
|
"string".should_not match(/rings/)
|
24
34
|
end
|
25
35
|
|
36
|
+
it "should pass when target (String) matches does not match (String)" do
|
37
|
+
"string".should_not match("rings")
|
38
|
+
end
|
39
|
+
|
26
40
|
it "should fail when target (String) matches expected (Regexp)" do
|
27
41
|
lambda {
|
28
42
|
"string".should_not match(/tri/)
|
29
43
|
}.should fail
|
30
44
|
end
|
31
45
|
|
46
|
+
it "should fail when target (String) matches expected (String)" do
|
47
|
+
lambda {
|
48
|
+
"string".should_not match("tri")
|
49
|
+
}.should fail
|
50
|
+
end
|
51
|
+
|
32
52
|
it "should provide message, expected and actual on failure" do
|
33
53
|
matcher = match(/tri/)
|
34
54
|
matcher.matches?("string")
|
@@ -13,7 +13,6 @@ module Spec
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "provides a default description" do
|
16
|
-
@matcher.matches?(0)
|
17
16
|
@matcher.description.should == "be a multiple of 3"
|
18
17
|
end
|
19
18
|
|
@@ -29,29 +28,17 @@ module Spec
|
|
29
28
|
end
|
30
29
|
|
31
30
|
it "is not diffable by default" do
|
32
|
-
matcher = Spec::Matchers::Matcher.new(:name)
|
33
|
-
match {|actual|}
|
34
|
-
end
|
35
|
-
matcher.matches?(0)
|
31
|
+
matcher = Spec::Matchers::Matcher.new(:name) {}
|
36
32
|
matcher.should_not be_diffable
|
37
33
|
end
|
38
34
|
|
39
35
|
it "is diffable when told to be" do
|
40
|
-
matcher = Spec::Matchers::Matcher.new(:name)
|
41
|
-
match {|actual|}
|
42
|
-
diffable
|
43
|
-
end
|
44
|
-
matcher.matches?(0)
|
36
|
+
matcher = Spec::Matchers::Matcher.new(:name) { diffable }
|
45
37
|
matcher.should be_diffable
|
46
38
|
end
|
47
39
|
|
48
40
|
it "provides expected" do
|
49
|
-
matcher = Spec::Matchers::Matcher.new(:name, 'expected string')
|
50
|
-
match {|actual|}
|
51
|
-
end
|
52
|
-
|
53
|
-
matcher.matches?('actual string')
|
54
|
-
|
41
|
+
matcher = Spec::Matchers::Matcher.new(:name, 'expected string') {}
|
55
42
|
matcher.expected.should == ['expected string']
|
56
43
|
end
|
57
44
|
|
@@ -92,7 +79,6 @@ module Spec
|
|
92
79
|
end
|
93
80
|
|
94
81
|
it "overrides the description" do
|
95
|
-
@matcher.matches?(true)
|
96
82
|
@matcher.description.should == "be the boolean true"
|
97
83
|
end
|
98
84
|
|
@@ -181,20 +167,33 @@ module Spec
|
|
181
167
|
end
|
182
168
|
end
|
183
169
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
end
|
170
|
+
it "supports helper methods" do
|
171
|
+
matcher = Spec::Matchers::Matcher.new(:be_similar_to, [1,2,3]) do |sample|
|
172
|
+
match do |actual|
|
173
|
+
similar?(sample, actual)
|
174
|
+
end
|
190
175
|
|
191
|
-
|
192
|
-
|
193
|
-
end
|
176
|
+
def similar?(a, b)
|
177
|
+
a.sort == b.sort
|
194
178
|
end
|
195
|
-
|
196
|
-
matcher.matches?([2,3,1]).should be_true
|
197
179
|
end
|
180
|
+
|
181
|
+
matcher.matches?([2,3,1]).should be_true
|
182
|
+
end
|
183
|
+
|
184
|
+
it "supports fluent interface" do
|
185
|
+
matcher = Spec::Matchers::Matcher.new(:first_word) do
|
186
|
+
def second_word
|
187
|
+
self
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
matcher.second_word.should == matcher
|
192
|
+
end
|
193
|
+
|
194
|
+
it "treats method missing normally for undeclared methods" do
|
195
|
+
matcher = Spec::Matchers::Matcher.new(:ignore) { }
|
196
|
+
expect { matcher.non_existent_method }.to raise_error(NoMethodError)
|
198
197
|
end
|
199
198
|
|
200
199
|
end
|