<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,3 +1,5 @@
+- Fixed DoubleDefinition chaining edge cases
+
 * 0.6.1
 - DoubleDefinitionCreatorProxy definition eval block is instance_evaled when the arity is not 1. When the arity is 1, the block is yielded with the DoubleDefinitionCreatorProxy passed in.
  </diff>
      <filename>CHANGES</filename>
    </modified>
    <modified>
      <diff>@@ -349,9 +349,9 @@ module RR
     def extract_subject_from_return_value(return_value)
       case return_value
       when DoubleDefinitions::DoubleDefinition
-        return_value.subject
+        return_value.root_subject
       when DoubleDefinitions::DoubleDefinitionCreatorProxy
-        return_value.__creator__.subject
+        return_value.__creator__.root_subject
       else
         return_value
       end</diff>
      <filename>lib/rr/double.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,6 +7,10 @@ module RR
         super()
       end
 
+      def root_subject
+        parent_double_definition.root_subject
+      end
+
       def instance_of(*args)
         raise NoMethodError
       end</diff>
      <filename>lib/rr/double_definitions/child_double_definition_creator.rb</filename>
    </modified>
    <modified>
      <diff>@@ -41,6 +41,10 @@ module RR
         @subject = subject
       end
 
+      def root_subject
+        double_definition_creator.root_subject
+      end
+
       module DefinitionConstructionMethods
         def with(*args, &amp;return_value_block)
           @argument_expectation = Expectations::ArgumentEqualityExpectation.new(*args)</diff>
      <filename>lib/rr/double_definitions/double_definition.rb</filename>
    </modified>
    <modified>
      <diff>@@ -62,6 +62,10 @@ module RR
         @scope_strategy = Strategies::Scope::Instance.new(self)
       end
 
+      def root_subject
+        subject
+      end      
+
       module StrategySetupMethods
         def no_subject?
           subject.__id__ === NO_SUBJECT.__id__</diff>
      <filename>lib/rr/double_definitions/double_definition_creator.rb</filename>
    </modified>
    <modified>
      <diff>@@ -36,6 +36,12 @@ describe &quot;RR&quot; do
 
       mock(subject).first(1) {mock!.second(2) {mock!.third(3) {4}}}
       subject.first(1).second(2).third(3).should == 4
+
+      mock(subject).first(1) {mock!.second(2).mock!.third(3) {4}}
+      subject.first(1).second(2).third(3).should == 4
+
+      mock(subject).first(1) {mock!.second(2).mock! {third(3) {4}}}
+      subject.first(1).second(2).third(3).should == 4
       
       mock(subject).first(1).mock!.second(2).mock!.third(3) {4}
       subject.first(1).second(2).third(3).should == 4</diff>
      <filename>spec/high_level_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -11,6 +11,15 @@ module RR
         @parent_double_definition = DoubleDefinition.new(parent_double_definition_creator, parent_subject)
         @child_double_definition_creator = ChildDoubleDefinitionCreator.new(parent_double_definition)
       end
+
+      describe &quot;#root_subject&quot; do
+        it &quot;returns the #parent_double_definition.root_subject&quot; do
+          child_subject = Object.new
+          parent_double_definition_creator.stub(parent_subject)
+          child_double_definition_creator.stub(child_subject)
+          child_double_definition_creator.root_subject.should == parent_subject
+        end
+      end      
       
       describe &quot;Strategies::Verification definitions&quot; do
         describe &quot;methods without !&quot; do</diff>
      <filename>spec/rr/double_definitions/child_double_definition_creator_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,6 +9,13 @@ module RR
         @subject = Object.new
         @creator = DoubleDefinitionCreator.new
       end
+
+      describe &quot;#root_subject&quot; do
+        it &quot;returns #subject&quot; do
+          creator.stub(subject).foobar
+          creator.root_subject.should == subject
+        end
+      end
       
       describe &quot;StrategySetupMethods&quot; do
         describe &quot;normal strategy definitions&quot; do</diff>
      <filename>spec/rr/double_definitions/double_definition_creator_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,16 +3,16 @@ require File.expand_path(&quot;#{File.dirname(__FILE__)}/../../spec_helper&quot;)
 module RR
   module DoubleDefinitions
     describe DoubleDefinition do
-      attr_reader :subject, :double_injection, :double, :definition
+      attr_reader :subject, :double_definition_creator, :double, :definition
 
       it_should_behave_like &quot;Swapped Space&quot;
 
       before do
         @subject = Object.new
         add_original_method
-        @double_injection = Space.instance.double_injection(subject, :foobar)
-        @double = new_double(double_injection)
-        @definition = double.definition
+        @double_definition_creator = DoubleDefinitionCreator.new
+        @definition = double_definition_creator.stub(subject).foobar
+        @double = definition.double
       end      
 
       def add_original_method
@@ -20,6 +20,13 @@ module RR
           :original_return_value
         end
       end
+      
+      describe &quot;#root_subject&quot; do
+        it &quot;returns #double_definition_creator.root_subject&quot; do
+          definition.root_subject.should == definition.double_definition_creator.root_subject
+          definition.root_subject.should == subject
+        end
+      end
 
       describe &quot;DefinitionConstructionMethods&quot; do
         macro(&quot;DoubleDefinition where #double_definition_creator is a Reimplementation&quot;) do
@@ -1009,8 +1016,9 @@ module RR
         end
 
         describe &quot;#exact_match?&quot; do
-          context &quot;when no expectation set&quot; do
+          context &quot;when no argument_expectation set&quot; do
             it &quot;raises a DoubleDefinitionError&quot; do
+              definition.argument_expectation = nil
               lambda do
                 definition.exact_match?
               end.should raise_error(Errors::DoubleDefinitionError)
@@ -1036,8 +1044,9 @@ module RR
         end
 
         describe &quot;#wildcard_match?&quot; do
-          context &quot;when no expectation is set&quot; do
+          context &quot;when no #argument_expectation is set&quot; do
             it &quot;raises a DoubleDefinitionError&quot; do
+              definition.argument_expectation = nil
               lambda do
                 definition.wildcard_match?
               end.should raise_error(Errors::DoubleDefinitionError)
@@ -1087,7 +1096,7 @@ module RR
 
           context &quot;when there is not times_matcher&quot; do
             it &quot;raises a DoubleDefinitionError&quot; do
-              definition.times_matcher.should be_nil
+              definition.times_matcher = nil
               lambda do
                 definition.terminal?
               end.should raise_error(Errors::DoubleDefinitionError)
@@ -1105,7 +1114,7 @@ module RR
 
           context &quot;when there is no argument expectation&quot; do
             it &quot;returns an empty array&quot; do
-              definition.argument_expectation.should be_nil
+              definition.argument_expectation = nil
               definition.expected_arguments.should == []
             end
           end</diff>
      <filename>spec/rr/double_definitions/double_definition_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a35296c8f719f3b87dc118e37cc03a783d5a788b</id>
    </parent>
  </parents>
  <author>
    <name>Brian Takita</name>
    <email>btakita@btakita-laptop.(none)</email>
  </author>
  <url>http://github.com/btakita/rr/commit/e33239dd614e3a3d434419afaaf898eabfbce0cd</url>
  <id>e33239dd614e3a3d434419afaaf898eabfbce0cd</id>
  <committed-date>2008-10-27T22:19:56-07:00</committed-date>
  <authored-date>2008-10-27T22:19:56-07:00</authored-date>
  <message>- Fixed DoubleDefinition chaining edge cases</message>
  <tree>391b035a451b864014d5a6b6726d527333a05030</tree>
  <committer>
    <name>Brian Takita</name>
    <email>btakita@btakita-laptop.(none)</email>
  </committer>
</commit>
