public void TransformCreateTableToAlterColumnTest()
        {
            string rawScript = @"CREATE TABLE [Person].[Contact](
	[ContactID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[NameStyle] [dbo].[NameStyle] NOT NULL CONSTRAINT [DF_Contact_NameStyle]  DEFAULT ((0)),
	[Title] [nvarchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
	[FirstName] [dbo].[Name] NOT NULL,
	[MiddleName] [dbo].[Name] NULL)"    ;
            string schema    = "Person";
            string tableName = "Contact";
            string changedScript;

            #region expected script ...
            string changedScriptExpected = @"IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'ContactID')
	ALTER TABLE [Person].[Contact] ALTER COLUMN [ContactID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL
ELSE
	ALTER TABLE [Person].[Contact] ADD [ContactID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL
GO

IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'NameStyle')
	ALTER TABLE [Person].[Contact] ALTER COLUMN     [NameStyle] [dbo].[NameStyle] NOT NULL 
ELSE
	ALTER TABLE [Person].[Contact] ADD  [NameStyle] [dbo].[NameStyle] NOT NULL 
GO

IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'Title')
	ALTER TABLE [Person].[Contact] ALTER COLUMN [Title] [nvarchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
ELSE
	ALTER TABLE [Person].[Contact] ADD [Title] [nvarchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
GO

IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'FirstName')
	ALTER TABLE [Person].[Contact] ALTER COLUMN [FirstName] [dbo].[Name] NOT NULL
ELSE
	ALTER TABLE [Person].[Contact] ADD [FirstName] [dbo].[Name] NOT NULL
GO

IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'MiddleName')
	ALTER TABLE [Person].[Contact] ALTER COLUMN [MiddleName] [dbo].[Name] NULL)
ELSE
	ALTER TABLE [Person].[Contact] ADD [MiddleName] [dbo].[Name] NULL)
GO

";
            #endregion

            List <string> expected = new List <string>();
            expected.AddRange(new string[] { "ContactID", "NameStyle", "Title", "FirstName", "MiddleName" });

            List <string> actual;
            actual = ScriptWrapping.TransformCreateTableToAlterColumn(rawScript, schema, tableName, out changedScript);
            Assert.AreEqual(changedScriptExpected, changedScript);
            Assert.AreEqual(string.Join(",", expected.ToArray()), string.Join(",", actual.ToArray()));
        }
        public void ExtractTableNameFromScriptTest_DefaultSchema()
        {
            string rawScript = @"ALTER TABLE [TestTable] ALTER COLUMN column3 varchar(50)";
            string schema;
            string schemaExpected = "dbo";
            string tableName;
            string tableNameExpected = "TestTable";

            ScriptWrapping.ExtractTableNameFromScript(rawScript, out schema, out tableName);
            Assert.AreEqual(schemaExpected, schema);
            Assert.AreEqual(tableNameExpected, tableName);
        }
        public void ExtractTableNameFromScriptTest_CustomSchema()
        {
            string rawScript = @"CREATE TABLE [testSchema].[TestTable] 
(
    column2 int,
    column3 varchar(50)
)";

            string schema;
            string schemaExpected = "testSchema";
            string tableName;
            string tableNameExpected = "TestTable";

            ScriptWrapping.ExtractTableNameFromScript(rawScript, out schema, out tableName);
            Assert.AreEqual(schemaExpected, schema);
            Assert.AreEqual(tableNameExpected, tableName);
        }
        public void ExtractTableNameFromScriptTest_UnableToFindTable()
        {
            string rawScript = @"CREATE TABL [TestTable] 
(
    column2 int,
    column3 varchar(50)
)";

            string schema;
            string schemaExpected = "dbo";
            string tableName;
            string tableNameExpected = "";

            ScriptWrapping.ExtractTableNameFromScript(rawScript, out schema, out tableName);
            Assert.AreEqual(schemaExpected, schema);
            Assert.AreEqual(tableNameExpected, tableName);
        }
        public void TransformCreateTableToResyncTableTest_MissingTableName()
        {
            string rawScript = @"CREATE TABLE [Person].[Contact](
	[ContactID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[NameStyle] [dbo].[NameStyle] NOT NULL CONSTRAINT [DF_Contact_NameStyle]  DEFAULT ((0)),
	[Title] [nvarchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
	[FirstName] [dbo].[Name] NOT NULL,
	[MiddleName] [dbo].[Name] NULL)"    ;
            string schema    = "Person";
            string tableName = "";

            #region expected ...
            string expected = rawScript;
            #endregion
            string actual;
            actual = ScriptWrapping.TransformCreateTableToResyncTable(rawScript, schema, tableName);
            Assert.AreEqual(expected, actual);
        }
        public void TransformCreateTableToAlterColumnTest_MissingTableName()
        {
            string rawScript = @"CREATE TABLE [Person].[Contact](
	[ContactID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[NameStyle] [dbo].[NameStyle] NOT NULL CONSTRAINT [DF_Contact_NameStyle]  DEFAULT ((0)),
	[Title] [nvarchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
	[FirstName] [dbo].[Name] NOT NULL,
	[MiddleName] [dbo].[Name] NULL)"    ;
            string schema    = "Person";
            string tableName = "";
            string changedScript;
            string changedScriptExpected = rawScript;

            List <string> expected = new List <string>();

            List <string> actual;

            actual = ScriptWrapping.TransformCreateTableToAlterColumn(rawScript, schema, tableName, out changedScript);
            Assert.AreEqual(changedScriptExpected, changedScript);
            Assert.AreEqual(string.Join(",", expected.ToArray()), string.Join(",", actual.ToArray()));
        }
        public void TransformCreateTableToResyncTableTest()
        {
            string rawScript = @"CREATE TABLE [Person].[Contact](
	[ContactID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[NameStyle] [dbo].[NameStyle] NOT NULL CONSTRAINT [DF_Contact_NameStyle]  DEFAULT ((0)),
	[Title] [nvarchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
	[FirstName] [dbo].[Name] NOT NULL,
	[MiddleName] [dbo].[Name] NULL)"    ;
            string schema    = "Person";
            string tableName = "Contact";

            #region expected ...
            string expected = @"IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person')
	CREATE TABLE [Person].[Contact]  (temp_will_be_removed bit NULL)
GO

IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'ContactID')
	ALTER TABLE [Person].[Contact] ALTER COLUMN [ContactID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL
ELSE
	ALTER TABLE [Person].[Contact] ADD [ContactID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL
GO

IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'NameStyle')
	ALTER TABLE [Person].[Contact] ALTER COLUMN     [NameStyle] [dbo].[NameStyle] NOT NULL 
ELSE
	ALTER TABLE [Person].[Contact] ADD  [NameStyle] [dbo].[NameStyle] NOT NULL 
GO

IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'Title')
	ALTER TABLE [Person].[Contact] ALTER COLUMN [Title] [nvarchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
ELSE
	ALTER TABLE [Person].[Contact] ADD [Title] [nvarchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
GO

IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'FirstName')
	ALTER TABLE [Person].[Contact] ALTER COLUMN [FirstName] [dbo].[Name] NOT NULL
ELSE
	ALTER TABLE [Person].[Contact] ADD [FirstName] [dbo].[Name] NOT NULL
GO

IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'MiddleName')
	ALTER TABLE [Person].[Contact] ALTER COLUMN [MiddleName] [dbo].[Name] NULL)
ELSE
	ALTER TABLE [Person].[Contact] ADD [MiddleName] [dbo].[Name] NULL)
GO


IF EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME = 'temp_will_be_removed')
	ALTER TABLE [Person].[Contact] DROP COLUMN temp_will_be_removed
GO

--Remove any obsolete columns
DECLARE @sql varchar(1000)
DECLARE @col varchar(250)
DECLARE @FK varchar(250)
DECLARE @tmp TABLE(columnName varchar(250))
DECLARE @tmpFK TABLE(constraintName varchar(250))
INSERT INTO @tmp SELECT COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME = 'Contact' AND TABLE_SCHEMA = 'Person' AND COLUMN_NAME NOT IN ('ContactID','NameStyle','Title','FirstName','MiddleName')
DECLARE curRemove CURSOR FOR SELECT columnName FROM @tmp
OPEN curRemove
FETCH NEXT FROM curRemove INTO @col
WHILE @@FETCH_STATUS = 0
BEGIN
	INSERT INTO @tmpFK SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where column_name = @col AND Table_Name = 'Contact' AND TABLE_SCHEMA = 'Person'
	DECLARE curFK CURSOR FOR SELECT constraintName FROM @tmpFK
	OPEN curFK
	FETCH NEXT FROM curFK INTO @FK
	WHILE @@FETCH_STATUS = 0
	BEGIN
		SET @sql = 'IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE CONSTRAINT_NAME = '''+@FK+''') ALTER TABLE [Person].[Contact] DROP CONSTRAINT ' +@FK
		PRINT @sql
		EXEC(@sql)
		FETCH NEXT FROM curFK INTO @FK
	END
	CLOSE curFK
	DEALLOCATE curFK 
	SET @sql = 'ALTER TABLE [Person].[Contact] DROP COLUMN ' +@col
	PRINT @sql
	EXEC(@sql)
	DELETE FROM @tmpFK
	FETCH NEXT FROM curRemove INTO @col
END
CLOSE curRemove
DEALLOCATE curRemove
GO

";
            #endregion
            string actual;
            actual = ScriptWrapping.TransformCreateTableToResyncTable(rawScript, schema, tableName);
            Assert.AreEqual(expected, actual);
        }