Branched miniunit into minitest w/o test/unit compatibility

[git-p4: depot-paths = "//src/minitest/dev/": change = 4312]
This commit is contained in:
Ryan Davis 2008-10-09 10:24:41 -08:00
commit 17bc421f95
12 changed files with 1929 additions and 0 deletions

13
.autotest Normal file
View File

@ -0,0 +1,13 @@
# -*- ruby -*-
Autotest.add_hook :initialize do |at|
at.extra_class_map["MiniSpec"] = "test/test_mini_spec.rb"
at.extra_class_map["TestMiniTestTestCase"] = "test/test_mini_test.rb"
at.add_exception 'coverage.info'
at.add_exception 'coverage'
end
require 'autotest/rcov'
Autotest::RCov.command = 'rcov_info'

83
History.txt Normal file
View File

@ -0,0 +1,83 @@
=== 1.2.1 / 2008-06-10
* 7 minor enhancements:
* Added deprecations everywhere in test/unit.
* Added test_order to TestCase. :random on mini, :sorted on test/unit (for now).
* Big cleanup in test/unit for rails. Thanks Jeremy Kemper!
* Minor readability cleanup.
* Pushed setup/run/teardown down to testcase allowing specialized testcases.
* Removed pp. Tests run 2x faster. :/
* Renamed deprecation methods and moved to test/unit/deprecate.rb.
=== 1.2.0 / 2008-06-09
* 2 major enhancements:
* Added Mini::Spec.
* Added Mini::Mock. Thanks Steven Baker!!
* 23 minor enhancements:
* Added bin/use_miniunit to make it easy to test out miniunit.
* Added -n filtering, thanks to Phil Hagelberg!
* Added args argument to #run, takes ARGV from at_exit.
* Added test name output if $DEBUG.
* Added a refute (was deny) for every assert.
* Added capture_io and a bunch of nice assertions from zentest.
* Added deprecation mechanism for assert_no/not methods to test/unit/assertions.
* Added pp output when available.
* Added tests for all assertions. Pretty much maxed out coverage.
* Added tests to verify consistency and good naming.
* Aliased and deprecated all ugly assertions.
* Cleaned out test/unit. Moved autorun there.
* Code cleanup to make extensions easier. Thanks Chad!
* Got spec args reversed in all but a couple assertions. Much more readable.
* Improved error messages across the board. Adds your message to the default.
* Moved into Mini namespace, renamed to Mini::Test and Mini::Spec.
* Pulled the assertions into their own module...
* Removed as much code as I could while still maintaining full functionality.
* Moved filter_backtrace into MiniTest.
* Removed MiniTest::Unit::run. Unnecessary.
* Removed location_of_failure. Unnecessary.
* Rewrote test/unit's filter_backtrace. Flog from 37.0 to 18.1
* Removed assert_send. Google says it is never used.
* Renamed MiniTest::Unit.autotest to #run.
* Renamed deny to refute.
* Rewrote some ugly/confusing default assertion messages.
* assert_in_delta now defaults to 0.001 precision. Makes specs prettier.
* 9 bug fixes:
* Fixed assert_raises to raise outside of the inner-begin/rescue.
* Fixed for ruby 1.9 and rubinius.
* No longer exits 0 if exception in code PRE-test run causes early exit.
* Removed implementors method list from mini/test.rb - too stale.
* assert_nothing_raised takes a class as an arg. wtf? STUPID
* ".EF" output is now unbuffered.
* Bunch of changes to get working with rails... UGH.
* Added stupid hacks to deal with rails not requiring their dependencies.
* Now bitch loudly if someone defines one of my classes instead of requiring.
* Fixed infect method to work better on 1.9.
* Fixed all shadowed variable warnings in 1.9.
=== 1.1.0 / 2007-11-08
* 4 major enhancements:
* Finished writing all missing assertions.
* Output matches original test/unit.
* Documented every method needed by language implementor.
* Fully switched over to self-testing setup.
* 2 minor enhancements:
* Added deny (assert ! test), our favorite extension to test/unit.
* Added .autotest and fairly complete unit tests. (thanks Chad for help here)
=== 1.0.0 / 2006-10-30
* 1 major enhancement
* Birthday!

17
Manifest.txt Normal file
View File

@ -0,0 +1,17 @@
.autotest
History.txt
Manifest.txt
README.txt
Rakefile
bin/use_miniunit
lib/mini/mock.rb
lib/mini/spec.rb
lib/mini/test.rb
lib/test/unit.rb
lib/test/unit/assertions.rb
lib/test/unit/deprecate.rb
lib/test/unit/error.rb
lib/test/unit/testcase.rb
test/test_mini_mock.rb
test/test_mini_spec.rb
test/test_mini_test.rb

57
README.txt Normal file
View File

@ -0,0 +1,57 @@
= mini/{test,spec,mock}
* http://rubyforge.org/projects/bfts
== DESCRIPTION:
mini/test is a completely minimial drop-in replacement for ruby's
test/unit. This is meant to be clean and easy to use both as a regular
test writer and for language implementors that need a minimal set of
methods to bootstrap a working unit test suite.
mini/spec is a functionally complete spec engine.
mini/mock, by Steven Baker, is a beautifully tiny mock object framework.
== FEATURES/PROBLEMS:
* Contains mini/test - a simple and clean test system (301 lines!).
* Contains mini/spec - a simple and clean spec system (52 lines!).
* Contains mini/mock - a simple and clean mock system (35 lines!).
* Fully test/unit compatible assertions.
* Allows test/unit to be required, firing up an autorunner.
* Incredibly small and fast runner, but no bells and whistles.
* Incompatible at the runner level.
== REQUIREMENTS:
+ Ruby 1.8, maybe even 1.6 or lower. No magic is involved.
== INSTALL:
+ sudo gem install miniunit
== LICENSE:
(The MIT License)
Copyright (c) Ryan Davis, Seattle.rb
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

65
Rakefile Normal file
View File

@ -0,0 +1,65 @@
# -*- ruby -*-
$TESTING_MINIUNIT = true
require 'rubygems'
require 'hoe'
require './lib/mini/test.rb'
Hoe.new('miniunit', Mini::Test::VERSION) do |miniunit|
miniunit.rubyforge_name = "bfts"
miniunit.developer('Ryan Davis', 'ryand-ruby@zenspider.com')
end
begin
require 'rcov/rcovtask'
Rcov::RcovTask.new do |t|
t.verbose = true
t.rcov_opts << "--include-file lib/test"
t.rcov_opts << "--no-color"
end
task :rcov_info do
pattern = ENV['PATTERN'] || "test/test_*.rb"
ruby "-Ilib -S rcov --text-report --include-file lib/test --save coverage.info #{pattern}"
end
task :rcov_overlay do
rcov, eol = Marshal.load(File.read("coverage.info")).last[ENV["FILE"]], 1
puts rcov[:lines].zip(rcov[:coverage]).map { |line, coverage|
bol, eol = eol, eol + line.length
[bol, eol, "#ffcccc"] unless coverage
}.compact.inspect
end
rescue LoadError
# skip
end
def loc dir
system "find #{dir} -name \\*.rb | xargs wc -l | tail -1"
end
desc "stupid line count"
task :dickwag do
puts
puts "miniunit"
puts
print " lib loc"; loc "lib"
print " test loc"; loc "test"
print " totl loc"; loc "lib test"
print " flog = "; system "flog -s lib"
puts
puts "test/unit"
puts
Dir.chdir File.expand_path("~/Work/svn/ruby/ruby_1_8") do
print " lib loc"; loc "lib/test"
print " test loc"; loc "test/testunit"
print " totl loc"; loc "lib/test test/testunit"
print " flog = "; system "flog -s lib/test"
end
puts
end
# vim: syntax=Ruby

23
bin/use_miniunit Executable file
View File

@ -0,0 +1,23 @@
#!/usr/bin/env ruby
require 'rbconfig'
use_miniunit = ARGV.shift
sitelib = Config::CONFIG["sitelibdir"]
projdir = File.dirname(File.dirname(File.expand_path(__FILE__)))
minidir = File.join(projdir, "lib")
case use_miniunit
when /^y/ then
File.symlink File.join(minidir, "mini"), File.join(sitelib, "mini")
File.symlink File.join(minidir, "test"), File.join(sitelib, "test")
puts "Added links to #{sitelib}"
when /^n/ then
File.unlink File.join(sitelib, "mini")
File.unlink File.join(sitelib, "test")
puts "Removed links from #{sitelib}"
else
pgm = File.basename __FILE__
puts "usage: #{pgm} (yes|no)"
exit 1
end

31
lib/mini/mock.rb Normal file
View File

@ -0,0 +1,31 @@
class MockExpectationError < StandardError; end
require 'mini/test'
class Mini::Mock
def initialize
@expected_calls = {}
@actual_calls = Hash.new {|h,k| h[k] = [] }
end
def expect(name, retval, args=[])
n, r, a = name, retval, args # for the closure below
@expected_calls[name] = { :retval => retval, :args => args }
self.class.__send__(:define_method, name) { |*x|
raise ArgumentError unless @expected_calls[n][:args].size == x.size
@actual_calls[n] << { :retval => r, :args => x }
retval
}
self
end
def verify
@expected_calls.each_key do |name|
expected = @expected_calls[name]
msg = "expected #{name}, #{expected.inspect}"
raise MockExpectationError, msg unless
@actual_calls.has_key? name and @actual_calls[name].include?(expected)
end
true
end
end

82
lib/mini/spec.rb Normal file
View File

@ -0,0 +1,82 @@
#!/usr/bin/ruby -w
require 'mini/test'
class Module
def infect_with_assertions pos_prefix, neg_prefix, skip_re, map = {}
Mini::Assertions.public_instance_methods(false).each do |meth|
meth = meth.to_s
new_name = case meth
when /^assert/ then
meth.sub(/^assert/, pos_prefix.to_s)
when /^refute/ then
meth.sub(/^refute/, neg_prefix.to_s)
end
next unless new_name
next if new_name =~ skip_re
regexp, replacement = map.find { |re, _| new_name =~ re }
new_name.sub! regexp, replacement if replacement
# warn "%-22p -> %p %p" % [meth, new_name, regexp]
self.class_eval <<-EOM
def #{new_name} *args, &block
return Mini::Spec.current.#{meth}(*args, &self) if Proc === self
return Mini::Spec.current.#{meth}(args.first, self) if args.size == 1
return Mini::Spec.current.#{meth}(self, *args)
end
EOM
end
end
end
Object.infect_with_assertions(:must, :wont,
/^(must|wont)$|wont_(throw)|
must_(block|not?_|nothing|raise$)/x,
/(must_throw)s/ => '\1',
/(?!not)_same/ => '_be_same_as',
/_in_/ => '_be_within_',
/_operator/ => '_be',
/_includes/ => '_include',
/(must|wont)_(.*_of|nil|empty)/ => '\1_be_\2',
/must_raises/ => 'must_raise')
class Object
alias :must_be_close_to :must_be_within_delta
alias :wont_be_close_to :wont_be_within_delta
end
module Kernel
def describe desc, &block
cls = Class.new(Mini::Spec)
Object.const_set desc.to_s.split(/\W+/).map { |s| s.capitalize }.join, cls
cls.class_eval(&block)
end
end
class Mini::Spec < Mini::Test::TestCase
def self.current
@@current_spec
end
def initialize name
super
@@current_spec = self
end
def self.before(type = :each, &block)
raise "unsupported before type: #{type}" unless type == :each
define_method :setup, &block
end
def self.after(type = :each, &block)
raise "unsupported after type: #{type}" unless type == :each
define_method :teardown, &block
end
def self.it desc, &block
define_method "test_#{desc.gsub(/\W+/, '_').downcase}", &block
end
end

482
lib/mini/test.rb Normal file
View File

@ -0,0 +1,482 @@
##
#
# Totally minimal drop-in replacement for test-unit
#
# TODO: refute -> debunk, prove/rebut, show/deny... lots of possibilities
module Mini
class Assertion < Exception; end
class Skip < Assertion; end
file = if RUBY_VERSION =~ /^1\.9/ then # bt's expanded, but __FILE__ isn't :(
File.expand_path __FILE__
elsif __FILE__ =~ /^[^\.]/ then # assume both relative
require 'pathname'
pwd = Pathname.new Dir.pwd
pn = Pathname.new File.expand_path(__FILE__)
pn = File.join(".", pn.relative_path_from(pwd)) unless pn.relative?
pn.to_s
else # assume both are expanded
__FILE__
end
# './lib' in project dir, or '/usr/local/blahblah' if installed
MINI_DIR = File.dirname(File.dirname(file))
def self.filter_backtrace bt
return ["No backtrace"] unless bt
new_bt = []
bt.each do |line|
break if line.rindex(MINI_DIR, 0)
new_bt << line
end
new_bt = bt.reject { |line| line.rindex(MINI_DIR, 0) } if new_bt.empty?
new_bt = bt.dup if new_bt.empty?
new_bt
end
module Assertions
def mu_pp(obj)
s = obj.inspect
s = s.force_encoding(Encoding.default_external) if defined? Encoding
s
end
def _assertions= n
@_assertions = n
end
def _assertions
@_assertions ||= 0
end
def assert test, msg = nil
msg ||= "Failed assertion, no message given."
self._assertions += 1
unless test then
msg = msg.call if Proc === msg
raise Mini::Assertion, msg
end
true
end
def assert_block msg = nil
msg = message(msg) { "Expected block to return true value" }
assert yield, msg
end
def assert_empty obj, msg = nil
msg = message(msg) { "Expected #{obj.inspect} to be empty" }
assert_respond_to obj, :empty?
assert obj.empty?, msg
end
def assert_equal exp, act, msg = nil
msg = message(msg) { "Expected #{mu_pp(exp)}, not #{mu_pp(act)}" }
assert(exp == act, msg)
end
def assert_in_delta exp, act, delta = 0.001, msg = nil
n = (exp - act).abs
msg = message(msg) { "Expected #{exp} - #{act} (#{n}) to be < #{delta}" }
assert delta > n, msg
end
def assert_in_epsilon a, b, epsilon = 0.001, msg = nil
assert_in_delta a, b, [a, b].min * epsilon, msg
end
def assert_includes collection, obj, msg = nil
msg = message(msg) { "Expected #{mu_pp(collection)} to include #{mu_pp(obj)}" }
assert_respond_to collection, :include?
assert collection.include?(obj), msg
end
def assert_instance_of cls, obj, msg = nil
msg = message(msg) { "Expected #{mu_pp(obj)} to be an instance of #{cls}, not #{obj.class}" }
flip = (Module === obj) && ! (Module === cls) # HACK for specs
obj, cls = cls, obj if flip
assert cls === obj, msg
end
def assert_kind_of cls, obj, msg = nil # TODO: merge with instance_of
msg = message(msg) {
"Expected #{mu_pp(obj)} to be a kind of #{cls}, not #{obj.class}" }
flip = (Module === obj) && ! (Module === cls) # HACK for specs
obj, cls = cls, obj if flip
assert obj.kind_of?(cls), msg
end
def assert_match exp, act, msg = nil
msg = message(msg) { "Expected #{mu_pp(act)} to match #{mu_pp(exp)}" }
assert_respond_to act, :"=~"
(exp = /#{exp}/) if String === exp && String === act
assert act =~ exp, msg
end
def assert_nil obj, msg = nil
msg = message(msg) { "Expected #{mu_pp(obj)} to be nil" }
assert obj.nil?, msg
end
def assert_operator o1, op, o2, msg = nil
msg = message(msg) { "Expected #{mu_pp(o1)} to be #{op} #{mu_pp(o2)}" }
assert o1.__send__(op, o2), msg
end
def assert_raises *exp
msg = String === exp.last ? exp.pop : nil
should_raise = false
begin
yield
should_raise = true
rescue Exception => e
assert_includes(exp, e.class, exception_details(e, "<#{mu_pp(exp)}> exception expected, not"))
return e
end
exp = exp.first if exp.size == 1
flunk "#{mu_pp(exp)} expected but nothing was raised." if should_raise
end
def assert_respond_to obj, meth, msg = nil
msg = message(msg) {
"Expected #{mu_pp(obj)} (#{obj.class}) to respond to ##{meth}"
}
flip = (Symbol === obj) && ! (Symbol === meth) # HACK for specs
obj, meth = meth, obj if flip
assert obj.respond_to?(meth), msg
end
def assert_same exp, act, msg = nil
msg = message(msg) {
data = [mu_pp(act), act.object_id, mu_pp(exp), exp.object_id]
"Expected %s (0x%x) to be the same as %s (0x%x)" % data
}
assert exp.equal?(act), msg
end
def assert_send send_ary, m = nil
recv, msg, *args = send_ary
m = message(m) {
"Expected #{mu_pp(recv)}.#{msg}(*#{mu_pp(args)}) to return true" }
assert recv.__send__(msg, *args), m
end
def assert_throws sym, msg = nil
default = "Expected #{mu_pp(sym)} to have been thrown"
caught = true
catch(sym) do
begin
yield
rescue ArgumentError => e # 1.9 exception
default += ", not #{e.message.split(/ /).last}"
rescue NameError => e # 1.8 exception
default += ", not #{e.name.inspect}"
end
caught = false
end
assert caught, message(msg) { default }
end
def capture_io
require 'stringio'
orig_stdout, orig_stderr = $stdout.dup, $stderr.dup
captured_stdout, captured_stderr = StringIO.new, StringIO.new
$stdout, $stderr = captured_stdout, captured_stderr
yield
return captured_stdout.string, captured_stderr.string
ensure
$stdout = orig_stdout
$stderr = orig_stderr
end
def exception_details e, msg
"#{msg}\nClass: <#{e.class}>\nMessage: <#{e.message.inspect}>\n---Backtrace---\n#{Mini::filter_backtrace(e.backtrace).join("\n")}\n---------------"
end
def flunk msg = nil
msg ||= "Epic Fail!"
assert false, msg
end
def message msg = nil, &default
proc {
if msg then
msg = msg.to_s unless String === msg
msg += '.' unless msg.empty?
msg += "\n#{default.call}."
msg.strip
else
"#{default.call}."
end
}
end
# used for counting assertions
def pass msg = nil
assert true
end
def refute test, msg = nil
msg ||= "Failed refutation, no message given"
not assert(! test, msg)
end
def refute_empty obj, msg = nil
msg = message(msg) { "Expected #{obj.inspect} to not be empty" }
assert_respond_to obj, :empty?
refute obj.empty?, msg
end
def refute_equal exp, act, msg = nil
msg = message(msg) { "Expected #{mu_pp(act)} to not be equal to #{mu_pp(exp)}" }
refute exp == act, msg
end
def refute_in_delta exp, act, delta = 0.001, msg = nil
n = (exp - act).abs
msg = message(msg) { "Expected #{exp} - #{act} (#{n}) to not be < #{delta}" }
refute delta > n, msg
end
def refute_in_epsilon a, b, epsilon = 0.001, msg = nil
refute_in_delta a, b, a * epsilon, msg
end
def refute_includes collection, obj, msg = nil
msg = message(msg) { "Expected #{mu_pp(collection)} to not include #{mu_pp(obj)}" }
assert_respond_to collection, :include?
refute collection.include?(obj), msg
end
def refute_instance_of cls, obj, msg = nil
msg = message(msg) { "Expected #{mu_pp(obj)} to not be an instance of #{cls}" }
flip = (Module === obj) && ! (Module === cls) # HACK for specs
obj, cls = cls, obj if flip
refute cls === obj, msg
end
def refute_kind_of cls, obj, msg = nil # TODO: merge with instance_of
msg = message(msg) { "Expected #{mu_pp(obj)} to not be a kind of #{cls}" }
flip = (Module === obj) && ! (Module === cls) # HACK for specs
obj, cls = cls, obj if flip
refute obj.kind_of?(cls), msg
end
def refute_match exp, act, msg = nil
msg = message(msg) { "Expected #{mu_pp(act)} to not match #{mu_pp(exp)}" }
refute act =~ exp, msg
end
def refute_nil obj, msg = nil
msg = message(msg) { "Expected #{mu_pp(obj)} to not be nil" }
refute obj.nil?, msg
end
def refute_operator o1, op, o2, msg = nil
msg = message(msg) { "Expected #{mu_pp(o1)} to not be #{op} #{mu_pp(o2)}" }
refute o1.__send__(op, o2), msg
end
def refute_respond_to obj, meth, msg = nil
msg = message(msg) { "Expected #{mu_pp(obj)} to not respond to #{meth}" }
flip = (Symbol === obj) && ! (Symbol === meth) # HACK for specs
obj, meth = meth, obj if flip
refute obj.respond_to?(meth), msg
end
def refute_same exp, act, msg = nil
msg = message(msg) { "Expected #{mu_pp(act)} to not be the same as #{mu_pp(exp)}" }
refute exp.equal?(act), msg
end
def skip msg = nil
msg ||= "Skipped, no message given"
raise Mini::Skip, msg
end
end
class Test
VERSION = "1.3.0"
attr_accessor :report, :failures, :errors, :skips
attr_accessor :test_count, :assertion_count
@@installed_at_exit ||= false
@@out = $stdout
def self.autorun
at_exit {
exit_code = Mini::Test.new.run(ARGV)
exit false if exit_code && exit_code != 0
} unless @@installed_at_exit
@@installed_at_exit = true
end
def self.output= stream
@@out = stream
end
def location e
e.backtrace.find { |s|
s !~ /in .(assert|refute|flunk|pass|fail|raise)/
}.sub(/:in .*$/, '')
end
def puke klass, meth, e
e = case e
when Mini::Skip then
@skips += 1
"Skipped:\n#{meth}(#{klass}) [#{location e}]:\n#{e.message}\n"
when Mini::Assertion then
@failures += 1
"Failure:\n#{meth}(#{klass}) [#{location e}]:\n#{e.message}\n"
else
@errors += 1
bt = Mini::filter_backtrace(e.backtrace).join("\n ")
"Error:\n#{meth}(#{klass}):\n#{e.class}: #{e.message}\n #{bt}\n"
end
@report << e
e[0, 1]
end
def initialize
@report = []
@errors = @failures = @skips = 0
@verbose = false
end
##
# Top level driver, controls all output and filtering.
def run args = []
@verbose = args.delete('-v')
filter = if args.first =~ /^(-n|--name)$/ then
args.shift
arg = args.shift
arg =~ /\/(.*)\// ? Regexp.new($1) : arg
else
/./ # anything - ^test_ already filtered by #tests
end
@@out.puts "Loaded suite #{$0.sub(/\.rb$/, '')}\nStarted"
start = Time.now
run_test_suites filter
@@out.puts
@@out.puts "Finished in #{'%.6f' % (Time.now - start)} seconds."
@report.each_with_index do |msg, i|
@@out.puts "\n%3d) %s" % [i + 1, msg]
end
@@out.puts
format = "%d tests, %d assertions, %d failures, %d errors, %d skips"
@@out.puts format % [test_count, assertion_count, failures, errors, skips]
return failures + errors if @test_count > 0 # or return nil...
end
def run_test_suites filter = /./
@test_count, @assertion_count = 0, 0
old_sync, @@out.sync = @@out.sync, true if @@out.respond_to? :sync=
TestCase.test_suites.each do |suite|
suite.test_methods.grep(filter).each do |test|
inst = suite.new test
inst._assertions = 0
@@out.print "#{suite}##{test}: " if @verbose
t = Time.now if @verbose
result = inst.run(self)
@@out.print "%.2f s: " % (Time.now - t) if @verbose
@@out.print result
@@out.puts if @verbose
@test_count += 1
@assertion_count += inst._assertions
end
end
@@out.sync = old_sync if @@out.respond_to? :sync=
[@test_count, @assertion_count]
end
class TestCase
attr_reader :name
def run runner
result = '.'
begin
@passed = nil
self.setup
self.__send__ self.name
@passed = true
rescue Exception => e
@passed = false
result = runner.puke(self.class, self.name, e)
ensure
begin
self.teardown
rescue Exception => e
result = runner.puke(self.class, self.name, e)
end
end
result
end
def initialize name
@name = name
@passed = nil
end
def self.reset
@@test_suites = {}
end
reset
def self.inherited klass
@@test_suites[klass] = true
end
def self.test_order
:random
end
def self.test_suites
@@test_suites.keys.sort_by { |ts| ts.name }
end
def self.test_methods
methods = public_instance_methods(true).grep(/^test/).map { |m|
m.to_s
}.sort
if self.test_order == :random then
max = methods.size
methods = methods.sort_by { rand(max) }
end
methods
end
def setup; end
def teardown; end
def passed?
@passed
end
include Mini::Assertions
end # class TestCase
end # class Test
end # module Mini

76
test/test_mini_mock.rb Normal file
View File

@ -0,0 +1,76 @@
require 'mini/mock'
Mini::Test.autorun
class TestMiniMock < Mini::Test::TestCase
def setup
@mock = Mini::Mock.new.expect(:foo, nil)
@mock.expect(:meaning_of_life, 42)
end
def test_should_create_stub_method
assert_nil @mock.foo
end
def test_should_allow_return_value_specification
assert_equal 42, @mock.meaning_of_life
end
def test_should_blow_up_if_not_called
@mock.foo
util_verify_bad
end
def test_should_not_blow_up_if_everything_called
@mock.foo
@mock.meaning_of_life
assert @mock.verify
end
def test_should_allow_expectations_to_be_added_after_creation
@mock.expect(:bar, true)
assert @mock.bar
end
def test_should_not_verify_if_new_expected_method_is_not_called
@mock.foo
@mock.meaning_of_life
@mock.expect(:bar, true)
util_verify_bad
end
def test_should_not_verify_if_unexpected_method_is_called
assert_raises NoMethodError do
@mock.unexpected
end
end
def test_should_blow_up_on_wrong_number_of_arguments
@mock.foo
@mock.meaning_of_life
@mock.expect(:sum, 3, [1, 2])
assert_raises ArgumentError do
@mock.sum
end
end
def test_should_blow_up_on_wrong_arguments
@mock.foo
@mock.meaning_of_life
@mock.expect(:sum, 3, [1, 2])
@mock.sum(2, 4)
util_verify_bad
end
def util_verify_bad
assert_raises MockExpectationError do
@mock.verify
end
end
end

149
test/test_mini_spec.rb Executable file
View File

@ -0,0 +1,149 @@
require 'mini/spec'
Mini::Test.autorun
describe Mini::Spec do
before do
@assertion_count = 5
end
after do
self._assertions.must_equal @assertion_count
end
it "needs to have all methods named well" do
@assertion_count = 2
methods = Object.public_instance_methods.find_all { |n| n =~ /^must|^wont/ }
methods.map! { |m| m.to_s } if Symbol === methods.first
musts, wonts = methods.sort.partition { |m| m =~ /^must/ }
expected_musts = %w(must_be
must_be_close_to
must_be_empty
must_be_instance_of
must_be_kind_of
must_be_nil
must_be_same_as
must_be_within_delta
must_be_within_epsilon
must_equal
must_include
must_match
must_raise
must_respond_to
must_send
must_throw)
expected_wonts = expected_musts.map { |m| m.sub(/^must/, 'wont') }
expected_wonts.reject! { |m| m =~ /wont_(not|raise|throw|send)/ }
musts.must_equal expected_musts
wonts.must_equal expected_wonts
end
it "needs to verify equality" do
(6 * 7).must_equal(42).must_equal true
proc { (6 * 9).must_equal(42) }.must_raise Mini::Assertion
end
it "needs to verify floats within a delta" do
(6.0 * 7).must_be_close_to(42.0).must_equal true
proc { 42.002.must_be_close_to 42.0 }.must_raise Mini::Assertion
end
it "needs to verify types of objects" do
(6 * 7).must_be_instance_of(Fixnum).must_equal true
proc { (6 * 7).must_be_instance_of String }.must_raise Mini::Assertion
end
it "needs to verify kinds of objects" do
@assertion_count = 7
(6 * 7).must_be_kind_of(Fixnum).must_equal true
(6 * 7).must_be_kind_of(Numeric).must_equal true
proc { (6 * 7).must_be_kind_of String }.must_raise Mini::Assertion
end
it "needs to verify regexp matches" do
@assertion_count = 7
"blah".must_match(/\w+/).must_equal true
proc { "blah".must_match(/\d+/) }.must_raise Mini::Assertion
end
it "needs to verify nil" do
nil.must_be_nil.must_equal true
proc { 42.must_be_nil }.must_raise Mini::Assertion
end
it "needs to verify using any operator" do
41.must_be(:<, 42).must_equal true
proc { 42.must_be(:<, 41) }.must_raise Mini::Assertion
end
it "needs to catch an expected exception" do
@assertion_count = 4
proc { raise "blah" }.must_raise RuntimeError
proc { raise Mini::Assertion }.must_raise Mini::Assertion
end
it "needs to catch an unexpected exception" do
@assertion_count = 4
proc {
proc { raise Mini::Assertion }.must_raise(RuntimeError)
}.must_raise Mini::Assertion
end
it "needs raise if an expected exception is not raised" do
@assertion_count = 3
proc { proc { 42 }.must_raise(RuntimeError) }.must_raise Mini::Assertion
end
it "needs to be able to catch a Mini::Assertion exception" do
@assertion_count = 3
proc { 1.wont_equal 1 }.must_raise Mini::Assertion
end
it "needs to verify using respond_to" do
42.must_respond_to(:+).must_equal true
proc { 42.must_respond_to(:clear) }.must_raise Mini::Assertion
end
it "needs to verify identity" do
1.must_be_same_as(1).must_equal true
proc { 1.must_be_same_as 2 }.must_raise Mini::Assertion
end
it "needs to verify throw" do
@assertion_count = 8
proc { throw :blah }.must_throw(:blah).must_equal true
proc { proc { }.must_throw(:blah) }.must_raise Mini::Assertion
proc { proc { throw :xxx }.must_throw(:blah) }.must_raise Mini::Assertion
end
it "needs to verify inequality" do
42.wont_equal(6 * 9).must_equal false
proc { 1.wont_equal 1 }.must_raise Mini::Assertion
end
it "needs to verify mismatch" do
"blah".wont_match(/\d+/).must_equal false
proc { "blah".wont_match(/\w+/) }.must_raise Mini::Assertion
end
it "needs to verify non-nil" do
42.wont_be_nil.must_equal false
proc { nil.wont_be_nil }.must_raise Mini::Assertion
end
it "needs to verify non-identity" do
1.wont_be_same_as(2).must_equal false
proc { 1.wont_be_same_as 1 }.must_raise Mini::Assertion
end
end

851
test/test_mini_test.rb Executable file
View File

@ -0,0 +1,851 @@
require 'stringio'
require 'mini/test'
Mini::Test.autorun
class TestMiniTest < Mini::Test::TestCase
def setup
srand 42
Mini::Test::TestCase.reset
@tu = Mini::Test.new
@output = StringIO.new("")
Mini::Test.output = @output
assert_equal [0, 0], @tu.run_test_suites
end
def teardown
Mini::Test.output = $stdout
Object.send :remove_const, :ATestCase if defined? ATestCase
end
BT_MIDDLE = ["./lib/mini/test.rb:165:in `run_test_suites'",
"./lib/mini/test.rb:161:in `each'",
"./lib/mini/test.rb:161:in `run_test_suites'",
"./lib/mini/test.rb:158:in `each'",
"./lib/mini/test.rb:158:in `run_test_suites'",
"./lib/mini/test.rb:139:in `run'",
"./lib/mini/test.rb:106:in `run'"]
def test_filter_backtrace
# this is a semi-lame mix of relative paths.
# I cheated by making the autotest parts not have ./
bt = (["lib/autotest.rb:571:in `add_exception'",
"test/test_autotest.rb:62:in `test_add_exception'",
"./lib/mini/test.rb:165:in `__send__'"] +
BT_MIDDLE +
["./lib/mini/test.rb:29",
"test/test_autotest.rb:422"])
bt = util_expand_bt bt
ex = ["lib/autotest.rb:571:in `add_exception'",
"test/test_autotest.rb:62:in `test_add_exception'"]
ex = util_expand_bt ex
fu = Mini::filter_backtrace(bt)
assert_equal ex, fu
end
def util_expand_bt bt
if RUBY_VERSION =~ /^1\.9/ then
bt.map { |f| (f =~ /^\./) ? File.expand_path(f) : f }
else
bt
end
end
def test_filter_backtrace_all_unit
bt = (["./lib/mini/test.rb:165:in `__send__'"] +
BT_MIDDLE +
["./lib/mini/test.rb:29"])
ex = bt.clone
fu = Mini::filter_backtrace(bt)
assert_equal ex, fu
end
def test_filter_backtrace_unit_starts
bt = (["./lib/mini/test.rb:165:in `__send__'"] +
BT_MIDDLE +
["./lib/mini/test.rb:29",
"-e:1"])
bt = util_expand_bt bt
ex = ["-e:1"]
fu = Mini::filter_backtrace(bt)
assert_equal ex, fu
end
def test_class_puke_with_assertion_failed
exception = Mini::Assertion.new "Oh no!"
exception.set_backtrace ["unhappy"]
assert_equal 'F', @tu.puke('SomeClass', 'method_name', exception)
assert_equal 1, @tu.failures
assert_match(/^Failure.*Oh no!/m, @tu.report.first)
end
def test_class_puke_with_failure_and_flunk_in_backtrace
exception = begin
Mini::Test::TestCase.new('fake tc').flunk
rescue Mini::Assertion => failure
failure
end
assert_equal 'F', @tu.puke('SomeClass', 'method_name', exception)
refute @tu.report.any?{|line| line =~ /in .flunk/}
end
def test_class_puke_with_non_failure_exception
exception = Exception.new("Oh no again!")
assert_equal 'E', @tu.puke('SomeClass', 'method_name', exception)
assert_equal 1, @tu.errors
assert_match(/^Exception.*Oh no again!/m, @tu.report.first)
end
def test_class_run_test_suites
tc = Class.new(Mini::Test::TestCase) do
def test_something
assert true
end
end
Object.const_set(:ATestCase, tc)
assert_equal [1, 1], @tu.run_test_suites
end
def test_run_failing # TODO: add error test
tc = Class.new(Mini::Test::TestCase) do
def test_something
assert true
end
def test_failure
assert false
end
end
Object.const_set(:ATestCase, tc)
@tu.run
expected = "Loaded suite blah
Started
F.
Finished in 0.00
1) Failure:
test_failure(ATestCase) [FILE:LINE]:
Failed assertion, no message given.
2 tests, 2 assertions, 1 failures, 0 errors, 0 skips
"
util_assert_report expected
end
def test_run_error
tc = Class.new(Mini::Test::TestCase) do
def test_something
assert true
end
def test_error
raise "unhandled exception"
end
end
Object.const_set(:ATestCase, tc)
@tu.run
expected = "Loaded suite blah
Started
E.
Finished in 0.00
1) Error:
test_error(ATestCase):
RuntimeError: unhandled exception
FILE:LINE:in `test_error'
2 tests, 1 assertions, 0 failures, 1 errors, 0 skips
"
util_assert_report expected
end
def test_run_error_teardown
tc = Class.new(Mini::Test::TestCase) do
def test_something
assert true
end
def teardown
raise "unhandled exception"
end
end
Object.const_set(:ATestCase, tc)
@tu.run
expected = "Loaded suite blah
Started
E
Finished in 0.00
1) Error:
test_something(ATestCase):
RuntimeError: unhandled exception
FILE:LINE:in `teardown'
1 tests, 1 assertions, 0 failures, 1 errors, 0 skips
"
util_assert_report expected
end
def test_run_skip
tc = Class.new(Mini::Test::TestCase) do
def test_something
assert true
end
def test_skip
skip "not yet"
end
end
Object.const_set(:ATestCase, tc)
@tu.run
expected = "Loaded suite blah
Started
S.
Finished in 0.00
1) Skipped:
test_skip(ATestCase) [FILE:LINE]:
not yet
2 tests, 1 assertions, 0 failures, 0 errors, 1 skips
"
util_assert_report expected
end
def util_assert_report expected = nil
expected ||= "Loaded suite blah
Started
.
Finished in 0.00
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
"
output = @output.string.sub(/Finished in .*/, "Finished in 0.00")
output.sub!(/Loaded suite .*/, 'Loaded suite blah')
output.sub!(/[\w\/\.]+:\d+/, 'FILE:LINE')
assert_equal(expected, output)
end
def test_run_failing_filtered
tc = Class.new(Mini::Test::TestCase) do
def test_something
assert true
end
def test_failure
assert false
end
end
Object.const_set(:ATestCase, tc)
@tu.run(%w(-n /something/))
util_assert_report
end
def test_run_passing
tc = Class.new(Mini::Test::TestCase) do
def test_something
assert true
end
end
Object.const_set(:ATestCase, tc)
@tu.run
util_assert_report
end
end
class TestMiniTestTestCase < Mini::Test::TestCase
def setup
Mini::Test::TestCase.reset
@tc = Mini::Test::TestCase.new 'fake tc'
@zomg = "zomg ponies!"
@assertion_count = 1
end
def teardown
assert_equal(@assertion_count, @tc._assertions,
"expected #{@assertion_count} assertions to be fired during the test, not #{@tc._assertions}") if @tc._assertions
Object.send :remove_const, :ATestCase if defined? ATestCase
end
def test_class_inherited
@assertion_count = 0
Object.const_set(:ATestCase, Class.new(Mini::Test::TestCase))
assert_equal [ATestCase], Mini::Test::TestCase.test_suites
end
def test_class_test_suites
@assertion_count = 0
Object.const_set(:ATestCase, Class.new(Mini::Test::TestCase))
assert_equal 1, Mini::Test::TestCase.test_suites.size
assert_equal [ATestCase], Mini::Test::TestCase.test_suites
end
def test_class_asserts_match_refutes
@assertion_count = 0
methods = Mini::Assertions.public_instance_methods
methods.map! { |m| m.to_s } if Symbol === methods.first
ignores = %w(assert_block assert_no_match assert_not_equal assert_not_nil
assert_not_same assert_nothing_thrown assert_raise
assert_nothing_raised assert_raises assert_throws assert_send)
asserts = methods.grep(/^assert/).sort - ignores
refutes = methods.grep(/^refute/).sort - ignores
assert_empty refutes.map { |n| n.sub(/^refute/, 'assert') } - asserts
assert_empty asserts.map { |n| n.sub(/^assert/, 'refute') } - refutes
end
def test_assert
@assertion_count = 2
@tc.assert_equal true, @tc.assert(true), "returns true on success"
end
def test_assert__triggered
util_assert_triggered "Failed assertion, no message given." do
@tc.assert false
end
end
def test_assert__triggered_message
util_assert_triggered @zomg do
@tc.assert false, @zomg
end
end
def test_assert_block
@tc.assert_block do
true
end
end
def test_assert_block_triggered
util_assert_triggered 'Expected block to return true value.' do
@tc.assert_block do
false
end
end
end
def test_assert_empty
@assertion_count = 2
@tc.assert_empty []
end
def test_assert_empty_triggered
@assertion_count = 2
util_assert_triggered "Expected [1] to be empty." do
@tc.assert_empty [1]
end
end
def test_assert_equal
@tc.assert_equal 1, 1
end
def test_assert_equal_different
util_assert_triggered "Expected 1, not 2." do
@tc.assert_equal 1, 2
end
end
def test_assert_in_delta
@tc.assert_in_delta 0.0, 1.0 / 1000, 0.1
end
def test_assert_in_delta_triggered
util_assert_triggered 'Expected 0.0 - 0.001 (0.001) to be < 1.0e-06.' do
@tc.assert_in_delta 0.0, 1.0 / 1000, 0.000001
end
end
def test_assert_in_epsilon
@assertion_count = 8
@tc.assert_in_epsilon 10000, 9991
@tc.assert_in_epsilon 9991, 10000
@tc.assert_in_epsilon 1.0, 1.001
@tc.assert_in_epsilon 1.001, 1.0
@tc.assert_in_epsilon 10000, 9999.1, 0.0001
@tc.assert_in_epsilon 9999.1, 10000, 0.0001
@tc.assert_in_epsilon 1.0, 1.0001, 0.0001
@tc.assert_in_epsilon 1.0001, 1.0, 0.0001
end
def test_assert_in_epsilon_triggered
util_assert_triggered 'Expected 10000 - 9990 (10) to be < 9.99.' do
@tc.assert_in_epsilon 10000, 9990
end
end
def test_assert_includes
@assertion_count = 2
@tc.assert_includes [true], true
end
def test_assert_includes_triggered
@assertion_count = 4
e = @tc.assert_raises Mini::Assertion do
@tc.assert_includes [true], false
end
expected = "Expected [true] to include false."
assert_equal expected, e.message
end
def test_assert_instance_of
@tc.assert_instance_of String, "blah"
end
def test_assert_instance_of_triggered
util_assert_triggered 'Expected "blah" to be an instance of Array, not String.' do
@tc.assert_instance_of Array, "blah"
end
end
def test_assert_kind_of
@tc.assert_kind_of String, "blah"
end
def test_assert_kind_of_triggered
util_assert_triggered 'Expected "blah" to be a kind of Array, not String.' do
@tc.assert_kind_of Array, "blah"
end
end
def test_assert_match
@assertion_count = 2
@tc.assert_match "blah blah blah", /\w+/
end
def test_assert_match_triggered
@assertion_count = 2
util_assert_triggered 'Expected /\d+/ to match "blah blah blah".' do
@tc.assert_match "blah blah blah", /\d+/
end
end
def test_assert_nil
@tc.assert_nil nil
end
def test_assert_nil_triggered
util_assert_triggered 'Expected 42 to be nil.' do
@tc.assert_nil 42
end
end
def test_assert_operator
@tc.assert_operator 2, :>, 1
end
def test_assert_operator_triggered
util_assert_triggered "Expected 2 to be < 1." do
@tc.assert_operator 2, :<, 1
end
end
def test_assert_raises
@assertion_count = 2
@tc.assert_raises RuntimeError do
raise "blah"
end
end
def test_assert_raises_triggered_different
@assertion_count = 2
e = assert_raises Mini::Assertion do
@tc.assert_raises RuntimeError do
raise SyntaxError, "icky"
end
end
expected = "<[RuntimeError]> exception expected, not
Class: <SyntaxError>
Message: <\"icky\">
---Backtrace---
FILE:LINE:in `test_assert_raises_triggered_different'
---------------.
Expected [RuntimeError] to include SyntaxError."
assert_equal expected, expected.gsub(/[\w\/\.]+:\d+/, 'FILE:LINE')
end
def test_assert_raises_triggered_none
e = assert_raises Mini::Assertion do
@tc.assert_raises Mini::Assertion do
# do nothing
end
end
expected = "Mini::Assertion expected but nothing was raised."
assert_equal expected, e.message
end
def test_assert_respond_to
@tc.assert_respond_to "blah", :empty?
end
def test_assert_respond_to_triggered
util_assert_triggered 'Expected "blah" (String) to respond to #rawr!.' do
@tc.assert_respond_to "blah", :rawr!
end
end
def test_assert_same
@assertion_count = 3
o = "blah"
@tc.assert_same 1, 1
@tc.assert_same :blah, :blah
@tc.assert_same o, o
end
def test_assert_same_triggered
@assertion_count = 2
util_assert_triggered 'Expected 2 (0xXXX) to be the same as 1 (0xXXX).' do
@tc.assert_same 1, 2
end
s1 = "blah"
s2 = "blah"
util_assert_triggered 'Expected "blah" (0xXXX) to be the same as "blah" (0xXXX).' do
@tc.assert_same s1, s2
end
end
def test_assert_send
@tc.assert_send [1, :<, 2]
end
def test_assert_send_bad
util_assert_triggered "Expected 1.>(*[2]) to return true." do
@tc.assert_send [1, :>, 2]
end
end
def test_assert_throws
@tc.assert_throws(:blah) do
throw :blah
end
end
def test_assert_throws_different
util_assert_triggered 'Expected :blah to have been thrown, not :not_blah.' do
@tc.assert_throws(:blah) do
throw :not_blah
end
end
end
def test_assert_throws_unthrown
util_assert_triggered 'Expected :blah to have been thrown.' do
@tc.assert_throws(:blah) do
# do nothing
end
end
end
def test_capture_io
@assertion_count = 0
out, err = capture_io do
puts 'hi'
warn 'bye!'
end
assert_equal "hi\n", out
assert_equal "bye!\n", err
end
def test_flunk
util_assert_triggered 'Epic Fail!' do
@tc.flunk
end
end
def test_flunk_message
util_assert_triggered @zomg do
@tc.flunk @zomg
end
end
def test_message
@assertion_count = 0
assert_equal "blah2.", @tc.message { "blah2" }.call
assert_equal "blah2.", @tc.message("") { "blah2" }.call
assert_equal "blah1.\nblah2.", @tc.message("blah1") { "blah2" }.call
end
def test_pass
@tc.pass
end
def test_test_methods_sorted
@assertion_count = 0
sample_test_case = Class.new(Mini::Test::TestCase)
class << sample_test_case
def test_order; :sorted end
end
sample_test_case.instance_eval do
define_method :test_test3 do assert "does not matter" end
define_method :test_test2 do assert "does not matter" end
define_method :test_test1 do assert "does not matter" end
end
expected = %w(test_test1 test_test2 test_test3)
assert_equal expected, sample_test_case.test_methods
end
def test_test_methods_random
@assertion_count = 0
sample_test_case = Class.new(Mini::Test::TestCase)
class << sample_test_case
def test_order; :random end
end
sample_test_case.instance_eval do
define_method :test_test1 do assert "does not matter" end
define_method :test_test2 do assert "does not matter" end
define_method :test_test3 do assert "does not matter" end
end
srand 42
expected = %w(test_test1 test_test2 test_test3)
max = expected.size
expected = expected.sort_by { rand(max) }
srand 42
result = sample_test_case.test_methods
assert_equal expected, result
end
def test_refute
@assertion_count = 2
@tc.assert_equal false, @tc.refute(false), "returns false on success"
end
def test_refute_empty
@assertion_count = 2
@tc.refute_empty [1]
end
def test_refute_empty_triggered
@assertion_count = 2
util_assert_triggered "Expected [] to not be empty." do
@tc.refute_empty []
end
end
def test_refute_equal
@tc.refute_equal "blah", "yay"
end
def test_refute_equal_triggered
util_assert_triggered 'Expected "blah" to not be equal to "blah".' do
@tc.refute_equal "blah", "blah"
end
end
def test_refute_in_delta
@tc.refute_in_delta 0.0, 1.0 / 1000, 0.000001
end
def test_refute_in_delta_triggered
util_assert_triggered 'Expected 0.0 - 0.001 (0.001) to not be < 0.1.' do
@tc.refute_in_delta 0.0, 1.0 / 1000, 0.1
end
end
def test_refute_in_epsilon
@tc.refute_in_epsilon 10000, 9990
end
def test_refute_in_epsilon_triggered
util_assert_triggered 'Expected 10000 - 9991 (9) to not be < 10.0.' do
@tc.refute_in_epsilon 10000, 9991
fail
end
end
def test_refute_includes
@assertion_count = 2
@tc.refute_includes [true], false
end
def test_refute_includes_triggered
@assertion_count = 4
e = @tc.assert_raises Mini::Assertion do
@tc.refute_includes [true], true
end
expected = "Expected [true] to not include true."
assert_equal expected, e.message
end
def test_refute_instance_of
@tc.refute_instance_of Array, "blah"
end
def test_refute_instance_of_triggered
util_assert_triggered 'Expected "blah" to not be an instance of String.' do
@tc.refute_instance_of String, "blah"
end
end
def test_refute_kind_of
@tc.refute_kind_of Array, "blah"
end
def test_refute_kind_of_triggered
util_assert_triggered 'Expected "blah" to not be a kind of String.' do
@tc.refute_kind_of String, "blah"
end
end
def test_refute_match
@tc.refute_match "blah blah blah", /\d+/
end
def test_refute_match_triggered
util_assert_triggered 'Expected /\w+/ to not match "blah blah blah".' do
@tc.refute_match "blah blah blah", /\w+/
end
end
def test_refute_nil
@tc.refute_nil 42
end
def test_refute_nil_triggered
util_assert_triggered 'Expected nil to not be nil.' do
@tc.refute_nil nil
end
end
def test_refute_operator
@tc.refute_operator 2, :<, 1
end
def test_refute_operator_triggered
util_assert_triggered "Expected 2 to not be > 1." do
@tc.refute_operator 2, :>, 1
end
end
def test_refute_respond_to
@tc.refute_respond_to "blah", :rawr!
end
def test_refute_respond_to_triggered
util_assert_triggered 'Expected "blah" to not respond to empty?.' do
@tc.refute_respond_to "blah", :empty?
end
end
def test_refute_same
@tc.refute_same 1, 2
end
# TODO: "with id <id>" crap from assertions.rb
def test_refute_same_triggered
util_assert_triggered 'Expected 1 to not be the same as 1.' do
@tc.refute_same 1, 1
end
end
def test_skip
@assertion_count = 0
util_assert_triggered "haha!", Mini::Skip do
@tc.skip "haha!"
end
end
def util_assert_triggered expected, klass = Mini::Assertion
e = assert_raises(klass) do
yield
end
msg = e.message.sub(/(---Backtrace---).*/m, '\1')
msg.gsub!(/\(0x[0-9a-f]+\)/, '(0xXXX)')
assert_equal expected, msg
end
if ENV['DEPRECATED'] then
require 'test/unit/assertions'
def test_assert_nothing_raised
@tc.assert_nothing_raised do
# do nothing
end
end
def test_assert_nothing_raised_triggered
expected = 'Exception raised:
Class: <RuntimeError>
Message: <"oops!">
---Backtrace---'
util_assert_triggered expected do
@tc.assert_nothing_raised do
raise "oops!"
end
end
end
end
end