public void RestoreSnapshot_Throws_When_No_Snapshots_Exist()
        {
            using (var manager = new SqlSnapshotManager(CONNECTION_STRING, TEST_DATABASE_NAME))
            {
                manager.DeleteSnapshot();

                Assert.Throws<NoSnapshotException>(delegate { manager.RestoreSnapshot(); });
            }
        }
        public void RestoreSnapshot_Reverts_Database_DML_Operations()
        {
            // arrange
            using (var manager = new SqlSnapshotManager(CONNECTION_STRING, TEST_DATABASE_NAME))
            {
                var CountCommand = new SqlCommand("SELECT Count(name) FROM People");
                var DestructiveCommand = new SqlCommand("DELETE FROM People");

                using (var conn = new SqlConnection(CONNECTION_STRING))
                {
                    conn.Open();
                    conn.ChangeDatabase(TEST_DATABASE_NAME);
                    SetupDatabase(conn);

                    CountCommand.Connection = conn;
                    DestructiveCommand.Connection = conn;

                    manager.SaveSnapshot();
                    Assert.AreEqual(4, CountCommand.ExecuteScalar());

                    DestructiveCommand.ExecuteNonQuery();
                    Assert.AreEqual(0, CountCommand.ExecuteScalar());

                    // close connection so exclusive access can be attained for restore
                    conn.Close();

                    // ACT
                    manager.RestoreSnapshot();

                    conn.Open();
                    conn.ChangeDatabase(TEST_DATABASE_NAME);
                    Assert.AreEqual(4, CountCommand.ExecuteScalar());
                }
            }
        }
        public void RestoreSnapshot_Reverts_Database_DDL_Operations()
        {
            // arrange
            using (var manager = new SqlSnapshotManager(CONNECTION_STRING, TEST_DATABASE_NAME))
            {
                var ExistsCommand = new SqlCommand("SELECT OBJECT_ID(N'dbo.People')");
                var DestructiveCommand = new SqlCommand("DROP TABLE People");

                using (var conn = new SqlConnection(CONNECTION_STRING))
                {
                    conn.Open();
                    conn.ChangeDatabase(TEST_DATABASE_NAME);
                    SetupDatabase(conn);

                    ExistsCommand.Connection = conn;
                    DestructiveCommand.Connection = conn;

                    manager.SaveSnapshot();
                    Assert.AreNotEqual(DBNull.Value, ExistsCommand.ExecuteScalar());

                    DestructiveCommand.ExecuteNonQuery();
                    Assert.AreEqual(DBNull.Value, ExistsCommand.ExecuteScalar());

                    // close connection so exclusive access can be attained for restore
                    conn.Close();

                    // ACT
                    manager.RestoreSnapshot();

                    conn.Open();
                    conn.ChangeDatabase(TEST_DATABASE_NAME);
                    Assert.AreNotEqual(DBNull.Value, ExistsCommand.ExecuteScalar());
                }
            }
        }
        public void Performance_Of_Cycle()
        {
            using (var manager = new SqlSnapshotManager(CONNECTION_STRING, TEST_DATABASE_NAME))
            {
                var timer = new Stopwatch();
                timer.Start();
                manager.SaveSnapshot();
                manager.RestoreSnapshot();
                timer.Stop();

                Console.WriteLine("The snapshot save/restore cycle takes {0} milliseconds on this machine.".Fill(timer.ElapsedMilliseconds));
            }
        }
        public void Performance_Of_Average_Restore()
        {
            using (var manager = new SqlSnapshotManager(CONNECTION_STRING, TEST_DATABASE_NAME))
            {
                var timer = new Stopwatch();
                manager.SaveSnapshot();

                var count = 10;
                timer.Start();

                for (int i = 0; i < count; i++)
                {
                    manager.RestoreSnapshot();
                }

                timer.Stop();

                Console.WriteLine("Restoring a snapshot took an average of {0} milliseconds on this machine.".Fill(timer.ElapsedMilliseconds / count));
            }
        }
 // tests | manual
 public void Manually_Restore_Snapshot()
 {
     var manager = new SqlSnapshotManager(CONNECTION_STRING, TEST_DATABASE_NAME);
     manager.RestoreSnapshot();
 }