public void TestCrossContextAllowsOverrides()
        {
            object viewParent = new object();
            object viewChildOne = new object();
            object viewChildTwo = new object();
            MockContext Parent = new MockContext(viewParent, true);
            MockContext ChildOne = new MockContext(viewChildOne, true); //Ctr will automatically add to Context.firstcontext. No need to call it manually (and you should not).
            MockContext ChildTwo = new MockContext(viewChildTwo, true);

            Parent.ScannedPackages = new string[]{
                "strange.unittests.annotated.testCrossContext"
            };

            ChildOne.ScannedPackages = new string[]{
                "strange.unittests.annotated.testCrossOverride"
            };
            Parent.Start();
            ChildOne.Start();
            ChildTwo.Start();

            TestCrossContextInterface parentModel = Parent.injectionBinder.GetInstance<TestCrossContextInterface>() as TestCrossContextInterface;
            //Get the instance from the parent injector (The cross context binding)

            TestCrossContextInterface childOneModel = ChildOne.injectionBinder.GetInstance<TestCrossContextInterface>() as TestCrossContextInterface;
            Assert.AreNotSame(childOneModel, parentModel); //The value from getinstance is NOT the same as the cross context value. We have overidden the cross context value locally

            TestCrossContextInterface childTwoModel = ChildTwo.injectionBinder.GetInstance<TestCrossContextInterface>() as TestCrossContextInterface;
            Assert.IsNotNull(childTwoModel);
            Assert.AreNotSame(childOneModel, childTwoModel); //These two are different objects, the childTwoModel being cross context, and childone being the override
            Assert.AreSame(parentModel, childTwoModel); //Both cross context models are the same

            parentModel.Value++;
            Assert.AreEqual(1, childTwoModel.Value); //cross context model should be changed

            parentModel.Value++;
            Assert.AreEqual(1000, childOneModel.Value); //local model is not changed

            Assert.AreEqual(2, parentModel.Value); //cross context model is changed
        }
        public void TestCrossContextImplicit()
        {
            object viewParent = new object();
            object viewChildOne  = new object();
            object viewChildTwo = new object();
            MockContext Parent = new MockContext(viewParent, true);
            MockContext ChildOne = new MockContext(viewChildOne, true); //Ctr will automatically add to Context.firstcontext. No need to call it manually (and you should not).
            MockContext ChildTwo = new MockContext(viewChildTwo, true);

            Parent.ScannedPackages = new string[]{
                "strange.unittests.annotated.testCrossContext"
            };

            Parent.Start();
            ChildOne.Start();
            ChildTwo.Start();

            TestCrossContextInterface parentModel = Parent.injectionBinder.GetInstance<TestCrossContextInterface>() as TestCrossContextInterface;

            TestCrossContextInterface childOneModel = ChildOne.injectionBinder.GetInstance<TestCrossContextInterface>() as TestCrossContextInterface;
            Assert.IsNotNull(childOneModel);
            TestCrossContextInterface childTwoModel = ChildTwo.injectionBinder.GetInstance<TestCrossContextInterface>() as TestCrossContextInterface;
            Assert.IsNotNull(childTwoModel);
            Assert.AreSame(childOneModel, childTwoModel); //These two should be the same object

            Assert.AreEqual(0, parentModel.Value); //start at 0, might as well verify.

            parentModel.Value++;
            Assert.AreEqual(1, childOneModel.Value); //child one is updated

            parentModel.Value++;
            Assert.AreEqual(2, childTwoModel.Value); //child two is updated
        }
 public void setup()
 {
     Context.firstContext = null;
     contextView = new object();
     context = new MockContext(contextView, true);
 }