Ruby Quiz #103: DictionaryMatcher

From: Adam <skidooer@gmail.com>
Date: November 25, 2006 1:13:25 AM CST
To: submission@rubyquiz.com
Subject: Ruby Quiz #103: DictionaryMatcher

class DictionaryMatcher < Array
attr_reader :options

def initialize(words = [], options = nil, lang = nil)
   @options, @kcode = options, lang
   super words
end

def =~(obj)
   collect { |word| obj =~ Regexp.new(word, @options, @kcode) }.compact.first
end
alias_method :===, :=~
alias_method :match, :=~

def casefold?
   options & Regexp::IGNORECASE
end

def kcode
   Regexp.new('', @options, @kcode).kcode
end

def to_s
   join '|'
end
alias_method :source, :to_s

def inspect
   Regexp.new('REPLACE', @options, @kcode).inspect.sub('REPLACE', to_s)
end
end

class String
alias_method :match_object, :=~

def =~(obj)
   result = match_object(obj)
   obj.is_a?(DictionaryMatcher) ? !result.nil? : result
end
end

------

require 'test/unit'
require 'dictionary_matcher'

class DictionaryMatcherTest < Test::Unit::TestCase
def setup
   @dictionary = DictionaryMatcher.new
   @dictionary << "string"
   @dictionary << "Ruby"
end

def test_added_terms
   assert @dictionary.include?("Ruby")
   assert ! @dictionary.include?("missing")
   assert ! @dictionary.include?("stringing you along")
end

def test_regexp_like_seach
   assert_equal 5, @dictionary =~ "long string"
   assert_equal nil, @dictionary =~ "rub you the wrong way"
   assert_equal true, "long string" =~ @dictionary
end

def test_case_sesitive_match
   assert ! @dictionary.casefold?
   assert_not_equal 5, @dictionary =~ "lONg sTrINg"
   assert_not_equal true, "lonG STRing" =~ @dictionary
end

def test_case_insesitive_match
   @dictionary.instance_variable_set('@options', Regexp::IGNORECASE)

   assert @dictionary.casefold?
   assert_equal 5, @dictionary =~ "lONg sTrINg"
   assert_equal true, "lonG STRing" =~ @dictionary
end

def test_new_dictionary_matcher_with_options
   dictionary = DictionaryMatcher.new(%W( here be words ),
Regexp::EXTENDED | Regexp::IGNORECASE, 'u')

   assert dictionary
   assert_equal %W( words be here ).sort, dictionary.sort
   assert_equal Regexp::EXTENDED | Regexp::IGNORECASE, dictionary.options
   assert_equal 'utf8', dictionary.kcode
end

def test_regexp_compatibility_methods
   assert @dictionary.eql?(@dictionary)
   assert ! @dictionary.casefold?
   assert @dictionary.kcode.nil?
   assert @dictionary.options.nil?
   assert_equal @dictionary.to_s, @dictionary.source
   assert_equal 'string|Ruby', @dictionary.source
   assert_equal '/string|Ruby/', @dictionary.inspect
end
end

···

Begin forwarded message: