public void Ctor_throws_when_invalid_isolation_level()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                connection.Open();

                var ex = Assert.Throws<ArgumentException>(() => connection.BeginTransaction(0));

                Assert.Equal(Strings.FormatInvalidIsolationLevel(0), ex.Message);
            }
        }
        public void Ctor_unsets_read_uncommitted_when_serializable()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                connection.Open();

                using (connection.BeginTransaction(IsolationLevel.Serializable))
                {
                    Assert.Equal(0L, connection.ExecuteScalar<long>("PRAGMA read_uncommitted"));
                }
            }
        }
        public void IsolationLevel_is_infered_when_unspecified()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                connection.Open();
                connection.ExecuteNonQuery("PRAGMA read_uncommitted = 1");

                using (var transaction = connection.BeginTransaction())
                {
                    Assert.Equal(IsolationLevel.ReadUncommitted, transaction.IsolationLevel);
                }
            }
        }
        public void IsolationLevel_throws_when_completed()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                connection.Open();

                var transaction = connection.BeginTransaction();
                transaction.Dispose();

                var ex = Assert.Throws<InvalidOperationException>(() => transaction.IsolationLevel);

                Assert.Equal(Strings.TransactionCompleted, ex.Message);
            }
        }
        public void Dispose_can_be_called_more_than_once()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                CreateTestTable(connection);

                var transaction = connection.BeginTransaction();
                transaction.Dispose();
                transaction.Dispose();
            }
        }
        public void Commit_throws_when_connection_closed()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                connection.Open();

                using (var transaction = connection.BeginTransaction())
                {
                    connection.Close();

                    var ex = Assert.Throws<InvalidOperationException>(() => transaction.Commit());

                    Assert.Equal(Strings.TransactionCompleted, ex.Message);
                }
            }
        }
        public void Dispose_works()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                CreateTestTable(connection);

                using (var transaction = connection.BeginTransaction())
                {
                    using (var command = connection.CreateCommand())
                    {
                        command.CommandText = "INSERT INTO TestTable VALUES (1)";
                        command.ExecuteNonQuery();

                        transaction.Dispose();

                        Assert.Null(connection.Transaction);
                        Assert.Null(transaction.Connection);
                    }
                }

                Assert.Equal(0L, connection.ExecuteScalar<long>("SELECT COUNT(*) FROM TestTable"));
            }
        }
        public void BeginTransaction_works()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                connection.Open();

                using (var transaction = connection.BeginTransaction())
                {
                    Assert.NotNull(transaction);
                    Assert.Same(transaction, connection.Transaction);
                    Assert.Equal(connection, transaction.Connection);
                    Assert.Equal(IsolationLevel.Serializable, transaction.IsolationLevel);
                }
            }
        }
        public void BeginTransaction_throws_when_parallel_transaction()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                connection.Open();

                using (connection.BeginTransaction())
                {
                    var ex = Assert.Throws<InvalidOperationException>(() => connection.BeginTransaction());

                    Assert.Equal(Strings.ParallelTransactionsNotSupported, ex.Message);
                }
            }
        }
        public void BeginTransaction_throws_when_closed()
        {
            using (var connection = new SQLiteConnection())
            {
                var ex = Assert.Throws<InvalidOperationException>(() => connection.BeginTransaction());

                Assert.Equal(Strings.FormatCallRequiresOpenConnection("BeginTransaction"), ex.Message);
            }
        }
        public void ExecuteReader_throws_when_transaction_required()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = "SELECT 1";
                    connection.Open();

                    using (connection.BeginTransaction())
                    {
                        var ex = Assert.Throws<InvalidOperationException>(() => command.ExecuteReader());

                        Assert.Equal(Strings.TransactionRequired, ex.Message);
                    }
                }
            }
        }
        public void ExecuteNonQuery_throws_when_transaction_mismatched()
        {
            using (var connection = new SQLiteConnection("Filename=:memory:"))
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = "SELECT 1";
                    connection.Open();

                    using (var otherConnection = new SQLiteConnection("Filename=:memory:"))
                    {
                        otherConnection.Open();

                        using (var transction = otherConnection.BeginTransaction())
                        {
                            command.Transaction = transction;

                            var ex = Assert.Throws<InvalidOperationException>(() => command.ExecuteNonQuery());

                            Assert.Equal(Strings.TransactionConnectionMismatch, ex.Message);
                        }
                    }
                }
            }
        }