Skip to content

Commit

Permalink
Refactored def_matcher(), introduced build_matcher method.
Browse files Browse the repository at this point in the history
Signed-off-by: Jeremy McAnally <jeremymcanally@gmail.com>
  • Loading branch information
mhennemeyer authored and jm committed Feb 11, 2009
1 parent b90775a commit 07e1378
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 40 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
pkg/*
.DS_Store

1 change: 1 addition & 0 deletions lib/matchy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
require 'matchy/expectation'
require 'matchy/modals'
require 'matchy/version'
require 'matchy/matcher_builder'
require 'matchy/def_matcher'

require 'matchy/built_in/enumerable_expectations'
Expand Down
40 changes: 2 additions & 38 deletions lib/matchy/def_matcher.rb
Original file line number Diff line number Diff line change
@@ -1,45 +1,9 @@
module Matchy
module DefMatcher
include Matchy::MatcherBuilder
def def_matcher(matcher_name, &block)
self.class.send :define_method, matcher_name do |*args|
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)
build_matcher(matcher_name, args, &block)
end
end
end
Expand Down
44 changes: 44 additions & 0 deletions lib/matchy/matcher_builder.rb
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
4 changes: 2 additions & 2 deletions test/test_def_matcher.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def test_pass_positive
def_matcher :matcher do |given, matcher, args|
true
end
lambda {1.should matcher}.should_not raise_error
1.should matcher
end

def test_fail_negative
Expand All @@ -43,7 +43,7 @@ def test_pass_negative
def_matcher :matcher do |given, matcher, args|
false
end
lambda {1.should_not matcher}.should_not raise_error
1.should_not matcher
end

def test_takes_arguments
Expand Down
72 changes: 72 additions & 0 deletions test/test_matcher_builder.rb
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

0 comments on commit 07e1378

Please sign in to comment.