Imported minitest 2.12.1 (r7323)

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35541 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ryan 2012-05-04 21:46:01 +00:00
parent 95d4b3ba49
commit 6af843b9cb
13 changed files with 1113 additions and 294 deletions

View File

@ -1,3 +1,8 @@
Sat May 5 06:43:10 2012 Ryan Davis <ryand-ruby@zenspider.com>
* lib/minitest/*: Imported minitest 2.12.1 (r7323)
* test/minitest/*: ditto
Sat May 5 01:47:33 2012 NARUSE, Yui <naruse@ruby-lang.org> Sat May 5 01:47:33 2012 NARUSE, Yui <naruse@ruby-lang.org>
* test/zlib/test_zlib.rb (test_inflate): add a test for Zlib.inflate. * test/zlib/test_zlib.rb (test_inflate): add a test for Zlib.inflate.
@ -5261,7 +5266,7 @@ Fri Nov 18 13:03:38 2011 NAKAMURA Usaku <usa@ruby-lang.org>
* win32/win32.c (fcntl): on F_DUPFD, determine the inheritance of the * win32/win32.c (fcntl): on F_DUPFD, determine the inheritance of the
new handle by O_NOINHERIT flag of original fd. new handle by O_NOINHERIT flag of original fd.
Fri Nov 18 08:00:41 2011 Ryan Davis <ryan@lust.zenspider.com> Fri Nov 18 08:00:41 2011 Ryan Davis <ryand-ruby@zenspider.com>
* lib/minitest/*: Imported minitest 2.8.1 (r6750) * lib/minitest/*: Imported minitest 2.8.1 (r6750)
* test/minitest/*: ditto * test/minitest/*: ditto

View File

@ -14,7 +14,7 @@ TDD, BDD, mocking, and benchmarking.
paired up and we cracked open the code for a few test paired up and we cracked open the code for a few test
frameworks... frameworks...
I MUST say that mintiest is *very* readable / understandable I MUST say that minitest is *very* readable / understandable
compared to the 'other two' options we looked at. Nicely done and compared to the 'other two' options we looked at. Nicely done and
thank you for helping us keep our mental sanity." thank you for helping us keep our mental sanity."
@ -44,7 +44,7 @@ implementors that need a minimal set of methods to bootstrap a working
test suite. For example, there is no magic involved for test-case test suite. For example, there is no magic involved for test-case
discovery. discovery.
"Again, I cant praise enough the idea of a testing/specing "Again, I can't praise enough the idea of a testing/specing
framework that I can actually read in full in one sitting!" framework that I can actually read in full in one sitting!"
-- Piotr Szotkowski -- Piotr Szotkowski
@ -117,6 +117,10 @@ Given that you'd like to test the following class:
end end
end end
For matchers support check out:
https://github.com/zenspider/minitest-matchers
=== Benchmarks === Benchmarks
Add benchmarks to your regular unit tests. If the unit tests fail, the Add benchmarks to your regular unit tests. If the unit tests fail, the
@ -167,7 +171,7 @@ Output is tab-delimited to make it easy to paste into a spreadsheet.
def ask(question) def ask(question)
method = question.tr(" ","_") + "?" method = question.tr(" ","_") + "?"
@meme.send(method) @meme.__send__(method)
end end
end end
@ -242,6 +246,46 @@ fixture loading:
MiniTest::Unit.runner = MiniTestWithTransactions::Unit.new MiniTest::Unit.runner = MiniTestWithTransactions::Unit.new
== Known Extensions:
minitest-capistrano :: Assertions and expectations for testing Capistrano recipes
minitest-capybara :: Capybara matchers support for minitest unit and spec
minitest-chef-handler :: Run Minitest suites as Chef report handlers
minitest-ci :: CI reporter plugin for MiniTest.
minitest-colorize :: Colorize MiniTest output and show failing tests instantly.
minitest-context :: Defines contexts for code reuse in MiniTest
specs that share common expectations.
minitest-debugger :: Wraps assert so failed assertions drop into
the ruby debugger.
minitest-display :: Patches MiniTest to allow for an easily configurable output.
minitest-emoji :: Print out emoji for your test passes, fails, and skips.
minitest-excludes :: Clean API for excluding certain tests you
don't want to run under certain conditions.
minitest-firemock :: Makes your MiniTest mocks more resilient.
minitest-growl :: Test notifier for minitest via growl.
minitest-instrument :: Instrument ActiveSupport::Notifications when
test method is executed
minitest-instrument-db :: Store information about speed of test
execution provided by minitest-instrument in database
minitest-libnotify :: Test notifier for minitest via libnotify.
minitest-macruby :: Provides extensions to minitest for macruby UI testing.
minitest-matchers :: Adds support for RSpec-style matchers to minitest.
minitest-metadata :: Annotate tests with metadata (key-value).
minitest-mongoid :: Mongoid assertion matchers for MiniTest
minitest-must_not :: Provides must_not as an alias for wont in MiniTest
minitest-predicates :: Adds support for .predicate? methods
minitest-pry :: A minitest plugin to drop into pry on assertion failure.
minitest-rails :: MiniTest integration for Rails 3.1.
minitest-reporters :: Create customizable MiniTest output formats
minitest-rg :: redgreen minitest
minitest-spec-magic :: Minitest::Spec extensions for Rails and beyond
minitest-tags :: add tags for minitest
minitest-wscolor :: Yet another test colorizer.
minitest_owrapper :: Get tests results as a TestResult object.
minitest_should :: Shoulda style syntax for minitest test::unit.
minitest_tu_shim :: minitest_tu_shim bridges between test/unit and minitest.
mongoid-minitest :: MiniTest matchers for Mongoid.
== REQUIREMENTS: == REQUIREMENTS:
* Ruby 1.8, maybe even 1.6 or lower. No magic is involved. * Ruby 1.8, maybe even 1.6 or lower. No magic is involved.

View File

@ -1,3 +1,4 @@
# encoding: utf-8
###################################################################### ######################################################################
# This file is imported from the minitest project. # This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted! # DO NOT make modifications in this repo. They _will_ be reverted!

View File

@ -1,3 +1,4 @@
# encoding: utf-8
###################################################################### ######################################################################
# This file is imported from the minitest project. # This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted! # DO NOT make modifications in this repo. They _will_ be reverted!
@ -7,9 +8,7 @@
require 'minitest/unit' require 'minitest/unit'
require 'minitest/spec' require 'minitest/spec'
class MiniTest::Unit class MiniTest::Unit # :nodoc:
attr_accessor :runner
def run_benchmarks # :nodoc: def run_benchmarks # :nodoc:
_run_anything :benchmark _run_anything :benchmark
end end
@ -318,6 +317,15 @@ class MiniTest::Spec
define_method "bench_#{name.gsub(/\W+/, '_')}", &block define_method "bench_#{name.gsub(/\W+/, '_')}", &block
end end
##
# Specifies the ranges used for benchmarking for that class.
#
# bench_range do
# bench_exp(2, 16, 2)
# end
#
# See Unit::TestCase.bench_range for more details.
def self.bench_range &block def self.bench_range &block
return super unless block return super unless block

View File

@ -1,10 +1,12 @@
# encoding: utf-8
###################################################################### ######################################################################
# This file is imported from the minitest project. # This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted! # DO NOT make modifications in this repo. They _will_ be reverted!
# File a patch instead and assign it to Ryan Davis. # File a patch instead and assign it to Ryan Davis.
###################################################################### ######################################################################
class MockExpectationError < StandardError; end class MockExpectationError < StandardError # :nodoc:
end # omg... worst bug ever. rdoc doesn't allow 1-liners
## ##
# A simple and clean mock object framework. # A simple and clean mock object framework.
@ -24,8 +26,8 @@ module MiniTest
end end
def initialize # :nodoc: def initialize # :nodoc:
@expected_calls = {} @expected_calls = Hash.new { |calls, name| calls[name] = [] }
@actual_calls = Hash.new {|h,k| h[k] = [] } @actual_calls = Hash.new { |calls, name| calls[name] = [] }
end end
## ##
@ -50,44 +52,70 @@ module MiniTest
# @mock.verify # => raises MockExpectationError # @mock.verify # => raises MockExpectationError
def expect(name, retval, args=[]) def expect(name, retval, args=[])
@expected_calls[name] = { :retval => retval, :args => args } raise ArgumentError, "args must be an array" unless Array === args
@expected_calls[name] << { :retval => retval, :args => args }
self self
end end
def call name, data
case data
when Hash then
"#{name}(#{data[:args].inspect[1..-2]}) => #{data[:retval].inspect}"
else
data.map { |d| call name, d }.join ", "
end
end
## ##
# Verify that all methods were called as expected. Raises # Verify that all methods were called as expected. Raises
# +MockExpectationError+ if the mock object was not called as # +MockExpectationError+ if the mock object was not called as
# expected. # expected.
def verify def verify
@expected_calls.each_key do |name| @expected_calls.each do |name, calls|
expected = @expected_calls[name] calls.each do |expected|
msg1 = "expected #{name}, #{expected.inspect}" msg1 = "expected #{call name, expected}"
msg2 = "#{msg1}, got #{@actual_calls[name].inspect}" msg2 = "#{msg1}, got [#{call name, @actual_calls[name]}]"
raise MockExpectationError, msg2 if raise MockExpectationError, msg2 if
@actual_calls.has_key? name and @actual_calls.has_key? name and
not @actual_calls[name].include?(expected) not @actual_calls[name].include?(expected)
raise MockExpectationError, msg1 unless raise MockExpectationError, msg1 unless
@actual_calls.has_key? name and @actual_calls[name].include?(expected) @actual_calls.has_key? name and @actual_calls[name].include?(expected)
end
end end
true true
end end
def method_missing(sym, *args) # :nodoc: def method_missing(sym, *args) # :nodoc:
expected = @expected_calls[sym] unless @expected_calls.has_key?(sym) then
unless expected then
raise NoMethodError, "unmocked method %p, expected one of %p" % raise NoMethodError, "unmocked method %p, expected one of %p" %
[sym, @expected_calls.keys.sort_by(&:to_s)] [sym, @expected_calls.keys.sort_by(&:to_s)]
end end
expected_args, retval = expected[:args], expected[:retval] index = @actual_calls[sym].length
expected_call = @expected_calls[sym][index]
unless expected_args.size == args.size unless expected_call then
raise MockExpectationError, "No more expects available for %p: %p" %
[sym, args]
end
expected_args, retval = expected_call[:args], expected_call[:retval]
if expected_args.size != args.size then
raise ArgumentError, "mocked method %p expects %d arguments, got %d" % raise ArgumentError, "mocked method %p expects %d arguments, got %d" %
[sym, expected[:args].size, args.size] [sym, expected_args.size, args.size]
end
fully_matched = expected_args.zip(args).all? { |mod, a|
mod === a or mod == a
}
unless fully_matched then
raise MockExpectationError, "mocked method %p called with unexpected arguments %p" %
[sym, args]
end end
@actual_calls[sym] << { @actual_calls[sym] << {

View File

@ -1,3 +1,4 @@
# encoding: utf-8
###################################################################### ######################################################################
# This file is imported from the minitest project. # This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted! # DO NOT make modifications in this repo. They _will_ be reverted!
@ -10,12 +11,17 @@ require "minitest/unit"
# Show your testing pride! # Show your testing pride!
class PrideIO class PrideIO
# Start an escape sequence
ESC = "\e[" ESC = "\e["
# End the escape sequence
NND = "#{ESC}0m" NND = "#{ESC}0m"
# The IO we're going to pipe through.
attr_reader :io attr_reader :io
def initialize io def initialize io # :nodoc:
@io = io @io = io
# stolen from /System/Library/Perl/5.10.0/Term/ANSIColor.pm # stolen from /System/Library/Perl/5.10.0/Term/ANSIColor.pm
# also reference http://en.wikipedia.org/wiki/ANSI_escape_code # also reference http://en.wikipedia.org/wiki/ANSI_escape_code
@ -25,6 +31,9 @@ class PrideIO
# io.sync = true # io.sync = true
end end
##
# Wrap print to colorize the output.
def print o def print o
case o case o
when "." then when "." then
@ -36,7 +45,7 @@ class PrideIO
end end
end end
def puts(*o) def puts(*o) # :nodoc:
o.map! { |s| o.map! { |s|
s.sub(/Finished tests/) { s.sub(/Finished tests/) {
@index = 0 @index = 0
@ -49,6 +58,9 @@ class PrideIO
super super
end end
##
# Color a string.
def pride string def pride string
string = "*" if string == "." string = "*" if string == "."
c = @colors[@index % @size] c = @colors[@index % @size]
@ -56,15 +68,20 @@ class PrideIO
"#{ESC}#{c}m#{string}#{NND}" "#{ESC}#{c}m#{string}#{NND}"
end end
def method_missing msg, *args def method_missing msg, *args # :nodoc:
io.send(msg, *args) io.send(msg, *args)
end end
end end
class PrideLOL < PrideIO # inspired by lolcat, but massively cleaned up ##
PI_3 = Math::PI / 3 # If you thought the PrideIO was colorful...
#
# (Inspired by lolcat, but with clean math)
def initialize io class PrideLOL < PrideIO
PI_3 = Math::PI / 3 # :nodoc:
def initialize io # :nodoc:
# walk red, green, and blue around a circle separated by equal thirds. # walk red, green, and blue around a circle separated by equal thirds.
# #
# To visualize, type this into wolfram-alpha: # To visualize, type this into wolfram-alpha:
@ -88,6 +105,9 @@ class PrideLOL < PrideIO # inspired by lolcat, but massively cleaned up
super super
end end
##
# Make the string even more colorful. Damnit.
def pride string def pride string
c = @colors[@index % @size] c = @colors[@index % @size]
@index += 1 @index += 1

View File

@ -1,3 +1,4 @@
# encoding: utf-8
###################################################################### ######################################################################
# This file is imported from the minitest project. # This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted! # DO NOT make modifications in this repo. They _will_ be reverted!
@ -13,11 +14,14 @@ class Module # :nodoc:
# warn "%-22p -> %p %p" % [meth, new_name, dont_flip] # warn "%-22p -> %p %p" % [meth, new_name, dont_flip]
self.class_eval <<-EOM self.class_eval <<-EOM
def #{new_name} *args def #{new_name} *args
return MiniTest::Spec.current.#{meth}(*args, &self) if case
Proc === self when Proc === self then
return MiniTest::Spec.current.#{meth}(args.first, self) if MiniTest::Spec.current.#{meth}(*args, &self)
args.size == 1 unless #{!!dont_flip} when #{!!dont_flip} then
return MiniTest::Spec.current.#{meth}(self, *args) MiniTest::Spec.current.#{meth}(self, *args)
else
MiniTest::Spec.current.#{meth}(args.first, self, *args[1..-1])
end
end end
EOM EOM
end end
@ -177,6 +181,12 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
add_teardown_hook {|tc| tc.instance_eval(&block) } add_teardown_hook {|tc| tc.instance_eval(&block) }
end end
NAME_RE = if RUBY_VERSION >= "1.9"
Regexp.new("[^[[:word:]]]+")
else
/\W+/u
end
## ##
# Define an expectation with name +desc+. Name gets morphed to a # Define an expectation with name +desc+. Name gets morphed to a
# proper test method name. For some freakish reason, people who # proper test method name. For some freakish reason, people who
@ -194,15 +204,22 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
@specs ||= 0 @specs ||= 0
@specs += 1 @specs += 1
name = "test_%04d_%s" % [ @specs, desc.gsub(/\W+/, '_').downcase ] name = "test_%04d_%s" % [ @specs, desc.gsub(NAME_RE, '_').downcase ]
define_method name, &block define_method name, &block
self.children.each do |mod| self.children.each do |mod|
mod.send :undef_method, name if mod.public_method_defined? name mod.send :undef_method, name if mod.public_method_defined? name
end end
name
end end
##
# Essentially, define an accessor for +name+ with +block+.
#
# Why use let instead of def? I honestly don't know.
def self.let name, &block def self.let name, &block
define_method name do define_method name do
@_memoized ||= {} @_memoized ||= {}
@ -210,6 +227,10 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
end end
end end
##
# Another lazy man's accessor generator. Made even more lazy by
# setting the name for you to +subject+.
def self.subject &block def self.subject &block
let :subject, &block let :subject, &block
end end
@ -232,6 +253,14 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
end end
# :stopdoc: # :stopdoc:
def after_setup
run_setup_hooks
end
def before_teardown
run_teardown_hooks
end
class << self class << self
attr_reader :desc attr_reader :desc
alias :specify :it alias :specify :it
@ -240,6 +269,9 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
# :startdoc: # :startdoc:
end end
##
# It's where you hide your "assertions".
module MiniTest::Expectations module MiniTest::Expectations
## ##
# See MiniTest::Assertions#assert_empty. # See MiniTest::Assertions#assert_empty.
@ -248,7 +280,7 @@ module MiniTest::Expectations
# #
# :method: must_be_empty # :method: must_be_empty
infect_an_assertion :assert_empty, :must_be_empty infect_an_assertion :assert_empty, :must_be_empty, :unary
## ##
# See MiniTest::Assertions#assert_equal # See MiniTest::Assertions#assert_equal
@ -322,7 +354,7 @@ module MiniTest::Expectations
# #
# :method: must_be_nil # :method: must_be_nil
infect_an_assertion :assert_nil, :must_be_nil infect_an_assertion :assert_nil, :must_be_nil, :unary
## ##
# See MiniTest::Assertions#assert_operator # See MiniTest::Assertions#assert_operator
@ -408,7 +440,7 @@ module MiniTest::Expectations
# #
# :method: wont_be_empty # :method: wont_be_empty
infect_an_assertion :refute_empty, :wont_be_empty infect_an_assertion :refute_empty, :wont_be_empty, :unary
## ##
# See MiniTest::Assertions#refute_equal # See MiniTest::Assertions#refute_equal
@ -483,7 +515,7 @@ module MiniTest::Expectations
# #
# :method: wont_be_nil # :method: wont_be_nil
infect_an_assertion :refute_nil, :wont_be_nil infect_an_assertion :refute_nil, :wont_be_nil, :unary
## ##
# See MiniTest::Assertions#refute_operator # See MiniTest::Assertions#refute_operator
@ -517,6 +549,6 @@ module MiniTest::Expectations
infect_an_assertion :refute_same, :wont_be_same_as infect_an_assertion :refute_same, :wont_be_same_as
end end
class Object class Object # :nodoc:
include MiniTest::Expectations include MiniTest::Expectations
end end

View File

@ -1,3 +1,4 @@
# encoding: utf-8
###################################################################### ######################################################################
# This file is imported from the minitest project. # This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted! # DO NOT make modifications in this repo. They _will_ be reverted!
@ -61,8 +62,13 @@ module MiniTest
# printed if the assertion fails. # printed if the assertion fails.
module Assertions module Assertions
UNDEFINED = Object.new # :nodoc:
WINDOZE = RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ def UNDEFINED.inspect # :nodoc:
"UNDEFINED" # again with the rdoc bugs... :(
end
WINDOZE = RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ # :nodoc:
## ##
# Returns the diff command to use in #diff. Tries to intelligently # Returns the diff command to use in #diff. Tries to intelligently
@ -187,6 +193,7 @@ module MiniTest
# Fails unless the block returns a true value. # Fails unless the block returns a true value.
def assert_block msg = nil def assert_block msg = nil
warn "NOTE: MiniTest::Unit::TestCase#assert_block is deprecated, use assert. It will be removed on or after 2012-06-01."
msg = message(msg) { "Expected block to return true value" } msg = message(msg) { "Expected block to return true value" }
assert yield, msg assert yield, msg
end end
@ -225,7 +232,7 @@ module MiniTest
def assert_in_delta exp, act, delta = 0.001, msg = nil def assert_in_delta exp, act, delta = 0.001, msg = nil
n = (exp - act).abs n = (exp - act).abs
msg = message(msg) { "Expected #{exp} - #{act} (#{n}) to be < #{delta}" } msg = message(msg) { "Expected |#{exp} - #{act}| (#{n}) to be < #{delta}"}
assert delta >= n, msg assert delta >= n, msg
end end
@ -234,7 +241,7 @@ module MiniTest
# error less than +epsilon+. # error less than +epsilon+.
def assert_in_epsilon a, b, epsilon = 0.001, msg = nil def assert_in_epsilon a, b, epsilon = 0.001, msg = nil
assert_in_delta a, b, [a, b].min * epsilon, msg assert_in_delta a, b, [a.abs, b.abs].min * epsilon, msg
end end
## ##
@ -270,13 +277,13 @@ module MiniTest
end end
## ##
# Fails unless +exp+ is <tt>=~</tt> +act+. # Fails unless +matcher+ <tt>=~</tt> +obj+.
def assert_match exp, act, msg = nil def assert_match matcher, obj, msg = nil
msg = message(msg) { "Expected #{mu_pp(exp)} to match #{mu_pp(act)}" } msg = message(msg) { "Expected #{mu_pp matcher} to match #{mu_pp obj}" }
assert_respond_to act, :"=~" assert_respond_to matcher, :"=~"
exp = Regexp.new Regexp.escape exp if String === exp and String === act matcher = Regexp.new Regexp.escape matcher if String === matcher
assert exp =~ act, msg assert matcher =~ obj, msg
end end
## ##
@ -287,9 +294,6 @@ module MiniTest
assert obj.nil?, msg assert obj.nil?, msg
end end
UNDEFINED = Object.new
def UNDEFINED.inspect; "UNDEFINED"; end
## ##
# For testing with binary operators. # For testing with binary operators.
# #
@ -313,8 +317,8 @@ module MiniTest
yield yield
end end
x = assert_equal stdout, out, "In stdout" if stdout
y = assert_equal stderr, err, "In stderr" if stderr y = assert_equal stderr, err, "In stderr" if stderr
x = assert_equal stdout, out, "In stdout" if stdout
(!stdout || x) && (!stderr || y) (!stdout || x) && (!stderr || y)
end end
@ -334,10 +338,11 @@ module MiniTest
end end
## ##
# Fails unless the block raises one of +exp+ # Fails unless the block raises one of +exp+. Returns the
# exception matched so you can check the message, attributes, etc.
def assert_raises *exp def assert_raises *exp
msg = "#{exp.pop}\n" if String === exp.last msg = "#{exp.pop}.\n" if String === exp.last
should_raise = false should_raise = false
begin begin
@ -355,7 +360,7 @@ module MiniTest
details = "#{msg}#{mu_pp(exp)} exception expected, not" details = "#{msg}#{mu_pp(exp)} exception expected, not"
assert(exp.any? { |ex| assert(exp.any? { |ex|
ex.instance_of?(Module) ? e.kind_of?(ex) : ex == e.class ex.instance_of?(Module) ? e.kind_of?(ex) : ex == e.class
}, proc{exception_details(e, details)}) }, exception_details(e, details))
return e return e
end end
@ -523,14 +528,14 @@ module MiniTest
end end
## ##
# For comparing Floats. Fails if +exp+ is within +delta+ of +act+ # For comparing Floats. Fails if +exp+ is within +delta+ of +act+.
# #
# refute_in_delta Math::PI, (22.0 / 7.0) # refute_in_delta Math::PI, (22.0 / 7.0)
def refute_in_delta exp, act, delta = 0.001, msg = nil def refute_in_delta exp, act, delta = 0.001, msg = nil
n = (exp - act).abs n = (exp - act).abs
msg = message(msg) { msg = message(msg) {
"Expected #{exp} - #{act} (#{n}) to not be < #{delta}" "Expected |#{exp} - #{act}| (#{n}) to not be < #{delta}"
} }
refute delta > n, msg refute delta > n, msg
end end
@ -544,7 +549,7 @@ module MiniTest
end end
## ##
# Fails if +collection+ includes +obj+ # Fails if +collection+ includes +obj+.
def refute_includes collection, obj, msg = nil def refute_includes collection, obj, msg = nil
msg = message(msg) { msg = message(msg) {
@ -555,7 +560,7 @@ module MiniTest
end end
## ##
# Fails if +obj+ is an instance of +cls+ # Fails if +obj+ is an instance of +cls+.
def refute_instance_of cls, obj, msg = nil def refute_instance_of cls, obj, msg = nil
msg = message(msg) { msg = message(msg) {
@ -565,7 +570,7 @@ module MiniTest
end end
## ##
# Fails if +obj+ is a kind of +cls+ # Fails if +obj+ is a kind of +cls+.
def refute_kind_of cls, obj, msg = nil # TODO: merge with instance_of 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}" } msg = message(msg) { "Expected #{mu_pp(obj)} to not be a kind of #{cls}" }
@ -573,13 +578,13 @@ module MiniTest
end end
## ##
# Fails if +exp+ <tt>=~</tt> +act+ # Fails if +matcher+ <tt>=~</tt> +obj+.
def refute_match exp, act, msg = nil def refute_match matcher, obj, msg = nil
msg = message(msg) { "Expected #{mu_pp(exp)} to not match #{mu_pp(act)}" } msg = message(msg) {"Expected #{mu_pp matcher} to not match #{mu_pp obj}"}
assert_respond_to act, :"=~" assert_respond_to matcher, :"=~"
exp = (/#{Regexp.escape exp}/) if String === exp and String === act matcher = Regexp.new Regexp.escape matcher if String === matcher
refute exp =~ act, msg refute matcher =~ obj, msg
end end
## ##
@ -646,8 +651,8 @@ module MiniTest
end end
end end
class Unit class Unit # :nodoc:
VERSION = "2.8.1" # :nodoc: VERSION = "2.12.1" # :nodoc:
attr_accessor :report, :failures, :errors, :skips # :nodoc: attr_accessor :report, :failures, :errors, :skips # :nodoc:
attr_accessor :test_count, :assertion_count # :nodoc: attr_accessor :test_count, :assertion_count # :nodoc:
@ -655,6 +660,10 @@ module MiniTest
attr_accessor :help # :nodoc: attr_accessor :help # :nodoc:
attr_accessor :verbose # :nodoc: attr_accessor :verbose # :nodoc:
attr_writer :options # :nodoc: attr_writer :options # :nodoc:
attr_accessor :last_error # :nodoc:
##
# Lazy accessor for options.
def options def options
@options ||= {} @options ||= {}
@ -662,6 +671,7 @@ module MiniTest
@@installed_at_exit ||= false @@installed_at_exit ||= false
@@out = $stdout @@out = $stdout
@@after_tests = []
## ##
# A simple hook allowing you to run a block of code after the # A simple hook allowing you to run a block of code after the
@ -669,8 +679,8 @@ module MiniTest
# #
# MiniTest::Unit.after_tests { p $debugging_info } # MiniTest::Unit.after_tests { p $debugging_info }
def self.after_tests def self.after_tests &block
at_exit { at_exit { yield } } @@after_tests << block
end end
## ##
@ -686,7 +696,10 @@ module MiniTest
# to run (at_exit stacks). # to run (at_exit stacks).
exit_code = nil exit_code = nil
at_exit { exit false if exit_code && exit_code != 0 } at_exit {
@@after_tests.reverse_each(&:call)
exit false if exit_code && exit_code != 0
}
exit_code = MiniTest::Unit.new.run ARGV exit_code = MiniTest::Unit.new.run ARGV
} unless @@installed_at_exit } unless @@installed_at_exit
@ -744,6 +757,9 @@ module MiniTest
grep(/^run_/).map { |s| s.to_s }).uniq grep(/^run_/).map { |s| s.to_s }).uniq
end end
##
# Return the IO for output.
def output def output
self.class.output self.class.output
end end
@ -756,6 +772,9 @@ module MiniTest
output.print(*a) output.print(*a)
end end
##
# Runner for a given +type+ (eg, test vs bench).
def _run_anything type def _run_anything type
suites = TestCase.send "#{type}_suites" suites = TestCase.send "#{type}_suites"
return if suites.empty? return if suites.empty?
@ -793,10 +812,16 @@ module MiniTest
status status
end end
##
# Runs all the +suites+ for a given +type+.
def _run_suites suites, type def _run_suites suites, type
suites.map { |suite| _run_suite suite, type } suites.map { |suite| _run_suite suite, type }
end end
##
# Run a single +suite+ for a given +type+.
def _run_suite suite, type def _run_suite suite, type
header = "#{type}_suite_header" header = "#{type}_suite_header"
puts send(header, suite) if respond_to? header puts send(header, suite) if respond_to? header
@ -811,9 +836,12 @@ module MiniTest
print "#{suite}##{method} = " if @verbose print "#{suite}##{method} = " if @verbose
@start_time = Time.now @start_time = Time.now
self.last_error = nil
result = inst.run self result = inst.run self
time = Time.now - @start_time time = Time.now - @start_time
record suite, method, inst._assertions, time, last_error
print "%.2f s = " % time if @verbose print "%.2f s = " % time if @verbose
print result print result
puts if @verbose puts if @verbose
@ -824,6 +852,21 @@ module MiniTest
return assertions.size, assertions.inject(0) { |sum, n| sum + n } return assertions.size, assertions.inject(0) { |sum, n| sum + n }
end end
##
# Record the result of a single run. Makes it very easy to gather
# information. Eg:
#
# class StatisticsRecorder < MiniTest::Unit
# def record suite, method, assertions, time, error
# # ... record the results somewhere ...
# end
# end
#
# MiniTest::Unit.runner = StatisticsRecorder.new
def record suite, method, assertions, time, error
end
def location e # :nodoc: def location e # :nodoc:
last_before_assertion = "" last_before_assertion = ""
e.backtrace.reverse_each do |s| e.backtrace.reverse_each do |s|
@ -838,6 +881,7 @@ module MiniTest
# exception +e+ # exception +e+
def puke klass, meth, e def puke klass, meth, e
self.last_error = e
e = case e e = case e
when MiniTest::Skip then when MiniTest::Skip then
@skips += 1 @skips += 1
@ -859,9 +903,10 @@ module MiniTest
@report = [] @report = []
@errors = @failures = @skips = 0 @errors = @failures = @skips = 0
@verbose = false @verbose = false
self.last_error = nil
end end
def process_args args = [] def process_args args = [] # :nodoc:
options = {} options = {}
orig_args = args.dup orig_args = args.dup
@ -882,7 +927,7 @@ module MiniTest
options[:verbose] = true options[:verbose] = true
end end
opts.on '-n', '--name PATTERN', "Filter test names on pattern." do |a| opts.on '-n', '--name PATTERN', "Filter test names on pattern (e.g. /foo/)" do |a|
options[:filter] = a options[:filter] = a
end end
@ -944,6 +989,52 @@ module MiniTest
io.puts format % [test_count, assertion_count, failures, errors, skips] io.puts format % [test_count, assertion_count, failures, errors, skips]
end end
##
# Provides a simple set of guards that you can use in your tests
# to skip execution if it is not applicable. These methods are
# mixed into TestCase as both instance and class methods so you
# can use them inside or outside of the test methods.
#
# def test_something_for_mri
# skip "bug 1234" if jruby?
# # ...
# end
#
# if windows? then
# # ... lots of test methods ...
# end
module Guard
##
# Is this running on jruby?
def jruby? platform = RUBY_PLATFORM
"java" == platform
end
##
# Is this running on mri?
def mri? platform = RUBY_DESCRIPTION
/^ruby/ =~ platform
end
##
# Is this running on rubinius?
def rubinius? platform = defined?(RUBY_ENGINE) && RUBY_ENGINE
"rbx" == platform
end
##
# Is this running on windows?
def windows? platform = RUBY_PLATFORM
/mswin|mingw/ =~ platform
end
end
## ##
# Subclass TestCase to create your own tests. Typically you'll want a # Subclass TestCase to create your own tests. Typically you'll want a
# TestCase subclass per implementation class. # TestCase subclass per implementation class.
@ -951,6 +1042,9 @@ module MiniTest
# See MiniTest::Assertions # See MiniTest::Assertions
class TestCase class TestCase
include Guard
extend Guard
attr_reader :__name__ # :nodoc: attr_reader :__name__ # :nodoc:
PASSTHROUGH_EXCEPTIONS = [NoMemoryError, SignalException, PASSTHROUGH_EXCEPTIONS = [NoMemoryError, SignalException,
@ -963,16 +1057,21 @@ module MiniTest
def run runner def run runner
trap "INFO" do trap "INFO" do
runner.report.each_with_index do |msg, i|
warn "\n%3d) %s" % [i + 1, msg]
end
warn ''
time = runner.start_time ? Time.now - runner.start_time : 0 time = runner.start_time ? Time.now - runner.start_time : 0
warn "%s#%s %.2fs" % [self.class, self.__name__, time] warn "Current Test: %s#%s %.2fs" % [self.class, self.__name__, time]
runner.status $stderr runner.status $stderr
end if SUPPORTS_INFO_SIGNAL end if SUPPORTS_INFO_SIGNAL
result = "" result = ""
begin begin
@passed = nil @passed = nil
self.before_setup
self.setup self.setup
self.run_setup_hooks self.after_setup
self.run_test self.__name__ self.run_test self.__name__
result = "." unless io? result = "." unless io?
@passed = true @passed = true
@ -982,13 +1081,14 @@ module MiniTest
@passed = false @passed = false
result = runner.puke self.class, self.__name__, e result = runner.puke self.class, self.__name__, e
ensure ensure
begin %w{ before_teardown teardown after_teardown }.each do |hook|
self.run_teardown_hooks begin
self.teardown self.send hook
rescue *PASSTHROUGH_EXCEPTIONS rescue *PASSTHROUGH_EXCEPTIONS
raise raise
rescue Exception => e rescue Exception => e
result = runner.puke self.class, self.__name__, e result = runner.puke self.class, self.__name__, e
end
end end
trap 'INFO', 'DEFAULT' if SUPPORTS_INFO_SIGNAL trap 'INFO', 'DEFAULT' if SUPPORTS_INFO_SIGNAL
end end
@ -1008,11 +1108,17 @@ module MiniTest
@@current @@current
end end
##
# Return the output IO object
def io def io
@__io__ = true @__io__ = true
MiniTest::Unit.output MiniTest::Unit.output
end end
##
# Have we hooked up the IO yet?
def io? def io?
@__io__ @__io__
end end
@ -1030,6 +1136,7 @@ module MiniTest
def self.i_suck_and_my_tests_are_order_dependent! def self.i_suck_and_my_tests_are_order_dependent!
class << self class << self
undef_method :test_order if method_defined? :test_order
define_method :test_order do :alpha end define_method :test_order do :alpha end
end end
end end
@ -1074,11 +1181,33 @@ module MiniTest
def setup; end def setup; end
##
# Runs before every test after setup. Use this to refactor test
# initialization.
def after_setup; end
##
# Runs before every setup. Use this to refactor test initialization.
def before_setup; end
## ##
# Runs after every test. Use this to refactor test cleanup. # Runs after every test. Use this to refactor test cleanup.
def teardown; end def teardown; end
##
# Runs after every test before teardown. Use this to refactor test
# initialization.
def before_teardown; end
##
# Runs after every teardown. Use this to refactor test cleanup.
def after_teardown; end
def self.reset_setup_teardown_hooks # :nodoc: def self.reset_setup_teardown_hooks # :nodoc:
@setup_hooks = [] @setup_hooks = []
@teardown_hooks = [] @teardown_hooks = []
@ -1189,6 +1318,8 @@ module MiniTest
end # class Unit end # class Unit
end # module MiniTest end # module MiniTest
Minitest = MiniTest # because ugh... I typo this all the time
if $DEBUG then if $DEBUG then
module Test # :nodoc: module Test # :nodoc:
module Unit # :nodoc: module Unit # :nodoc:

View File

@ -0,0 +1,49 @@
# encoding: utf-8
######################################################################
# This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted!
# File a patch instead and assign it to Ryan Davis.
######################################################################
require 'tempfile'
require 'stringio'
require 'minitest/autorun'
class MetaMetaMetaTestCase < MiniTest::Unit::TestCase
def assert_report expected = nil
expected ||= <<-EOM.gsub(/^ {6}/, '')
Run options: --seed 42
# Running tests:
.
Finished tests in 0.00
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
EOM
output = @output.string.dup
output.sub!(/Finished tests in .*/, "Finished tests in 0.00")
output.sub!(/Loaded suite .*/, 'Loaded suite blah')
output.gsub!(/\[[^\]:]+:\d+\]/, '[FILE:LINE]')
output.gsub!(/^(\s+)[^:]+:\d+:in/, '\1FILE:LINE:in')
assert_equal(expected, output)
end
def setup
super
srand 42
MiniTest::Unit::TestCase.reset
@tu = MiniTest::Unit.new
@output = StringIO.new("")
MiniTest::Unit.runner = nil # protect the outer runner from the inner tests
MiniTest::Unit.output = @output
end
def teardown
super
MiniTest::Unit.output = $stdout
Object.send :remove_const, :ATestCase if defined? ATestCase
end
end

View File

@ -1,3 +1,4 @@
# encoding: utf-8
###################################################################### ######################################################################
# This file is imported from the minitest project. # This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted! # DO NOT make modifications in this repo. They _will_ be reverted!

View File

@ -1,3 +1,4 @@
# encoding: utf-8
###################################################################### ######################################################################
# This file is imported from the minitest project. # This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted! # DO NOT make modifications in this repo. They _will_ be reverted!
@ -26,7 +27,7 @@ class TestMiniTestMock < MiniTest::Unit::TestCase
def test_blow_up_if_not_called def test_blow_up_if_not_called
@mock.foo @mock.foo
util_verify_bad util_verify_bad "expected meaning_of_life() => 42, got []"
end end
def test_not_blow_up_if_everything_called def test_not_blow_up_if_everything_called
@ -46,7 +47,7 @@ class TestMiniTestMock < MiniTest::Unit::TestCase
@mock.meaning_of_life @mock.meaning_of_life
@mock.expect(:bar, true) @mock.expect(:bar, true)
util_verify_bad util_verify_bad "expected bar() => true, got []"
end end
def test_blow_up_on_wrong_number_of_arguments def test_blow_up_on_wrong_number_of_arguments
@ -84,9 +85,20 @@ class TestMiniTestMock < MiniTest::Unit::TestCase
@mock.meaning_of_life @mock.meaning_of_life
@mock.expect(:sum, 3, [1, 2]) @mock.expect(:sum, 3, [1, 2])
@mock.sum(2, 4) e = assert_raises MockExpectationError do
@mock.sum(2, 4)
end
util_verify_bad exp = "mocked method :sum called with unexpected arguments [2, 4]"
assert_equal exp, e.message
end
def test_expect_with_non_array_args
e = assert_raises ArgumentError do
@mock.expect :blah, 3, false
end
assert_equal "args must be an array", e.message
end end
def test_respond_appropriately def test_respond_appropriately
@ -142,29 +154,59 @@ class TestMiniTestMock < MiniTest::Unit::TestCase
def test_verify_raises_with_strict_args def test_verify_raises_with_strict_args
mock = MiniTest::Mock.new mock = MiniTest::Mock.new
mock.expect :strict_expectation, true, [2] mock.expect :strict_expectation, true, [2]
mock.strict_expectation 1
util_verify_bad
end
def test_verify_shows_the_actual_arguments_in_the_message
mock = MiniTest::Mock.new
mock.expect :capitalized, true, ["a"]
mock.capitalized "b"
e = assert_raises MockExpectationError do e = assert_raises MockExpectationError do
mock.verify mock.strict_expectation 1
end end
a = {:retval=>true, :args=>["a"]} exp = "mocked method :strict_expectation called with unexpected arguments [1]"
b = {:retval=>true, :args=>["b"]} assert_equal exp, e.message
expected = "expected capitalized, #{a.inspect}, got [#{b.inspect}]"
assert_equal expected, e.message
end end
def util_verify_bad def test_method_missing_empty
assert_raises MockExpectationError do mock = MiniTest::Mock.new
mock.expect :a, nil
mock.a
e = assert_raises MockExpectationError do
mock.a
end
assert_equal "No more expects available for :a: []", e.message
end
def test_same_method_expects_are_verified_when_all_called
mock = MiniTest::Mock.new
mock.expect :foo, nil, [:bar]
mock.expect :foo, nil, [:baz]
mock.foo :bar
mock.foo :baz
assert mock.verify
end
def test_same_method_expects_blow_up_when_not_all_called
mock = MiniTest::Mock.new
mock.expect :foo, nil, [:bar]
mock.expect :foo, nil, [:baz]
mock.foo :bar
e = assert_raises(MockExpectationError) { mock.verify }
exp = "expected foo(:baz) => nil, got [foo(:bar) => nil]"
assert_equal exp, e.message
end
def util_verify_bad exp
e = assert_raises MockExpectationError do
@mock.verify @mock.verify
end end
assert_equal exp, e.message
end end
end end

View File

@ -1,9 +1,11 @@
# encoding: utf-8
###################################################################### ######################################################################
# This file is imported from the minitest project. # This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted! # DO NOT make modifications in this repo. They _will_ be reverted!
# File a patch instead and assign it to Ryan Davis. # File a patch instead and assign it to Ryan Davis.
###################################################################### ######################################################################
# encoding: utf-8
require 'minitest/autorun' require 'minitest/autorun'
require 'stringio' require 'stringio'
@ -13,6 +15,19 @@ class ExampleA; end
class ExampleB < ExampleA; end class ExampleB < ExampleA; end
describe MiniTest::Spec do describe MiniTest::Spec do
def assert_triggered expected = "blah", klass = MiniTest::Assertion
@assertion_count += 2
e = assert_raises(klass) do
yield
end
msg = e.message.sub(/(---Backtrace---).*/m, '\1')
msg.gsub!(/\(oid=[-0-9]+\)/, '(oid=N)')
assert_equal expected, msg
end
before do before do
@assertion_count = 4 @assertion_count = 4
end end
@ -21,8 +36,78 @@ describe MiniTest::Spec do
self._assertions.must_equal @assertion_count self._assertions.must_equal @assertion_count
end end
# TODO: figure out how the hell to write a test for this it "needs to be able to catch a MiniTest::Assertion exception" do
# it "will skip if there is no block" @assertion_count = 1
assert_triggered "Expected 1 to not be equal to 1." do
1.wont_equal 1
end
end
it "needs to be sensible about must_include order" do
@assertion_count += 3 # must_include is 2 assertions
[1, 2, 3].must_include(2).must_equal true
assert_triggered "Expected [1, 2, 3] to include 5." do
[1, 2, 3].must_include 5
end
assert_triggered "msg.\nExpected [1, 2, 3] to include 5." do
[1, 2, 3].must_include 5, "msg"
end
end
it "needs to be sensible about wont_include order" do
@assertion_count += 3 # wont_include is 2 assertions
[1, 2, 3].wont_include(5).must_equal false
assert_triggered "Expected [1, 2, 3] to not include 2." do
[1, 2, 3].wont_include 2
end
assert_triggered "msg.\nExpected [1, 2, 3] to not include 2." do
[1, 2, 3].wont_include 2, "msg"
end
end
it "needs to catch an expected exception" do
@assertion_count = 2
proc { raise "blah" }.must_raise RuntimeError
proc { raise MiniTest::Assertion }.must_raise MiniTest::Assertion
end
it "needs to catch an unexpected exception" do
@assertion_count -= 2 # no positive
msg = <<-EOM.gsub(/^ {6}/, '').chomp
[RuntimeError] exception expected, not
Class: <MiniTest::Assertion>
Message: <\"MiniTest::Assertion\">
---Backtrace---
EOM
assert_triggered msg do
proc { raise MiniTest::Assertion }.must_raise RuntimeError
end
assert_triggered "msg.\n#{msg}" do
proc { raise MiniTest::Assertion }.must_raise RuntimeError, "msg"
end
end
it "needs to ensure silence" do
@assertion_count -= 1 # no msg
@assertion_count += 2 # assert_output is 2 assertions
proc { }.must_be_silent.must_equal true
assert_triggered "In stdout.\nExpected: \"\"\n Actual: \"xxx\"" do
proc { print "xxx" }.must_be_silent
end
end
it "needs to have all methods named well" do it "needs to have all methods named well" do
@assertion_count = 2 @assertion_count = 2
@ -60,159 +145,379 @@ describe MiniTest::Spec do
wonts.must_equal expected_wonts wonts.must_equal expected_wonts
end end
it "needs to raise if an expected exception is not raised" do
@assertion_count -= 2 # no positive test
assert_triggered "RuntimeError expected but nothing was raised." do
proc { 42 }.must_raise RuntimeError
end
assert_triggered "msg.\nRuntimeError expected but nothing was raised." do
proc { 42 }.must_raise RuntimeError, "msg"
end
end
it "needs to verify binary messages" do
42.wont_be(:<, 24).must_equal false
assert_triggered 'Expected 24 to not be < 42.' do
24.wont_be :<, 42
end
assert_triggered "msg.\nExpected 24 to not be < 42." do
24.wont_be :<, 42, "msg"
end
end
it "needs to verify emptyness" do
@assertion_count += 3 # empty is 2 assertions
[].must_be_empty.must_equal true
assert_triggered "Expected [42] to be empty." do
[42].must_be_empty
end
assert_triggered "msg.\nExpected [42] to be empty." do
[42].must_be_empty "msg"
end
end
it "needs to verify equality" do it "needs to verify equality" do
(6 * 7).must_equal(42).must_equal true (6 * 7).must_equal(42).must_equal true
proc { (6 * 9).must_equal(42) }.must_raise MiniTest::Assertion
assert_triggered "Expected: 42\n Actual: 54" do
(6 * 9).must_equal 42
end
assert_triggered "msg.\nExpected: 42\n Actual: 54" do
(6 * 9).must_equal 42, "msg"
end
end
it "needs to verify floats outside a delta" do
@assertion_count += 1 # extra test
24.wont_be_close_to(42).must_equal false
assert_triggered 'Expected |42 - 42.0| (0.0) to not be < 0.001.' do
(6 * 7.0).wont_be_close_to 42
end
assert_triggered 'Expected |42 - 42.0| (0.0) to not be < 1.0e-05.' do
(6 * 7.0).wont_be_close_to 42, 0.00001
end
assert_triggered "msg.\nExpected |42 - 42.0| (0.0) to not be < 1.0e-05." do
(6 * 7.0).wont_be_close_to 42, 0.00001, "msg"
end
end
it "needs to verify floats outside an epsilon" do
@assertion_count += 1 # extra test
24.wont_be_within_epsilon(42).must_equal false
assert_triggered 'Expected |42 - 42.0| (0.0) to not be < 0.042.' do
(6 * 7.0).wont_be_within_epsilon 42
end
assert_triggered 'Expected |42 - 42.0| (0.0) to not be < 0.00042.' do
(6 * 7.0).wont_be_within_epsilon 42, 0.00001
end
assert_triggered "msg.\nExpected |42 - 42.0| (0.0) to not be < 0.00042." do
(6 * 7.0).wont_be_within_epsilon 42, 0.00001, "msg"
end
end end
it "needs to verify floats within a delta" do it "needs to verify floats within a delta" do
@assertion_count += 1 # extra test
(6.0 * 7).must_be_close_to(42.0).must_equal true (6.0 * 7).must_be_close_to(42.0).must_equal true
proc { 42.002.must_be_close_to 42.0 }.must_raise MiniTest::Assertion
assert_triggered 'Expected |0.0 - 0.01| (0.01) to be < 0.001.' do
(1.0 / 100).must_be_close_to 0.0
end
assert_triggered 'Expected |0.0 - 0.001| (0.001) to be < 1.0e-06.' do
(1.0 / 1000).must_be_close_to 0.0, 0.000001
end
assert_triggered "msg.\nExpected |0.0 - 0.001| (0.001) to be < 1.0e-06." do
(1.0 / 1000).must_be_close_to 0.0, 0.000001, "msg"
end
end end
it "needs to verify types of objects" do it "needs to verify floats within an epsilon" do
(6 * 7).must_be_instance_of(Fixnum).must_equal true @assertion_count += 1 # extra test
proc { (6 * 7).must_be_instance_of String }.must_raise MiniTest::Assertion
end
it "needs to verify kinds of objects" do (6.0 * 7).must_be_within_epsilon(42.0).must_equal true
@assertion_count = 6
(6 * 7).must_be_kind_of(Fixnum).must_equal true assert_triggered 'Expected |0.0 - 0.01| (0.01) to be < 0.0.' do
(6 * 7).must_be_kind_of(Numeric).must_equal true (1.0 / 100).must_be_within_epsilon 0.0
proc { (6 * 7).must_be_kind_of String }.must_raise MiniTest::Assertion end
end
it "needs to verify regexp matches" do assert_triggered 'Expected |0.0 - 0.001| (0.001) to be < 0.0.' do
@assertion_count = 6 (1.0 / 1000).must_be_within_epsilon 0.0, 0.000001
end
"blah".must_match(/\w+/).must_equal true assert_triggered "msg.\nExpected |0.0 - 0.001| (0.001) to be < 0.0." do
proc { "blah".must_match(/\d+/) }.must_raise MiniTest::Assertion (1.0 / 1000).must_be_within_epsilon 0.0, 0.000001, "msg"
end end
it "needs to verify nil" do
nil.must_be_nil.must_equal true
proc { 42.must_be_nil }.must_raise MiniTest::Assertion
end
it "needs to verify using any binary operator" do
41.must_be(:<, 42).must_equal true
proc { 42.must_be(:<, 41) }.must_raise MiniTest::Assertion
end
it "needs to verify using any predicate" do
"".must_be(:empty?).must_equal true
proc { "blah".must_be(:empty?) }.must_raise MiniTest::Assertion
end
it "needs to catch an expected exception" do
@assertion_count = 2
proc { raise "blah" }.must_raise RuntimeError
proc { raise MiniTest::Assertion }.must_raise MiniTest::Assertion
end
it "needs to catch an unexpected exception" do
@assertion_count = 2
proc {
proc { raise MiniTest::Assertion }.must_raise(RuntimeError)
}.must_raise MiniTest::Assertion
end
it "needs raise if an expected exception is not raised" do
@assertion_count = 2
proc { proc { 42 }.must_raise(RuntimeError) }.must_raise MiniTest::Assertion
end
it "needs to be able to catch a MiniTest::Assertion exception" do
@assertion_count = 2
proc { 1.wont_equal 1 }.must_raise MiniTest::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 MiniTest::Assertion
end end
it "needs to verify identity" do it "needs to verify identity" do
1.must_be_same_as(1).must_equal true 1.must_be_same_as(1).must_equal true
proc { 1.must_be_same_as 2 }.must_raise MiniTest::Assertion
end
it "needs to verify throw" do assert_triggered "Expected 1 (oid=N) to be the same as 2 (oid=N)." do
@assertion_count = 6 1.must_be_same_as 2
end
proc { throw :blah }.must_throw(:blah).must_equal true assert_triggered "msg.\nExpected 1 (oid=N) to be the same as 2 (oid=N)." do
proc { proc { }.must_throw(:blah) }.must_raise MiniTest::Assertion 1.must_be_same_as 2, "msg"
proc { proc { throw :xxx }.must_throw(:blah) }.must_raise MiniTest::Assertion end
end end
it "needs to verify inequality" do it "needs to verify inequality" do
42.wont_equal(6 * 9).must_equal false 42.wont_equal(6 * 9).must_equal false
proc { 1.wont_equal 1 }.must_raise MiniTest::Assertion
assert_triggered "Expected 1 to not be equal to 1." do
1.wont_equal 1
end
assert_triggered "msg.\nExpected 1 to not be equal to 1." do
1.wont_equal 1, "msg"
end
end
it "needs to verify instances of a class" do
42.wont_be_instance_of(String).must_equal false
assert_triggered 'Expected 42 to not be an instance of Fixnum.' do
42.wont_be_instance_of Fixnum
end
assert_triggered "msg.\nExpected 42 to not be an instance of Fixnum." do
42.wont_be_instance_of Fixnum, "msg"
end
end
it "needs to verify kinds of a class" do
42.wont_be_kind_of(String).must_equal false
assert_triggered 'Expected 42 to not be a kind of Integer.' do
42.wont_be_kind_of Integer
end
assert_triggered "msg.\nExpected 42 to not be a kind of Integer." do
42.wont_be_kind_of Integer, "msg"
end
end
it "needs to verify kinds of objects" do
@assertion_count += 2 # extra test
(6 * 7).must_be_kind_of(Fixnum).must_equal true
(6 * 7).must_be_kind_of(Numeric).must_equal true
assert_triggered "Expected 42 to be a kind of String, not Fixnum." do
(6 * 7).must_be_kind_of String
end
assert_triggered "msg.\nExpected 42 to be a kind of String, not Fixnum." do
(6 * 7).must_be_kind_of String, "msg"
end
end end
it "needs to verify mismatch" do it "needs to verify mismatch" do
@assertion_count = 6 @assertion_count += 3 # match is 2
"blah".wont_match(/\d+/).must_equal false "blah".wont_match(/\d+/).must_equal false
proc { "blah".wont_match(/\w+/) }.must_raise MiniTest::Assertion
assert_triggered "Expected /\\w+/ to not match \"blah\"." do
"blah".wont_match(/\w+/)
end
assert_triggered "msg.\nExpected /\\w+/ to not match \"blah\"." do
"blah".wont_match(/\w+/, "msg")
end
end end
it "needs to verify using any (negative) predicate" do it "needs to verify nil" do
"blah".wont_be(:empty?).must_equal false nil.must_be_nil.must_equal true
proc { "".wont_be(:empty?) }.must_raise MiniTest::Assertion
assert_triggered "Expected 42 to be nil." do
42.must_be_nil
end
assert_triggered "msg.\nExpected 42 to be nil." do
42.must_be_nil "msg"
end
end end
it "needs to verify non-nil" do it "needs to verify non-emptyness" do
42.wont_be_nil.must_equal false @assertion_count += 3 # empty is 2 assertions
proc { nil.wont_be_nil }.must_raise MiniTest::Assertion
['some item'].wont_be_empty.must_equal false
assert_triggered "Expected [] to not be empty." do
[].wont_be_empty
end
assert_triggered "msg.\nExpected [] to not be empty." do
[].wont_be_empty "msg"
end
end end
it "needs to verify non-identity" do it "needs to verify non-identity" do
1.wont_be_same_as(2).must_equal false 1.wont_be_same_as(2).must_equal false
proc { 1.wont_be_same_as 1 }.must_raise MiniTest::Assertion
assert_triggered "Expected 1 (oid=N) to not be the same as 1 (oid=N)." do
1.wont_be_same_as 1
end
assert_triggered "msg.\nExpected 1 (oid=N) to not be the same as 1 (oid=N)." do
1.wont_be_same_as 1, "msg"
end
end end
it "needs to verify output in stdout" do it "needs to verify non-nil" do
proc { print "blah" }.must_output("blah").must_equal true 42.wont_be_nil.must_equal false
proc { assert_triggered "Expected nil to not be nil." do
proc { print "xxx" }.must_output("blah") nil.wont_be_nil
}.must_raise MiniTest::Assertion end
assert_triggered "msg.\nExpected nil to not be nil." do
nil.wont_be_nil "msg"
end
end
it "needs to verify objects not responding to a message" do
"".wont_respond_to(:woot!).must_equal false
assert_triggered 'Expected "" to not respond to to_s.' do
"".wont_respond_to :to_s
end
assert_triggered "msg.\nExpected \"\" to not respond to to_s." do
"".wont_respond_to :to_s, "msg"
end
end end
it "needs to verify output in stderr" do it "needs to verify output in stderr" do
@assertion_count -= 1 # no msg
proc { $stderr.print "blah" }.must_output(nil, "blah").must_equal true proc { $stderr.print "blah" }.must_output(nil, "blah").must_equal true
proc { assert_triggered "In stderr.\nExpected: \"blah\"\n Actual: \"xxx\"" do
proc { $stderr.print "xxx" }.must_output(nil, "blah") proc { $stderr.print "xxx" }.must_output(nil, "blah")
}.must_raise MiniTest::Assertion end
end end
it "needs to ensure silence" do it "needs to verify output in stdout" do
@assertion_count = 5 @assertion_count -= 1 # no msg
proc { }.must_be_silent.must_equal true proc { print "blah" }.must_output("blah").must_equal true
proc { assert_triggered "In stdout.\nExpected: \"blah\"\n Actual: \"xxx\"" do
proc { print "xxx" }.must_be_silent proc { print "xxx" }.must_output("blah")
}.must_raise MiniTest::Assertion end
end end
it "needs to be sensible about must_include order" do it "needs to verify regexp matches" do
@assertion_count = 6 @assertion_count += 3 # must_match is 2 assertions
[1, 2, 3].must_include(2).must_equal true
proc { [1, 2, 3].must_include 5 }.must_raise MiniTest::Assertion "blah".must_match(/\w+/).must_equal true
assert_triggered "Expected /\\d+/ to match \"blah\"." do
"blah".must_match(/\d+/)
end
assert_triggered "msg.\nExpected /\\d+/ to match \"blah\"." do
"blah".must_match(/\d+/, "msg")
end
end end
it "needs to be sensible about wont_include order" do it "needs to verify throw" do
@assertion_count = 6 @assertion_count += 2 # 2 extra tests
[1, 2, 3].wont_include(5).must_equal false
proc { [1, 2, 3].wont_include 2 }.must_raise MiniTest::Assertion proc { throw :blah }.must_throw(:blah).must_equal true
assert_triggered "Expected :blah to have been thrown." do
proc { }.must_throw :blah
end
assert_triggered "Expected :blah to have been thrown, not :xxx." do
proc { throw :xxx }.must_throw :blah
end
assert_triggered "msg.\nExpected :blah to have been thrown." do
proc { }.must_throw :blah, "msg"
end
assert_triggered "msg.\nExpected :blah to have been thrown, not :xxx." do
proc { throw :xxx }.must_throw :blah, "msg"
end
end end
it "needs to verify types of objects" do
(6 * 7).must_be_instance_of(Fixnum).must_equal true
exp = "Expected 42 to be an instance of String, not Fixnum."
assert_triggered exp do
(6 * 7).must_be_instance_of String
end
assert_triggered "msg.\n#{exp}" do
(6 * 7).must_be_instance_of String, "msg"
end
end
it "needs to verify using any (negative) predicate" do
@assertion_count -= 1 # doesn't take a message
"blah".wont_be(:empty?).must_equal false
assert_triggered "Expected \"\" to not be empty?." do
"".wont_be :empty?
end
end
it "needs to verify using any binary operator" do
@assertion_count -= 1 # no msg
41.must_be(:<, 42).must_equal true
assert_triggered "Expected 42 to be < 41." do
42.must_be(:<, 41)
end
end
it "needs to verify using any predicate" do
@assertion_count -= 1 # no msg
"".must_be(:empty?).must_equal true
assert_triggered "Expected \"blah\" to be empty?." do
"blah".must_be :empty?
end
end
it "needs to verify using respond_to" do
42.must_respond_to(:+).must_equal true
assert_triggered "Expected 42 (Fixnum) to respond to #clear." do
42.must_respond_to :clear
end
assert_triggered "msg.\nExpected 42 (Fixnum) to respond to #clear." do
42.must_respond_to :clear, "msg"
end
end
end end
describe MiniTest::Spec, :let do describe MiniTest::Spec, :let do
@ -381,17 +686,21 @@ class TestMeta < MiniTest::Unit::TestCase
end end
def test_describe_first_structure def test_describe_first_structure
x = y = z = nil x = x1 = x2 = y = z = nil
x = describe "top-level thingy" do x = describe "top-level thingy" do
y = describe "first thingy" do end y = describe "first thingy" do end
it "top-level-it" do end x1 = it "top-level-it" do end
x2 = it "не латинские буквы-и-спецсимволы&いった α, β, γ, δ, ε hello!!! world" do end
z = describe "second thingy" do end z = describe "second thingy" do end
end end
assert_equal ['test_0001_top_level_it'], test_methods = ['test_0001_top_level_it', 'test_0002_неатинские_буквы_и_спецсимволы_いった_α_β_γ_δ_ε_hello_world'].sort
x.instance_methods.grep(/^test/).map {|o| o.to_s}
assert_equal test_methods, [x1, x2]
assert_equal test_methods,
x.instance_methods.grep(/^test/).map {|o| o.to_s}.sort
assert_equal [], y.instance_methods.grep(/^test/) assert_equal [], y.instance_methods.grep(/^test/)
assert_equal [], z.instance_methods.grep(/^test/) assert_equal [], z.instance_methods.grep(/^test/)
end end

View File

@ -1,18 +1,18 @@
# encoding: utf-8
###################################################################### ######################################################################
# This file is imported from the minitest project. # This file is imported from the minitest project.
# DO NOT make modifications in this repo. They _will_ be reverted! # DO NOT make modifications in this repo. They _will_ be reverted!
# File a patch instead and assign it to Ryan Davis. # File a patch instead and assign it to Ryan Davis.
###################################################################### ######################################################################
require 'stringio'
require 'pathname' require 'pathname'
require 'minitest/autorun' require 'test/minitest/metametameta'
module MyModule; end module MyModule; end
class AnError < StandardError; include MyModule; end class AnError < StandardError; include MyModule; end
class ImmutableString < String; def inspect; super.freeze; end; end class ImmutableString < String; def inspect; super.freeze; end; end
class TestMiniTestUnit < MiniTest::Unit::TestCase class TestMiniTestUnit < MetaMetaMetaTestCase
pwd = Pathname.new(File.expand_path(Dir.pwd)) pwd = Pathname.new(File.expand_path(Dir.pwd))
basedir = Pathname.new(File.expand_path("lib/minitest")) + 'mini' basedir = Pathname.new(File.expand_path("lib/minitest")) + 'mini'
basedir = basedir.relative_path_from(pwd).to_s basedir = basedir.relative_path_from(pwd).to_s
@ -22,38 +22,6 @@ class TestMiniTestUnit < MiniTest::Unit::TestCase
"#{MINITEST_BASE_DIR}/test.rb:139:in `run'", "#{MINITEST_BASE_DIR}/test.rb:139:in `run'",
"#{MINITEST_BASE_DIR}/test.rb:106:in `run'"] "#{MINITEST_BASE_DIR}/test.rb:106:in `run'"]
def assert_report expected = nil
expected ||= "Run options: --seed 42
# Running tests:
.
Finished tests in 0.00
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
"
output = @output.string.sub(/Finished tests in .*/, "Finished tests in 0.00")
output.sub!(/Loaded suite .*/, 'Loaded suite blah')
output.sub!(/^(\s+)(?:#{Regexp.union(__FILE__, File.expand_path(__FILE__))}):\d+:/o, '\1FILE:LINE:')
output.sub!(/\[(?:#{Regexp.union(__FILE__, File.expand_path(__FILE__))}):\d+\]/o, '[FILE:LINE]')
assert_equal(expected, output)
end
def setup
srand 42
MiniTest::Unit::TestCase.reset
@tu = MiniTest::Unit.new
@output = StringIO.new("")
MiniTest::Unit.runner = nil # protect the outer runner from the inner tests
MiniTest::Unit.output = @output
end
def teardown
MiniTest::Unit.output = $stdout
Object.send :remove_const, :ATestCase if defined? ATestCase
end
def test_class_puke_with_assertion_failed def test_class_puke_with_assertion_failed
exception = MiniTest::Assertion.new "Oh no!" exception = MiniTest::Assertion.new "Oh no!"
exception.set_backtrace ["unhappy"] exception.set_backtrace ["unhappy"]
@ -235,21 +203,23 @@ Finished tests in 0.00
@tu.run %w[--seed 42] @tu.run %w[--seed 42]
expected = "Run options: --seed 42 expected = <<-EOM.gsub(/^ {6}/, '')
Run options: --seed 42
# Running tests: # Running tests:
E. E.
Finished tests in 0.00 Finished tests in 0.00
1) Error: 1) Error:
test_error(ATestCase): test_error(ATestCase):
RuntimeError: unhandled exception RuntimeError: unhandled exception
FILE:LINE:in `test_error' FILE:LINE:in `test_error'
2 tests, 1 assertions, 0 failures, 1 errors, 0 skips
EOM
2 tests, 1 assertions, 0 failures, 1 errors, 0 skips
"
assert_report expected assert_report expected
end end
@ -506,10 +476,82 @@ Finished tests in 0.00
end end
end end
def test_before_setup
call_order = []
Class.new(MiniTest::Unit::TestCase) do
define_method :setup do
super()
call_order << :setup
end
define_method :before_setup do
call_order << :before_setup
end
def test_omg; assert true; end
end
@tu.run %w[--seed 42]
expected = [:before_setup, :setup]
assert_equal expected, call_order
end
def test_after_teardown
call_order = []
Class.new(MiniTest::Unit::TestCase) do
define_method :teardown do
super()
call_order << :teardown
end
define_method :after_teardown do
call_order << :after_teardown
end
def test_omg; assert true; end
end
@tu.run %w[--seed 42]
expected = [:teardown, :after_teardown]
assert_equal expected, call_order
end
def test_all_teardowns_are_guaranteed_to_run
call_order = []
Class.new(MiniTest::Unit::TestCase) do
define_method :after_teardown do
super()
call_order << :after_teardown
raise
end
define_method :teardown do
super()
call_order << :teardown
raise
end
define_method :before_teardown do
super()
call_order << :before_teardown
raise
end
def test_omg; assert true; end
end
@tu.run %w[--seed 42]
expected = [:before_teardown, :teardown, :after_teardown]
assert_equal expected, call_order
end
def test_setup_hooks def test_setup_hooks
call_order = [] call_order = []
tc = Class.new(MiniTest::Unit::TestCase) do tc = Class.new(MiniTest::Spec) do
define_method :setup do define_method :setup do
super() super()
call_order << :method call_order << :method
@ -546,7 +588,7 @@ Finished tests in 0.00
def test_teardown_hooks def test_teardown_hooks
call_order = [] call_order = []
tc = Class.new(MiniTest::Unit::TestCase) do tc = Class.new(MiniTest::Spec) do
define_method :teardown do define_method :teardown do
super() super()
call_order << :method call_order << :method
@ -583,7 +625,7 @@ Finished tests in 0.00
def test_setup_and_teardown_hooks_survive_inheritance def test_setup_and_teardown_hooks_survive_inheritance
call_order = [] call_order = []
parent = Class.new(MiniTest::Unit::TestCase) do parent = Class.new(MiniTest::Spec) do
define_method :setup do define_method :setup do
super() super()
call_order << :setup_method call_order << :setup_method
@ -626,7 +668,11 @@ Finished tests in 0.00
end end
class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
RUBY18 = ! defined? Encoding
def setup def setup
super
MiniTest::Unit::TestCase.reset MiniTest::Unit::TestCase.reset
@tc = MiniTest::Unit::TestCase.new 'fake tc' @tc = MiniTest::Unit::TestCase.new 'fake tc'
@ -659,15 +705,22 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
end end
def test_assert_block def test_assert_block
@tc.assert_block do exp = ["NOTE: MiniTest::Unit::TestCase#assert_block is deprecated,",
true "use assert. It will be removed on or after 2012-06-01.\n"].join " "
assert_output "", exp do
@tc.assert_block do
true
end
end end
end end
def test_assert_block_triggered def test_assert_block_triggered
util_assert_triggered "blah.\nExpected block to return true value." do assert_output do
@tc.assert_block "blah" do util_assert_triggered "blah.\nExpected block to return true value." do
false @tc.assert_block "blah" do
false
end
end end
end end
end end
@ -804,13 +857,13 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
end end
def test_assert_in_delta_triggered def test_assert_in_delta_triggered
util_assert_triggered 'Expected 0.0 - 0.001 (0.001) to be < 1.0e-06.' do 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 @tc.assert_in_delta 0.0, 1.0 / 1000, 0.000001
end end
end end
def test_assert_in_epsilon def test_assert_in_epsilon
@assertion_count = 8 @assertion_count = 10
@tc.assert_in_epsilon 10000, 9991 @tc.assert_in_epsilon 10000, 9991
@tc.assert_in_epsilon 9991, 10000 @tc.assert_in_epsilon 9991, 10000
@ -821,14 +874,24 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
@tc.assert_in_epsilon 9999.1, 10000, 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.0, 1.0001, 0.0001
@tc.assert_in_epsilon 1.0001, 1.0, 0.0001 @tc.assert_in_epsilon 1.0001, 1.0, 0.0001
@tc.assert_in_epsilon(-1, -1)
@tc.assert_in_epsilon(-10000, -9991)
end end
def test_assert_in_epsilon_triggered def test_assert_in_epsilon_triggered
util_assert_triggered 'Expected 10000 - 9990 (10) to be < 9.99.' do util_assert_triggered 'Expected |10000 - 9990| (10) to be < 9.99.' do
@tc.assert_in_epsilon 10000, 9990 @tc.assert_in_epsilon 10000, 9990
end end
end end
def test_assert_in_epsilon_triggered_negative_case
x = RUBY18 ? "0.1" : "0.10000000000000009"
util_assert_triggered "Expected |-1.1 - -1| (#{x}) to be < 0.1." do
@tc.assert_in_epsilon(-1.1, -1, 0.1)
end
end
def test_assert_includes def test_assert_includes
@assertion_count = 2 @assertion_count = 2
@ -871,7 +934,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
@tc.assert_match(/\w+/, "blah blah blah") @tc.assert_match(/\w+/, "blah blah blah")
end end
def test_assert_match_object def test_assert_match_matcher_object
@assertion_count = 2 @assertion_count = 2
pattern = Object.new pattern = Object.new
@ -880,6 +943,15 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
@tc.assert_match pattern, 5 @tc.assert_match pattern, 5
end end
def test_assert_match_matchee_to_str
@assertion_count = 2
obj = Object.new
def obj.to_str; "blah" end
@tc.assert_match "blah", obj
end
def test_assert_match_object_triggered def test_assert_match_object_triggered
@assertion_count = 2 @assertion_count = 2
@ -956,7 +1028,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
end end
def test_assert_output_triggered_both def test_assert_output_triggered_both
util_assert_triggered util_msg("yay", "boo", "In stdout") do util_assert_triggered util_msg("blah", "blah blah", "In stderr") do
@tc.assert_output "yay", "blah" do @tc.assert_output "yay", "blah" do
print "boo" print "boo"
$stderr.print "blah blah" $stderr.print "blah blah"
@ -980,12 +1052,28 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
end end
end end
def test_assert_predicate
@tc.assert_predicate "", :empty?
end
def test_assert_predicate_triggered
util_assert_triggered 'Expected "blah" to be empty?.' do
@tc.assert_predicate "blah", :empty?
end
end
def test_assert_raises def test_assert_raises
@tc.assert_raises RuntimeError do @tc.assert_raises RuntimeError do
raise "blah" raise "blah"
end end
end end
def test_assert_raises_module
@tc.assert_raises MyModule do
raise AnError
end
end
## ##
# *sigh* This is quite an odd scenario, but it is from real (albeit # *sigh* This is quite an odd scenario, but it is from real (albeit
# ugly) test code in ruby-core: # ugly) test code in ruby-core:
@ -1006,12 +1094,6 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
end end
end end
def test_assert_raises_module
@tc.assert_raises MyModule do
raise AnError
end
end
def test_assert_raises_triggered_different def test_assert_raises_triggered_different
e = assert_raises MiniTest::Assertion do e = assert_raises MiniTest::Assertion do
@tc.assert_raises RuntimeError do @tc.assert_raises RuntimeError do
@ -1039,13 +1121,15 @@ FILE:LINE:in `test_assert_raises_triggered_different'
end end
end end
expected = "XXX expected = <<-EOM.gsub(/^ {6}/, '').chomp
[RuntimeError] exception expected, not XXX.
Class: <SyntaxError> [RuntimeError] exception expected, not
Message: <\"icky\"> Class: <SyntaxError>
---Backtrace--- Message: <\"icky\">
FILE:LINE:in `test_assert_raises_triggered_different_msg' ---Backtrace---
---------------" FILE:LINE:in `test_assert_raises_triggered_different_msg'
---------------
EOM
actual = e.message.gsub(/^.+:\d+/, 'FILE:LINE') actual = e.message.gsub(/^.+:\d+/, 'FILE:LINE')
actual.gsub!(/block \(\d+ levels\) in /, '') if RUBY_VERSION >= '1.9.0' actual.gsub!(/block \(\d+ levels\) in /, '') if RUBY_VERSION >= '1.9.0'
@ -1072,7 +1156,7 @@ FILE:LINE:in `test_assert_raises_triggered_different_msg'
end end
end end
expected = "XXX\nMiniTest::Assertion expected but nothing was raised." expected = "XXX.\nMiniTest::Assertion expected but nothing was raised."
assert_equal expected, e.message assert_equal expected, e.message
end end
@ -1150,8 +1234,6 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
end end
def test_assert_silent_triggered_err def test_assert_silent_triggered_err
@assertion_count = 2
util_assert_triggered util_msg("", "blah blah", "In stderr") do util_assert_triggered util_msg("", "blah blah", "In stderr") do
@tc.assert_silent do @tc.assert_silent do
$stderr.print "blah blah" $stderr.print "blah blah"
@ -1160,6 +1242,8 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
end end
def test_assert_silent_triggered_out def test_assert_silent_triggered_out
@assertion_count = 2
util_assert_triggered util_msg("", "blah blah", "In stdout") do util_assert_triggered util_msg("", "blah blah", "In stdout") do
@tc.assert_silent do @tc.assert_silent do
print "blah blah" print "blah blah"
@ -1211,10 +1295,15 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
methods = MiniTest::Assertions.public_instance_methods methods = MiniTest::Assertions.public_instance_methods
methods.map! { |m| m.to_s } if Symbol === methods.first methods.map! { |m| m.to_s } if Symbol === methods.first
ignores = %w(assert_block assert_no_match assert_not_equal # These don't have corresponding refutes _on purpose_. They're
assert_not_nil assert_not_same assert_nothing_raised # useless and will never be added, so don't bother.
assert_nothing_thrown assert_output assert_raise ignores = %w[assert_block assert_output assert_raises assert_send
assert_raises assert_send assert_silent assert_throws) assert_silent assert_throws]
# These are test/unit methods. I'm not actually sure why they're still here
ignores += %w[assert_no_match assert_not_equal assert_not_nil
assert_not_same assert_nothing_raised
assert_nothing_thrown assert_raise]
asserts = methods.grep(/^assert/).sort - ignores asserts = methods.grep(/^assert/).sort - ignores
refutes = methods.grep(/^refute/).sort - ignores refutes = methods.grep(/^refute/).sort - ignores
@ -1252,6 +1341,12 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
end end
end end
def test_expectation_with_a_message
util_assert_triggered "Expected: 2\n Actual: 1" do
1.must_equal 2, ''
end
end
def test_flunk def test_flunk
util_assert_triggered 'Epic Fail!' do util_assert_triggered 'Epic Fail!' do
@tc.flunk @tc.flunk
@ -1317,7 +1412,7 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
end end
def test_refute_in_delta_triggered def test_refute_in_delta_triggered
util_assert_triggered 'Expected 0.0 - 0.001 (0.001) to not be < 0.1.' do 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 @tc.refute_in_delta 0.0, 1.0 / 1000, 0.1
end end
end end
@ -1327,7 +1422,7 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
end end
def test_refute_in_epsilon_triggered def test_refute_in_epsilon_triggered
util_assert_triggered 'Expected 10000 - 9991 (9) to not be < 10.0.' do util_assert_triggered 'Expected |10000 - 9991| (9) to not be < 10.0.' do
@tc.refute_in_epsilon 10000, 9991 @tc.refute_in_epsilon 10000, 9991
fail fail
end end
@ -1375,7 +1470,7 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
@tc.refute_match(/\d+/, "blah blah blah") @tc.refute_match(/\d+/, "blah blah blah")
end end
def test_refute_match_object def test_refute_match_matcher_object
@assertion_count = 2 @assertion_count = 2
@tc.refute_match Object.new, 5 # default #=~ returns false @tc.refute_match Object.new, 5 # default #=~ returns false
end end
@ -1409,6 +1504,16 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
end end
end end
def test_refute_predicate
@tc.refute_predicate "42", :empty?
end
def test_refute_predicate_triggered
util_assert_triggered 'Expected "" to not be empty?.' do
@tc.refute_predicate "", :empty?
end
end
def test_refute_operator def test_refute_operator
@tc.refute_operator 2, :<, 1 @tc.refute_operator 2, :<, 1
end end
@ -1482,6 +1587,28 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
assert_equal expected, sample_test_case.test_methods assert_equal expected, sample_test_case.test_methods
end end
def test_i_suck_and_my_tests_are_order_dependent_bang_sets_test_order_alpha
@assertion_count = 0
shitty_test_case = Class.new MiniTest::Unit::TestCase
shitty_test_case.i_suck_and_my_tests_are_order_dependent!
assert_equal :alpha, shitty_test_case.test_order
end
def test_i_suck_and_my_tests_are_order_dependent_bang_does_not_warn
@assertion_count = 0
shitty_test_case = Class.new MiniTest::Unit::TestCase
def shitty_test_case.test_order ; :lol end
assert_silent do
shitty_test_case.i_suck_and_my_tests_are_order_dependent!
end
end
def util_assert_triggered expected, klass = MiniTest::Assertion def util_assert_triggered expected, klass = MiniTest::Assertion
e = assert_raises(klass) do e = assert_raises(klass) do
yield yield
@ -1508,3 +1635,25 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
MiniTest::Assertions.diff = old_diff MiniTest::Assertions.diff = old_diff
end end
end end
class TestMiniTestGuard < MiniTest::Unit::TestCase
def test_mri_eh
assert self.class.mri? "ruby blah"
assert self.mri? "ruby blah"
end
def test_jruby_eh
assert self.class.jruby? "java"
assert self.jruby? "java"
end
def test_rubinius_eh
assert self.class.rubinius? "rbx"
assert self.rubinius? "rbx"
end
def test_windows_eh
assert self.class.windows? "mswin"
assert self.windows? "mswin"
end
end