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

362 lines
12 KiB
C#

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace FunctionalTests
{
using System;
using System.Data.Entity;
using System.Data.Entity.Core.Metadata.Edm;
using System.Data.Entity.ModelConfiguration.Edm;
using System.Linq;
using FunctionalTests.Fixtures;
using Xunit;
public class EnumsScenarioTests : TestBase
{
[Fact]
public void Simple_enum_mapping_scenario()
{
var modelBuilder = new DbModelBuilder();
modelBuilder.Entity<Enum_Product>();
var databaseMapping = BuildMapping(modelBuilder);
databaseMapping.AssertValid();
databaseMapping.Assert<Enum_Product>(p => p.CategoryId).IsTrue(t => t.IsEnumType);
databaseMapping.Assert<Enum_Product>().HasColumn("CategoryId");
var enumType = databaseMapping.Model.GetEnumType("CategoryId");
Assert.NotNull(enumType);
Assert.Equal(7, enumType.Members.Count);
Assert.False(enumType.IsFlags);
Assert.Equal(PrimitiveTypeKind.Int32, enumType.UnderlyingType.PrimitiveTypeKind);
}
[Fact]
public void Short_enum_mapping_with_flags_attribute()
{
var modelBuilder = new DbModelBuilder();
modelBuilder.Entity<Enum_Flags>();
var databaseMapping = BuildMapping(modelBuilder);
databaseMapping.AssertValid();
var enumType = databaseMapping.Model.GetEnumType("WithFlags");
Assert.NotNull(enumType);
Assert.Equal(4, enumType.Members.Count);
Assert.True(enumType.IsFlags);
Assert.Equal(PrimitiveTypeKind.Int16, enumType.UnderlyingType.PrimitiveTypeKind);
}
[Fact]
public void Build_model_for_a_single_type_with_a_enum_key()
{
var modelBuilder = new AdventureWorksModelBuilder();
modelBuilder.Entity<Enum_Product_PK>();
var databaseMapping = BuildMapping(modelBuilder);
Assert.Equal(1, databaseMapping.EntityContainerMappings.Single().EntitySetMappings.Count());
}
[Fact]
public void Enum_mapped_as_by_convention_fk_in_association()
{
var modelBuilder = new DbModelBuilder();
modelBuilder.Entity<Enum_Fk_Product>();
var databaseMapping = BuildMapping(modelBuilder);
databaseMapping.AssertValid();
databaseMapping.Assert<Enum_Fk_Product>().HasForeignKeyColumn("CategoryId");
}
[Fact]
public void Enum_mapped_as_by_convention_IA_in_association()
{
var modelBuilder = new DbModelBuilder();
modelBuilder.Entity<Enum_IA_Principal>();
var databaseMapping = BuildMapping(modelBuilder);
databaseMapping.AssertValid();
databaseMapping.Assert<Enum_IA_Dependent>().HasForeignKeyColumn("Principal_Id");
}
[Fact]
public void Annotated_nullable_enum_inside_complex_type_is_mapped()
{
var modelBuilder = new DbModelBuilder();
modelBuilder.Entity<Enum_ComplexEntity>();
var databaseMapping = BuildMapping(modelBuilder);
databaseMapping.AssertValid();
databaseMapping.Assert<Enum_ComplexType>(c => c.Enum).IsTrue(t => t.IsEnumType);
databaseMapping.Assert<Enum_ComplexType>(c => c.Enum).IsTrue(t => t.Nullable);
databaseMapping.Assert<Enum_ComplexType>(c => c.Enum).DbEqual("col_enum", c => c.Name);
}
[Fact]
public void Fluent_api_configured_enum_property_gets_correct_facets()
{
var modelBuilder = new DbModelBuilder();
modelBuilder.Entity<Enum_Product>().Property(p => p.CategoryId).IsOptional();
var databaseMapping = BuildMapping(modelBuilder);
databaseMapping.AssertValid();
databaseMapping.Assert<Enum_Product>(p => p.CategoryId).IsTrue(p => p.Nullable);
}
[Fact]
public void Should_be_able_to_use_v4_1_model_builder_without_enums()
{
var modelBuilder = new DbModelBuilder(DbModelBuilderVersion.V4_1);
modelBuilder.Entity<Enum_Product>();
var databaseMapping = BuildMapping(modelBuilder);
databaseMapping.AssertValid();
Assert.Equal(2.0, databaseMapping.Model.Version);
Assert.Equal(2.0, databaseMapping.Database.Version);
}
[Fact]
public void Empty_enum_in_model_does_not_fail_validation()
{
var modelBuilder = new DbModelBuilder();
modelBuilder.Entity<Enum_Empty>();
var databaseMapping = BuildMapping(modelBuilder);
databaseMapping.AssertValid();
databaseMapping.Assert<Enum_Empty>(p => p.Empty).IsFalse(e => e.EnumType.Members.Any());
}
[Fact]
public void Unsigned_enum_in_model_should_fail_validation()
{
var modelBuilder = new DbModelBuilder();
modelBuilder.Entity<Enum_Unsigned>();
var databaseMapping = BuildMapping(modelBuilder);
databaseMapping.AssertValid();
}
[Fact]
public void Explicitly_mapping_an_enum_property_using_4_1_throws()
{
var modelBuilder = new DbModelBuilder(DbModelBuilderVersion.V4_1);
modelBuilder.Entity<Enum_Product>().Property(e => e.CategoryId);
Assert.Throws<NotSupportedException>(
() =>
BuildMapping(modelBuilder))
.ValidateMessage("UnsupportedUseOfV3Type", "Enum_Product", "CategoryId");
}
[Fact]
public void Explicitly_mapping_a_nullable_enum_property_using_4_1_throws()
{
var modelBuilder = new DbModelBuilder(DbModelBuilderVersion.V4_1);
modelBuilder.Entity<Enum_Nullable>().Property(e => e.CategoryId);
Assert.Throws<NotSupportedException>(
() =>
BuildMapping(modelBuilder))
.ValidateMessage("UnsupportedUseOfV3Type", "Enum_Nullable", "CategoryId");
}
[Fact]
public void Explicitly_mapping_an_enum_property_on_a_complex_type_using_4_1_throws()
{
var modelBuilder = new DbModelBuilder(DbModelBuilderVersion.V4_1);
modelBuilder.ComplexType<Enum_ComplexType>().Property(c => c.Enum);
Assert.Throws<NotSupportedException>(
() =>
BuildMapping(modelBuilder))
.ValidateMessage("UnsupportedUseOfV3Type", "Enum_ComplexType", "Enum");
}
[Fact]
public void Explicitly_using_an_enum_property_as_a_key_with_4_1_throws()
{
var modelBuilder = new DbModelBuilder(DbModelBuilderVersion.V4_1);
modelBuilder.Entity<Enum_Product>().HasKey(e => e.CategoryId);
Assert.Throws<NotSupportedException>(
() =>
BuildMapping(modelBuilder))
.ValidateMessage("UnsupportedUseOfV3Type", "Enum_Product", "CategoryId");
}
[Fact]
public void Explicitly_using_an_enum_property_as_part_of_a_composite_key_with_4_1_throws()
{
var modelBuilder = new DbModelBuilder(DbModelBuilderVersion.V4_1);
modelBuilder.Entity<Enum_Product>().HasKey(
e => new
{
e.Id,
e.CategoryId
});
Assert.Throws<NotSupportedException>(
() =>
BuildMapping(modelBuilder))
.ValidateMessage("UnsupportedUseOfV3Type", "Enum_Product", "CategoryId");
}
[Fact]
public void Explicitly_mapping_an_enum_property_with_Map_using_4_1_throws()
{
var modelBuilder = new DbModelBuilder(DbModelBuilderVersion.V4_1);
modelBuilder.Entity<Enum_Product>().Map(
mapping =>
{
mapping.ToTable("Table1");
mapping.Properties(e => e.CategoryId);
});
Assert.Throws<InvalidOperationException>(
() =>
BuildMapping(modelBuilder))
.ValidateMessage("EntityMappingConfiguration_CannotMapIgnoredProperty", "Enum_Product", "CategoryId");
}
}
namespace Fixtures
{
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
public enum CategoryId
{
Beverages = 1,
Condiments,
Confections,
Dairy_Products,
Grains_Cereals,
Meat_Poultry,
Produce
}
public enum Empty
{
}
public class Enum_Empty
{
public int Id { get; set; }
public Empty Empty { get; set; }
}
public enum Unsigned : uint
{
Member
}
public class Enum_Unsigned
{
public int Id { get; set; }
public Unsigned Unsigned { get; set; }
}
public class Enum_Product
{
public int Id { get; set; }
public string ProductName { get; set; }
public decimal UnitPrice { get; set; }
public short UnitsInStock { get; set; }
public CategoryId CategoryId { get; set; }
}
public class Enum_Nullable
{
public int Id { get; set; }
public CategoryId? CategoryId { get; set; }
}
[Flags]
public enum WithFlags : short
{
Beverages = 0,
Condiments = 1,
Confections = 2,
Dairy_Products = 4
}
public class Enum_Flags
{
public int Id { get; set; }
public WithFlags FlagsEnum { get; set; }
}
public class Enum_Product_PK
{
public CategoryId Id { get; set; }
public string ProductName { get; set; }
public decimal UnitPrice { get; set; }
public short UnitsInStock { get; set; }
}
public class Enum_Fk_Product
{
public int Id { get; set; }
public CategoryId CategoryId { get; set; }
public Enum_Fk_Category Category { get; set; }
}
public class Enum_Fk_Category
{
public CategoryId Id { get; set; }
public ICollection<Enum_Fk_Product> Products { get; set; }
}
public class Enum_IA_Principal
{
public CategoryId Id { get; set; }
public ICollection<Enum_IA_Dependent> Dependents { get; set; }
}
public class Enum_IA_Dependent
{
public int Id { get; set; }
public Enum_IA_Principal Principal { get; set; }
}
public class Enum_ComplexEntity
{
public int Id { get; set; }
public Enum_ComplexType ComplexType { get; set; }
}
[ComplexType]
public class Enum_ComplexType
{
[Column("col_enum")]
public WithFlags? Enum { get; set; }
}
}
}