Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

include contest.rb with tests

  • Loading branch information...
commit 22c2724dc09d796ca9b03e32594e6e490a3e06c8 1 parent 7a79120
@rtomayko rtomayko authored
Showing with 70 additions and 1 deletion.
  1. +2 −1  Rakefile
  2. +68 −0 test/contest.rb
View
3  Rakefile
@@ -11,7 +11,8 @@ end
desc 'Run tests (default)'
Rake::TestTask.new(:test) do |t|
t.test_files = FileList['test/*_test.rb']
- t.ruby_opts = ['-rubygems'] if defined? Gem
+ t.ruby_opts = ['-Itest']
+ t.ruby_opts << '-rubygems' if defined? Gem
end
# PACKAGING =================================================================
View
68 test/contest.rb
@@ -0,0 +1,68 @@
+require "test/unit"
+
+# Test::Unit loads a default test if the suite is empty, whose purpose is to
+# fail. Since having empty contexts is a common practice, we decided to
+# overwrite TestSuite#empty? in order to allow them. Having a failure when no
+# tests have been defined seems counter-intuitive.
+class Test::Unit::TestSuite
+ def empty?
+ false
+ end
+end
+
+# Contest adds +teardown+, +test+ and +context+ as class methods, and the
+# instance methods +setup+ and +teardown+ now iterate on the corresponding
+# blocks. Note that all setup and teardown blocks must be defined with the
+# block syntax. Adding setup or teardown instance methods defeats the purpose
+# of this library.
+class Test::Unit::TestCase
+ def self.setup(&block)
+ define_method :setup do
+ super(&block)
+ instance_eval(&block)
+ end
+ end
+
+ def self.teardown(&block)
+ define_method :teardown do
+ instance_eval(&block)
+ super(&block)
+ end
+ end
+
+ def self.context(name, &block)
+ subclass = Class.new(self)
+ remove_tests(subclass)
+ subclass.class_eval(&block) if block_given?
+ const_set(context_name(name), subclass)
+ end
+
+ def self.test(name, &block)
+ define_method(test_name(name), &block)
+ end
+
+ class << self
+ alias_method :should, :test
+ alias_method :describe, :context
+ end
+
+private
+
+ def self.context_name(name)
+ "Test#{sanitize_name(name).gsub(/(^| )(\w)/) { $2.upcase }}".to_sym
+ end
+
+ def self.test_name(name)
+ "test_#{sanitize_name(name).gsub(/\s+/,'_')}".to_sym
+ end
+
+ def self.sanitize_name(name)
+ name.gsub(/\W+/, ' ').strip
+ end
+
+ def self.remove_tests(subclass)
+ subclass.public_instance_methods.grep(/^test_/).each do |meth|
+ subclass.send(:undef_method, meth.to_sym)
+ end
+ end
+end
Please sign in to comment.
Something went wrong with that request. Please try again.