Ejemplo n.º 1
0
        public void BatchingTopologicalSort_sorts_circular_direct()
        {
            var model = new Model();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.AddProperty("Id", typeof(int)));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.GetOrSetPrimaryKey(entityTypeB.AddProperty("Id", typeof(int)));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.GetOrSetPrimaryKey(entityTypeC.AddProperty("Id", typeof(int)));

            // C, A -> B -> A
            entityTypeA.GetOrAddForeignKey(entityTypeA.AddProperty(A.PProperty), entityTypeB.FindPrimaryKey(), entityTypeB);
            entityTypeB.GetOrAddForeignKey(entityTypeB.AddProperty(B.PProperty), entityTypeA.FindPrimaryKey(), entityTypeA);

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeC, entityTypeA, entityTypeB);

            Assert.Equal(
                CoreStrings.CircularDependency(nameof(A) + " -> " + nameof(B) + " -> " + nameof(A)),
                Assert.Throws <InvalidOperationException>(() => graph.BatchingTopologicalSort()).Message);
        }
Ejemplo n.º 2
0
        public void BatchingTopologicalSort_sorts_reverse()
        {
            var model = new Model();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.AddProperty("Id", typeof(int)));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.GetOrSetPrimaryKey(entityTypeB.AddProperty("Id", typeof(int)));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.GetOrSetPrimaryKey(entityTypeC.AddProperty("Id", typeof(int)));

            // C -> B -> A
            entityTypeA.GetOrAddForeignKey(entityTypeA.AddProperty(A.PProperty), entityTypeB.FindPrimaryKey(), entityTypeB);
            entityTypeB.GetOrAddForeignKey(entityTypeB.AddProperty(B.PProperty), entityTypeC.FindPrimaryKey(), entityTypeC);

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                new[] { entityTypeC.Name, entityTypeB.Name, entityTypeA.Name },
                graph.BatchingTopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }
Ejemplo n.º 3
0
        public void BatchingTopologicalSort_sorts_simple()
        {
            var model = new Model();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.GetOrSetPrimaryKey(entityTypeB.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.GetOrSetPrimaryKey(entityTypeC.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            // B -> A -> C
            entityTypeC.GetOrAddForeignKey(entityTypeC.GetOrAddProperty("P", typeof(int)), entityTypeA.GetPrimaryKey());
            entityTypeA.GetOrAddForeignKey(entityTypeA.GetOrAddProperty("P", typeof(int)), entityTypeB.GetPrimaryKey());

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                new[] { entityTypeB.Name, entityTypeA.Name, entityTypeC.Name },
                graph.BatchingTopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }
Ejemplo n.º 4
0
        public void BatchingTopologicalSort_sorts_leafy_cycle()
        {
            var model = new Model();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.GetOrSetPrimaryKey(entityTypeB.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.GetOrSetPrimaryKey(entityTypeC.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            // C -> B -> C -> A
            entityTypeB.GetOrAddForeignKey(entityTypeB.GetOrAddProperty("P", typeof(int)), entityTypeC.GetPrimaryKey());
            entityTypeC.GetOrAddForeignKey(entityTypeC.GetOrAddProperty("P", typeof(int)), entityTypeB.GetPrimaryKey());
            entityTypeA.GetOrAddForeignKey(entityTypeA.GetOrAddProperty("P", typeof(int)), entityTypeC.GetPrimaryKey());

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                Strings.CircularDependency(typeof(C).FullName + " -> " + typeof(B).FullName + " -> " + typeof(C).FullName + " -> " + typeof(A).FullName),
                Assert.Throws <InvalidOperationException>(() => graph.BatchingTopologicalSort()).Message);
        }
        public void Sort_reverse()
        {
            var entityTypeA = new NamedEntityType(typeof(A));

            entityTypeA.SetKey(entityTypeA.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            var entityTypeB = new NamedEntityType(typeof(B));

            entityTypeB.SetKey(entityTypeB.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            var entityTypeC = new NamedEntityType(typeof(C));

            entityTypeC.SetKey(entityTypeC.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            // C -> B -> A
            entityTypeA.AddForeignKey(entityTypeB.GetKey(), entityTypeA.AddProperty("P", typeof(int)));
            entityTypeB.AddForeignKey(entityTypeC.GetKey(), entityTypeB.AddProperty("P", typeof(int)));

            var model = new EntityTypeGraph();

            model.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                new[] { entityTypeC.Name, entityTypeB.Name, entityTypeA.Name },
                model.TopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }
        public void Sort_tree()
        {
            var entityTypeA = new NamedEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeB = new NamedEntityType(typeof(B));

            entityTypeB.GetOrSetPrimaryKey(entityTypeB.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeC = new NamedEntityType(typeof(C));

            entityTypeC.GetOrSetPrimaryKey(entityTypeC.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            // A -> B, A -> C, C -> B
            entityTypeB.GetOrAddForeignKey(entityTypeA.GetPrimaryKey(), entityTypeB.GetOrAddProperty("P", typeof(int)));
            entityTypeC.GetOrAddForeignKey(entityTypeA.GetPrimaryKey(), entityTypeC.GetOrAddProperty("P", typeof(int)));
            entityTypeB.GetOrAddForeignKey(entityTypeC.GetPrimaryKey(), entityTypeB.GetOrAddProperty("P", typeof(int)));

            var model = new EntityTypeGraph();

            model.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                new[] { entityTypeA.Name, entityTypeC.Name, entityTypeB.Name },
                model.TopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }
        public void BatchingTopologicalSort_sorts_no_edges()
        {
            var model = CreateModel();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.SetPrimaryKey(entityTypeA.AddProperty("Id", typeof(int)));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.SetPrimaryKey(entityTypeB.AddProperty("Id", typeof(int)));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.SetPrimaryKey(entityTypeC.AddProperty("Id", typeof(int)));

            // A B C
            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeC, entityTypeA, entityTypeB);

            Assert.Equal(
                new[] { entityTypeC.Name, entityTypeA.Name, entityTypeB.Name },
                graph.BatchingTopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }
        public void Sort_leafy_cycle()
        {
            var entityTypeA = new NamedEntityType(typeof(A));

            entityTypeA.SetKey(entityTypeA.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            var entityTypeB = new NamedEntityType(typeof(B));

            entityTypeB.SetKey(entityTypeB.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            var entityTypeC = new NamedEntityType(typeof(C));

            entityTypeC.SetKey(entityTypeC.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            // C -> B -> C -> A
            entityTypeB.AddForeignKey(entityTypeC.GetKey(), entityTypeB.AddProperty("P", typeof(int)));
            entityTypeC.AddForeignKey(entityTypeB.GetKey(), entityTypeC.AddProperty("P", typeof(int)));
            entityTypeA.AddForeignKey(entityTypeC.GetKey(), entityTypeA.AddProperty("P", typeof(int)));

            var model = new EntityTypeGraph();

            model.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                Strings.FormatCircularDependency("C -> B -> C -> A"),
                Assert.Throws <InvalidOperationException>(() => model.TopologicalSort()).Message);
        }
Ejemplo n.º 9
0
        public void Sort_no_edges()
        {
            var model = new Model();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.GetOrSetPrimaryKey(entityTypeB.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.GetOrSetPrimaryKey(entityTypeC.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            // A B C
            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeC, entityTypeA, entityTypeB);

            Assert.Equal(
                new[] { entityTypeC.Name, entityTypeA.Name, entityTypeB.Name },
                graph.TopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }
        public void Sort_circular_transitive()
        {
            var entityTypeA = new NamedEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeB = new NamedEntityType(typeof(B));

            entityTypeB.GetOrSetPrimaryKey(entityTypeB.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeC = new NamedEntityType(typeof(C));

            entityTypeC.GetOrSetPrimaryKey(entityTypeC.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            // A -> C -> B -> A
            entityTypeA.GetOrAddForeignKey(entityTypeB.GetPrimaryKey(), entityTypeA.GetOrAddProperty("P", typeof(int)));
            entityTypeB.GetOrAddForeignKey(entityTypeC.GetPrimaryKey(), entityTypeB.GetOrAddProperty("P", typeof(int)));
            entityTypeC.GetOrAddForeignKey(entityTypeA.GetPrimaryKey(), entityTypeC.GetOrAddProperty("P", typeof(int)));

            var model = new EntityTypeGraph();

            model.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                Strings.FormatCircularDependency(typeof(A).FullName + " -> " + typeof(C).FullName + " -> " + typeof(B).FullName + " -> " + typeof(A).FullName),
                Assert.Throws <InvalidOperationException>(() => model.TopologicalSort()).Message);
        }
        public void BatchingTopologicalSort_sorts_tree()
        {
            var model = CreateModel();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.SetPrimaryKey(entityTypeA.AddProperty("Id", typeof(int)));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.SetPrimaryKey(entityTypeB.AddProperty("Id", typeof(int)));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.SetPrimaryKey(entityTypeC.AddProperty("Id", typeof(int)));

            // A -> B, A -> C, C -> B
            entityTypeB.AddForeignKey(entityTypeB.AddProperty(B.PProperty), entityTypeA.FindPrimaryKey(), entityTypeA);
            entityTypeC.AddForeignKey(entityTypeC.AddProperty(C.PProperty), entityTypeA.FindPrimaryKey(), entityTypeA);
            entityTypeB.AddForeignKey(entityTypeB.AddProperty("P2", typeof(int)), entityTypeC.FindPrimaryKey(), entityTypeC);

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                new[] { entityTypeA.Name, entityTypeC.Name, entityTypeB.Name },
                graph.BatchingTopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }
        public void BatchingTopologicalSort_sorts_leafy_cycle()
        {
            var model = CreateModel();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.SetPrimaryKey(entityTypeA.AddProperty("Id", typeof(int)));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.SetPrimaryKey(entityTypeB.AddProperty("Id", typeof(int)));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.SetPrimaryKey(entityTypeC.AddProperty("Id", typeof(int)));

            // C -> B -> C -> A
            entityTypeB.AddForeignKey(entityTypeB.AddProperty(B.PProperty), entityTypeC.FindPrimaryKey(), entityTypeC);
            entityTypeC.AddForeignKey(entityTypeC.AddProperty(C.PProperty), entityTypeB.FindPrimaryKey(), entityTypeB);
            entityTypeA.AddForeignKey(entityTypeA.AddProperty(A.PProperty), entityTypeC.FindPrimaryKey(), entityTypeC);

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                CoreStrings.CircularDependency(nameof(C) + " ->" + Environment.NewLine + nameof(B) + " ->" + Environment.NewLine + nameof(C)),
                Assert.Throws <InvalidOperationException>(() => graph.BatchingTopologicalSort()).Message);
        }
        public void BatchingTopologicalSort_sorts_preserves_graph()
        {
            var model = CreateModel();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.SetPrimaryKey(entityTypeA.AddProperty("Id", typeof(int)));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.SetPrimaryKey(entityTypeB.AddProperty("Id", typeof(int)));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.SetPrimaryKey(entityTypeC.AddProperty("Id", typeof(int)));

            // B -> A -> C
            entityTypeC.AddForeignKey(entityTypeC.AddProperty(C.PProperty), entityTypeA.FindPrimaryKey(), entityTypeA);
            entityTypeA.AddForeignKey(entityTypeA.AddProperty(A.PProperty), entityTypeB.FindPrimaryKey(), entityTypeB);

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                new[] { entityTypeB.Name, entityTypeA.Name, entityTypeC.Name },
                graph.BatchingTopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());

            Assert.Equal(
                new[] { entityTypeA, entityTypeB, entityTypeC },
                graph.Vertices);

            Assert.Equal(
                new[] { entityTypeC },
                graph.GetOutgoingNeighbors(entityTypeA));

            Assert.Equal(
                new[] { entityTypeA },
                graph.GetOutgoingNeighbors(entityTypeB));

            Assert.Equal(
                new[] { entityTypeB.Name, entityTypeA.Name, entityTypeC.Name },
                graph.BatchingTopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }
Ejemplo n.º 14
0
        public void Sort_preserves_graph()
        {
            var model = new Model();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.GetOrSetPrimaryKey(entityTypeB.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.GetOrSetPrimaryKey(entityTypeC.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            // B -> A -> C
            entityTypeC.GetOrAddForeignKey(entityTypeC.GetOrAddProperty("P", typeof(int)), entityTypeA.GetPrimaryKey());
            entityTypeA.GetOrAddForeignKey(entityTypeA.GetOrAddProperty("P", typeof(int)), entityTypeB.GetPrimaryKey());

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                new[] { entityTypeB.Name, entityTypeA.Name, entityTypeC.Name },
                graph.TopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());

            Assert.Equal(
                new[] { entityTypeA, entityTypeB, entityTypeC },
                graph.Vertices);

            Assert.Equal(
                new[] { entityTypeC },
                graph.GetOutgoingNeighbours(entityTypeA));

            Assert.Equal(
                new[] { entityTypeA },
                graph.GetOutgoingNeighbours(entityTypeB));

            Assert.Equal(
                new[] { entityTypeB.Name, entityTypeA.Name, entityTypeC.Name },
                graph.TopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }
Ejemplo n.º 15
0
        public void Sort_self_ref()
        {
            var model = new Model();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            // A -> A
            entityTypeA.GetOrAddForeignKey(entityTypeA.GetOrAddProperty("P", typeof(int)), entityTypeA.GetPrimaryKey());

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA);

            Assert.Equal(
                Strings.CircularDependency(typeof(A).FullName + " -> " + typeof(A).FullName),
                Assert.Throws <InvalidOperationException>(() => graph.TopologicalSort()).Message);
        }
        public void Sort_preserves_graph()
        {
            var entityTypeA = new NamedEntityType(typeof(A));

            entityTypeA.SetKey(entityTypeA.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            var entityTypeB = new NamedEntityType(typeof(B));

            entityTypeB.SetKey(entityTypeB.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            var entityTypeC = new NamedEntityType(typeof(C));

            entityTypeC.SetKey(entityTypeC.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            // B -> A -> C
            entityTypeC.AddForeignKey(entityTypeA.GetKey(), entityTypeC.AddProperty("P", typeof(int)));
            entityTypeA.AddForeignKey(entityTypeB.GetKey(), entityTypeA.AddProperty("P", typeof(int)));

            var model = new EntityTypeGraph();

            model.Populate(entityTypeA, entityTypeB, entityTypeC);

            Assert.Equal(
                new[] { entityTypeB.Name, entityTypeA.Name, entityTypeC.Name },
                model.TopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());

            Assert.Equal(
                new[] { entityTypeA, entityTypeB, entityTypeC },
                model.Vertices);

            Assert.Equal(
                new[] { entityTypeC },
                model.GetOutgoingNeighbours(entityTypeA));

            Assert.Equal(
                new[] { entityTypeA },
                model.GetOutgoingNeighbours(entityTypeB));

            Assert.Equal(
                new[] { entityTypeB.Name, entityTypeA.Name, entityTypeC.Name },
                model.TopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }
Ejemplo n.º 17
0
        public void BatchingTopologicalSort_sorts_two_cycles()
        {
            var model = new Model();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.AddProperty("Id", typeof(int)));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.GetOrSetPrimaryKey(entityTypeB.AddProperty("Id", typeof(int)));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.GetOrSetPrimaryKey(entityTypeC.AddProperty("Id", typeof(int)));

            var entityTypeD = model.AddEntityType(typeof(D));

            entityTypeD.GetOrSetPrimaryKey(entityTypeD.AddProperty("Id", typeof(int)));

            var entityTypeE = model.AddEntityType(typeof(E));

            entityTypeE.GetOrSetPrimaryKey(entityTypeE.AddProperty("Id", typeof(int)));

            // A -> C -> B -> A
            entityTypeA.GetOrAddForeignKey(entityTypeA.AddProperty(A.PProperty), entityTypeB.FindPrimaryKey(), entityTypeB);
            entityTypeB.GetOrAddForeignKey(entityTypeB.AddProperty(B.PProperty), entityTypeC.FindPrimaryKey(), entityTypeC);
            entityTypeC.GetOrAddForeignKey(entityTypeC.AddProperty(C.PProperty), entityTypeA.FindPrimaryKey(), entityTypeA);

            // A -> E -> D -> A
            entityTypeA.GetOrAddForeignKey(entityTypeA.AddProperty("P2", typeof(int)), entityTypeD.FindPrimaryKey(), entityTypeD);
            entityTypeD.GetOrAddForeignKey(entityTypeD.AddProperty("P2", typeof(int)), entityTypeE.FindPrimaryKey(), entityTypeE);
            entityTypeE.GetOrAddForeignKey(entityTypeE.AddProperty("P2", typeof(int)), entityTypeA.FindPrimaryKey(), entityTypeA);

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA, entityTypeB, entityTypeC, entityTypeD, entityTypeE);

            Assert.Equal(
                CoreStrings.CircularDependency(typeof(A).FullName + " -> " + typeof(C).FullName + " -> " + typeof(B).FullName + " -> " + typeof(A).FullName),
                Assert.Throws <InvalidOperationException>(() => graph.BatchingTopologicalSort()).Message);
        }
Ejemplo n.º 18
0
        public void Sort_two_cycles()
        {
            var model = new Model();

            var entityTypeA = model.AddEntityType(typeof(A));

            entityTypeA.GetOrSetPrimaryKey(entityTypeA.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeB = model.AddEntityType(typeof(B));

            entityTypeB.GetOrSetPrimaryKey(entityTypeB.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeC = model.AddEntityType(typeof(C));

            entityTypeC.GetOrSetPrimaryKey(entityTypeC.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeD = model.AddEntityType(typeof(D));

            entityTypeD.GetOrSetPrimaryKey(entityTypeD.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            var entityTypeE = model.AddEntityType(typeof(E));

            entityTypeE.GetOrSetPrimaryKey(entityTypeE.GetOrAddProperty("Id", typeof(int), shadowProperty: true));

            // A -> C -> B -> A
            entityTypeA.GetOrAddForeignKey(entityTypeA.GetOrAddProperty("P", typeof(int)), entityTypeB.GetPrimaryKey());
            entityTypeB.GetOrAddForeignKey(entityTypeB.GetOrAddProperty("P", typeof(int)), entityTypeC.GetPrimaryKey());
            entityTypeC.GetOrAddForeignKey(entityTypeC.GetOrAddProperty("P", typeof(int)), entityTypeA.GetPrimaryKey());

            // A -> E -> D -> A
            entityTypeA.GetOrAddForeignKey(entityTypeA.GetOrAddProperty("P2", typeof(int)), entityTypeD.GetPrimaryKey());
            entityTypeD.GetOrAddForeignKey(entityTypeD.GetOrAddProperty("P2", typeof(int)), entityTypeE.GetPrimaryKey());
            entityTypeE.GetOrAddForeignKey(entityTypeE.GetOrAddProperty("P2", typeof(int)), entityTypeA.GetPrimaryKey());

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA, entityTypeB, entityTypeC, entityTypeD, entityTypeE);

            Assert.Equal(
                Strings.FormatCircularDependency(typeof(A).FullName + " -> " + typeof(C).FullName + " -> " + typeof(B).FullName + " -> " + typeof(A).FullName),
                Assert.Throws <InvalidOperationException>(() => graph.TopologicalSort()).Message);
        }
        public void BatchingTopologicalSort_sorts_self_ref()
        {
            var model = CreateModel();

            var entityTypeA = model.AddEntityType(typeof(A));
            var property    = entityTypeA.AddProperty("Id", typeof(int));

            entityTypeA.SetPrimaryKey(property);

            // A -> A
            entityTypeA.AddForeignKey(entityTypeA.AddProperty(A.PProperty), entityTypeA.FindPrimaryKey(), entityTypeA);

            var graph = new EntityTypeGraph();

            graph.Populate(entityTypeA);

            Assert.Equal(
                CoreStrings.CircularDependency(nameof(A) + " ->" + Environment.NewLine + nameof(A)),
                Assert.Throws <InvalidOperationException>(() => graph.BatchingTopologicalSort()).Message);
        }
        public void Sort_no_edges()
        {
            var entityTypeA = new NamedEntityType(typeof(A));

            entityTypeA.SetKey(entityTypeA.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            var entityTypeB = new NamedEntityType(typeof(B));

            entityTypeB.SetKey(entityTypeB.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            var entityTypeC = new NamedEntityType(typeof(C));

            entityTypeC.SetKey(entityTypeC.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false));

            // A B C
            var model = new EntityTypeGraph();

            model.Populate(entityTypeC, entityTypeA, entityTypeB);

            Assert.Equal(
                new[] { entityTypeC.Name, entityTypeA.Name, entityTypeB.Name, },
                model.TopologicalSort().SelectMany(e => e).Select(e => e.Name).ToArray());
        }