public void CanReleaseRegisteredScope()
		{
			var scope = MockRepository.GenerateStub<IScope>();
			scope.Stub(s => s.IsValid).Return(true);
			scope.Stub(s => s.AssociatedConversation).Return(MockRepository.GenerateMock<IConversation>());
			var cc = new ConversationContext();

			cc.RegisterScope(scope);
			cc.ReleaseScope(scope);

			Assert.That(cc.CurrentScope, Is.Null);
		}
		public void ThrowsOnReleasingInvalidScope()
		{
			var scope = MockRepository.GenerateMock<IScope>();
			var valid = true;
			scope.Stub(s => s.IsValid).Do((Func<bool>)(() => valid));
			scope.Stub(s => s.AssociatedConversation).Return(MockRepository.GenerateMock<IConversation>());

			var cc = new ConversationContext();

			cc.RegisterScope(scope);
			valid = false;
			var e = Assert.Throws<InvalidOperationException>(() => cc.ReleaseScope(scope));
			Assert.That(e.Message, Contains.Substring("invalid"));
			Assert.That(e.Message, Contains.Substring("scope"));
			Assert.That(e.Message, Contains.Substring("internal"));
			Assert.That(e.Message, Contains.Substring("dispose"));
			Assert.That(e.Message, Contains.Substring("conversation"));
		}
		public void ThrowsOnReleasingNull()
		{
			var cc = new ConversationContext();
			var e = Assert.Throws<ArgumentNullException>(() => cc.ReleaseScope(null));
			Assert.That(e.ParamName, Is.EqualTo("scope"));
		}
		public void ScopesMustBeRegisteredBeforeRelease()
		{
			var outerConv = MockRepository.GenerateMock<IConversation>();
			var innerConv = MockRepository.GenerateMock<IConversation>();

			var outerScope = MockRepository.GenerateMock<IScope>();
			var innerScope = MockRepository.GenerateMock<IScope>();
			innerScope.Stub(s => s.AssociatedConversation).Return(innerConv);
			outerScope.Stub(s => s.AssociatedConversation).Return(outerConv);
			innerScope.Stub(s => s.IsValid).Return(true);
			outerScope.Stub(s => s.IsValid).Return(true);

			var cc = new ConversationContext();

			cc.RegisterScope(outerScope);
			var e = Assert.Throws<InvalidOperationException>(() => cc.ReleaseScope(innerScope));
			Assert.That(e.Message, Contains.Substring("release"));
			Assert.That(e.Message, Contains.Substring("not"));
			Assert.That(e.Message, Contains.Substring("register"));
		}
		public void ScopesCanBeNested()
		{
			var outerConv = MockRepository.GenerateMock<IConversation>();
			var innerConv = MockRepository.GenerateMock<IConversation>();

			var outerScope = MockRepository.GenerateMock<IScope>();
			var innerScope = MockRepository.GenerateMock<IScope>();
			innerScope.Stub(s => s.AssociatedConversation).Return(innerConv);
			outerScope.Stub(s => s.AssociatedConversation).Return(outerConv);
			innerScope.Stub(s => s.IsValid).Return(true);
			outerScope.Stub(s => s.IsValid).Return(true);

			var cc = new ConversationContext();

			cc.RegisterScope(outerScope);
			Assert.That(cc.CurrentScope, Is.SameAs(outerScope));
			Assert.That(cc.CurrentConversation, Is.SameAs(outerConv));
			cc.RegisterScope(innerScope);
			Assert.That(cc.CurrentScope, Is.SameAs(innerScope));
			Assert.That(cc.CurrentConversation, Is.SameAs(innerConv));
			cc.ReleaseScope(innerScope);
			Assert.That(cc.CurrentScope, Is.SameAs(outerScope));
			Assert.That(cc.CurrentConversation, Is.SameAs(outerConv));
			cc.ReleaseScope(outerScope);
			Assert.That(cc.CurrentScope, Is.Null);
			Assert.That(cc.CurrentConversation, Is.Null);
		}
		public void WhenAScopeIsRegisteredItIsUsedForCurrentConversation()
		{
			var defConv = MockRepository.GenerateMock<IConversation>();
			var conv = MockRepository.GenerateMock<IConversation>();

			var scope = MockRepository.GenerateMock<IScope>();
			scope.Stub(s => s.AssociatedConversation).Return(conv);
			scope.Stub(s => s.IsValid).Return(true);

			var cc = new ConversationContext();
			cc.SetDefaultConversation(defConv);

			Assert.That(cc.CurrentConversation, Is.SameAs(defConv));
			cc.RegisterScope(scope);
			Assert.That(cc.CurrentScope, Is.SameAs(scope));
			Assert.That(cc.CurrentConversation, Is.SameAs(conv));
			cc.ReleaseScope(scope);
			Assert.That(cc.CurrentConversation, Is.SameAs(defConv));
		}