Skip to content

Instantly share code, notes, and snippets.

@wycats
Created September 18, 2008 01:23
Show Gist options
  • Save wycats/11350 to your computer and use it in GitHub Desktop.
Save wycats/11350 to your computer and use it in GitHub Desktop.
module Spec
module Matchers
def self.create(name, &block)
@guid ||= 0
mod = Module.new do
klass = Class.new(MatcherDSL) do
def initialize(expected_value)
@expected_value = expected_value
end
end
klass.class_eval(&block)
define_method(name) do |*expected_value|
# Avoid a warning for the form should foo.
klass.new(expected_value && expected_value[0])
end
end
Merb::Test::ExampleGroup.send(:include, mod)
end
class MatcherDSL
include Merb::Test::RouteHelper
def self.matches(&block)
define_method(:matches_proxy, &block)
define_method(:matches?) do |object|
@object = object
if block.arity == 2
matches_proxy(@object, @expected_value)
else
matches_proxy(@object)
end
end
end
def self.expected_value(&block)
define_method(:transform_expected, &block)
define_method(:initialize) do |expected_value|
@expected_value = transform_expected(expected_value) || expected_value
end
end
def self.negative_failure_message(&block)
define_method(:proxy_negative_failure_message, &block)
define_method(:negative_failure_message) do
proxy_negative_failure_message(@object, @expected_value)
end
end
def self.failure_message(&block)
define_method(:proxy_failure_message, &block)
define_method(:failure_message) do
proxy_failure_message(@object, @expected_value)
end
end
def self.message(&block)
class_eval do
def failure_message
generic_message(@object, @expected_value, nil)
end
def negative_failure_message
generic_message(@object, @expected_value, " not")
end
end
define_method(:proxy_generic_message, &block)
define_method(:generic_message) do |object, expected, not_string|
proxy_generic_message(not_string, object, expected)
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment