From a213c2ed9c84f0f64f0664e820227034d078f9f9 Mon Sep 17 00:00:00 2001 From: ryan Date: Wed, 9 May 2012 04:09:25 +0000 Subject: [PATCH] Imported minitest 3.0.0 (r7435) w/ fixes for rubygems. 10955 tests, 2253343 assertions, 1 failures, 1 errors, 28 skips minus drb tests on x86_64-darwin11.3.0 and reviewed by drbrain git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35601 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 +++ lib/minitest/README.txt | 18 +++++- lib/minitest/mock.rb | 38 ++++++++++++ lib/minitest/unit.rb | 12 ++-- test/minitest/metametameta.rb | 4 +- test/minitest/test_minitest_mock.rb | 59 ++++++++++++++++++ test/minitest/test_minitest_unit.rb | 18 ++---- test/rubygems/test_gem_platform.rb | 77 +++++++++++++----------- test/rubygems/test_gem_remote_fetcher.rb | 17 +++--- 9 files changed, 184 insertions(+), 67 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8991c59528..c88beb66e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Wed May 9 08:09:38 2012 Ryan Davis + + * lib/minitest/*: Imported minitest 3.0.0 (r7435) + * test/minitest/*: ditto + * test/rubygems/*: Imported fixes for buggy use of assert_match + and deprecated assert_block + UNBUNCH YOUR PANTIES. THE TESTS DO NOT RUN CLEAN ON OSX. + Wed May 9 06:28:59 2012 Eric Hodel * re.c (rb_reg_equal): Removed incorrect example for Regexp#== with diff --git a/lib/minitest/README.txt b/lib/minitest/README.txt index 8c33c0aa52..9029354921 100644 --- a/lib/minitest/README.txt +++ b/lib/minitest/README.txt @@ -33,8 +33,8 @@ algorithms in a repeatable manner. Now you can assert that your newb co-worker doesn't replace your linear algorithm with an exponential one! -minitest/mock by Steven Baker, is a beautifully tiny mock object -framework. +minitest/mock by Steven Baker, is a beautifully tiny mock (and stub) +object framework. minitest/pride shows pride in testing and adds coloring to your test output. I guess it is an example of how to write IO pipes too. :P @@ -54,7 +54,7 @@ discovery. * minitest/autorun - the easy and explicit way to run all your tests. * minitest/unit - a very fast, simple, and clean test system. * minitest/spec - a very fast, simple, and clean spec system. -* minitest/mock - a simple and clean mock system. +* minitest/mock - a simple and clean mock/stub system. * minitest/benchmark - an awesome way to assert your algorithm's performance. * minitest/pride - show your pride in testing! * Incredibly small and fast runner, but no bells and whistles. @@ -194,6 +194,18 @@ Output is tab-delimited to make it easy to paste into a spreadsheet. end end +=== Stubs + + def test_stale_eh + obj_under_test = Something.new + + refute obj_under_test.stale? + + Time.stub :now, Time.at(0) do # stub goes away once the block is done + assert obj_under_test.stale? + end + end + === Customizable Test Runner Types: MiniTest::Unit.runner=(runner) provides an easy way of creating custom diff --git a/lib/minitest/mock.rb b/lib/minitest/mock.rb index 55b0095c0b..ec36d775cc 100644 --- a/lib/minitest/mock.rb +++ b/lib/minitest/mock.rb @@ -132,3 +132,41 @@ module MiniTest end end end + +class Object # :nodoc: + + ## + # Add a temporary stubbed method replacing +name+ for the duration + # of the +block+. If +val_or_callable+ responds to #call, then it + # returns the result of calling it, otherwise returns the value + # as-is. Cleans up the stub at the end of the +block+. + # + # def test_stale_eh + # obj_under_test = Something.new + # refute obj_under_test.stale? + # + # Time.stub :now, Time.at(0) do + # assert obj_under_test.stale? + # end + # end + + def stub name, val_or_callable, &block + new_name = "__minitest_stub__#{name}" + + metaclass = class << self; self; end + metaclass.send :alias_method, new_name, name + metaclass.send :define_method, name do |*args| + if val_or_callable.respond_to? :call then + val_or_callable.call(*args) + else + val_or_callable + end + end + + yield + ensure + metaclass.send :undef_method, name + metaclass.send :alias_method, name, new_name + metaclass.send :undef_method, new_name + end +end diff --git a/lib/minitest/unit.rb b/lib/minitest/unit.rb index 9d9439c552..50c1fac94b 100644 --- a/lib/minitest/unit.rb +++ b/lib/minitest/unit.rb @@ -193,7 +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." + warn "NOTE: MiniTest::Unit::TestCase#assert_block is deprecated, use assert. It will be removed on or after 2012-06-01. Called from #{caller.first}" msg = message(msg) { "Expected block to return true value" } assert yield, msg end @@ -281,8 +281,8 @@ module MiniTest def assert_match matcher, obj, msg = nil msg = message(msg) { "Expected #{mu_pp matcher} to match #{mu_pp obj}" } - assert_respond_to obj, :"=~" - matcher = Regexp.new Regexp.escape matcher if String === matcher and obj.respond_to?(:to_str) + assert_respond_to matcher, :"=~" + matcher = Regexp.new Regexp.escape matcher if String === matcher assert matcher =~ obj, msg end @@ -582,8 +582,8 @@ module MiniTest def refute_match matcher, obj, msg = nil msg = message(msg) {"Expected #{mu_pp matcher} to not match #{mu_pp obj}"} - assert_respond_to obj, :"=~" - matcher = Regexp.new Regexp.escape matcher if String === matcher and obj.respond_to?(:to_str) + assert_respond_to matcher, :"=~" + matcher = Regexp.new Regexp.escape matcher if String === matcher refute matcher =~ obj, msg end @@ -652,7 +652,7 @@ module MiniTest end class Unit # :nodoc: - VERSION = "2.12.1" # :nodoc: + VERSION = "3.0.0" # :nodoc: attr_accessor :report, :failures, :errors, :skips # :nodoc: attr_accessor :test_count, :assertion_count # :nodoc: diff --git a/test/minitest/metametameta.rb b/test/minitest/metametameta.rb index 035ee77ab4..609e551ff5 100644 --- a/test/minitest/metametameta.rb +++ b/test/minitest/metametameta.rb @@ -26,13 +26,15 @@ class MetaMetaMetaTestCase < MiniTest::Unit::TestCase output = @output.string.dup output.sub!(/Finished tests in .*/, "Finished tests in 0.00") output.sub!(/Loaded suite .*/, 'Loaded suite blah') - if /mswin|mingw/ =~ RUBY_PLATFORM + + if windows? then output.gsub!(/\[(?:[A-Za-z]:)?[^\]:]+:\d+\]/, '[FILE:LINE]') output.gsub!(/^(\s+)(?:[A-Za-z]:)?[^:]+:\d+:in/, '\1FILE:LINE:in') else output.gsub!(/\[[^\]:]+:\d+\]/, '[FILE:LINE]') output.gsub!(/^(\s+)[^:]+:\d+:in/, '\1FILE:LINE:in') end + assert_equal(expected, output) end diff --git a/test/minitest/test_minitest_mock.rb b/test/minitest/test_minitest_mock.rb index 02321e0f97..dcb140851a 100644 --- a/test/minitest/test_minitest_mock.rb +++ b/test/minitest/test_minitest_mock.rb @@ -210,3 +210,62 @@ class TestMiniTestMock < MiniTest::Unit::TestCase assert_equal exp, e.message end end + +require "test/minitest/metametameta" + +class TestMiniTestStub < MiniTest::Unit::TestCase + def setup + super + MiniTest::Unit::TestCase.reset + + @tc = MiniTest::Unit::TestCase.new 'fake tc' + @assertion_count = 1 + end + + def teardown + super + assert_equal @assertion_count, @tc._assertions + end + + def assert_stub val_or_callable + @assertion_count += 1 + + t = Time.now.to_i + + Time.stub :now, val_or_callable do + @tc.assert_equal 42, Time.now + end + + @tc.assert_operator Time.now.to_i, :>=, t + end + + def test_stub_value + assert_stub 42 + end + + def test_stub_block + assert_stub lambda { 42 } + end + + def test_stub_block_args + @assertion_count += 1 + + t = Time.now.to_i + + Time.stub :now, lambda { |n| n * 2 } do + @tc.assert_equal 42, Time.now(21) + end + + @tc.assert_operator Time.now.to_i, :>=, t + end + + def test_stub_callable + obj = Object.new + + def obj.call + 42 + end + + assert_stub obj + end +end diff --git a/test/minitest/test_minitest_unit.rb b/test/minitest/test_minitest_unit.rb index 1707810a4f..e13890f32f 100644 --- a/test/minitest/test_minitest_unit.rb +++ b/test/minitest/test_minitest_unit.rb @@ -6,7 +6,7 @@ ###################################################################### require 'pathname' -require File.expand_path('../metametameta', __FILE__) +require 'test/minitest/metametameta' module MyModule; end class AnError < StandardError; include MyModule; end @@ -706,13 +706,16 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase def test_assert_block exp = ["NOTE: MiniTest::Unit::TestCase#assert_block is deprecated,", - "use assert. It will be removed on or after 2012-06-01.\n"].join " " + "use assert. It will be removed on or after 2012-06-01."].join " " - assert_output "", exp do + out, err = capture_io do @tc.assert_block do true end end + + assert_equal "", out + assert_match exp, err end def test_assert_block_triggered @@ -952,15 +955,6 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase @tc.assert_match "blah", obj end - def test_assert_match_matchee_match - @assertion_count = 2 - - obj = Object.new - def obj.=~(o); true end - - @tc.assert_match "blah", obj - end - def test_assert_match_object_triggered @assertion_count = 2 diff --git a/test/rubygems/test_gem_platform.rb b/test/rubygems/test_gem_platform.rb index f3b94ea83d..0350d5f028 100644 --- a/test/rubygems/test_gem_platform.rb +++ b/test/rubygems/test_gem_platform.rb @@ -207,64 +207,71 @@ class TestGemPlatform < Gem::TestCase def test_equals_tilde util_set_arch 'i386-mswin32' - assert_match 'mswin32', Gem::Platform.local - assert_match 'i386-mswin32', Gem::Platform.local + assert_local_match 'mswin32' + assert_local_match 'i386-mswin32' # oddballs - assert_match 'i386-mswin32-mq5.3', Gem::Platform.local - assert_match 'i386-mswin32-mq6', Gem::Platform.local - refute_match 'win32-1.8.2-VC7', Gem::Platform.local - refute_match 'win32-1.8.4-VC6', Gem::Platform.local - refute_match 'win32-source', Gem::Platform.local - refute_match 'windows', Gem::Platform.local + assert_local_match 'i386-mswin32-mq5.3' + assert_local_match 'i386-mswin32-mq6' + refute_local_match 'win32-1.8.2-VC7' + refute_local_match 'win32-1.8.4-VC6' + refute_local_match 'win32-source' + refute_local_match 'windows' util_set_arch 'i686-linux' - assert_match 'i486-linux', Gem::Platform.local - assert_match 'i586-linux', Gem::Platform.local - assert_match 'i686-linux', Gem::Platform.local + assert_local_match 'i486-linux' + assert_local_match 'i586-linux' + assert_local_match 'i686-linux' util_set_arch 'i686-darwin8' - assert_match 'i686-darwin8.4.1', Gem::Platform.local - assert_match 'i686-darwin8.8.2', Gem::Platform.local + assert_local_match 'i686-darwin8.4.1' + assert_local_match 'i686-darwin8.8.2' util_set_arch 'java' - assert_match 'java', Gem::Platform.local - assert_match 'jruby', Gem::Platform.local + assert_local_match 'java' + assert_local_match 'jruby' util_set_arch 'universal-dotnet2.0' - assert_match 'universal-dotnet', Gem::Platform.local - assert_match 'universal-dotnet-2.0', Gem::Platform.local - refute_match 'universal-dotnet-4.0', Gem::Platform.local - assert_match 'dotnet', Gem::Platform.local - assert_match 'dotnet-2.0', Gem::Platform.local - refute_match 'dotnet-4.0', Gem::Platform.local + assert_local_match 'universal-dotnet' + assert_local_match 'universal-dotnet-2.0' + refute_local_match 'universal-dotnet-4.0' + assert_local_match 'dotnet' + assert_local_match 'dotnet-2.0' + refute_local_match 'dotnet-4.0' util_set_arch 'universal-dotnet4.0' - assert_match 'universal-dotnet', Gem::Platform.local - refute_match 'universal-dotnet-2.0', Gem::Platform.local - assert_match 'universal-dotnet-4.0', Gem::Platform.local - assert_match 'dotnet', Gem::Platform.local - refute_match 'dotnet-2.0', Gem::Platform.local - assert_match 'dotnet-4.0', Gem::Platform.local + assert_local_match 'universal-dotnet' + refute_local_match 'universal-dotnet-2.0' + assert_local_match 'universal-dotnet-4.0' + assert_local_match 'dotnet' + refute_local_match 'dotnet-2.0' + assert_local_match 'dotnet-4.0' util_set_arch 'universal-macruby-1.0' - assert_match 'universal-macruby', Gem::Platform.local - assert_match 'macruby', Gem::Platform.local - refute_match 'universal-macruby-0.10', Gem::Platform.local - assert_match 'universal-macruby-1.0', Gem::Platform.local + assert_local_match 'universal-macruby' + assert_local_match 'macruby' + refute_local_match 'universal-macruby-0.10' + assert_local_match 'universal-macruby-1.0' util_set_arch 'powerpc-darwin' - assert_match 'powerpc-darwin', Gem::Platform.local + assert_local_match 'powerpc-darwin' util_set_arch 'powerpc-darwin7' - assert_match 'powerpc-darwin7.9.0', Gem::Platform.local + assert_local_match 'powerpc-darwin7.9.0' util_set_arch 'powerpc-darwin8' - assert_match 'powerpc-darwin8.10.0', Gem::Platform.local + assert_local_match 'powerpc-darwin8.10.0' util_set_arch 'sparc-solaris2.8' - assert_match 'sparc-solaris2.8-mq5.3', Gem::Platform.local + assert_local_match 'sparc-solaris2.8-mq5.3' end + def assert_local_match name + assert_match Gem::Platform.local, name + end + + def refute_local_match name + refute_match Gem::Platform.local, name + end end diff --git a/test/rubygems/test_gem_remote_fetcher.rb b/test/rubygems/test_gem_remote_fetcher.rb index 495c28727c..30d49f61cb 100644 --- a/test/rubygems/test_gem_remote_fetcher.rb +++ b/test/rubygems/test_gem_remote_fetcher.rb @@ -1,10 +1,7 @@ require 'rubygems/test_case' require 'ostruct' require 'webrick' -begin - require 'webrick/https' -rescue LoadError -end +require 'webrick/https' require 'rubygems/remote_fetcher' require 'rubygems/format' @@ -752,7 +749,7 @@ gems: with_configured_fetcher(":ssl_ca_cert: #{temp_ca_cert}") do |fetcher| fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml") end - end if defined?(OpenSSL::PKey) + end def test_do_not_allow_insecure_ssl_connection_by_default ssl_server = self.class.start_ssl_server @@ -761,14 +758,14 @@ gems: fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml") end end - end if defined?(OpenSSL::PKey) + end def test_ssl_connection_allow_verify_none ssl_server = self.class.start_ssl_server with_configured_fetcher(":ssl_verify_mode: 0") do |fetcher| fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml") end - end if defined?(OpenSSL::PKey) + end def test_do_not_follow_insecure_redirect ssl_server = self.class.start_ssl_server @@ -778,7 +775,7 @@ gems: fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/insecure_redirect?to=#{@server_uri}") end end - end if defined?(OpenSSL::PKey) + end def with_configured_fetcher(config_str = nil, &block) if config_str @@ -856,7 +853,7 @@ gems: end DIR = File.expand_path(File.dirname(__FILE__)) - DH_PARAM = defined?(OpenSSL::PKey) ? OpenSSL::PKey::DH.new(128) : nil + DH_PARAM = OpenSSL::PKey::DH.new(128) def start_ssl_server(config = {}) null_logger = NilLog.new @@ -894,7 +891,7 @@ gems: end end server - end if DH_PARAM + end