On Jul 11, 12:57 ¨Βν¬ ΝαττθεΝοσσ Όναττθεχ®ν®®®ΐηναιμ®γονΎ χςοτεΊ
> Anyway, here's another test:
>
> nums = (0...1000).sort_by { rand }
> strs = nums.map { |n| symbolify(n) }
>
> strs.zip(nums).sort_by { rand }.each do |str, num|
> res = eval(str)
> raise "Not a string!"  ¨Βξμεσστς®ισίαΣτςιξη
> raise "Invalid chars!" unless str.delete("?*()-").empty?
> raise "Decode failed!" unless res == num
> end
>
> puts "Passed!"

I've done some translating of these tests into test/unit (and some
meta-programming to help me test multiple solutions easily.  Here's
what the end of my solution file looks like:

###
require 'test/unit'

class TestSymbolify < Test::Unit::TestCase
  @test_number = 1

  def self.solution_test(module_name, range, test=:delayed_eval_tests)
    class_eval <<-EOD
      def test_#{@test_number}_#{module_name.to_s.gsub('::','_')}
        Object.send(:include, #{module_name})
        #{test}(#{range})
      end
    EOD
    @test_number += 1
  end

  def symbolify_assertions_for(string, integer)
    assert_kind_of(String, string)
    assert_match(/\A[?*()-]*\Z/, string)
    assert_equal(integer, eval(string))
  end

  def cheat_friendly_tests(range)
    range.each do |i|
      s = symbolify(i)
      symbolify_assertions_for(s,i)
    end
  end

  def delayed_eval_tests(range)
    nums = range.sort_by { rand }
    strs = nums.map { |n| symbolify(n) }

    strs.zip(nums).sort_by { rand }.each do |s, i|
      symbolify_assertions_for(s,i)
    end
  end

  # The actual tests
  solution_test(Symbolify::Integers, -1000..1000)
  solution_test(Symbolify::NaturalNumbers, 0..1000)
  solution_test(Symbolify::Cheating,
-1000..1000, :cheat_friendly_tests)
end
###

It might be a little much... but I *was* having fun.

Chris