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 ===================================================================