public void Upsert_IDefaultEntity_NoMerge()
        {
            var tableName   = "table_c";
            var firstEntity = new EntityA()
            {
                Data             = new byte[512],
                DateTime         = DateTime.Now,
                DateTimeOffset   = DateTimeOffset.Now,
                Integer          = int.MaxValue,
                NullableDateTime = DateTime.Now,
                NullableInteger  = int.MaxValue,
                String           = new string('S', 120),
                Varchar          = new string('S', 50)
            };

            provider.CreateTable <EntityA>(tableName);
            var id = provider.Insert(tableName, firstEntity);

            var expected = new EntityA()
            {
                Id               = id,
                Data             = new byte[12],
                DateTime         = DateTime.Today,
                DateTimeOffset   = DateTime.Today,
                Integer          = 0,
                NullableDateTime = null,
                NullableInteger  = 123,
                String           = null,
                Varchar          = "Test"
            };

            var id2 = provider.Insert(tableName, expected, upsert: true, merge: false);

            Assert.AreEqual(id, id2);

            var actual = provider.Query <EntityA>($"SELECT * FROM {provider.ResolveTableName("table_c")} WHERE \"Id\" = @0", expected.Id)
                         .FirstOrDefault();

            Assert.IsNotNull(actual);
            Assert.AreEqual(expected.Type, actual.Type);
            Assert.IsTrue(expected.DateTime.Subtract(actual.DateTime) < TimeSpan.FromMilliseconds(1));
            Assert.IsFalse(actual.NullableDateTime.HasValue);
            Assert.IsFalse(expected.NullableDateTime.HasValue);
            Assert.IsTrue(expected.DateTimeOffset.Subtract(actual.DateTimeOffset) < TimeSpan.FromMilliseconds(1));
            Assert.AreEqual(expected.DateTimeOffset.Offset, actual.DateTimeOffset.Offset);
            Assert.AreEqual(expected.Integer, actual.Integer);
            Assert.AreEqual(expected.NullableInteger, actual.NullableInteger);
            Assert.AreEqual(expected.String, actual.String);
            Assert.AreEqual(expected.Varchar, actual.Varchar);
            for (var i = 0; i < expected.Data.Length; i++)
            {
                Assert.AreEqual(expected.Data[i], actual.Data[i]);
            }
        }
        public void Update_IDefaultEntity_Merge()
        {
            var tableName   = "table_x";
            var firstEntity = new EntityA()
            {
                Data             = new byte[512],
                NullableDateTime = DateTime.Today,
                NullableInteger  = int.MaxValue,
                String           = new string('S', 120),
                Varchar          = new string('S', 50)
            };

            provider.CreateTable <EntityA>(tableName);
            var id = provider.Insert(tableName, firstEntity);

            var secondEntity = firstEntity.MemberwiseClone() as EntityA;

            Assert.IsNotNull(secondEntity);

            secondEntity.Data             = null;
            secondEntity.DateTime         = DateTime.Today;
            secondEntity.DateTimeOffset   = new DateTimeOffset(DateTime.Today);
            secondEntity.NullableDateTime = null;
            secondEntity.NullableInteger  = null;
            secondEntity.String           = null;

            var affected = provider.Update(tableName, secondEntity, true);

            Assert.AreEqual(1, affected);

            var actual = provider.Query <EntityA>($"SELECT * FROM {provider.ResolveTableName(tableName)} WHERE \"Id\" = @0", firstEntity.Id)
                         .FirstOrDefault();

            Assert.AreEqual(firstEntity.Data, actual.Data);
            Assert.IsTrue(secondEntity.DateTime.Equals(actual.DateTime));
            Assert.IsTrue(secondEntity.DateTimeOffset.Equals(actual.DateTimeOffset));
            Assert.AreEqual(firstEntity.NullableDateTime, actual.NullableDateTime);
            Assert.AreEqual(firstEntity.NullableInteger, actual.NullableInteger);
            Assert.AreEqual(firstEntity.String, actual.String);
            Assert.AreEqual(firstEntity.Varchar, actual.Varchar);
        }
        public void Insert_IDefaultEntity()
        {
            var tableName = "table_c";
            var entity    = new EntityA()
            {
                Data             = new byte[512],
                DateTime         = DateTime.Now,
                DateTimeOffset   = DateTimeOffset.Now,
                Integer          = int.MaxValue,
                NullableDateTime = DateTime.Now,
                NullableInteger  = int.MaxValue,
                String           = new string('S', 120),
                Varchar          = new string('S', 50)
            };

            provider.CreateTable <EntityA>(tableName);

            var id = provider.Insert(tableName, entity);

            Assert.IsTrue(id > 0);
            Assert.AreEqual(id, entity.Id);
        }
        public void Update_IDefaultEntity_NotExisting()
        {
            var tableName   = "table_x";
            var firstEntity = new EntityA()
            {
                Data             = new byte[512],
                NullableDateTime = DateTime.Today,
                NullableInteger  = int.MaxValue,
                String           = new string('S', 120),
                Varchar          = new string('S', 50)
            };

            provider.CreateTable <EntityA>(tableName);
            var id = provider.Insert(tableName, firstEntity);

            provider.Execute($"DELETE FROM {provider.ResolveTableName(tableName)} WHERE \"Id\" = @0", id);

            var secondEntity = firstEntity.MemberwiseClone() as EntityA;
            var affected     = provider.Update(tableName, secondEntity, true);

            Assert.AreEqual(0, affected);
        }
        public void Upsert_IDefaultEntity_Merge()
        {
            var tableName   = "table_c";
            var firstEntity = new EntityA()
            {
                Data             = new byte[512],
                NullableDateTime = DateTime.Now,
                NullableInteger  = int.MaxValue,
                String           = new string('S', 120),
                Varchar          = new string('S', 50)
            };

            provider.CreateTable <EntityA>(tableName);
            var id = provider.Insert(tableName, firstEntity);

            var expected = new EntityA()
            {
                Id               = id,
                Data             = null,
                NullableDateTime = null,
                NullableInteger  = null,
                String           = null,
                Varchar          = null
            };

            provider.Insert(tableName, expected, upsert: true, merge: true); // merge = true
            var actual = provider.Query <EntityA>($"SELECT * FROM {provider.ResolveTableName("table_c")} WHERE \"Id\" = @0", expected.Id)
                         .FirstOrDefault();

            Assert.AreEqual(firstEntity.Type, actual.Type);
            Assert.IsTrue(firstEntity.DateTime.Subtract(actual.DateTime) < TimeSpan.FromMilliseconds(1));
            Assert.IsTrue(actual.NullableDateTime.HasValue);
            Assert.IsTrue(firstEntity.NullableDateTime.HasValue);
            Assert.AreEqual(firstEntity.NullableInteger, actual.NullableInteger);
            Assert.AreEqual(firstEntity.String, actual.String);
            Assert.AreEqual(firstEntity.Varchar, actual.Varchar);
        }