spec/isolator_spec.rb in caricature-0.3.1 vs spec/isolator_spec.rb in caricature-0.5.0

- old
+ new

@@ -1,13 +1,36 @@ require File.dirname(__FILE__) + "/bacon_helper" +class TestIsolation + attr_accessor :instance, :expectations + def initialize(instance, expectations) + @instance, @expectations = instance, expectations + end + def send_message(method_name, return_type, *args, &b) + exp = expectations.find(method_name, *args) + if exp + res = instance.__send__(method_name, *args, &b) if exp.super_before? + res = exp.execute(*args) + res = instance.__send__(method_name, *args, &b) if !exp.super_before? and exp.call_super? + res + else + rt = nil + is_value_type = return_type && return_type != System::Void.to_clr_type && return_type.is_value_type + rt = System::Activator.create_instance(return_type) if is_value_type + rt + end + end +end + describe "Caricature::RubyIsolator" do before do @subj = Soldier.new - @recorder = Caricature::MethodCallRecorder.new - @proxy = Caricature::RubyIsolator.for(@subj, @recorder) + res = Caricature::RubyIsolator.for Caricature::IsolatorContext.new(@subj) + iso = TestIsolation.new res.subject, Caricature::Expectations.new + @proxy = res.isolation + @proxy.class.instance_variable_set("@___context___", iso) end describe "when invoking a method" do @@ -17,39 +40,48 @@ it "should return nil" do @proxy.name.should.be.nil end - it "should record a call" do - @recorder.size.should.equal 1 + end + + describe "when isolating a class with class members" do + + before do + res = Caricature::RubyIsolator.for Caricature::IsolatorContext.new(DaggerWithClassMembers) + iso = TestIsolation.new res.subject, Caricature::Expectations.new + @proxy = res.isolation + @proxy.class.instance_variable_set("@___context___", iso) end - it "should record the correct call" do - mc = @recorder[:name] - mc.method_name.should.equal :name - mc.args.should.equal [Caricature::ArgumentRecording.new] - mc.block.should.equal nil + it "should return nil for the class method" do + + @proxy.class.class_name.should.be.nil + end end end describe "Caricature::RecordingClrProxy" do describe "for an instance of a CLR class" do before do - @samurai = ClrModels::Samurai.new - @samurai.name = "Nakiro" - @recorder = Caricature::MethodCallRecorder.new - @proxy = Caricature::ClrIsolator.for(@samurai, @recorder) + @ninja = ClrModels::Ninja.new + @ninja.name = "Nakiro" + context = Caricature::IsolatorContext.new(@ninja) + res = Caricature::ClrIsolator.for context + iso = TestIsolation.new res.subject, Caricature::Expectations.new + @proxy = res.isolation + @proxy.class.instance_variable_set("@___context___", iso) end it "should create a proxy" do - @proxy.___super___.name.should.equal @samurai.name - @proxy.___super___.id.should.equal 0 + @proxy.___super___.name.should.equal @ninja.name + @proxy.___super___.id.should.equal 1 end describe "when invoking a method" do before do @@ -58,64 +90,56 @@ it "should return nil" do @proxy.name.should.be.nil end - it "should record a call" do - @recorder.size.should.equal 1 + end + + describe "when isolating a class with class members" do + + before do + res = Caricature::ClrIsolator.for Caricature::IsolatorContext.new(ClrModels::SwordWithStatics) + iso = TestIsolation.new res.subject, Caricature::Expectations.new + @proxy = res.isolation + @proxy.class.instance_variable_set("@___context___", iso) end - it "should record the correct call" do - mc = @recorder[:name] - mc.method_name.should.equal :name - mc.args.should.equal [Caricature::ArgumentRecording.new] - mc.block.should.equal nil + it "should return nil for the class method" do + + @proxy.class.class_naming.should.be.nil + end end end describe "for a CLR class" do before do @recorder = Caricature::MethodCallRecorder.new - @proxy = Caricature::ClrIsolator.for(ClrModels::Ninja, @recorder) + context = Caricature::IsolatorContext.new(ClrModels::Ninja, @recorder) + res = Caricature::ClrIsolator.for context + iso = TestIsolation.new res.subject, Caricature::Expectations.new + @proxy = res.isolation + @proxy.class.instance_variable_set("@___context___", iso) end it "should create a proxy" do - @proxy.___super___.class.superclass.should.equal ClrModels::Ninja + @proxy.class.superclass.should.equal ClrModels::Ninja end - describe "when invoking a method" do - - before do - @proxy.name - end - - it "should record a call" do - @recorder.size.should.equal 1 - end - - it "should record the correct call" do - mc = @recorder[:name] - mc.method_name.should.equal :name - mc.args.should.equal [Caricature::ArgumentRecording.new] - mc.block.should.equal nil - end - - end end describe "for a CLR interface" do before do - @recorder = Caricature::MethodCallRecorder.new - @proxy = Caricature::ClrInterfaceIsolator.for(ClrModels::IWarrior, @recorder) + res = Caricature::ClrInterfaceIsolator.for Caricature::IsolatorContext.new(ClrModels::IWarrior) + @proxy = res.isolation end it "should create a proxy" do @proxy.class.to_s.should.match /^IWarrior/ end @@ -130,36 +154,17 @@ it "should create a setter for a writable property on the proxy" do @proxy.should.respond_to?(:name=) end - describe "when invoking a method" do - - before do - @proxy.name - end - - it "should record a call" do - @recorder.size.should.equal 1 - end - - it "should record the correct call" do - mc = @recorder[:name] - mc.method_name.should.equal :name - mc.args.should.equal [Caricature::ArgumentRecording.new] - mc.block.should.equal nil - end - - end - end describe "for a CLR Interface with an event" do before do - @recorder = Caricature::MethodCallRecorder.new - @proxy = Caricature::ClrInterfaceIsolator.for(ClrModels::IExposing, @recorder) + res = Caricature::ClrInterfaceIsolator.for Caricature::IsolatorContext.new(ClrModels::IExposing) + @proxy = res.isolation end it "should create an add method for the event" do @proxy.should.respond_to?(:add_is_exposed_changed) end @@ -171,10 +176,11 @@ end describe "for CLR interface recursion" do before do - @proxy = Caricature::ClrInterfaceIsolator.for(ClrModels::IExposingWarrior, Caricature::MethodCallRecorder.new) + res = Caricature::ClrInterfaceIsolator.for Caricature::IsolatorContext.new(ClrModels::IExposingWarrior) + @proxy = res.isolation end it "should create a method defined on the CLR interface" do @proxy.should.respond_to?(:own_method) end \ No newline at end of file