public void Given_a_specification_with_a_missing_table_then_the_missing_table_should_be_detected()
            {
                // Arrange
                TestingSchemaSpecification spec1 = new TestingSchemaSpecification();
                spec1.AddTable("t1");
                Table expected = spec1.AddTable("t2");

                TestingSchemaSpecification spec2 = new TestingSchemaSpecification();
                spec2.AddTable("t1");

                // Act
                CompareResult result = spec1.Compare(spec2);

                // Assert
                Assert.That(result.MissingList.Count, Is.EqualTo(1));
                Assert.That(result.MissingList[0], Is.SameAs(expected));
            }
            public void Given_two_specifications_with_differences_in_one_table_then_conflict_should_be_detected()
            {
                // Arrange
                TestingSchemaSpecification spec1 = new TestingSchemaSpecification();
                spec1.AddTable("irrelevant");
                Table expectedFirst = spec1.AddTable("t2").WithColumn("c1").Done();

                TestingSchemaSpecification spec2 = new TestingSchemaSpecification();
                spec2.AddTable("irrelevant");
                Table expectedSecond = spec2.AddTable("t2");

                // Act
                CompareResult result = spec1.Compare(spec2);

                // Assert
                Assert.That(result.ConflictList.Count, Is.EqualTo(1));
                Assert.That(result.ConflictList[0].First, Is.SameAs(expectedFirst));
                Assert.That(result.ConflictList[0].Second, Is.SameAs(expectedSecond));
            }
            public void Then_should_return_table_conflicts_with_their_columns_conflicts()
            {
                // Arrange
                TestingSchemaSpecification spec1 = new TestingSchemaSpecification();
                TestingSchemaSpecification spec2 = new TestingSchemaSpecification();

                spec1.AddTable("t1").WithColumn("t1_c1").OfType("int", 4);
                spec1.AddTable("t2").WithColumn("T2_c1").Done();

                spec2.AddTable("t1").WithColumn("t1_c1").OfType("varchar", 4);
                spec2.AddTable("t2");

                // Act
                CompareResult result = spec1.Compare(spec2);

                // Assert
                Assert.That(result.ConflictList.Count, Is.EqualTo(2));
                var firstConflict = result.ConflictList[0];
                Assert.That(firstConflict.Detail, Is.Not.Null);

                var t1ColumnConflictList = firstConflict.Detail.ConflictList;
                Assert.That(t1ColumnConflictList.Count, Is.EqualTo(1));

                Assert.That(t1ColumnConflictList[0].First, Is.TypeOf<Column>());
                Assert.That(((Column)t1ColumnConflictList[0].First).ColumnType, Is.EqualTo("int"));
                Assert.That(((Column)t1ColumnConflictList[0].Second).ColumnType, Is.EqualTo("varchar"));

                // Asserting missing column
                var secondConflict = result.ConflictList[1];
                Assert.That(secondConflict.Detail, Is.Not.Null);
                var t2ColumnMissingList = secondConflict.Detail.MissingList;
                Assert.That(t2ColumnMissingList.Count, Is.EqualTo(1));
                Assert.That(t2ColumnMissingList[0], Is.TypeOf<Column>());
                Assert.That(t2ColumnMissingList[0].Name, Is.EqualTo("T2_c1"));
            }
            public void Given_a_specification_with_extra_tables_then_the_extra_tables_should_be_ignored()
            {
                // Arrange
                TestingSchemaSpecification spec1 = new TestingSchemaSpecification();
                spec1.AddTable("t1");

                TestingSchemaSpecification spec2 = new TestingSchemaSpecification();
                spec2.AddTable("t1");
                spec2.AddTable("t2");

                // Act
                CompareResult result = spec1.Compare(spec2);

                // Assert
                Assert.That(result.HaveValues, Is.False);
            }