From 9694bb8cac12969300692dac5a1cf7aa4e3a46cd Mon Sep 17 00:00:00 2001 From: drbrain Date: Thu, 29 Nov 2012 06:52:18 +0000 Subject: * lib/rubygems*: Updated to RubyGems 2.0 * test/rubygems*: ditto. * common.mk (prelude): Updated for RubyGems 2.0 source rearrangement. * tool/change_maker.rb: Allow invalid UTF-8 characters in source files. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37976 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/rubygems/test_require.rb | 193 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 test/rubygems/test_require.rb (limited to 'test/rubygems/test_require.rb') diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb new file mode 100644 index 0000000000..9484901581 --- /dev/null +++ b/test/rubygems/test_require.rb @@ -0,0 +1,193 @@ +require 'rubygems/test_case' +require 'rubygems' + +class TestGemRequire < Gem::TestCase + def assert_require(path) + assert require(path), "'#{path}' was already required" + end + + def test_require_is_not_lazy_with_exact_req + a1 = new_spec "a", "1", {"b" => "= 1"}, "lib/a.rb" + b1 = new_spec "b", "1", nil, "lib/b/c.rb" + b2 = new_spec "b", "2", nil, "lib/b/c.rb" + + install_specs a1, b1, b2 + + save_loaded_features do + assert_require 'a' + assert_equal %w(a-1 b-1), loaded_spec_names + assert_equal unresolved_names, [] + + assert_require "b/c" + assert_equal %w(a-1 b-1), loaded_spec_names + end + end + + def test_require_is_lazy_with_inexact_req + a1 = new_spec "a", "1", {"b" => ">= 1"}, "lib/a.rb" + b1 = new_spec "b", "1", nil, "lib/b/c.rb" + b2 = new_spec "b", "2", nil, "lib/b/c.rb" + + install_specs a1, b1, b2 + + save_loaded_features do + assert_require 'a' + assert_equal %w(a-1), loaded_spec_names + assert_equal unresolved_names, ["b (>= 1)"] + + assert_require "b/c" + assert_equal %w(a-1 b-2), loaded_spec_names + end + end + + def test_require_is_not_lazy_with_one_possible + a1 = new_spec "a", "1", {"b" => ">= 1"}, "lib/a.rb" + b1 = new_spec "b", "1", nil, "lib/b/c.rb" + + install_specs a1, b1 + + save_loaded_features do + assert_require 'a' + assert_equal %w(a-1 b-1), loaded_spec_names + assert_equal unresolved_names, [] + + assert_require "b/c" + assert_equal %w(a-1 b-1), loaded_spec_names + end + end + + def test_activate_via_require_respects_loaded_files + save_loaded_features do + require 'benchmark' # stdlib + + a1 = new_spec "a", "1", {"b" => ">= 1"}, "lib/a.rb" + b1 = new_spec "b", "1", nil, "lib/benchmark.rb" + b2 = new_spec "b", "2", nil, "lib/benchmark.rb" + + install_specs a1, b1, b2 + + require 'a' + assert_equal unresolved_names, ["b (>= 1)"] + + refute require('benchmark'), "benchmark should have already been loaded" + + # We detected that we should activate b-2, so we did so, but + # then original_require decided "I've already got benchmark.rb" loaded. + # This case is fine because our lazy loading is provided exactly + # the same behavior as eager loading would have. + + assert_equal %w(a-1 b-2), loaded_spec_names + end + end + + def test_already_activated_direct_conflict + save_loaded_features do + a1 = new_spec "a", "1", { "b" => "> 0" } + b1 = new_spec "b", "1", { "c" => ">= 1" }, "lib/ib.rb" + b2 = new_spec "b", "2", { "c" => ">= 2" }, "lib/ib.rb" + c1 = new_spec "c", "1", nil, "lib/d.rb" + c2 = new_spec("c", "2", nil, "lib/d.rb") + + install_specs a1, b1, b2, c1, c2 + + a1.activate + c1.activate + assert_equal %w(a-1 c-1), loaded_spec_names + assert_equal ["b (> 0)"], unresolved_names + + assert require("ib") + + assert_equal %w(a-1 b-1 c-1), loaded_spec_names + assert_equal [], unresolved_names + end + end + + def test_multiple_gems_with_the_same_path + save_loaded_features do + a1 = new_spec "a", "1", { "b" => "> 0", "x" => "> 0" } + b1 = new_spec "b", "1", { "c" => ">= 1" }, "lib/ib.rb" + b2 = new_spec "b", "2", { "c" => ">= 2" }, "lib/ib.rb" + x1 = new_spec "x", "1", nil, "lib/ib.rb" + x2 = new_spec "x", "2", nil, "lib/ib.rb" + c1 = new_spec "c", "1", nil, "lib/d.rb" + c2 = new_spec("c", "2", nil, "lib/d.rb") + + install_specs a1, b1, b2, c1, c2, x1, x2 + + a1.activate + c1.activate + assert_equal %w(a-1 c-1), loaded_spec_names + assert_equal ["b (> 0)", "x (> 0)"], unresolved_names + + e = assert_raises(Gem::LoadError) do + require("ib") + end + + assert_equal "ib found in multiple gems: b, x", e.message + end + end + + def test_unable_to_find_good_unresolved_version + save_loaded_features do + a1 = new_spec "a", "1", { "b" => "> 0" } + b1 = new_spec "b", "1", { "c" => ">= 2" }, "lib/ib.rb" + b2 = new_spec "b", "2", { "c" => ">= 3" }, "lib/ib.rb" + + c1 = new_spec "c", "1", nil, "lib/d.rb" + c2 = new_spec "c", "2", nil, "lib/d.rb" + c3 = new_spec "c", "3", nil, "lib/d.rb" + + install_specs a1, b1, b2, c1, c2, c3 + + a1.activate + c1.activate + assert_equal %w(a-1 c-1), loaded_spec_names + assert_equal ["b (> 0)"], unresolved_names + + e = assert_raises(Gem::LoadError) do + require("ib") + end + + assert_equal "unable to find a version of 'b' to activate", e.message + end + end + + def test_default_gem_only + save_loaded_features do + default_gem_spec = new_default_spec("default", "2.0.0.0", + nil, "default/gem.rb") + install_default_specs(default_gem_spec) + assert_require "default/gem" + assert_equal %w(default-2.0.0.0), loaded_spec_names + end + end + + def test_default_gem_and_normal_gem + save_loaded_features do + default_gem_spec = new_default_spec("default", "2.0.0.0", + nil, "default/gem.rb") + install_default_specs(default_gem_spec) + normal_gem_spec = new_spec("default", "3.0", nil, + "lib/default/gem.rb") + install_specs(normal_gem_spec) + assert_require "default/gem" + assert_equal %w(default-3.0), loaded_spec_names + end + end + + def loaded_spec_names + Gem.loaded_specs.values.map(&:full_name).sort + end + + def unresolved_names + Gem::Specification.unresolved_deps.values.map(&:to_s).sort + end + + def save_loaded_features + old_loaded_features = $LOADED_FEATURES.dup + yield + ensure + $LOADED_FEATURES.replace old_loaded_features + end + +end -- cgit v1.2.3