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))); } }
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))); } } }