using System;
using System.Data;
using NUnit.Framework;

namespace Spring.Transaction.Support
{
	[TestFixture]
	public class DefaultTransactionDefinitionTests
	{
		[Test]
		public void VanillaTest()
		{
			DefaultTransactionDefinition def = new DefaultTransactionDefinition( TransactionPropagation.NotSupported);
			Assert.IsTrue( def.PropagationBehavior == TransactionPropagation.NotSupported );
			def.PropagationBehavior = TransactionPropagation.Nested;
			Assert.IsTrue( def.PropagationBehavior == TransactionPropagation.Nested );
			def.TransactionIsolationLevel = IsolationLevel.ReadCommitted;
			Assert.IsTrue( def.TransactionIsolationLevel == IsolationLevel.ReadCommitted);
			def.TransactionTimeout = 1000;
			Assert.IsTrue( 1000 == def.TransactionTimeout );
			Assert.IsTrue( false == def.ReadOnly );
			def.ReadOnly = true;
			Assert.IsTrue( true == def.ReadOnly );
		}
		[Test]
		public void IsolationLeveNonDefaultl()
		{
			DefaultTransactionDefinition def = new DefaultTransactionDefinition();
			Assert.IsTrue( def.PropagationBehavior == TransactionPropagation.Required );
		}
		[Test]
		[ExpectedException(typeof(ArgumentException))]
		public void InvalidTimeout()
		{
			DefaultTransactionDefinition def = new DefaultTransactionDefinition();
			def.TransactionTimeout = -1000;
		}
		[Test]
		public void DefinitionString()
		{
			DefaultTransactionDefinition def = new DefaultTransactionDefinition();
			DefaultTransactionDefinition def2 = new DefaultTransactionDefinition();

			Assert.IsTrue( def.ToString() == def2.ToString());
			def.Equals(def2);
		}
		[Test]
			public void DefinitionStringFilled()
		{
			DefaultTransactionDefinition def = new DefaultTransactionDefinition( TransactionPropagation.Never );
			def.TransactionIsolationLevel = IsolationLevel.Chaos;
			def.TransactionTimeout = 1000;
			def.ReadOnly = true;
			Assert.AreEqual( "PROPAGATION_Never,ISOLATION_Chaos,timeout_1000,readOnly", def.ToString());
			
			DefaultTransactionDefinition def2 = new DefaultTransactionDefinition( TransactionPropagation.Never );
			def2.TransactionIsolationLevel = IsolationLevel.Chaos;
			def2.TransactionTimeout = 1000;
			def2.ReadOnly = true;

			Assert.IsTrue( def2.Equals(def));
			Assert.IsTrue( def.GetHashCode() == def2.GetHashCode());
		}
	}
}
