예제 #1
0
        public void TestTopologicalSort()
        {
            //arrange
            var schema = new DatabaseSchema(null, null);

            var orders = new DatabaseTable();

            orders.Name = "orders";
            var productsFk = new DatabaseConstraint
            {
                ConstraintType = ConstraintType.ForeignKey,
                RefersToTable  = "products"
            };

            orders.AddConstraint(productsFk);
            schema.Tables.Add(orders);

            var categories = new DatabaseTable();

            categories.Name = "categories";
            schema.Tables.Add(categories);

            var products = new DatabaseTable();

            products.Name = "products";
            var categoriesFk = new DatabaseConstraint();

            categoriesFk.ConstraintType = ConstraintType.ForeignKey;
            categoriesFk.RefersToTable  = "categories";
            products.AddConstraint(categoriesFk);
            schema.Tables.Add(products);

            //act
            var sortedTables = SchemaTablesSorter.TopologicalSort(schema);

            //assert
            var first = sortedTables.First();
            var last  = sortedTables.Last();

            Assert.AreEqual(categories, first);
            Assert.AreEqual(orders, last);
        }
예제 #2
0
        public void WithBidirectionalDepndencyTopologicalSort()
        {
            //arrange
            var schema = new DatabaseSchema(null, null);

            var orders = new DatabaseTable();

            orders.Name = "countries";
            var productsFk = new DatabaseConstraint();

            productsFk.ConstraintType = ConstraintType.ForeignKey;
            productsFk.RefersToTable  = "capitalcities";
            orders.AddConstraint(productsFk);
            schema.Tables.Add(orders);

            var products = new DatabaseTable();

            products.Name = "capitalcities";
            var categoriesFk = new DatabaseConstraint();

            categoriesFk.ConstraintType = ConstraintType.ForeignKey;
            categoriesFk.RefersToTable  = "countries";
            products.AddConstraint(categoriesFk);
            schema.Tables.Add(products);

            //a country has one capital city
            //a capital city is in one country
            //But bidirectional foreign keys is terrible database design - you really only need one direction.
            //(you have to save the country with a null capital, then the capital, then update the country again).
            //Topological sorts don't support cycles, so we should just get back the original list

            //act
            var sortedTables = SchemaTablesSorter.TopologicalSort(schema);

            //assert
            Assert.AreEqual(2, sortedTables.Count());
            //non-deterministic order
        }
        public void TestSqlServerGetDateCheckConstraint()
        {
            //arrange
            var table = new DatabaseTable {
                Name = "Orders"
            };

            var check = new DatabaseConstraint
            {
                ConstraintType = ConstraintType.Check,
                Expression     = "[OrderDate] >getDate()",
                Name           = "ValidationRule"
            };

            table.AddConstraint(check);

            var writer = new TableGenerator(table);

            //act
            var txt = writer.Write();

            //assert
            Assert.IsTrue(txt.Contains("ALTER TABLE [Orders] ADD CONSTRAINT [ValidationRule] CHECK ([OrderDate] >getDate());"));
        }
        public void TestAccessCheckConstraint()
        {
            //arrange
            var table = new DatabaseTable {
                Name = "Orders"
            };

            var check = new DatabaseConstraint
            {
                ConstraintType = ConstraintType.Check,
                Expression     = "> 0",
                Name           = "[Orders].[Quantity].ValidationRule"
            };

            table.AddConstraint(check);

            var writer = new ConstraintWriter(table);

            //act
            var txt = writer.WriteCheckConstraints();

            //assert
            Assert.IsTrue(txt.Contains("ALTER TABLE [Orders] ADD CONSTRAINT [Orders_Quantity_ValidationRule] CHECK ([Orders].[Quantity] > 0);"));
        }