diff UnitTests/CS/Data/DbManagerTest.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/DbManagerTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,484 @@
+using System;
+using System.Collections;
+using System.Data;
+using System.Data.SqlClient;
+using System.Data.SqlTypes;
+using System.IO;
+using System.Linq;
+using System.Xml;
+using BLToolkit.Data.DataProvider;
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace Data
+{
+	[TestFixture]
+	public class DbManagerTest
+	{
+		public enum Gender
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		public class Person
+		{
+			[MapField("PersonID")]
+			public int    ID;
+			public string FirstName;
+			public string MiddleName;
+			public string LastName;
+			public Gender Gender;
+		}
+
+		public class DataTypeTest
+		{
+			[MapField("DataTypeID")]
+			public int       ID;
+			[MapIgnore(false)]
+			public Byte[]    Binary_;
+#if !ORACLE
+			// Oracle does not know boolean nor guid.
+			//
+			public Boolean   Boolean_;
+			public Guid      Guid_;
+#endif
+			public Byte      Byte_;
+			[MapIgnore(false)]
+			public Byte[]    Bytes_;
+			public DateTime  DateTime_;
+			public Decimal   Decimal_;
+			public Double    Double_;
+			public Int16     Int16_;
+			public Int32     Int32_;
+			public Int64     Int64_;
+			public Decimal   Money_;
+			public Single    Single_;
+			public String    String_;
+
+			public Char      Char_;
+			public SByte     SByte_;
+			public UInt16    UInt16_;
+			public UInt32    UInt32_;
+			public UInt64    UInt64_;
+#if !SQLCE
+			[MapIgnore(false)]
+			public Stream    Stream_;
+			[MapIgnore]
+			public XmlReader Xml_;
+			[MapField("Xml_")]
+			public XmlDocument XmlDoc_;
+#endif
+		}
+
+		public class DataTypeSqlTest
+		{
+			[MapField("DataTypeID")]
+			public int ID;
+			public SqlBinary   Binary_;
+			public SqlBoolean  Boolean_;
+			public SqlByte     Byte_;
+			public SqlDateTime DateTime_;
+			public SqlDecimal  Decimal_;
+			public SqlDouble   Double_;
+			public SqlGuid     Guid_;
+			public SqlInt16    Int16_;
+			public SqlInt32    Int32_;
+			public SqlInt64    Int64_;
+			public SqlMoney    Money_;
+			public SqlSingle   Single_;
+			public SqlString   String_;
+#if !SQLCE
+			[MapIgnore(false)]
+			public SqlBytes    Bytes_;
+			[MapIgnore(false)]
+			public SqlChars    Chars_;
+			[MapIgnore(false)]
+			public SqlXml      Xml_;
+#endif
+		}
+
+		[Test]
+		public void ExecuteList1()
+		{
+			using (DbManager db = new DbManager())
+			{
+				ArrayList list = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteList(typeof(Person));
+				
+				Assert.IsNotEmpty(list);
+			}
+		}
+
+		[Test]
+		public void ExecuteList2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				IList list = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteList(new EditableArrayList(typeof(Person)), typeof(Person));
+				
+				Assert.IsNotEmpty(list);
+			}
+		}
+
+		[Test]
+		public void ExecuteObject()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Person p = (Person)db
+					.SetCommand("SELECT * FROM Person WHERE PersonID = " + db.DataProvider.Convert("id", ConvertType.NameToQueryParameter),
+					db.Parameter("id", 1))
+					.ExecuteObject(typeof(Person));
+
+				TypeAccessor.WriteConsole(p);
+			}
+		}
+
+		[Test]
+		public void ExecuteObject2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				DataTypeTest dt = (DataTypeTest)db
+					.SetCommand("SELECT * FROM DataTypeTest WHERE DataTypeID = " + db.DataProvider.Convert("id", ConvertType.NameToQueryParameter),
+					db.Parameter("id", 2))
+					.ExecuteObject(typeof(DataTypeTest));
+
+				TypeAccessor.WriteConsole(dt);
+			}
+		}
+
+#if !ORACLE
+		[Test]
+#endif
+		public void ExecuteObject2Sql()
+		{
+			using (DbManager db = new DbManager())
+			{
+				DataTypeSqlTest dt = (DataTypeSqlTest)db
+					.SetCommand("SELECT * FROM DataTypeTest WHERE DataTypeID = " + db.DataProvider.Convert("id", ConvertType.NameToQueryParameter),
+					db.Parameter("id", 2))
+					.ExecuteObject(typeof(DataTypeSqlTest));
+
+				TypeAccessor.WriteConsole(dt);
+			}
+		}
+
+#if MSSQL
+		[Test]
+#endif
+		public void NativeConnection()
+		{
+			string connectionString = DbManager.GetConnectionString(null);
+
+			using (DbManager db = new DbManager(new SqlConnection(connectionString)))
+			{
+				db
+					.SetSpCommand ("Person_SelectByName",
+						db.Parameter("@firstName", "John"),
+						db.Parameter("@lastName",  "Pupkin"))
+					.ExecuteScalar();
+			}
+		}
+
+		public class OutRefTest
+		{
+			public int    ID             = 5;
+			public int    outputID;
+			public int    inputOutputID  = 10;
+			public string str            = "5";
+			public string outputStr;
+			public string inputOutputStr = "10";
+		}
+
+#if !ACCESS && !SQLCE && !SQLITE
+		[Test]
+		public void MapOutput()
+		{
+			OutRefTest o = new OutRefTest();
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetSpCommand("OutRefTest", db.CreateParameters(o,
+						new string[] {      "outputID",      "outputStr" },
+						new string[] { "inputOutputID", "inputOutputStr" },
+						null))
+					.ExecuteNonQuery(o);
+			}
+
+			Assert.AreEqual(5,     o.outputID);
+			Assert.AreEqual(15,    o.inputOutputID);
+			Assert.AreEqual("5",   o.outputStr);
+			Assert.AreEqual("510", o.inputOutputStr);
+		}
+
+		public class ReturnParameter
+		{
+			public int Value;
+		}
+
+		[Test]
+		public void MapReturnValue()
+		{
+			ReturnParameter e = new ReturnParameter();
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetSpCommand("Scalar_ReturnParameter")
+					.ExecuteNonQuery("Value", e);
+			}
+
+			Assert.AreEqual(12345, e.Value);
+		}
+
+		[Test]
+		public void InsertAndMapBack()
+		{
+			Person e = new Person();
+			e.FirstName = "Crazy";
+			e.LastName  = "Frog";
+			e.Gender    =  Gender.Other;
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetSpCommand("Person_Insert", db.CreateParameters(e, new string[] { "PersonID" }, null, null))
+					.ExecuteObject(e);
+
+				Assert.IsTrue(e.ID > 0);
+
+				// Cleanup.
+				//
+				db
+					.SetSpCommand("Person_Delete", db.CreateParameters(e))
+					.ExecuteNonQuery();
+			}
+		}
+
+		[Test]
+		public void MapDataRow()
+		{
+			DataTable dataTable = new DataTable();
+			dataTable.Columns.Add("ID",             typeof(int));
+			dataTable.Columns.Add("outputID",       typeof(int));
+			dataTable.Columns.Add("inputOutputID",  typeof(int));
+			dataTable.Columns.Add("str",            typeof(string));
+			dataTable.Columns.Add("outputStr",      typeof(string));
+			dataTable.Columns.Add("inputOutputStr", typeof(string));
+
+			DataRow dataRow = dataTable.Rows.Add(new object[]{5, 0, 10, "5", null, "10"});
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetSpCommand("OutRefTest", db.CreateParameters(dataRow,
+						new string[] {      "outputID",      "outputStr" },
+						new string[] { "inputOutputID", "inputOutputStr" },
+						null))
+					.ExecuteNonQuery(dataRow);
+			}
+
+			Assert.AreEqual(5,     dataRow["outputID"]);
+			Assert.AreEqual(15,    dataRow["inputOutputID"]);
+			Assert.AreEqual("5",   dataRow["outputStr"]);
+			Assert.AreEqual("510", dataRow["inputOutputStr"]);
+		}
+#endif
+		
+		[Test]
+		public void CreateParametersTest()
+		{
+			using (var db = new DbManager())
+			{
+				var dt = new DataTypeTest
+				{
+					ID        = 12345,
+					Binary_   = new byte[2] {1, 2},
+#if !ORACLE
+					Boolean_  = true,
+					Guid_     = Guid.Empty,
+#endif
+					Byte_     = 250,
+					Bytes_    = new byte[] { 2, 1 },
+					DateTime_ = DateTime.Now,
+					Decimal_  = 9876543210.0m,
+					Double_   = 12345.67890,
+					Int16_    = 12345,
+					Int32_    = 1234567890,
+					Int64_    = 1234567890123456789,
+					Money_    = 99876543210.0m,
+					Single_   = 1234.0f,
+					String_   = "Crazy Frog",
+
+					Char_     = 'F',
+					SByte_    = 123,
+					//UInt16_   = 65432,
+					//UInt32_   = 4000000000,
+					//UInt64_   = 12345678901234567890,
+#if !SQLCE
+					Stream_   = new MemoryStream(5),
+					Xml_      = new XmlTextReader(new StringReader("<xml/>")),
+					XmlDoc_   = new XmlDocument(),
+#endif
+				};
+
+				dt.XmlDoc_.LoadXml("<xmldoc/>");
+
+				var parameters = db.CreateParameters(dt);
+
+				Assert.IsNotNull(parameters);
+				Assert.AreEqual(ObjectMapper<DataTypeTest>.Instance.Count, parameters.Length);
+
+				foreach (MemberMapper mm in ObjectMapper<DataTypeTest>.Instance)
+				{
+					var paramName = (string)db.DataProvider.Convert(mm.Name, db.GetConvertTypeToParameter());
+					var p         = parameters.First(obj => obj.ParameterName == paramName);
+
+					Assert.IsNotNull(p);
+					Assert.AreEqual(mm.GetValue(dt), p.Value);
+				}
+			}
+		}
+
+#if!ORACLE
+		[Test]
+#endif
+		public void CreateParametersSqlTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				DataTypeSqlTest dt = new DataTypeSqlTest();
+				
+				dt.ID        = 12345;
+				dt.Binary_   = new SqlBinary(new byte[2] {1, 2});
+				dt.Boolean_  = new SqlBoolean(1);
+				dt.Byte_     = new SqlByte(250);
+				dt.DateTime_ = new SqlDateTime(DateTime.Now);
+				dt.Decimal_  = new SqlDecimal(9876543210.0m);
+				dt.Double_   = new SqlDouble(12345.67890);
+				dt.Guid_     = new SqlGuid(Guid.Empty);
+				dt.Int16_    = new SqlInt16(12345);
+				dt.Int32_    = new SqlInt32(1234567890);
+				dt.Int64_    = new SqlInt64(1234567890123456789);
+				dt.Money_    = new SqlMoney(99876543210.0m);
+				dt.Single_   = new SqlSingle(1234.0f);
+				dt.String_   = new SqlString("Crazy Frog");
+
+#if !SQLCE
+				dt.Bytes_    = new SqlBytes(new byte[2] {2, 1});
+				dt.Chars_    = new SqlChars(new char[2] {'B', 'L'});
+				dt.Xml_      = new SqlXml(new XmlTextReader(new StringReader("<xml/>")));
+#endif
+
+				var parameters = db.CreateParameters(dt);
+
+				Assert.IsNotNull(parameters);
+				Assert.AreEqual(ObjectMapper<DataTypeSqlTest>.Instance.Count, parameters.Length);
+
+				foreach (MemberMapper mm in ObjectMapper<DataTypeSqlTest>.Instance)
+				{
+					var pName = (string)db.DataProvider.Convert(mm.Name, db.GetConvertTypeToParameter());
+					var p     = Array.Find(parameters, obj => obj.ParameterName == pName);
+
+					Assert.IsNotNull(p);
+					Assert.AreEqual(mm.GetValue(dt), p.Value);
+				}
+			}
+		}
+
+		public struct DBInfo
+		{
+			public DateTime TimeValue;
+		}
+		
+		[Test]
+		public void CreateParametersStructTest()
+		{
+			var dbInfo = new DBInfo { TimeValue = DateTime.Now };
+
+			using (var db = new DbManager())
+			{
+				var parameters = db.CreateParameters(dbInfo);
+				
+				Assert.IsNotNull(parameters);
+				Assert.AreEqual(1, parameters.Length);
+				Assert.AreEqual(dbInfo.TimeValue, parameters[0].Value);
+				
+			}
+		}
+
+		public class FirstPart
+		{
+			public string FirstName;
+		}
+
+		public class SecondPart
+		{
+			public string LastName;
+		}
+
+#if !SQLITE && !SQLCE
+		[Test]
+#endif
+		public void CreateManyParametersTest()
+		{
+			FirstPart  f = new FirstPart();
+			SecondPart s = new SecondPart();
+
+			f.FirstName = "John";
+			s.LastName = "Pupkin";
+
+			using (DbManager db = new DbManager())
+			{
+				Person p = (Person)db
+					.SetSpCommand ("Person_SelectByName", db.CreateParameters(f), db.CreateParameters(s))
+					.ExecuteObject(typeof(Person));
+				
+				Assert.IsNotNull(p);
+				Assert.AreEqual(f.FirstName, p.FirstName);
+				Assert.AreEqual(s.LastName,  p.LastName);
+			}
+		}
+
+		[Test]
+		public void EnumExecuteScalarTest1()
+		{
+			using (var dbm = new DbManager())
+			{
+				var gender = dbm.SetCommand(CommandType.Text, "select 'M'")
+								.ExecuteScalar<Gender>();
+
+				Assert.That(gender, Is.EqualTo(Gender.Male));
+			}
+		}
+
+		public enum ABType
+		{
+			Error = -1,
+			A = 0,
+			B,
+		}
+
+		[Test]
+		public void EnumExecuteScalarTest2()
+		{
+			using (var db = new DbManager())
+			{
+				var type = db.SetCommand("select 1 where 1 = 2").ExecuteScalar<ABType>();
+				Assert.That(type, Is.EqualTo(ABType.A));
+			}
+		}
+	}
+}