edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Interop/spec_helper.rb;C645339
File: spec_helper.rb
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Interop/spec_helper.rb;C645339  (server)    1/23/2009 3:57 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Interop/spec_helper.rb;netinterop1
@@ -13,6 +13,26 @@
     require 'mspec/matchers/equal_utf16'
     require 'mspec/matchers/match_yaml'
 
+    # Code to setup HOME directory correctly on Windows
+    # This duplicates Ruby 1.9 semantics for defining HOME
+    platform_is :windows do
+      if ENV['HOME']
+        ENV['HOME'] = ENV['HOME'].tr '\\', '/'
+      elsif ENV['HOMEDIR'] && ENV['HOMEDRIVE']
+        ENV['HOME'] = File.join(ENV['HOMEDRIVE'], ENV['HOMEDIR'])
+      elsif ENV['HOMEDIR']
+        ENV['HOME'] = ENV['HOMEDIR']
+      elsif ENV['HOMEDRIVE']
+        ENV['HOME'] = ENV['HOMEDRIVE']
+      elsif ENV['USERPROFILE']
+        ENV['HOME'] = ENV['USERPROFILE']
+      else
+        puts "No suitable HOME environment found. This means that all of"
+        puts "HOME, HOMEDIR, HOMEDRIVE, and USERPROFILE are not set"
+        exit 1
+      end
+    end
+
     TOLERANCE = 0.00003 unless Object.const_defined?(:TOLERANCE)
   rescue LoadError
     puts "Please install the MSpec gem to run the specs."
@@ -20,18 +40,12 @@
   end
 end
 
-v = MSpec::VERSION.split('.').collect { |d| "1%02d" % d.to_i }.join.to_i
-unless v >= 101104100
-  puts "Please install MSpec version >= 1.4.0 to run the specs"
+minimum_version = "1.5.6"
+unless MSpec::VERSION >= minimum_version
+  puts "Please install MSpec version >= #{minimum_version} to run the specs"
   exit 1
 end
 
 $VERBOSE = nil unless ENV['OUTPUT_WARNINGS']
 
-def has_tty?
-  if STDOUT.tty? then
-    yield
-  end
-end
-
 $: << (ENV["MERLIN_ROOT"] + "\\Bin\\Debug")
===================================================================
add: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Interop/load/custom_assembly_spec.rb
File: custom_assembly_spec.rb
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Interop/load/custom_assembly_spec.rb;netinterop1
@@ -1,0 +1,209 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+require 'ironruby'
+
+describe "Single time loading of custom assembly" do
+  before :each do
+    @engine = IronRuby.create_engine
+    str = "$: << '#{ENV["MERLIN_ROOT"] + "\\Bin\\Debug\\"}'".gsub("\\", "/")
+    @engine.execute(str)
+  end
+
+  after :each do
+    #TODO: Does this release the engine enough to allow GC? We don't want a
+    #ton of wasted interpreters hanging around.
+    @engine = nil
+  end
+
+  it "works via require" do
+    @engine.execute("require 'rowantest.baseclasscs'")
+    @engine.execute("$\"").should == ['rowantest.baseclasscs.dll']
+  end
+
+  it "works via load" do
+    @engine.execute("load 'rowantest.baseclasscs.dll'")
+    lambda {@engine.execute("Merlin::Testing::BaseClass::EmptyClass")}.should_not raise_error(NameError)
+  end
+
+  it "works via load_assembly" do
+    lambda {@engine.execute("load_assembly 'rowantest.baseclasscs.dll'")}.should raise_error(LoadError)
+  end
+end
+
+describe "Repeated loading of custom assembly" do
+  before :each do
+    @engine = IronRuby.create_engine
+    str = "$: << '#{ENV["MERLIN_ROOT"] + "\\Bin\\Debug\\"}'".gsub("\\", "/")
+    @engine.execute(str)
+  end
+
+  after :each do
+    @engine = nil
+  end
+
+  it "only loads once with require followed by require" do
+    @engine.execute("require 'rowantest.baseclasscs'").should == true
+    @engine.execute("require 'rowantest.baseclasscs'").should == false
+  end
+
+  it "loads twice with require followed by load" do
+    @engine.execute("require 'rowantest.baseclasscs'").should == true
+    @engine.execute("load 'rowantest.baseclasscs.dll'").should == true
+  end
+
+  it "loads twice with load followed by require" do
+    @engine.execute("load 'rowantest.baseclasscs.dll'").should == true
+    @engine.execute("require 'rowantest.baseclasscs'").should == true
+  end
+  
+  it "loads twice with load followed by load" do
+    @engine.execute("load 'rowantest.baseclasscs.dll'").should == true
+    @engine.execute("load 'rowantest.baseclasscs.dll'").should == true
+  end
+end
+
+describe "Single time loading of custom assembly with Strong name" do
+  before :each do
+    @engine = IronRuby.create_engine
+    str = "$: << '#{ENV["MERLIN_ROOT"] + "\\Bin\\Debug\\"}'".gsub("\\", "/")
+    @engine.execute(str)
+  end
+
+  after :each do
+    #TODO: Does this release the engine enough to allow GC? We don't want a
+    #ton of wasted interpreters hanging around.
+    @engine = nil
+  end
+
+  it "works via require" do
+    @engine.execute("require 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'")
+    @engine.execute("$\"").should == ['rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null']
+  end
+
+  it "works via load" do
+    @engine.execute("load 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'")
+    lambda {@engine.execute("Merlin::Testing::BaseClass::EmptyClass")}.should_not raise_error(NameError)
+  end
+
+  it "works via load_assembly" do
+    @engine.execute("load_assembly 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'")
+    lambda {@engine.execute("Merlin::Testing::BaseClass::EmptyClass")}.should_not raise_error(NameError)
+  end
+end
+
+describe "Repeated loading of custom assembly with strong name" do
+  before :each do
+    @engine = IronRuby.create_engine
+    str = "$: << '#{ENV["MERLIN_ROOT"] + "\\Bin\\Debug\\"}'".gsub("\\", "/")
+    @engine.execute(str)
+  end
+
+  after :each do
+    @engine = nil
+  end
+
+  it "only loads once with require followed by require" do
+    @engine.execute("require 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+    @engine.execute("require 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == false
+  end
+
+  it "loads twice with require followed by load" do
+    @engine.execute("require 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+    @engine.execute("load 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+  end
+
+  it "loads twice with require followed by load_assembly" do
+    @engine.execute("require 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+    @engine.execute("load_assembly 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+  end
+  
+  it "loads twice with load followed by require" do
+    @engine.execute("load 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+    @engine.execute("require 'rowantest.baseclasscs'").should == true
+  end
+  
+  it "loads twice with load followed by load" do
+    @engine.execute("load 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+    @engine.execute("load 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+  end
+
+  it "loads twice with load followed by load_assembly" do
+    @engine.execute("load 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+    @engine.execute("load_assembly 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+  end
+
+  it "loads twice with load_assembly followed by require" do
+    @engine.execute("load_assembly 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+    @engine.execute("require 'rowantest.baseclasscs'").should == true
+  end
+  
+  it "loads twice with load_assembly followed by load" do
+    @engine.execute("load_assembly 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+    @engine.execute("load 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+  end
+
+  it "loads twice with load_assembly followed by load_assembly" do
+    @engine.execute("load_assembly 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+    @engine.execute("load_assembly 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'").should == true
+  end
+end
+
+describe "Loading of custom assembly outside of the load path" do
+  it "raises a LoadError" do
+    engine = IronRuby.create_engine
+    lambda {engine.execute("require 'rowantest.baseclasscs'")}.should raise_error(LoadError)
+    lambda {engine.execute("load 'rowantest.baseclasscs.dll'")}.should raise_error(LoadError)
+    lambda {engine.execute("load_assembly 'rowantest.baseclasscs.dll'")}.should raise_error(LoadError)
+  end
+
+  it "doesn't raise LoadError for strong names" do 
+    lambda {engine.execute("require 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'")}.should_not raise_error(LoadError)
+    lambda {engine.execute("load 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'")}.should_not raise_error(LoadError)
+    lambda {engine.execute("load_assembly 'rowantest.baseclasscs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'")}.should_not raise_error(LoadError)
+  end
+end
+
+
+describe "Modifying and reloading custom assembly" do 
+  before :each do
+    @engine = IronRuby.create_engine
+    @scope = @engine.create_scope
+    str = "$: << '#{ENV["MERLIN_ROOT"] + "\\Bin\\Debug\\"}'".gsub("\\", "/")
+    @engine.execute(str, @scope)
+    @engine.execute("require 'rowantest.baseclasscs'", @scope)
+    str = <<-EOL
+      class Merlin::Testing::BaseClass::EmptyClass
+        def foo
+          :foo
+        end
+      end
+    EOL
+    @engine.execute str, @scope
+    @engine.execute "ec = Merlin::Testing::BaseClass::EmptyClass.new", @scope
+  end
+
+  after :each do
+    @engine = nil
+  end
+  
+  it "is allowed" do
+    @engine.execute("ec.foo", @scope).should == :foo
+  end
+  
+  it "doesn't reload with require" do
+    @engine.execute("ec.foo", @scope).should == :foo
+    @engine.execute("require 'rowantest.baseclasscs'", @scope).should == false
+    @engine.execute("ec.foo", @scope).should == :foo
+  end
+
+  it "reloads with load, without rewriting the class or module" do
+    @engine.execute("ec.foo", @scope).should == :foo
+    @engine.execute("load 'rowantest.baseclasscs.dll'", @scope).should == true
+    @engine.execute("ec.foo", @scope).should == :foo
+  end
+
+  it "reloads with load_assembly, without rewriting the class or module" do
+    @engine.execute("ec.foo", @scope).should == :foo
+    @engine.execute("load_assembly 'rowantest.baseclasscs'", @scope).should == true
+    @engine.execute("ec.foo", @scope).should == :foo
+  end
+end
===================================================================
add: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Interop/load/mscorlib_spec.rb
File: mscorlib_spec.rb
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Interop/load/mscorlib_spec.rb;netinterop1
@@ -1,0 +1,209 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+require 'ironruby'
+
+describe "Single time loading of mscorlib" do
+  before :each do
+    @engine = IronRuby.create_engine
+  end
+
+  after :each do
+    #TODO: Does this release the engine enough to allow GC? We don't want a
+    #ton of wasted interpreters hanging around.
+    @engine = nil
+  end
+
+  it "works via require" do
+    @engine.execute("require 'mscorlib'")
+    @engine.execute("$\"").should == ['mscorlib']
+  end
+
+  it "works via load" do
+    @engine.execute("load 'mscorlib'")
+    lambda {@engine.execute("System")}.should_not raise_error(NameError)
+  end
+
+  it "works via load_assembly" do
+    @engine.execute("load_assembly 'mscorlib'")
+    lambda {@engine.execute("System")}.should_not raise_error(NameError)
+  end
+end
+
+describe "Repeated loading of mscorlib" do
+  before :each do
+    @engine = IronRuby.create_engine
+  end
+
+  after :each do
+    @engine = nil
+  end
+
+  it "only loads once with require followed by require" do
+    @engine.execute("require 'mscorlib'").should == true
+    @engine.execute("require 'mscorlib'").should == false
+  end
+
+  it "loads twice with require followed by load" do
+    @engine.execute("require 'mscorlib'").should == true
+    @engine.execute("load 'mscorlib'").should == true
+  end
+
+  it "loads twice with require followed by load_assembly" do
+    @engine.execute("require 'mscorlib'").should == true
+    @engine.execute("load_assembly 'mscorlib'").should == true
+  end
+  
+  it "loads twice with load followed by require" do
+    @engine.execute("load 'mscorlib'").should == true
+    @engine.execute("require 'mscorlib'").should == true
+  end
+  
+  it "loads twice with load followed by load" do
+    @engine.execute("load 'mscorlib'").should == true
+    @engine.execute("load 'mscorlib'").should == true
+  end
+
+  it "loads twice with load followed by load_assembly" do
+    @engine.execute("load 'mscorlib'").should == true
+    @engine.execute("load_assembly 'mscorlib'").should == true
+  end
+
+  it "loads twice with load_assembly followed by require" do
+    @engine.execute("load_assembly 'mscorlib'").should == true
+    @engine.execute("require 'mscorlib'").should == true
+  end
+  
+  it "loads twice with load_assembly followed by load" do
+    @engine.execute("load_assembly 'mscorlib'").should == true
+    @engine.execute("load 'mscorlib'").should == true
+  end
+
+  it "loads twice with load_assembly followed by load_assembly" do
+    @engine.execute("load_assembly 'mscorlib'").should == true
+    @engine.execute("load_assembly 'mscorlib'").should == true
+  end
+end
+
+describe "Single time loading of mscorlib with Strong name" do
+  before :each do
+    @engine = IronRuby.create_engine
+  end
+
+  after :each do
+    #TODO: Does this release the engine enough to allow GC? We don't want a
+    #ton of wasted interpreters hanging around.
+    @engine = nil
+  end
+
+  it "works via require" do
+    @engine.execute("require 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'")
+    @engine.execute("$\"").should == ['mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089']
+  end
+
+  it "works via load" do
+    @engine.execute("load 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'")
+    lambda {@engine.execute("System")}.should_not raise_error(NameError)
+  end
+
+  it "works via load_assembly" do
+    @engine.execute("load_assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'")
+    lambda {@engine.execute("System")}.should_not raise_error(NameError)
+  end
+end
+
+describe "Repeated loading of mscorlib with Strong name" do
+  before :each do
+    @engine = IronRuby.create_engine
+  end
+
+  after :each do
+    @engine = nil
+  end
+
+  it "only loads once with require followed by require" do
+    @engine.execute("require 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("require 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == false
+  end
+
+  it "loads twice with require followed by load" do
+    @engine.execute("require 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+
+  it "loads twice with require followed by load_assembly" do
+    @engine.execute("require 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load_assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+  
+  it "loads twice with load followed by require" do
+    @engine.execute("load 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("require 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+  
+  it "loads twice with load followed by load" do
+    @engine.execute("load 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+
+  it "loads twice with load followed by load_assembly" do
+    @engine.execute("load 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load_assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+
+  it "loads twice with load_assembly followed by require" do
+    @engine.execute("load_assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("require 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+  
+  it "loads twice with load_assembly followed by load" do
+    @engine.execute("load_assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+
+  it "loads twice with load_assembly followed by load_assembly" do
+    @engine.execute("load_assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load_assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+end
+
+describe "Modifying and reloading mscorlib" do 
+  before :each do
+    @engine = IronRuby.create_engine
+    @scope = @engine.create_scope
+    @engine.execute("require 'mscorlib'", @scope)
+    str = <<-EOL
+      class System::Collections::ArrayList
+        def foo
+          :foo
+        end
+      end
+    EOL
+    @engine.execute str, @scope
+    @engine.execute "al = System::Collections::ArrayList.new", @scope
+  end
+
+  after :each do
+    @engine = nil
+  end
+  
+  it "is allowed" do
+    @engine.execute("al.foo", @scope).should == :foo
+  end
+  
+  it "doesn't reload with require" do
+    @engine.execute("al.foo", @scope).should == :foo
+    @engine.execute("require 'mscorlib'", @scope).should == false
+    @engine.execute("al.foo", @scope).should == :foo
+  end
+
+  it "reloads with load, without rewriting the class or module" do
+    @engine.execute("al.foo", @scope).should == :foo
+    @engine.execute("load 'mscorlib'", @scope).should == true
+    @engine.execute("al.foo", @scope).should == :foo
+  end
+
+  it "reloads with load_assembly, without rewriting the class or module" do
+    @engine.execute("al.foo", @scope).should == :foo
+    @engine.execute("load_assembly 'mscorlib'", @scope).should == true
+    @engine.execute("al.foo", @scope).should == :foo
+  end
+end
===================================================================
add: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Interop/load/net_bcl_spec.rb
File: net_bcl_spec.rb
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Tests/Interop/load/net_bcl_spec.rb;netinterop1
@@ -1,0 +1,152 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+require 'ironruby'
+
+describe "Single time loading of a .NET BCL assembly without Strong Name" do
+  before :each do
+    @engine = IronRuby.create_engine
+  end
+
+  after :each do
+    #TODO: Does this release the engine enough to allow GC? We don't want a
+    #ton of wasted interpreters hanging around.
+    @engine = nil
+  end
+
+  it "raises LoadError via require" do
+    lambda {@engine.execute("require 'System.Core'")}.should raise_error(LoadError)
+  end
+
+  it "raises LoadError via load" do
+    lambda {@engine.execute("load 'System.Core'")}.should raise_error(LoadError)
+  end
+
+  it "raises LoadError via load_assembly" do
+    lambda {@engine.execute("load_assembly 'System.Core'")}.should raise_error(LoadError)
+  end
+end
+
+describe "Single time loading of a .NET BCL Assembly with Strong name" do
+  before :each do
+    @engine = IronRuby.create_engine
+  end
+
+  after :each do
+    #TODO: Does this release the engine enough to allow GC? We don't want a
+    #ton of wasted interpreters hanging around.
+    @engine = nil
+  end
+
+  it "works via require" do
+    @engine.execute("require 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'")
+    @engine.execute("$\"").should == ['System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089']
+  end
+
+  it "works via load" do
+    @engine.execute("load 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'")
+    lambda {@engine.execute("System::Linq")}.should_not raise_error(NameError)
+  end
+
+  it "works via load_assembly" do
+    @engine.execute("load_assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'")
+    lambda {@engine.execute("System::Linq")}.should_not raise_error(NameError)
+  end
+end
+
+describe "Repeated loading of a .NET BCL Assembly with Strong name" do
+  before :each do
+    @engine = IronRuby.create_engine
+  end
+
+  after :each do
+    @engine = nil
+  end
+
+  it "only loads once with require followed by require" do
+    @engine.execute("require 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("require 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == false
+  end
+
+  it "loads twice with require followed by load" do
+    @engine.execute("require 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+
+  it "loads twice with require followed by load_assembly" do
+    @engine.execute("require 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load_assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+  
+  it "loads twice with load followed by require" do
+    @engine.execute("load 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("require 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+  
+  it "loads twice with load followed by load" do
+    @engine.execute("load 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+
+  it "loads twice with load followed by load_assembly" do
+    @engine.execute("load 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load_assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+
+  it "loads twice with load_assembly followed by require" do
+    @engine.execute("load_assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("require 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+  
+  it "loads twice with load_assembly followed by load" do
+    @engine.execute("load_assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+
+  it "loads twice with load_assembly followed by load_assembly" do
+    @engine.execute("load_assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+    @engine.execute("load_assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'").should == true
+  end
+end
+
+
+describe "Modifying and reloading a .NET BCL Assembly" do 
+  before :each do
+    @engine = IronRuby.create_engine
+    @scope = @engine.create_scope
+    @engine.execute("require 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'", @scope)
+    str = <<-EOL
+      class System::Web::HttpApplication
+        def foo
+          :foo
+        end
+      end
+    EOL
+    @engine.execute str, @scope
+    @engine.execute "ha = System::Web::HttpApplication.new", @scope
+  end
+
+  after :each do
+    @engine = nil
+  end
+  
+  it "is allowed" do
+    @engine.execute("ha.foo", @scope).should == :foo
+  end
+  
+  it "doesn't reload with require" do
+    @engine.execute("ha.foo", @scope).should == :foo
+    @engine.execute("require 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'", @scope).should == false
+    @engine.execute("ha.foo", @scope).should == :foo
+  end
+
+  it "reloads with load, without rewriting the class or module" do
+    @engine.execute("ha.foo", @scope).should == :foo
+    @engine.execute("load 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'", @scope).should == true
+    @engine.execute("ha.foo", @scope).should == :foo
+  end
+
+  it "reloads with load_assembly, without rewriting the class or module" do
+    @engine.execute("ha.foo", @scope).should == :foo
+    @engine.execute("load_assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'", @scope).should == true
+    @engine.execute("ha.foo", @scope).should == :foo
+  end
+end
===================================================================
