Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

326 lines
16 KiB
C#

// 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.Collections.Generic;
using System.Data.Entity.Internal;
using System.Data.Entity.ModelConfiguration.Internal.UnitTests;
using System.Data.Entity.Resources;
using System.Threading;
using Moq;
using Xunit;
public class DbCollectionEntryTests
{
[Fact]
public void NonGeneric_DbCollectionEntry_delegates_to_InternalReferenceEntry_correctly()
{
var v = new DbCollectionEntryVerifier();
v.VerifyGetter(e => e.CurrentValue, m => m.CurrentValue);
var currentValue = new object[0];
v.VerifySetter(e => e.CurrentValue = currentValue, m => m.CurrentValue = currentValue);
v.VerifyGetter(e => e.EntityEntry, m => m.InternalEntityEntry);
v.VerifyGetter(e => e.IsLoaded, m => m.IsLoaded);
v.VerifyGetter(e => e.Name, m => m.Name);
v.VerifyMethod(e => e.GetValidationErrors(), m => m.GetValidationErrors());
v.VerifyMethod(e => e.Load(), m => m.Load());
v.VerifyMethod(e => e.Query(), m => m.Query());
#if !NET40
v.VerifyMethod(e => e.LoadAsync(), m => m.LoadAsync(CancellationToken.None));
v.VerifyMethod(e => e.LoadAsync(CancellationToken.None), m => m.LoadAsync(CancellationToken.None));
#endif
}
[Fact]
public void Generic_DbCollectionEntry_delegates_to_InternalReferenceEntry_correctly()
{
var v = new DbCollectionEntryVerifier<object, object>();
v.VerifyGetter(e => e.CurrentValue, m => m.CurrentValue);
var currentValue = new object[0];
v.VerifySetter(e => e.CurrentValue = currentValue, m => m.CurrentValue = currentValue);
v.VerifyGetter(e => e.EntityEntry, m => m.InternalEntityEntry);
v.VerifyGetter(e => e.IsLoaded, m => m.IsLoaded);
v.VerifyGetter(e => e.Name, m => m.Name);
v.VerifyMethod(e => e.GetValidationErrors(), m => m.GetValidationErrors());
v.VerifyMethod(e => e.Load(), m => m.Load());
v.VerifyMethod(e => e.Query(), m => m.Query());
#if !NET40
v.VerifyMethod(e => e.LoadAsync(), m => m.LoadAsync(CancellationToken.None));
v.VerifyMethod(e => e.LoadAsync(CancellationToken.None), m => m.LoadAsync(CancellationToken.None));
#endif
}
public class EntityEntry
{
[Fact]
public void EntityEntity_can_be_obtained_from_generic_DbCollectionEntry_back_reference()
{
var entityEntry = new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object);
var backEntry = entityEntry.Collection(e => e.Collection).EntityEntry;
Assert.Same(entityEntry.Entity, backEntry.Entity);
}
[Fact]
public void EntityEntity_can_be_obtained_from_non_generic_DbCollectionEntry_back_reference()
{
var entityEntry = new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object);
var backEntry = entityEntry.Collection("Collection").EntityEntry;
Assert.Same(entityEntry.Entity, backEntry.Entity);
}
}
public class Cast
{
[Fact]
public void Non_generic_DbMemberEntry_for_collection_can_be_converted_to_generic_version()
{
var memberEntry = new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Member(
"Collection");
var generic = memberEntry.Cast<FakeWithProps, ICollection<FakeEntity>>();
Assert.IsType<DbCollectionEntry<FakeWithProps, FakeEntity>>(generic);
Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry);
}
[Fact]
public void Non_generic_DbCollectionEntry_for_collection_can_be_converted_to_generic_version()
{
var memberEntry =
new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Collection("Collection");
var generic = memberEntry.Cast<FakeWithProps, FakeEntity>();
Assert.IsType<DbCollectionEntry<FakeWithProps, FakeEntity>>(generic);
Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry);
}
[Fact]
public void Non_generic_DbMemberEntry_for_collection_can_be_converted_to_generic_version_of_base_entity_type()
{
var memberEntry = new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Member(
"Collection");
var generic = memberEntry.Cast<object, ICollection<FakeEntity>>();
Assert.IsType<DbCollectionEntry<object, FakeEntity>>(generic);
Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry);
}
[Fact]
public void Non_generic_DbCollectionEntry_for_collection_can_be_converted_to_generic_version_of_base_entity_type()
{
var memberEntry =
new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Collection("Collection");
var generic = memberEntry.Cast<object, FakeEntity>();
Assert.IsType<DbCollectionEntry<object, FakeEntity>>(generic);
Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry);
}
[Fact]
public void Non_generic_DbMemberEntry_for_collection_cannot_be_converted_to_generic_version_of_base_property_type()
{
var memberEntry = new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Member(
"Collection");
// This cast fails because an ICollection<FakeEntity> is not an IColletion<object>.
Assert.Equal(
Strings.DbMember_BadTypeForCast(
typeof(DbMemberEntry).Name, typeof(FakeWithProps).Name, typeof(ICollection<object>).Name, typeof(FakeWithProps).Name,
typeof(ICollection<FakeEntity>).Name),
Assert.Throws<InvalidCastException>(() => memberEntry.Cast<FakeWithProps, ICollection<object>>()).Message);
}
[Fact]
public void Non_generic_DbCollectionEntry_for_collection_can_be_converted_to_generic_version_of_base_property_type()
{
var memberEntry =
new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Collection("Collection");
var generic = memberEntry.Cast<FakeWithProps, object>();
Assert.IsType<DbCollectionEntry<FakeWithProps, object>>(generic);
Assert.Same(memberEntry.InternalMemberEntry, generic.InternalMemberEntry);
}
[Fact]
public void Non_generic_DbMemberEntry_for_collection_cannot_be_converted_to_generic_version_of_derived_entity_type()
{
var memberEntry = new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Member(
"Collection");
Assert.Equal(
Strings.DbMember_BadTypeForCast(
typeof(DbMemberEntry).Name, typeof(DerivedFakeWithProps).Name, typeof(ICollection<FakeEntity>).Name,
typeof(FakeWithProps).Name, typeof(ICollection<FakeEntity>).Name),
Assert.Throws<InvalidCastException>(() => memberEntry.Cast<DerivedFakeWithProps, ICollection<FakeEntity>>()).Message);
}
[Fact]
public void Non_generic_DbCollectionEntry_for_collection_cannot_be_converted_to_generic_version_of_derived_entity_type()
{
var memberEntry =
new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Collection("Collection");
Assert.Equal(
Strings.DbMember_BadTypeForCast(
typeof(DbCollectionEntry).Name, typeof(DerivedFakeWithProps).Name, typeof(FakeEntity).Name,
typeof(FakeWithProps).Name, typeof(FakeEntity).Name),
Assert.Throws<InvalidCastException>(() => memberEntry.Cast<DerivedFakeWithProps, FakeEntity>()).Message);
}
[Fact]
public void Non_generic_DbMemberEntry_for_collection_cannot_be_converted_to_generic_version_of_derived_property_type()
{
var memberEntry = new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Member(
"Collection");
Assert.Equal(
Strings.DbMember_BadTypeForCast(
typeof(DbMemberEntry).Name, typeof(FakeWithProps).Name, typeof(ICollection<FakeDerivedEntity>).Name,
typeof(FakeWithProps).Name, typeof(ICollection<FakeEntity>).Name),
Assert.Throws<InvalidCastException>(() => memberEntry.Cast<FakeWithProps, ICollection<FakeDerivedEntity>>()).Message);
}
[Fact]
public void Non_generic_DbCollectionEntry_for_collection_cannot_be_converted_to_generic_version_of_derived_property_type()
{
var memberEntry =
new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Collection("Collection");
Assert.Equal(
Strings.DbMember_BadTypeForCast(
typeof(DbCollectionEntry).Name, typeof(FakeWithProps).Name, typeof(FakeDerivedEntity).Name,
typeof(FakeWithProps).Name, typeof(FakeEntity).Name),
Assert.Throws<InvalidCastException>(() => memberEntry.Cast<FakeWithProps, FakeDerivedEntity>()).Message);
}
}
public class ImplicitDbCollectionEntry
{
[Fact]
public void Generic_DbCollectionEntry_can_be_implicitly_converted_to_non_generic_version()
{
var propEntry =
new DbCollectionEntry<FakeWithProps, FakeEntity>(
new InternalCollectionEntry(
new Mock<InternalEntityEntryForMock<FakeEntity>>().Object, FakeWithProps.CollectionMetadata));
NonGenericTestMethod(propEntry, "Collection");
}
private void NonGenericTestMethod(DbCollectionEntry nonGenericEntry, string name)
{
Assert.Same(name, nonGenericEntry.Name);
}
[Fact]
public void Generic_DbCollectionEntry_typed_as_DbMemberEntry_can_be_implicitly_converted_to_non_generic_version()
{
DbMemberEntry<FakeWithProps, ICollection<FakeEntity>> propEntry =
new DbCollectionEntry<FakeWithProps, FakeEntity>(
new InternalCollectionEntry(
new Mock<InternalEntityEntryForMock<FakeEntity>>().Object, FakeWithProps.CollectionMetadata));
NonGenericTestMethodCollectionAsMember(propEntry, "Collection");
}
private void NonGenericTestMethodCollectionAsMember(DbMemberEntry nonGenericEntry, string name)
{
Assert.Same(name, nonGenericEntry.Name);
Assert.IsType<DbCollectionEntry>(nonGenericEntry);
}
[Fact]
public void Generic_DbCollectionEntry_typed_as_DbMemberEntry_can_be_implicitly_converted_to_non_generic_DbCollectionEntry()
{
DbMemberEntry<FakeWithProps, ICollection<FakeEntity>> propEntry =
new DbCollectionEntry<FakeWithProps, FakeEntity>(
new InternalCollectionEntry(
new Mock<InternalEntityEntryForMock<FakeEntity>>().Object, FakeWithProps.CollectionMetadata));
NonGenericTestMethod((DbCollectionEntry)propEntry, "Collection");
}
[Fact]
public void Generic_DbMemberEntry_for_collection_can_be_converted_to_non_generic_version()
{
var memberEntry =
new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Member<ICollection<FakeEntity>>(
"Collection");
var nonGeneric = ImplicitConvert(memberEntry);
Assert.IsType<DbCollectionEntry>(nonGeneric);
Assert.Same(memberEntry.InternalMemberEntry, nonGeneric.InternalMemberEntry);
}
private static DbMemberEntry ImplicitConvert(DbMemberEntry nonGeneric)
{
return nonGeneric;
}
[Fact]
public void Generic_DbCollectionEntry_for_collection_can_be_converted_to_non_generic_version()
{
var memberEntry =
new DbEntityEntry<FakeWithProps>(FakeWithProps.CreateMockInternalEntityEntry().Object).Collection(e => e.Collection);
var nonGeneric = ImplicitConvert(memberEntry);
Assert.IsType<DbCollectionEntry>(nonGeneric);
Assert.Same(memberEntry.InternalMemberEntry, nonGeneric.InternalMemberEntry);
}
private static DbCollectionEntry ImplicitConvert(DbCollectionEntry nonGeneric)
{
return nonGeneric;
}
}
#region Helpers
internal class DbCollectionEntryVerifier : DbMemberEntryVerifier<DbCollectionEntry, InternalCollectionEntry>
{
protected override DbCollectionEntry CreateEntry(InternalCollectionEntry internalEntry)
{
return new DbCollectionEntry(internalEntry);
}
protected override Mock<InternalCollectionEntry> CreateInternalEntryMock()
{
return new Mock<InternalCollectionEntry>(
new Mock<InternalEntityEntryForMock<object>>().Object,
new NavigationEntryMetadata(typeof(object), typeof(object), "fake collection", isCollection: true));
}
}
internal class DbCollectionEntryVerifier<TEntity, TElement> :
DbMemberEntryVerifier<DbCollectionEntry<TEntity, TElement>, InternalCollectionEntry>
where TEntity : class
{
protected override DbCollectionEntry<TEntity, TElement> CreateEntry(InternalCollectionEntry internalEntry)
{
return new DbCollectionEntry<TEntity, TElement>(internalEntry);
}
protected override Mock<InternalCollectionEntry> CreateInternalEntryMock()
{
return new Mock<InternalCollectionEntry>(
new Mock<InternalEntityEntryForMock<object>>().Object,
new NavigationEntryMetadata(typeof(object), typeof(object), "fake collection", isCollection: true));
}
}
#endregion
}
}