public void CannotSetCommitModeAfterSessionStarted()
		{
			var t = MockRepository.GenerateStub<ITransaction>();
			var s = MockRepository.GenerateStub<ISession>();
			var sf = MockRepository.GenerateStub<ISessionFactory>();
			var cc = MockRepository.GenerateStub<INhConversationContext>();
			sf.Stub(x => x.OpenSession()).Return(s);
			s.Stub(x => x.BeginTransaction()).IgnoreArguments().Return(t);
			var cm = ConversationCommitMode.Explicit;
			var c = new NhConversation(sf, cc);
			c.Execute(x => { }); // Call doesn't matter, it's a stub
			var e = Assert.Throws<NotSupportedException>(() => c.CommitMode = cm);
			Assert.That(e.Message, Contains.Substring("CommitMode"));
			Assert.That(e.Message, Contains.Substring("started"));
		}
		public void ExceptionsCancelTheConversation()
		{
			var t = MockRepository.GenerateStub<ITransaction>();
			var s = MockRepository.GenerateStub<ISession>();
			var sf = MockRepository.GenerateStub<ISessionFactory>();
			var cc = MockRepository.GenerateStub<INhConversationContext>();
			sf.Stub(x => x.OpenSession()).Return(s);
			s.Stub(x => x.BeginTransaction()).IgnoreArguments().Return(t);
			var c = new NhConversation(sf, cc);
			ConversationCanceledEventArgs eventRaised = null;
			object eventRaiser = null;
			c.Canceled += (o, a) =>
			{
				eventRaiser = o;
				eventRaised = a;
			};
			var e = Assert.Throws<Exception>(() => c.Execute(x => { throw new Exception("foo"); }));
			Assert.That(e.Message, Is.EqualTo("foo"));
			Assert.That(eventRaised, Is.Not.Null);
			Assert.That(eventRaised.CanceledByUser, Is.False);
			Assert.That(eventRaised.Exception, Is.SameAs(e));
			Assert.That(eventRaiser, Is.SameAs(c));
		}
		public void ExceptionsInExecuteCancelTheConversation()
		{
			var sf = MockRepository.GenerateStub<ISessionFactory>();
			var cc = MockRepository.GenerateStub<INhConversationContext>();
			var c = new NhConversation(sf, cc);
			ConversationCanceledEventArgs eventRaised = null;
			object eventRaiser = null;
			c.Canceled += (o, a) =>
			{
				eventRaiser = o;
				eventRaised = a;
			};
			var e = Assert.Throws<Exception>(() => c.Execute(() => { throw new Exception("foo"); }));
			Assert.That(e.Message, Is.EqualTo("foo"));
			Assert.That(eventRaised, Is.Not.Null);
			Assert.That(eventRaised.CanceledByUser, Is.False);
			Assert.That(eventRaised.Exception, Is.SameAs(e));
			Assert.That(eventRaiser, Is.SameAs(c));
		}
		public void CannotCallExecuteWhenConversationIsCanceled()
		{
			var sf = MockRepository.GenerateStub<ISessionFactory>();
			var cc = MockRepository.GenerateStub<INhConversationContext>();
			var c = new NhConversation(sf, cc);
			c.Cancel();
			var e = Assert.Throws<InvalidOperationException>(() => c.Execute(() => { ; })); // Call doesn't matter, it's a stub
			Assert.That(e.Message, Contains.Substring("canceled"));
		}
		public void CanUseExecuteToSwitchConversation()
		{
			NhConversationContext context = new NhConversationContext();
			var sf = MockRepository.GenerateStub<ISessionFactory>();
			var conv1 = new NhConversation(sf, context);
			var conv2 = new NhConversation(sf, context);

			Assert.That(context.CurrentConversation, Is.Null);
			conv1.Execute(() => Assert.That(context.CurrentConversation, Is.SameAs(conv1)));
			conv2.Execute(() => Assert.That(context.CurrentConversation, Is.SameAs(conv2)));
			Assert.That(context.CurrentConversation, Is.Null);
		}
		public void RestartingTheConversationResetsCancelState()
		{
			var t = MockRepository.GenerateStub<ITransaction>();
			var s = MockRepository.GenerateStub<ISession>();
			var sf = MockRepository.GenerateStub<ISessionFactory>();
			var cc = MockRepository.GenerateStub<INhConversationContext>();
			sf.Stub(x => x.OpenSession()).Return(s);
			s.Stub(x => x.BeginTransaction()).IgnoreArguments().Return(t);
			var c = new NhConversation(sf, cc);
			c.Cancel();
			c.Restart();
			bool called = false;
			c.Execute(x => called = true); // Call doesn't matter, it's a stub
			Assert.That(called);
		}