public async Task UtcReadWrite_SuccessAsync()
        {
            TimestampUtcClass entity;

            // Save
            using (var session = OpenSession())
                using (var tx = session.BeginTransaction())
                {
                    // Create a new datetime value and round it to the precision that the database supports. This
                    // code basically the same as in the implementation but here to guard posible changes.
                    var resolution = session.GetSessionImplementation().Factory.Dialect.TimestampResolutionInTicks;
                    var next       = DateTime.UtcNow;
                    next = next.AddTicks(-(next.Ticks % resolution));

                    entity = new TimestampUtcClass
                    {
                        Id    = 1,
                        Value = next
                    };

                    await(session.SaveAsync(entity));
                    await(tx.CommitAsync());
                    session.Close();
                }

            // Retrieve and compare
            using (var session = OpenSession())
                using (var tx = session.BeginTransaction())
                {
                    var result = await(session.GetAsync <TimestampUtcClass>(entity.Id));
                    Assert.IsNotNull(result, "Entity not saved or cannot be retrieved by its key.");

                    // Property: Value
                    Assert.AreEqual(DateTimeKind.Utc, result.Value.Kind, "Kind is NOT Utc");
                    Assert.AreEqual(entity.Value.Ticks, result.Value.Ticks, "Value should be the same.");

                    // Property: Revision
                    var revision = result.Revision;
                    Assert.AreEqual(DateTimeKind.Utc, revision.Kind, "Kind is NOT Utc");

                    var differenceInMinutes = Math.Abs((revision - DateTime.UtcNow).TotalMinutes);
                    // Take a wide margin for accounting for sometimes bad build servers performances.
                    Assert.Less(differenceInMinutes, 2, "Difference should be less than 2 minutes.");

                    await(tx.CommitAsync());
                    session.Close();
                }

            // Delete
            using (var session = OpenSession())
                using (var tx = session.BeginTransaction())
                {
                    var result = await(session.GetAsync <TimestampUtcClass>(entity.Id));
                    await(session.DeleteAsync(result));
                    await(tx.CommitAsync());
                    session.Close();
                }
        }
        public void UtcReadWrite_Success()
        {
            TimestampUtcClass entity;

            // Save
            using (var session = OpenSession())
                using (var tx = session.BeginTransaction())
                {
                    // Create a new datetime value and round it to the precision that the database supports. This
                    // code basically the same as in the implementation but here to guard posible changes.
                    var resolution = session.GetSessionImplementation().Factory.Dialect.TimestampResolutionInTicks;
                    var next       = DateTime.UtcNow;
                    next = next.AddTicks(-(next.Ticks % resolution));

                    entity = new TimestampUtcClass
                    {
                        Id    = 1,
                        Value = next
                    };

                    session.Save(entity);
                    tx.Commit();
                    session.Close();
                }

            // Retrieve and compare
            using (var session = OpenSession())
                using (var tx = session.BeginTransaction())
                {
                    var result = session.Get <TimestampUtcClass>(entity.Id);
                    Assert.IsNotNull(result, "Entity not saved or cannot be retrieved by its key.");

                    // Property: Value
                    Assert.AreEqual(DateTimeKind.Utc, result.Value.Kind, "Kind is NOT Utc");
                    Assert.AreEqual(entity.Value.Ticks, result.Value.Ticks, "Value should be the same.");

                    // Property: Revision
                    var revision = result.Revision;
                    Assert.AreEqual(DateTimeKind.Utc, revision.Kind, "Kind is NOT Utc");

                    var differenceInSeconds = Math.Abs((revision - DateTime.UtcNow).TotalSeconds);
                    Assert.IsTrue(differenceInSeconds < 1d, "Difference should be less then 1 second.");

                    tx.Commit();
                    session.Close();
                }

            // Delete
            using (var session = OpenSession())
                using (var tx = session.BeginTransaction())
                {
                    var result = session.Get <TimestampUtcClass>(entity.Id);
                    session.Delete(result);
                    tx.Commit();
                    session.Close();
                }
        }
        public async Task LocalReadWrite_FailAsync(DateTimeKind kind)
        {
            var entity = new TimestampUtcClass
            {
                Id    = 1,
                Value = DateTime.SpecifyKind(DateTime.Now, kind)
            };

            using (var session = OpenSession())
                using (var tx = session.BeginTransaction())
                {
                    await(session.SaveAsync(entity));
                    Assert.That(() => session.FlushAsync(), Throws.TypeOf <PropertyValueException>());
                    await(tx.RollbackAsync());
                }
        }
        public void LocalReadWrite_Fail(DateTimeKind kind)
        {
            var entity = new TimestampUtcClass
            {
                Id    = 1,
                Value = DateTime.SpecifyKind(DateTime.Now, kind)
            };

            using (var session = OpenSession())
                using (var tx = session.BeginTransaction())
                {
                    session.Save(entity);
                    Assert.That(() => session.Flush(), Throws.TypeOf <PropertyValueException>());
                    tx.Rollback();
                }
        }