-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refactored def_matcher(), introduced build_matcher method.
Signed-off-by: Jeremy McAnally <jeremymcanally@gmail.com>
- Loading branch information
1 parent
b90775a
commit 07e1378
Showing
6 changed files
with
123 additions
and
40 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,3 @@ | ||
pkg/* | ||
.DS_Store | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
module Matchy | ||
module MatcherBuilder | ||
def build_matcher(matcher_name=nil, args=[], &block) | ||
match_block = lambda do |actual, matcher| | ||
block.call(actual, matcher, args) | ||
end | ||
body = lambda do |klass| | ||
@matcher_name = matcher_name.to_s | ||
def self.matcher_name | ||
@matcher_name | ||
end | ||
|
||
attr_accessor :positive_msg, :negative_msg, :msgs | ||
attr_reader :matcher_name | ||
def initialize match_block, test_case | ||
@test_case = test_case | ||
@match_block = match_block | ||
@matcher_name = self.class.matcher_name | ||
end | ||
|
||
def method_missing id, *args, &block | ||
require 'ostruct' | ||
(self.msgs ||= []) << OpenStruct.new( "name" => id, "args" => args, "block" => block ) | ||
self | ||
end | ||
|
||
def matches? given | ||
@positive_msg ||= "Matching with '#{matcher_name}' failed, although it should match." | ||
@negative_msg ||= "Matching with '#{matcher_name}' passed, although it should_not match." | ||
@match_block.call(given, self) | ||
end | ||
|
||
def failure_message | ||
self.positive_msg | ||
end | ||
|
||
def negative_failure_message | ||
self.negative_msg | ||
end | ||
end | ||
Class.new(Matchy::Expectations::Base, &body).new(match_block, self) | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
require File.dirname(__FILE__) + '/test_helper.rb' | ||
|
||
class TestMatcherBuilder < Test::Unit::TestCase | ||
include Matchy::MatcherBuilder | ||
|
||
def setup | ||
@obj = Object.new | ||
end | ||
|
||
def test_matcher_responds_to_matches | ||
block = lambda {|given, matcher, args| true} | ||
build_matcher(:m, &block).should respond_to(:matches?) | ||
end | ||
|
||
def test_fail_positive | ||
block = lambda {|given, matcher, args| false} | ||
lambda {@obj.should build_matcher(:m, &block)}.should raise_error | ||
end | ||
|
||
def test_pass_positive | ||
block = lambda {|given, matcher, args| true} | ||
@obj.should build_matcher(:m, &block) | ||
end | ||
|
||
def test_fail_negative | ||
block = lambda {|given, matcher, args| true} | ||
lambda {@obj.should_not build_matcher(:m, &block)}.should raise_error | ||
end | ||
|
||
def test_pass_negative | ||
block = lambda {|given, matcher, args| false} | ||
@obj.should_not build_matcher(:m, &block) | ||
end | ||
|
||
def test_takes_arguments | ||
block = lambda {|given, matcher, args| $args = args; true} | ||
@obj.should build_matcher(:m,[1,2,3], &block) | ||
$args.should eql([1,2,3]) | ||
end | ||
|
||
def test_received_method | ||
block = lambda {|given, matcher, args| $msgs = matcher.msgs; true} | ||
@obj.should build_matcher(:m, &block).method1 | ||
$msgs[0].name.should eql(:method1) | ||
end | ||
|
||
def test_received_method_takes_args | ||
block = lambda {|given, matcher, args| $msgs = matcher.msgs; true} | ||
@obj.should build_matcher(:m, &block).method1(1,2,3) | ||
$msgs[0].args.should eql([1,2,3]) | ||
end | ||
|
||
def test_received_method_takes_block | ||
block = lambda {|given, matcher, args| $msgs = matcher.msgs; true} | ||
@obj.should build_matcher(:m, &block).method1 { "Hello, World!"} | ||
$msgs[0].block.call.should eql("Hello, World!") | ||
end | ||
|
||
def test_received_method_chained | ||
block = lambda {|given, matcher, args| $msgs = matcher.msgs; true} | ||
@obj.should build_matcher(:m, &block).method1(1,2,3) { "Hello, World!"}. | ||
method2(4,5,6) { "Hello chained messages" } | ||
|
||
$msgs[0].name.should eql(:method1) | ||
$msgs[1].name.should eql(:method2) | ||
$msgs[0].args.should eql([1,2,3]) | ||
$msgs[1].args.should eql([4,5,6]) | ||
$msgs[0].block.call.should eql("Hello, World!") | ||
$msgs[1].block.call.should eql("Hello chained messages") | ||
end | ||
|
||
end |