mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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:
parent
95d4b3ba49
commit
6af843b9cb
13 changed files with 1113 additions and 294 deletions
|
@ -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>
|
||||
|
||||
* 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
|
||||
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)
|
||||
* test/minitest/*: ditto
|
||||
|
|
|
@ -14,7 +14,7 @@ TDD, BDD, mocking, and benchmarking.
|
|||
paired up and we cracked open the code for a few test
|
||||
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
|
||||
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
|
||||
discovery.
|
||||
|
||||
"Again, I can’t 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!"
|
||||
|
||||
-- Piotr Szotkowski
|
||||
|
@ -117,6 +117,10 @@ Given that you'd like to test the following class:
|
|||
end
|
||||
end
|
||||
|
||||
For matchers support check out:
|
||||
|
||||
https://github.com/zenspider/minitest-matchers
|
||||
|
||||
=== Benchmarks
|
||||
|
||||
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)
|
||||
method = question.tr(" ","_") + "?"
|
||||
@meme.send(method)
|
||||
@meme.__send__(method)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -242,6 +246,46 @@ fixture loading:
|
|||
|
||||
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:
|
||||
|
||||
* Ruby 1.8, maybe even 1.6 or lower. No magic is involved.
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# encoding: utf-8
|
||||
######################################################################
|
||||
# This file is imported from the minitest project.
|
||||
# DO NOT make modifications in this repo. They _will_ be reverted!
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# encoding: utf-8
|
||||
######################################################################
|
||||
# This file is imported from the minitest project.
|
||||
# DO NOT make modifications in this repo. They _will_ be reverted!
|
||||
|
@ -7,9 +8,7 @@
|
|||
require 'minitest/unit'
|
||||
require 'minitest/spec'
|
||||
|
||||
class MiniTest::Unit
|
||||
attr_accessor :runner
|
||||
|
||||
class MiniTest::Unit # :nodoc:
|
||||
def run_benchmarks # :nodoc:
|
||||
_run_anything :benchmark
|
||||
end
|
||||
|
@ -318,6 +317,15 @@ class MiniTest::Spec
|
|||
define_method "bench_#{name.gsub(/\W+/, '_')}", &block
|
||||
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
|
||||
return super unless block
|
||||
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
# 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.
|
||||
######################################################################
|
||||
|
||||
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.
|
||||
|
@ -24,8 +26,8 @@ module MiniTest
|
|||
end
|
||||
|
||||
def initialize # :nodoc:
|
||||
@expected_calls = {}
|
||||
@actual_calls = Hash.new {|h,k| h[k] = [] }
|
||||
@expected_calls = Hash.new { |calls, name| calls[name] = [] }
|
||||
@actual_calls = Hash.new { |calls, name| calls[name] = [] }
|
||||
end
|
||||
|
||||
##
|
||||
|
@ -50,44 +52,70 @@ module MiniTest
|
|||
# @mock.verify # => raises MockExpectationError
|
||||
|
||||
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
|
||||
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
|
||||
# +MockExpectationError+ if the mock object was not called as
|
||||
# expected.
|
||||
|
||||
def verify
|
||||
@expected_calls.each_key do |name|
|
||||
expected = @expected_calls[name]
|
||||
msg1 = "expected #{name}, #{expected.inspect}"
|
||||
msg2 = "#{msg1}, got #{@actual_calls[name].inspect}"
|
||||
@expected_calls.each do |name, calls|
|
||||
calls.each do |expected|
|
||||
msg1 = "expected #{call name, expected}"
|
||||
msg2 = "#{msg1}, got [#{call name, @actual_calls[name]}]"
|
||||
|
||||
raise MockExpectationError, msg2 if
|
||||
@actual_calls.has_key? name and
|
||||
not @actual_calls[name].include?(expected)
|
||||
raise MockExpectationError, msg2 if
|
||||
@actual_calls.has_key? name and
|
||||
not @actual_calls[name].include?(expected)
|
||||
|
||||
raise MockExpectationError, msg1 unless
|
||||
@actual_calls.has_key? name and @actual_calls[name].include?(expected)
|
||||
raise MockExpectationError, msg1 unless
|
||||
@actual_calls.has_key? name and @actual_calls[name].include?(expected)
|
||||
end
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
def method_missing(sym, *args) # :nodoc:
|
||||
expected = @expected_calls[sym]
|
||||
|
||||
unless expected then
|
||||
unless @expected_calls.has_key?(sym) then
|
||||
raise NoMethodError, "unmocked method %p, expected one of %p" %
|
||||
[sym, @expected_calls.keys.sort_by(&:to_s)]
|
||||
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" %
|
||||
[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
|
||||
|
||||
@actual_calls[sym] << {
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# encoding: utf-8
|
||||
######################################################################
|
||||
# This file is imported from the minitest project.
|
||||
# DO NOT make modifications in this repo. They _will_ be reverted!
|
||||
|
@ -10,12 +11,17 @@ require "minitest/unit"
|
|||
# Show your testing pride!
|
||||
|
||||
class PrideIO
|
||||
|
||||
# Start an escape sequence
|
||||
ESC = "\e["
|
||||
|
||||
# End the escape sequence
|
||||
NND = "#{ESC}0m"
|
||||
|
||||
# The IO we're going to pipe through.
|
||||
attr_reader :io
|
||||
|
||||
def initialize io
|
||||
def initialize io # :nodoc:
|
||||
@io = io
|
||||
# stolen from /System/Library/Perl/5.10.0/Term/ANSIColor.pm
|
||||
# also reference http://en.wikipedia.org/wiki/ANSI_escape_code
|
||||
|
@ -25,6 +31,9 @@ class PrideIO
|
|||
# io.sync = true
|
||||
end
|
||||
|
||||
##
|
||||
# Wrap print to colorize the output.
|
||||
|
||||
def print o
|
||||
case o
|
||||
when "." then
|
||||
|
@ -36,7 +45,7 @@ class PrideIO
|
|||
end
|
||||
end
|
||||
|
||||
def puts(*o)
|
||||
def puts(*o) # :nodoc:
|
||||
o.map! { |s|
|
||||
s.sub(/Finished tests/) {
|
||||
@index = 0
|
||||
|
@ -49,6 +58,9 @@ class PrideIO
|
|||
super
|
||||
end
|
||||
|
||||
##
|
||||
# Color a string.
|
||||
|
||||
def pride string
|
||||
string = "*" if string == "."
|
||||
c = @colors[@index % @size]
|
||||
|
@ -56,15 +68,20 @@ class PrideIO
|
|||
"#{ESC}#{c}m#{string}#{NND}"
|
||||
end
|
||||
|
||||
def method_missing msg, *args
|
||||
def method_missing msg, *args # :nodoc:
|
||||
io.send(msg, *args)
|
||||
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.
|
||||
#
|
||||
# To visualize, type this into wolfram-alpha:
|
||||
|
@ -88,6 +105,9 @@ class PrideLOL < PrideIO # inspired by lolcat, but massively cleaned up
|
|||
super
|
||||
end
|
||||
|
||||
##
|
||||
# Make the string even more colorful. Damnit.
|
||||
|
||||
def pride string
|
||||
c = @colors[@index % @size]
|
||||
@index += 1
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# encoding: utf-8
|
||||
######################################################################
|
||||
# This file is imported from the minitest project.
|
||||
# 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]
|
||||
self.class_eval <<-EOM
|
||||
def #{new_name} *args
|
||||
return MiniTest::Spec.current.#{meth}(*args, &self) if
|
||||
Proc === self
|
||||
return MiniTest::Spec.current.#{meth}(args.first, self) if
|
||||
args.size == 1 unless #{!!dont_flip}
|
||||
return MiniTest::Spec.current.#{meth}(self, *args)
|
||||
case
|
||||
when Proc === self then
|
||||
MiniTest::Spec.current.#{meth}(*args, &self)
|
||||
when #{!!dont_flip} then
|
||||
MiniTest::Spec.current.#{meth}(self, *args)
|
||||
else
|
||||
MiniTest::Spec.current.#{meth}(args.first, self, *args[1..-1])
|
||||
end
|
||||
end
|
||||
EOM
|
||||
end
|
||||
|
@ -177,6 +181,12 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
|
|||
add_teardown_hook {|tc| tc.instance_eval(&block) }
|
||||
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
|
||||
# proper test method name. For some freakish reason, people who
|
||||
|
@ -194,15 +204,22 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
|
|||
@specs ||= 0
|
||||
@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
|
||||
|
||||
self.children.each do |mod|
|
||||
mod.send :undef_method, name if mod.public_method_defined? name
|
||||
end
|
||||
|
||||
name
|
||||
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
|
||||
define_method name do
|
||||
@_memoized ||= {}
|
||||
|
@ -210,6 +227,10 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Another lazy man's accessor generator. Made even more lazy by
|
||||
# setting the name for you to +subject+.
|
||||
|
||||
def self.subject &block
|
||||
let :subject, &block
|
||||
end
|
||||
|
@ -232,6 +253,14 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
|
|||
end
|
||||
|
||||
# :stopdoc:
|
||||
def after_setup
|
||||
run_setup_hooks
|
||||
end
|
||||
|
||||
def before_teardown
|
||||
run_teardown_hooks
|
||||
end
|
||||
|
||||
class << self
|
||||
attr_reader :desc
|
||||
alias :specify :it
|
||||
|
@ -240,6 +269,9 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
|
|||
# :startdoc:
|
||||
end
|
||||
|
||||
##
|
||||
# It's where you hide your "assertions".
|
||||
|
||||
module MiniTest::Expectations
|
||||
##
|
||||
# See MiniTest::Assertions#assert_empty.
|
||||
|
@ -248,7 +280,7 @@ module MiniTest::Expectations
|
|||
#
|
||||
# :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
|
||||
|
@ -322,7 +354,7 @@ module MiniTest::Expectations
|
|||
#
|
||||
# :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
|
||||
|
@ -408,7 +440,7 @@ module MiniTest::Expectations
|
|||
#
|
||||
# :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
|
||||
|
@ -483,7 +515,7 @@ module MiniTest::Expectations
|
|||
#
|
||||
# :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
|
||||
|
@ -517,6 +549,6 @@ module MiniTest::Expectations
|
|||
infect_an_assertion :refute_same, :wont_be_same_as
|
||||
end
|
||||
|
||||
class Object
|
||||
class Object # :nodoc:
|
||||
include MiniTest::Expectations
|
||||
end
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# encoding: utf-8
|
||||
######################################################################
|
||||
# This file is imported from the minitest project.
|
||||
# DO NOT make modifications in this repo. They _will_ be reverted!
|
||||
|
@ -61,8 +62,13 @@ module MiniTest
|
|||
# printed if the assertion fails.
|
||||
|
||||
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
|
||||
|
@ -187,6 +193,7 @@ module MiniTest
|
|||
# Fails unless the block returns a true value.
|
||||
|
||||
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" }
|
||||
assert yield, msg
|
||||
end
|
||||
|
@ -225,7 +232,7 @@ module MiniTest
|
|||
|
||||
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}" }
|
||||
msg = message(msg) { "Expected |#{exp} - #{act}| (#{n}) to be < #{delta}"}
|
||||
assert delta >= n, msg
|
||||
end
|
||||
|
||||
|
@ -234,7 +241,7 @@ module MiniTest
|
|||
# error less than +epsilon+.
|
||||
|
||||
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
|
||||
|
||||
##
|
||||
|
@ -270,13 +277,13 @@ module MiniTest
|
|||
end
|
||||
|
||||
##
|
||||
# Fails unless +exp+ is <tt>=~</tt> +act+.
|
||||
# Fails unless +matcher+ <tt>=~</tt> +obj+.
|
||||
|
||||
def assert_match exp, act, msg = nil
|
||||
msg = message(msg) { "Expected #{mu_pp(exp)} to match #{mu_pp(act)}" }
|
||||
assert_respond_to act, :"=~"
|
||||
exp = Regexp.new Regexp.escape exp if String === exp and String === act
|
||||
assert exp =~ act, msg
|
||||
def assert_match matcher, obj, msg = nil
|
||||
msg = message(msg) { "Expected #{mu_pp matcher} to match #{mu_pp obj}" }
|
||||
assert_respond_to matcher, :"=~"
|
||||
matcher = Regexp.new Regexp.escape matcher if String === matcher
|
||||
assert matcher =~ obj, msg
|
||||
end
|
||||
|
||||
##
|
||||
|
@ -287,9 +294,6 @@ module MiniTest
|
|||
assert obj.nil?, msg
|
||||
end
|
||||
|
||||
UNDEFINED = Object.new
|
||||
def UNDEFINED.inspect; "UNDEFINED"; end
|
||||
|
||||
##
|
||||
# For testing with binary operators.
|
||||
#
|
||||
|
@ -313,8 +317,8 @@ module MiniTest
|
|||
yield
|
||||
end
|
||||
|
||||
x = assert_equal stdout, out, "In stdout" if stdout
|
||||
y = assert_equal stderr, err, "In stderr" if stderr
|
||||
x = assert_equal stdout, out, "In stdout" if stdout
|
||||
|
||||
(!stdout || x) && (!stderr || y)
|
||||
end
|
||||
|
@ -334,10 +338,11 @@ module MiniTest
|
|||
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
|
||||
msg = "#{exp.pop}\n" if String === exp.last
|
||||
msg = "#{exp.pop}.\n" if String === exp.last
|
||||
|
||||
should_raise = false
|
||||
begin
|
||||
|
@ -355,7 +360,7 @@ module MiniTest
|
|||
details = "#{msg}#{mu_pp(exp)} exception expected, not"
|
||||
assert(exp.any? { |ex|
|
||||
ex.instance_of?(Module) ? e.kind_of?(ex) : ex == e.class
|
||||
}, proc{exception_details(e, details)})
|
||||
}, exception_details(e, details))
|
||||
|
||||
return e
|
||||
end
|
||||
|
@ -523,14 +528,14 @@ module MiniTest
|
|||
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)
|
||||
|
||||
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}"
|
||||
"Expected |#{exp} - #{act}| (#{n}) to not be < #{delta}"
|
||||
}
|
||||
refute delta > n, msg
|
||||
end
|
||||
|
@ -544,7 +549,7 @@ module MiniTest
|
|||
end
|
||||
|
||||
##
|
||||
# Fails if +collection+ includes +obj+
|
||||
# Fails if +collection+ includes +obj+.
|
||||
|
||||
def refute_includes collection, obj, msg = nil
|
||||
msg = message(msg) {
|
||||
|
@ -555,7 +560,7 @@ module MiniTest
|
|||
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
|
||||
msg = message(msg) {
|
||||
|
@ -565,7 +570,7 @@ module MiniTest
|
|||
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
|
||||
msg = message(msg) { "Expected #{mu_pp(obj)} to not be a kind of #{cls}" }
|
||||
|
@ -573,13 +578,13 @@ module MiniTest
|
|||
end
|
||||
|
||||
##
|
||||
# Fails if +exp+ <tt>=~</tt> +act+
|
||||
# Fails if +matcher+ <tt>=~</tt> +obj+.
|
||||
|
||||
def refute_match exp, act, msg = nil
|
||||
msg = message(msg) { "Expected #{mu_pp(exp)} to not match #{mu_pp(act)}" }
|
||||
assert_respond_to act, :"=~"
|
||||
exp = (/#{Regexp.escape exp}/) if String === exp and String === act
|
||||
refute exp =~ act, msg
|
||||
def refute_match matcher, obj, msg = nil
|
||||
msg = message(msg) {"Expected #{mu_pp matcher} to not match #{mu_pp obj}"}
|
||||
assert_respond_to matcher, :"=~"
|
||||
matcher = Regexp.new Regexp.escape matcher if String === matcher
|
||||
refute matcher =~ obj, msg
|
||||
end
|
||||
|
||||
##
|
||||
|
@ -646,8 +651,8 @@ module MiniTest
|
|||
end
|
||||
end
|
||||
|
||||
class Unit
|
||||
VERSION = "2.8.1" # :nodoc:
|
||||
class Unit # :nodoc:
|
||||
VERSION = "2.12.1" # :nodoc:
|
||||
|
||||
attr_accessor :report, :failures, :errors, :skips # :nodoc:
|
||||
attr_accessor :test_count, :assertion_count # :nodoc:
|
||||
|
@ -655,6 +660,10 @@ module MiniTest
|
|||
attr_accessor :help # :nodoc:
|
||||
attr_accessor :verbose # :nodoc:
|
||||
attr_writer :options # :nodoc:
|
||||
attr_accessor :last_error # :nodoc:
|
||||
|
||||
##
|
||||
# Lazy accessor for options.
|
||||
|
||||
def options
|
||||
@options ||= {}
|
||||
|
@ -662,6 +671,7 @@ module MiniTest
|
|||
|
||||
@@installed_at_exit ||= false
|
||||
@@out = $stdout
|
||||
@@after_tests = []
|
||||
|
||||
##
|
||||
# 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 }
|
||||
|
||||
def self.after_tests
|
||||
at_exit { at_exit { yield } }
|
||||
def self.after_tests &block
|
||||
@@after_tests << block
|
||||
end
|
||||
|
||||
##
|
||||
|
@ -686,7 +696,10 @@ module MiniTest
|
|||
# to run (at_exit stacks).
|
||||
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
|
||||
} unless @@installed_at_exit
|
||||
|
@ -744,6 +757,9 @@ module MiniTest
|
|||
grep(/^run_/).map { |s| s.to_s }).uniq
|
||||
end
|
||||
|
||||
##
|
||||
# Return the IO for output.
|
||||
|
||||
def output
|
||||
self.class.output
|
||||
end
|
||||
|
@ -756,6 +772,9 @@ module MiniTest
|
|||
output.print(*a)
|
||||
end
|
||||
|
||||
##
|
||||
# Runner for a given +type+ (eg, test vs bench).
|
||||
|
||||
def _run_anything type
|
||||
suites = TestCase.send "#{type}_suites"
|
||||
return if suites.empty?
|
||||
|
@ -793,10 +812,16 @@ module MiniTest
|
|||
status
|
||||
end
|
||||
|
||||
##
|
||||
# Runs all the +suites+ for a given +type+.
|
||||
|
||||
def _run_suites suites, type
|
||||
suites.map { |suite| _run_suite suite, type }
|
||||
end
|
||||
|
||||
##
|
||||
# Run a single +suite+ for a given +type+.
|
||||
|
||||
def _run_suite suite, type
|
||||
header = "#{type}_suite_header"
|
||||
puts send(header, suite) if respond_to? header
|
||||
|
@ -811,9 +836,12 @@ module MiniTest
|
|||
print "#{suite}##{method} = " if @verbose
|
||||
|
||||
@start_time = Time.now
|
||||
self.last_error = nil
|
||||
result = inst.run self
|
||||
time = Time.now - @start_time
|
||||
|
||||
record suite, method, inst._assertions, time, last_error
|
||||
|
||||
print "%.2f s = " % time if @verbose
|
||||
print result
|
||||
puts if @verbose
|
||||
|
@ -824,6 +852,21 @@ module MiniTest
|
|||
return assertions.size, assertions.inject(0) { |sum, n| sum + n }
|
||||
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:
|
||||
last_before_assertion = ""
|
||||
e.backtrace.reverse_each do |s|
|
||||
|
@ -838,6 +881,7 @@ module MiniTest
|
|||
# exception +e+
|
||||
|
||||
def puke klass, meth, e
|
||||
self.last_error = e
|
||||
e = case e
|
||||
when MiniTest::Skip then
|
||||
@skips += 1
|
||||
|
@ -859,9 +903,10 @@ module MiniTest
|
|||
@report = []
|
||||
@errors = @failures = @skips = 0
|
||||
@verbose = false
|
||||
self.last_error = nil
|
||||
end
|
||||
|
||||
def process_args args = []
|
||||
def process_args args = [] # :nodoc:
|
||||
options = {}
|
||||
orig_args = args.dup
|
||||
|
||||
|
@ -882,7 +927,7 @@ module MiniTest
|
|||
options[:verbose] = true
|
||||
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
|
||||
end
|
||||
|
||||
|
@ -944,6 +989,52 @@ module MiniTest
|
|||
io.puts format % [test_count, assertion_count, failures, errors, skips]
|
||||
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
|
||||
# TestCase subclass per implementation class.
|
||||
|
@ -951,6 +1042,9 @@ module MiniTest
|
|||
# See MiniTest::Assertions
|
||||
|
||||
class TestCase
|
||||
include Guard
|
||||
extend Guard
|
||||
|
||||
attr_reader :__name__ # :nodoc:
|
||||
|
||||
PASSTHROUGH_EXCEPTIONS = [NoMemoryError, SignalException,
|
||||
|
@ -963,16 +1057,21 @@ module MiniTest
|
|||
|
||||
def run runner
|
||||
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
|
||||
warn "%s#%s %.2fs" % [self.class, self.__name__, time]
|
||||
warn "Current Test: %s#%s %.2fs" % [self.class, self.__name__, time]
|
||||
runner.status $stderr
|
||||
end if SUPPORTS_INFO_SIGNAL
|
||||
|
||||
result = ""
|
||||
begin
|
||||
@passed = nil
|
||||
self.before_setup
|
||||
self.setup
|
||||
self.run_setup_hooks
|
||||
self.after_setup
|
||||
self.run_test self.__name__
|
||||
result = "." unless io?
|
||||
@passed = true
|
||||
|
@ -982,13 +1081,14 @@ module MiniTest
|
|||
@passed = false
|
||||
result = runner.puke self.class, self.__name__, e
|
||||
ensure
|
||||
begin
|
||||
self.run_teardown_hooks
|
||||
self.teardown
|
||||
rescue *PASSTHROUGH_EXCEPTIONS
|
||||
raise
|
||||
rescue Exception => e
|
||||
result = runner.puke self.class, self.__name__, e
|
||||
%w{ before_teardown teardown after_teardown }.each do |hook|
|
||||
begin
|
||||
self.send hook
|
||||
rescue *PASSTHROUGH_EXCEPTIONS
|
||||
raise
|
||||
rescue Exception => e
|
||||
result = runner.puke self.class, self.__name__, e
|
||||
end
|
||||
end
|
||||
trap 'INFO', 'DEFAULT' if SUPPORTS_INFO_SIGNAL
|
||||
end
|
||||
|
@ -1008,11 +1108,17 @@ module MiniTest
|
|||
@@current
|
||||
end
|
||||
|
||||
##
|
||||
# Return the output IO object
|
||||
|
||||
def io
|
||||
@__io__ = true
|
||||
MiniTest::Unit.output
|
||||
end
|
||||
|
||||
##
|
||||
# Have we hooked up the IO yet?
|
||||
|
||||
def io?
|
||||
@__io__
|
||||
end
|
||||
|
@ -1030,6 +1136,7 @@ module MiniTest
|
|||
|
||||
def self.i_suck_and_my_tests_are_order_dependent!
|
||||
class << self
|
||||
undef_method :test_order if method_defined? :test_order
|
||||
define_method :test_order do :alpha end
|
||||
end
|
||||
end
|
||||
|
@ -1074,11 +1181,33 @@ module MiniTest
|
|||
|
||||
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.
|
||||
|
||||
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:
|
||||
@setup_hooks = []
|
||||
@teardown_hooks = []
|
||||
|
@ -1189,6 +1318,8 @@ module MiniTest
|
|||
end # class Unit
|
||||
end # module MiniTest
|
||||
|
||||
Minitest = MiniTest # because ugh... I typo this all the time
|
||||
|
||||
if $DEBUG then
|
||||
module Test # :nodoc:
|
||||
module Unit # :nodoc:
|
||||
|
|
49
test/minitest/metametameta.rb
Normal file
49
test/minitest/metametameta.rb
Normal 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
|
|
@ -1,3 +1,4 @@
|
|||
# encoding: utf-8
|
||||
######################################################################
|
||||
# This file is imported from the minitest project.
|
||||
# DO NOT make modifications in this repo. They _will_ be reverted!
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# encoding: utf-8
|
||||
######################################################################
|
||||
# This file is imported from the minitest project.
|
||||
# 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
|
||||
@mock.foo
|
||||
|
||||
util_verify_bad
|
||||
util_verify_bad "expected meaning_of_life() => 42, got []"
|
||||
end
|
||||
|
||||
def test_not_blow_up_if_everything_called
|
||||
|
@ -46,7 +47,7 @@ class TestMiniTestMock < MiniTest::Unit::TestCase
|
|||
@mock.meaning_of_life
|
||||
@mock.expect(:bar, true)
|
||||
|
||||
util_verify_bad
|
||||
util_verify_bad "expected bar() => true, got []"
|
||||
end
|
||||
|
||||
def test_blow_up_on_wrong_number_of_arguments
|
||||
|
@ -84,9 +85,20 @@ class TestMiniTestMock < MiniTest::Unit::TestCase
|
|||
@mock.meaning_of_life
|
||||
@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
|
||||
|
||||
def test_respond_appropriately
|
||||
|
@ -142,29 +154,59 @@ class TestMiniTestMock < MiniTest::Unit::TestCase
|
|||
def test_verify_raises_with_strict_args
|
||||
mock = MiniTest::Mock.new
|
||||
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
|
||||
mock.verify
|
||||
mock.strict_expectation 1
|
||||
end
|
||||
|
||||
a = {:retval=>true, :args=>["a"]}
|
||||
b = {:retval=>true, :args=>["b"]}
|
||||
|
||||
expected = "expected capitalized, #{a.inspect}, got [#{b.inspect}]"
|
||||
assert_equal expected, e.message
|
||||
exp = "mocked method :strict_expectation called with unexpected arguments [1]"
|
||||
assert_equal exp, e.message
|
||||
end
|
||||
|
||||
def util_verify_bad
|
||||
assert_raises MockExpectationError do
|
||||
def test_method_missing_empty
|
||||
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
|
||||
end
|
||||
|
||||
assert_equal exp, e.message
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
# 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.
|
||||
######################################################################
|
||||
|
||||
# encoding: utf-8
|
||||
require 'minitest/autorun'
|
||||
require 'stringio'
|
||||
|
||||
|
@ -13,6 +15,19 @@ class ExampleA; end
|
|||
class ExampleB < ExampleA; end
|
||||
|
||||
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
|
||||
@assertion_count = 4
|
||||
end
|
||||
|
@ -21,8 +36,78 @@ describe MiniTest::Spec do
|
|||
self._assertions.must_equal @assertion_count
|
||||
end
|
||||
|
||||
# TODO: figure out how the hell to write a test for this
|
||||
# it "will skip if there is no block"
|
||||
it "needs to be able to catch a MiniTest::Assertion exception" do
|
||||
@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
|
||||
@assertion_count = 2
|
||||
|
@ -60,159 +145,379 @@ describe MiniTest::Spec do
|
|||
wonts.must_equal expected_wonts
|
||||
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
|
||||
(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
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
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 MiniTest::Assertion
|
||||
end
|
||||
it "needs to verify floats within an epsilon" do
|
||||
@assertion_count += 1 # extra test
|
||||
|
||||
it "needs to verify kinds of objects" do
|
||||
@assertion_count = 6
|
||||
(6.0 * 7).must_be_within_epsilon(42.0).must_equal true
|
||||
|
||||
(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 MiniTest::Assertion
|
||||
end
|
||||
assert_triggered 'Expected |0.0 - 0.01| (0.01) to be < 0.0.' do
|
||||
(1.0 / 100).must_be_within_epsilon 0.0
|
||||
end
|
||||
|
||||
it "needs to verify regexp matches" do
|
||||
@assertion_count = 6
|
||||
assert_triggered 'Expected |0.0 - 0.001| (0.001) to be < 0.0.' do
|
||||
(1.0 / 1000).must_be_within_epsilon 0.0, 0.000001
|
||||
end
|
||||
|
||||
"blah".must_match(/\w+/).must_equal true
|
||||
proc { "blah".must_match(/\d+/) }.must_raise MiniTest::Assertion
|
||||
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
|
||||
assert_triggered "msg.\nExpected |0.0 - 0.001| (0.001) to be < 0.0." do
|
||||
(1.0 / 1000).must_be_within_epsilon 0.0, 0.000001, "msg"
|
||||
end
|
||||
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 MiniTest::Assertion
|
||||
end
|
||||
|
||||
it "needs to verify throw" do
|
||||
@assertion_count = 6
|
||||
assert_triggered "Expected 1 (oid=N) to be the same as 2 (oid=N)." do
|
||||
1.must_be_same_as 2
|
||||
end
|
||||
|
||||
proc { throw :blah }.must_throw(:blah).must_equal true
|
||||
proc { proc { }.must_throw(:blah) }.must_raise MiniTest::Assertion
|
||||
proc { proc { throw :xxx }.must_throw(:blah) }.must_raise MiniTest::Assertion
|
||||
assert_triggered "msg.\nExpected 1 (oid=N) to be the same as 2 (oid=N)." do
|
||||
1.must_be_same_as 2, "msg"
|
||||
end
|
||||
end
|
||||
|
||||
it "needs to verify inequality" do
|
||||
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
|
||||
|
||||
it "needs to verify mismatch" do
|
||||
@assertion_count = 6
|
||||
@assertion_count += 3 # match is 2
|
||||
|
||||
"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
|
||||
|
||||
it "needs to verify using any (negative) predicate" do
|
||||
"blah".wont_be(:empty?).must_equal false
|
||||
proc { "".wont_be(:empty?) }.must_raise MiniTest::Assertion
|
||||
it "needs to verify nil" do
|
||||
nil.must_be_nil.must_equal true
|
||||
|
||||
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
|
||||
|
||||
it "needs to verify non-nil" do
|
||||
42.wont_be_nil.must_equal false
|
||||
proc { nil.wont_be_nil }.must_raise MiniTest::Assertion
|
||||
it "needs to verify non-emptyness" do
|
||||
@assertion_count += 3 # empty is 2 assertions
|
||||
|
||||
['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
|
||||
|
||||
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 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
|
||||
|
||||
it "needs to verify output in stdout" do
|
||||
proc { print "blah" }.must_output("blah").must_equal true
|
||||
it "needs to verify non-nil" do
|
||||
42.wont_be_nil.must_equal false
|
||||
|
||||
proc {
|
||||
proc { print "xxx" }.must_output("blah")
|
||||
}.must_raise MiniTest::Assertion
|
||||
assert_triggered "Expected nil to not be nil." do
|
||||
nil.wont_be_nil
|
||||
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
|
||||
|
||||
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 {
|
||||
assert_triggered "In stderr.\nExpected: \"blah\"\n Actual: \"xxx\"" do
|
||||
proc { $stderr.print "xxx" }.must_output(nil, "blah")
|
||||
}.must_raise MiniTest::Assertion
|
||||
end
|
||||
end
|
||||
|
||||
it "needs to ensure silence" do
|
||||
@assertion_count = 5
|
||||
it "needs to verify output in stdout" do
|
||||
@assertion_count -= 1 # no msg
|
||||
|
||||
proc { }.must_be_silent.must_equal true
|
||||
proc { print "blah" }.must_output("blah").must_equal true
|
||||
|
||||
proc {
|
||||
proc { print "xxx" }.must_be_silent
|
||||
}.must_raise MiniTest::Assertion
|
||||
assert_triggered "In stdout.\nExpected: \"blah\"\n Actual: \"xxx\"" do
|
||||
proc { print "xxx" }.must_output("blah")
|
||||
end
|
||||
end
|
||||
|
||||
it "needs to be sensible about must_include order" do
|
||||
@assertion_count = 6
|
||||
[1, 2, 3].must_include(2).must_equal true
|
||||
proc { [1, 2, 3].must_include 5 }.must_raise MiniTest::Assertion
|
||||
it "needs to verify regexp matches" do
|
||||
@assertion_count += 3 # must_match is 2 assertions
|
||||
|
||||
"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
|
||||
|
||||
it "needs to be sensible about wont_include order" do
|
||||
@assertion_count = 6
|
||||
[1, 2, 3].wont_include(5).must_equal false
|
||||
proc { [1, 2, 3].wont_include 2 }.must_raise MiniTest::Assertion
|
||||
it "needs to verify throw" do
|
||||
@assertion_count += 2 # 2 extra tests
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
describe MiniTest::Spec, :let do
|
||||
|
@ -381,17 +686,21 @@ class TestMeta < MiniTest::Unit::TestCase
|
|||
end
|
||||
|
||||
def test_describe_first_structure
|
||||
x = y = z = nil
|
||||
x = x1 = x2 = y = z = nil
|
||||
x = describe "top-level thingy" do
|
||||
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
|
||||
end
|
||||
|
||||
assert_equal ['test_0001_top_level_it'],
|
||||
x.instance_methods.grep(/^test/).map {|o| o.to_s}
|
||||
test_methods = ['test_0001_top_level_it', 'test_0002_не_латинские_буквы_и_спецсимволы_いった_α_β_γ_δ_ε_hello_world'].sort
|
||||
|
||||
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 [], z.instance_methods.grep(/^test/)
|
||||
end
|
||||
|
|
|
@ -1,18 +1,18 @@
|
|||
# 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 'stringio'
|
||||
require 'pathname'
|
||||
require 'minitest/autorun'
|
||||
require 'test/minitest/metametameta'
|
||||
|
||||
module MyModule; end
|
||||
class AnError < StandardError; include MyModule; 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))
|
||||
basedir = Pathname.new(File.expand_path("lib/minitest")) + 'mini'
|
||||
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: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
|
||||
exception = MiniTest::Assertion.new "Oh no!"
|
||||
exception.set_backtrace ["unhappy"]
|
||||
|
@ -235,21 +203,23 @@ Finished tests in 0.00
|
|||
|
||||
@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:
|
||||
test_error(ATestCase):
|
||||
RuntimeError: unhandled exception
|
||||
FILE:LINE:in `test_error'
|
||||
1) Error:
|
||||
test_error(ATestCase):
|
||||
RuntimeError: unhandled exception
|
||||
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
|
||||
end
|
||||
|
||||
|
@ -506,10 +476,82 @@ Finished tests in 0.00
|
|||
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
|
||||
call_order = []
|
||||
|
||||
tc = Class.new(MiniTest::Unit::TestCase) do
|
||||
tc = Class.new(MiniTest::Spec) do
|
||||
define_method :setup do
|
||||
super()
|
||||
call_order << :method
|
||||
|
@ -546,7 +588,7 @@ Finished tests in 0.00
|
|||
def test_teardown_hooks
|
||||
call_order = []
|
||||
|
||||
tc = Class.new(MiniTest::Unit::TestCase) do
|
||||
tc = Class.new(MiniTest::Spec) do
|
||||
define_method :teardown do
|
||||
super()
|
||||
call_order << :method
|
||||
|
@ -583,7 +625,7 @@ Finished tests in 0.00
|
|||
def test_setup_and_teardown_hooks_survive_inheritance
|
||||
call_order = []
|
||||
|
||||
parent = Class.new(MiniTest::Unit::TestCase) do
|
||||
parent = Class.new(MiniTest::Spec) do
|
||||
define_method :setup do
|
||||
super()
|
||||
call_order << :setup_method
|
||||
|
@ -626,7 +668,11 @@ Finished tests in 0.00
|
|||
end
|
||||
|
||||
class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
||||
RUBY18 = ! defined? Encoding
|
||||
|
||||
def setup
|
||||
super
|
||||
|
||||
MiniTest::Unit::TestCase.reset
|
||||
|
||||
@tc = MiniTest::Unit::TestCase.new 'fake tc'
|
||||
|
@ -659,15 +705,22 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|||
end
|
||||
|
||||
def test_assert_block
|
||||
@tc.assert_block do
|
||||
true
|
||||
exp = ["NOTE: MiniTest::Unit::TestCase#assert_block is deprecated,",
|
||||
"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
|
||||
|
||||
def test_assert_block_triggered
|
||||
util_assert_triggered "blah.\nExpected block to return true value." do
|
||||
@tc.assert_block "blah" do
|
||||
false
|
||||
assert_output do
|
||||
util_assert_triggered "blah.\nExpected block to return true value." do
|
||||
@tc.assert_block "blah" do
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -804,13 +857,13 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|||
end
|
||||
|
||||
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
|
||||
end
|
||||
end
|
||||
|
||||
def test_assert_in_epsilon
|
||||
@assertion_count = 8
|
||||
@assertion_count = 10
|
||||
|
||||
@tc.assert_in_epsilon 10000, 9991
|
||||
@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 1.0, 1.0001, 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
|
||||
|
||||
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
|
||||
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
|
||||
@assertion_count = 2
|
||||
|
||||
|
@ -871,7 +934,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|||
@tc.assert_match(/\w+/, "blah blah blah")
|
||||
end
|
||||
|
||||
def test_assert_match_object
|
||||
def test_assert_match_matcher_object
|
||||
@assertion_count = 2
|
||||
|
||||
pattern = Object.new
|
||||
|
@ -880,6 +943,15 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|||
@tc.assert_match pattern, 5
|
||||
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
|
||||
@assertion_count = 2
|
||||
|
||||
|
@ -956,7 +1028,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|||
end
|
||||
|
||||
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
|
||||
print "boo"
|
||||
$stderr.print "blah blah"
|
||||
|
@ -980,12 +1052,28 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|||
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
|
||||
@tc.assert_raises RuntimeError do
|
||||
raise "blah"
|
||||
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
|
||||
# ugly) test code in ruby-core:
|
||||
|
@ -1006,12 +1094,6 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
def test_assert_raises_module
|
||||
@tc.assert_raises MyModule do
|
||||
raise AnError
|
||||
end
|
||||
end
|
||||
|
||||
def test_assert_raises_triggered_different
|
||||
e = assert_raises MiniTest::Assertion do
|
||||
@tc.assert_raises RuntimeError do
|
||||
|
@ -1039,13 +1121,15 @@ FILE:LINE:in `test_assert_raises_triggered_different'
|
|||
end
|
||||
end
|
||||
|
||||
expected = "XXX
|
||||
[RuntimeError] exception expected, not
|
||||
Class: <SyntaxError>
|
||||
Message: <\"icky\">
|
||||
---Backtrace---
|
||||
FILE:LINE:in `test_assert_raises_triggered_different_msg'
|
||||
---------------"
|
||||
expected = <<-EOM.gsub(/^ {6}/, '').chomp
|
||||
XXX.
|
||||
[RuntimeError] exception expected, not
|
||||
Class: <SyntaxError>
|
||||
Message: <\"icky\">
|
||||
---Backtrace---
|
||||
FILE:LINE:in `test_assert_raises_triggered_different_msg'
|
||||
---------------
|
||||
EOM
|
||||
|
||||
actual = e.message.gsub(/^.+:\d+/, 'FILE:LINE')
|
||||
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
|
||||
|
||||
expected = "XXX\nMiniTest::Assertion expected but nothing was raised."
|
||||
expected = "XXX.\nMiniTest::Assertion expected but nothing was raised."
|
||||
|
||||
assert_equal expected, e.message
|
||||
end
|
||||
|
@ -1150,8 +1234,6 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
|
|||
end
|
||||
|
||||
def test_assert_silent_triggered_err
|
||||
@assertion_count = 2
|
||||
|
||||
util_assert_triggered util_msg("", "blah blah", "In stderr") do
|
||||
@tc.assert_silent do
|
||||
$stderr.print "blah blah"
|
||||
|
@ -1160,6 +1242,8 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
|
|||
end
|
||||
|
||||
def test_assert_silent_triggered_out
|
||||
@assertion_count = 2
|
||||
|
||||
util_assert_triggered util_msg("", "blah blah", "In stdout") do
|
||||
@tc.assert_silent do
|
||||
print "blah blah"
|
||||
|
@ -1211,10 +1295,15 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
|
|||
methods = MiniTest::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_raised
|
||||
assert_nothing_thrown assert_output assert_raise
|
||||
assert_raises assert_send assert_silent assert_throws)
|
||||
# These don't have corresponding refutes _on purpose_. They're
|
||||
# useless and will never be added, so don't bother.
|
||||
ignores = %w[assert_block assert_output assert_raises assert_send
|
||||
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
|
||||
refutes = methods.grep(/^refute/).sort - ignores
|
||||
|
@ -1252,6 +1341,12 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
|
|||
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
|
||||
util_assert_triggered 'Epic Fail!' do
|
||||
@tc.flunk
|
||||
|
@ -1317,7 +1412,7 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
|
|||
end
|
||||
|
||||
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
|
||||
end
|
||||
end
|
||||
|
@ -1327,7 +1422,7 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
|
|||
end
|
||||
|
||||
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
|
||||
fail
|
||||
end
|
||||
|
@ -1375,7 +1470,7 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
|
|||
@tc.refute_match(/\d+/, "blah blah blah")
|
||||
end
|
||||
|
||||
def test_refute_match_object
|
||||
def test_refute_match_matcher_object
|
||||
@assertion_count = 2
|
||||
@tc.refute_match Object.new, 5 # default #=~ returns false
|
||||
end
|
||||
|
@ -1409,6 +1504,16 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
|
|||
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
|
||||
@tc.refute_operator 2, :<, 1
|
||||
end
|
||||
|
@ -1482,6 +1587,28 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
|
|||
assert_equal expected, sample_test_case.test_methods
|
||||
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
|
||||
e = assert_raises(klass) do
|
||||
yield
|
||||
|
@ -1508,3 +1635,25 @@ FILE:LINE:in `test_assert_raises_triggered_subclass'
|
|||
MiniTest::Assertions.diff = old_diff
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue