Begin forwarded message:

> 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