示例#1
0
        public void MultipleImplementations()
        {
            using (var container = new RhetosTestContainer())
            {
                var repository = container.Resolve<Common.DomRepository>();

                // Initialize data:

                repository.TestPolymorphic.MultipleImplementations.Delete(repository.TestPolymorphic.MultipleImplementations.All());

                var mi1 = new TestPolymorphic.MultipleImplementations { Name1 = "abc", Name2 = "123" };
                var mi2 = new TestPolymorphic.MultipleImplementations { Name1 = "def", Name2 = "456" };

                repository.TestPolymorphic.MultipleImplementations.Insert(new[] { mi1, mi2 });

                // Testing unions:

                var base1 = repository.TestPolymorphic.Base1.All();
                Assert.AreEqual("abc, cba, def, fed", TestUtility.DumpSorted(base1, item => item.Name1));

                var base2 = repository.TestPolymorphic.Base2.All();
                Assert.AreEqual("123, 321, 456, 654", TestUtility.DumpSorted(base2, item => item.Name2));

                var base3 = repository.TestPolymorphic.Base3.All();
                Assert.AreEqual("abc-3, def-3", TestUtility.DumpSorted(base3, item => item.Name1));

                // Testing specific implementation ID uniqueness:

                var base1IDs = base1.Select(item => item.ID).ToList();
                Assert.AreEqual(base1IDs.Count, base1IDs.Distinct().Count());

                // Testing specific implementation ID stability:

                var secondRead = repository.TestPolymorphic.Base1.All();
                Assert.AreEqual(
                    TestUtility.DumpSorted(base1IDs),
                    TestUtility.DumpSorted(secondRead, item => item.ID));

                // Testing querying by specific implementation subtype:

                Assert.AreEqual(
                    "abc-, cba-abc, def-, fed-def",
                    TestUtility.DumpSorted(repository.TestPolymorphic.Base1.Query()
                        .Select(item => item.Name1 + "-" + item.MultipleImplementationsReverse.Name1)));

                // Testing C# implementation:

                int implementationHash = DomUtility.GetSubtypeImplementationHash("Reverse");

                var expected = new[] {
                    new TestPolymorphic.Base1 {
                        ID = DomUtility.GetSubtypeImplementationId(mi1.ID, implementationHash),
                        MultipleImplementationsReverseID = mi1.ID },
                    new TestPolymorphic.Base1 {
                        ID = DomUtility.GetSubtypeImplementationId(mi2.ID, implementationHash),
                        MultipleImplementationsReverseID = mi2.ID },
                };
                var actual = base1.Where(item => item.MultipleImplementationsReverseID != null);
                Assert.AreEqual(
                    TestUtility.DumpSorted(expected, item => item.MultipleImplementationsReverseID.ToString() + "/" + item.ID.ToString()),
                    TestUtility.DumpSorted(actual, item => item.MultipleImplementationsReverseID.ToString() + "/" + item.ID.ToString()));

                // Testing persisted IDs for specific implementation subtype:

                Assert.AreEqual(
                    TestUtility.DumpSorted(base1IDs),
                    TestUtility.DumpSorted(repository.TestPolymorphic.Base1_Materialized.Query().Select(item => item.ID)));
            }
        }
示例#2
0
        public void MultipleImplementations()
        {
            foreach (bool useDatabaseNullSemantics in new[] { false, true })
            {
                using (var container = new RhetosTestContainer())
                {
                    container.SetUseDatabaseNullSemantics(useDatabaseNullSemantics);
                    var repository = container.Resolve <Common.DomRepository>();

                    // Initialize data:

                    repository.TestPolymorphic.MultipleImplementations.Delete(repository.TestPolymorphic.MultipleImplementations.Query());

                    var mi1 = new TestPolymorphic.MultipleImplementations {
                        Name1 = "abc", Name2 = "123"
                    };
                    var mi2 = new TestPolymorphic.MultipleImplementations {
                        Name1 = "def", Name2 = "456"
                    };

                    repository.TestPolymorphic.MultipleImplementations.Insert(new[] { mi1, mi2 });

                    // Testing unions:

                    var base1 = repository.TestPolymorphic.Base1.Load();
                    Assert.AreEqual("abc, cba, def, fed", TestUtility.DumpSorted(base1, item => item.Name1));

                    var base2 = repository.TestPolymorphic.Base2.Load();
                    Assert.AreEqual("123, 321, 456, 654", TestUtility.DumpSorted(base2, item => item.Name2));

                    var base3 = repository.TestPolymorphic.Base3.Load();
                    Assert.AreEqual("abc-3, def-3", TestUtility.DumpSorted(base3, item => item.Name1));

                    // Testing specific implementation ID uniqueness:

                    var base1IDs = base1.Select(item => item.ID).ToList();
                    Assert.AreEqual(base1IDs.Count, base1IDs.Distinct().Count());

                    // Testing specific implementation ID stability:

                    var secondRead = repository.TestPolymorphic.Base1.Query();
                    Assert.AreEqual(
                        TestUtility.DumpSorted(base1IDs),
                        TestUtility.DumpSorted(secondRead, item => item.ID));

                    // Testing querying by specific implementation subtype:

                    Assert.AreEqual(
                        "abc-, cba-abc, def-, fed-def",
                        TestUtility.DumpSorted(repository.TestPolymorphic.Base1.Query()
                                               .ToList()
                                               .Select(item => item.Name1 + "-" + item.MultipleImplementationsReverse?.Name1)));

                    // Testing C# implementation:

                    int implementationHash = DomUtility.GetSubtypeImplementationHash("Reverse");

                    var expected = new[] {
                        new TestPolymorphic.Base1 {
                            ID = DomUtility.GetSubtypeImplementationId(mi1.ID, implementationHash),
                            MultipleImplementationsReverseID = mi1.ID
                        },
                        new TestPolymorphic.Base1 {
                            ID = DomUtility.GetSubtypeImplementationId(mi2.ID, implementationHash),
                            MultipleImplementationsReverseID = mi2.ID
                        },
                    };
                    var actual = base1.Where(item => item.MultipleImplementationsReverseID != null);
                    Assert.AreEqual(
                        TestUtility.DumpSorted(expected, item => item.MultipleImplementationsReverseID.ToString() + "/" + item.ID.ToString()),
                        TestUtility.DumpSorted(actual, item => item.MultipleImplementationsReverseID.ToString() + "/" + item.ID.ToString()));

                    // Testing persisted IDs for specific implementation subtype:

                    Assert.AreEqual(
                        TestUtility.DumpSorted(base1IDs),
                        TestUtility.DumpSorted(repository.TestPolymorphic.Base1_Materialized.Query().Select(item => item.ID)));
                }
            }
        }