// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. namespace System.Data.Entity.Infrastructure { using System.Data.Entity.Internal; using System.Data.Entity.Resources; using Moq; using Xunit; public class DbPropertyEntryTests { [Fact] public void NonGeneric_DbPropertyEntry_delegates_to_InternalReferenceEntry() { var v = new DbPropertyEntryVerifier(); v.VerifyGetter(e => e.CurrentValue, m => m.CurrentValue); var value = new object(); v.VerifySetter(e => e.CurrentValue = value, m => m.CurrentValue = value); v.VerifyGetter(e => e.EntityEntry, m => m.InternalEntityEntry); v.VerifyGetter(e => e.IsModified, m => m.IsModified); v.VerifySetter(e => e.IsModified = true, m => m.IsModified = true); v.VerifyGetter(e => e.Name, m => m.Name); v.VerifyGetter(e => e.OriginalValue, m => m.OriginalValue); v.VerifySetter(e => e.OriginalValue = value, m => m.OriginalValue = value); v.VerifyGetter(e => e.ParentProperty, m => m.ParentPropertyEntry); v.VerifyMethod(e => e.GetValidationErrors(), m => m.GetValidationErrors()); } [Fact] public void Generic_DbPropertyEntry_delegates_to_InternalReferenceEntry() { var v = new DbPropertyEntryVerifier(); v.VerifyGetter(e => e.CurrentValue, m => m.CurrentValue); var value = new object(); v.VerifySetter(e => e.CurrentValue = value, m => m.CurrentValue = value); v.VerifyGetter(e => e.EntityEntry, m => m.InternalEntityEntry); v.VerifyGetter(e => e.IsModified, m => m.IsModified); v.VerifySetter(e => e.IsModified = true, m => m.IsModified = true); v.VerifyGetter(e => e.Name, m => m.Name); v.VerifyGetter(e => e.OriginalValue, m => m.OriginalValue); v.VerifySetter(e => e.OriginalValue = value, m => m.OriginalValue = value); v.VerifyGetter(e => e.ParentProperty, m => m.ParentPropertyEntry); v.VerifyMethod(e => e.GetValidationErrors(), m => m.GetValidationErrors()); } public class EntityEntry { [Fact] public void EntityEntity_can_be_obtained_from_generic_DbPropertyEntry_back_reference() { var entityEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object); var backEntry = entityEntry.Property(e => e.ValueTypeProp).EntityEntry; Assert.Same(entityEntry.Entity, backEntry.Entity); } [Fact] public void EntityEntity_can_be_obtained_from_non_generic_DbPropertyEntry_back_reference() { var entityEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object); var backEntry = entityEntry.Property("ValueTypeProp").EntityEntry; Assert.Same(entityEntry.Entity, backEntry.Entity); } } public class ParentProperty { [Fact] public void Parent_PropertyEntity_can_be_obtained_from_nested_generic_DbComplexPropertyEntry_back_reference() { var mockInternalEntry = FakeWithProps.CreateMockInternalEntityEntry(); var propEntry = new DbComplexPropertyEntry( new InternalEntityPropertyEntry(mockInternalEntry.Object, FakeWithProps.ComplexPropertyMetadata)); var backEntry = propEntry.Property(e => e.ValueTypeProp).ParentProperty; Assert.Same(propEntry.Name, backEntry.Name); } [Fact] public void Parent_PropertyEntity_can_be_obtained_from_nested_non_generic_DbComplexPropertyEntry_back_reference() { var mockInternalEntry = FakeWithProps.CreateMockInternalEntityEntry(); var propEntry = new DbComplexPropertyEntry( new InternalEntityPropertyEntry(mockInternalEntry.Object, FakeWithProps.ComplexPropertyMetadata)); var backEntry = propEntry.Property("ValueTypeProp").ParentProperty; Assert.Same(propEntry.Name, backEntry.Name); } [Fact] public void Parent_PropertyEntity_returns_null_for_non_nested_generic_DbPropertyEntry_back_reference() { var entityEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object); var backEntry = entityEntry.Property(e => e.ValueTypeProp).ParentProperty; Assert.Null(backEntry); } [Fact] public void Parent_PropertyEntity_returns_null_for_non_nested_non_generic_DbPropertyEntry_back_reference() { var entityEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object); var backEntry = entityEntry.Property("ValueTypeProp").ParentProperty; Assert.Null(backEntry); } } public class Cast { [Fact] public void Non_generic_DbMemberEntry_for_property_can_be_converted_to_generic_version() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Member("ValueTypeProp"); var generic = memberEntry.Cast(); Assert.IsType>(generic); Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry); } [Fact] public void Non_generic_DbPropertyEntry_for_property_can_be_converted_to_generic_version() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Property("ValueTypeProp"); var generic = memberEntry.Cast(); Assert.IsType>(generic); Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry); } [Fact] public void Non_generic_DbMemberEntry_for_property_can_be_converted_to_generic_version_of_base_entity_type() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Member("ValueTypeProp"); var generic = memberEntry.Cast(); Assert.IsType>(generic); Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry); } [Fact] public void Non_generic_DbPropertyEntry_for_property_can_be_converted_to_generic_version_of_base_entity_type() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Property("ValueTypeProp"); var generic = memberEntry.Cast(); Assert.IsType>(generic); Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry); } [Fact] public void Non_generic_DbMemberEntry_for_property_can_be_converted_to_generic_version_of_base_property_type() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Member("ValueTypeProp"); var generic = memberEntry.Cast(); Assert.IsType>(generic); Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry); } [Fact] public void Non_generic_DbPropertyEntry_for_property_can_be_converted_to_generic_version_of_base_property_type() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Property("ValueTypeProp"); var generic = memberEntry.Cast(); Assert.IsType>(generic); Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry); } [Fact] public void Non_generic_DbMemberEntry_for_property_cannot_be_converted_to_generic_version_of_derived_entity_type() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Member("ValueTypeProp"); Assert.Equal( Strings.DbMember_BadTypeForCast( typeof(DbMemberEntry).Name, typeof(DerivedFakeWithProps).Name, typeof(int).Name, typeof(FakeWithProps).Name, typeof(int).Name), Assert.Throws(() => memberEntry.Cast()).Message); } [Fact] public void Non_generic_DbPropertyEntry_for_property_cannot_be_converted_to_generic_version_of_derived_entity_type() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Property("ValueTypeProp"); Assert.Equal( Strings.DbMember_BadTypeForCast( typeof(DbPropertyEntry).Name, typeof(DerivedFakeWithProps).Name, typeof(int).Name, typeof(FakeWithProps).Name, typeof(int).Name), Assert.Throws(() => memberEntry.Cast()).Message); } [Fact] public void Non_generic_DbMemberEntry_for_property_cannot_be_converted_to_generic_version_of_bad_property_type() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Member("ValueTypeProp"); Assert.Equal( Strings.DbMember_BadTypeForCast( typeof(DbMemberEntry).Name, typeof(FakeWithProps).Name, typeof(string).Name, typeof(FakeWithProps).Name, typeof(int).Name), Assert.Throws(() => memberEntry.Cast()).Message); } [Fact] public void Non_generic_DbPropertyEntry_for_property_cannot_be_converted_to_generic_version_of_bad_property_type() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Property("ValueTypeProp"); Assert.Equal( Strings.DbMember_BadTypeForCast( typeof(DbPropertyEntry).Name, typeof(FakeWithProps).Name, typeof(short).Name, typeof(FakeWithProps).Name, typeof(int).Name), Assert.Throws(() => memberEntry.Cast()).Message); } } public class ImplicitDbPropertyEntry { [Fact] public void Generic_DbPropertyEntry_can_be_implicitly_converted_to_non_generic_version() { var propEntry = new DbPropertyEntry( new InternalEntityPropertyEntry( new Mock>().Object, FakeEntity.FakeNamedFooPropertyMetadata)); NonGenericTestMethod(propEntry, "Foo"); } private void NonGenericTestMethod(DbPropertyEntry nonGenericEntry, string name) { Assert.Same(name, nonGenericEntry.Name); } [Fact] public void Generic_DbPropertyEntry_typed_as_DbMemberEntry_can_be_implicitly_converted_to_non_generic_version() { DbMemberEntry propEntry = new DbPropertyEntry( new InternalEntityPropertyEntry( new Mock>().Object, FakeEntity.FakeNamedFooPropertyMetadata)); NonGenericTestMethodPropAsMember(propEntry, "Foo"); } private void NonGenericTestMethodPropAsMember(DbMemberEntry nonGenericEntry, string name) { Assert.Same(name, nonGenericEntry.Name); Assert.IsType(nonGenericEntry); } [Fact] public void Generic_DbPropertyEntry_typed_as_DbMemberEntry_can_be_explicitly_converted_to_non_generic_DbPropertyEntry() { DbMemberEntry propEntry = new DbPropertyEntry( new InternalEntityPropertyEntry( new Mock>().Object, FakeEntity.FakeNamedFooPropertyMetadata)); NonGenericTestMethod((DbPropertyEntry)propEntry, "Foo"); } [Fact] public void Generic_DbMemberEntry_for_property_can_be_converted_to_non_generic_version() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Member("ValueTypeProp"); var nonGeneric = ImplicitConvert(memberEntry); Assert.IsType(nonGeneric); Assert.Same(memberEntry.InternalMemberEntry, nonGeneric.InternalMemberEntry); } private static DbMemberEntry ImplicitConvert(DbMemberEntry nonGeneric) { return nonGeneric; } [Fact] public void Generic_DbPropertyEntry_for_property_can_be_converted_to_non_generic_version() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Property(e => e.ValueTypeProp); var nonGeneric = ImplicitConvert(memberEntry); Assert.IsType(nonGeneric); Assert.Same(memberEntry.InternalMemberEntry, nonGeneric.InternalMemberEntry); } [Fact] public void Generic_DbPropertyEntry_for_complex_property_can_be_converted_to_non_generic_version() { var memberEntry = new DbEntityEntry(FakeWithProps.CreateMockInternalEntityEntry().Object).Property(e => e.ComplexProp); var nonGeneric = ImplicitConvert(memberEntry); Assert.IsType(nonGeneric); Assert.Same(memberEntry.InternalMemberEntry, nonGeneric.InternalMemberEntry); } private static DbPropertyEntry ImplicitConvert(DbPropertyEntry nonGeneric) { return nonGeneric; } } #region Helpers internal class DbPropertyEntryVerifier : DbMemberEntryVerifier { protected override DbPropertyEntry CreateEntry(InternalPropertyEntry internalEntry) { return new DbPropertyEntry(internalEntry); } protected override Mock CreateInternalEntryMock() { return new Mock( new Mock>().Object, new PropertyEntryMetadata(typeof(object), typeof(object), "fake property", isMapped: true, isComplex: true)); } } internal class DbPropertyEntryVerifier : DbMemberEntryVerifier, InternalPropertyEntry> where TEntity : class { protected override DbPropertyEntry CreateEntry(InternalPropertyEntry internalEntry) { return new DbPropertyEntry(internalEntry); } protected override Mock CreateInternalEntryMock() { return new Mock( new Mock>().Object, new PropertyEntryMetadata(typeof(object), typeof(object), "fake property", isMapped: true, isComplex: true)); } } #endregion } }