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

163 lines
9.0 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.Migrations
{
using System.Data.Entity.Migrations.Model;
using System.Linq;
using Xunit;
[Variant(DatabaseProvider.SqlClient, ProgrammingLanguage.CSharp)]
[Variant(DatabaseProvider.SqlServerCe, ProgrammingLanguage.CSharp)]
[Variant(DatabaseProvider.SqlClient, ProgrammingLanguage.VB)]
public class DefaultValueScenarios : DbTestCase
{
private class DefaultValuesMigration : DbMigration
{
public override void Up()
{
CreateTable(
"DefaultValues",
c => new
{
Binary = c.Binary(defaultValue: new byte[] { }),
Boolean = c.Boolean(defaultValue: true),
Byte = c.Byte(defaultValue: 42),
DateTime = c.DateTime(defaultValue: new DateTime()),
DateTimeOffset = c.DateTimeOffset(defaultValue: new DateTimeOffset()),
Decimal = c.Decimal(defaultValue: 42.23m),
Double = c.Double(defaultValue: 123.45),
Guid = c.Guid(defaultValue: new Guid()),
Int = c.Int(defaultValue: 0),
Long = c.Long(defaultValue: 3456789),
Short = c.Short(defaultValue: 256),
Single = c.Single(defaultValue: 234.999f),
String = c.String(defaultValue: string.Empty),
Time = c.Time(defaultValue: TimeSpan.Zero)
});
}
}
[MigrationsTheory]
public void Can_create_columns_with_default_values_for_all_types()
{
ResetDatabase();
var migrator = CreateMigrator<ShopContext_v1>();
migrator.Update();
var defaultValuesMigration = new DefaultValuesMigration();
var createTableOperation
= (CreateTableOperation)defaultValuesMigration.GetOperations().Single();
WhenSqlCe(
() =>
{
createTableOperation.Columns.Remove(createTableOperation.Columns.Single(c => c.Name == "DateTimeOffset"));
createTableOperation.Columns.Remove(createTableOperation.Columns.Single(c => c.Name == "Time"));
});
migrator = CreateMigrator<ShopContext_v1>(defaultValuesMigration);
migrator.Update();
var table = Info.Tables.Single(t => t.Name == "DefaultValues");
Assert.True(table.Columns.Any(c => c.Name == "Binary" && c.Default.Contains("0x")));
Assert.True(table.Columns.Any(c => c.Name == "Boolean" && c.Default.Contains('1')));
Assert.True(table.Columns.Any(c => c.Name == "Byte" && c.Default.Contains("42")));
Assert.True(table.Columns.Any(c => c.Name == "DateTime" && c.Default.Contains("'0001-01-01T00:00:00.000'")));
Assert.True(table.Columns.Any(c => c.Name == "Decimal" && c.Default.Contains("42.23")));
Assert.True(table.Columns.Any(c => c.Name == "Double" && c.Default.Contains("123.45")));
Assert.True(table.Columns.Any(c => c.Name == "Guid" && c.Default.Contains("'00000000-0000-0000-0000-000000000000'")));
Assert.True(table.Columns.Any(c => c.Name == "Int" && c.Default.Contains("0")));
Assert.True(table.Columns.Any(c => c.Name == "Long" && c.Default.Contains("3456789")));
Assert.True(table.Columns.Any(c => c.Name == "Short" && c.Default.Contains("256")));
Assert.True(table.Columns.Any(c => c.Name == "Single" && c.Default.Contains("234.999")));
Assert.True(table.Columns.Any(c => c.Name == "String" && c.Default.Contains("''")));
WhenNotSqlCe(
() =>
{
Assert.True(table.Columns.Any(c => c.Name == "DateTimeOffset" && c.Default == "('0001-01-01T00:00:00.000+00:00')"));
Assert.True(table.Columns.Any(c => c.Name == "Time" && c.Default == "('00:00:00')"));
});
}
private class DefaultValueSqlMigration : DbMigration
{
public override void Up()
{
CreateTable(
"DefaultValueSql",
c => new
{
Binary = c.Binary(defaultValueSql: "CONVERT([binary],'123')"),
Boolean = c.Boolean(defaultValueSql: "CONVERT([bit],'1')"),
Byte = c.Byte(defaultValueSql: "CONVERT([tinyint],'123')"),
DateTime = c.DateTime(defaultValueSql: "CONVERT([datetime],'1947/08/15 03:33:20')"),
DateTimeOffset = c.DateTimeOffset(defaultValueSql: "CONVERT([datetimeoffset],'1947/08/15 03:33:20')"),
Decimal = c.Decimal(defaultValueSql: "CONVERT([money],'123')"),
Double = c.Double(defaultValueSql: "CONVERT([float],'123')"),
Guid = c.Guid(defaultValueSql: "CONVERT([uniqueidentifier],'123')"),
Int = c.Int(defaultValueSql: "CONVERT([int],'123')"),
Long = c.Long(defaultValueSql: "CONVERT([bigint],'123')"),
Short = c.Short(defaultValueSql: "CONVERT([smallint],'123')"),
Single = c.Single(defaultValueSql: "CONVERT([real],'123')"),
String = c.String(defaultValueSql: "CONVERT([nvarchar](100),(123))"),
Time = c.Time(defaultValueSql: "CONVERT([time],'03:33:20')")
});
}
}
[MigrationsTheory]
public void Can_create_columns_with_default_value_expressions_for_all_types()
{
ResetDatabase();
var migrator = CreateMigrator<ShopContext_v1>();
migrator.Update();
var defaultValuesMigration = new DefaultValueSqlMigration();
var createTableOperation
= (CreateTableOperation)defaultValuesMigration.GetOperations().Single();
WhenSqlCe(
() =>
{
createTableOperation.Columns.Remove(createTableOperation.Columns.Single(c => c.Name == "DateTimeOffset"));
createTableOperation.Columns.Remove(createTableOperation.Columns.Single(c => c.Name == "Time"));
});
migrator = CreateMigrator<ShopContext_v1>(defaultValuesMigration);
migrator.Update();
var table = Info.Tables.Single(t => t.Name == "DefaultValueSql");
Assert.True(table.Columns.Any(c => c.Name == "Binary" && c.Default.Contains("CONVERT([binary],'123'")));
Assert.True(table.Columns.Any(c => c.Name == "Boolean" && c.Default.Contains("CONVERT([bit],'1'")));
Assert.True(table.Columns.Any(c => c.Name == "Byte" && c.Default.Contains("CONVERT([tinyint],'123'")));
Assert.True(table.Columns.Any(c => c.Name == "DateTime" && c.Default.Contains("CONVERT([datetime],'1947/08/15 03:33:20'")));
Assert.True(table.Columns.Any(c => c.Name == "Decimal" && c.Default.Contains("CONVERT([money],'123'")));
Assert.True(table.Columns.Any(c => c.Name == "Double" && c.Default.Contains("CONVERT([float],'123'")));
Assert.True(table.Columns.Any(c => c.Name == "Guid" && c.Default.Contains("CONVERT([uniqueidentifier],'123'")));
Assert.True(table.Columns.Any(c => c.Name == "Int" && c.Default.Contains("CONVERT([int],'123'")));
Assert.True(table.Columns.Any(c => c.Name == "Long" && c.Default.Contains("CONVERT([bigint],'123'")));
Assert.True(table.Columns.Any(c => c.Name == "Short" && c.Default.Contains("CONVERT([smallint],'123'")));
Assert.True(table.Columns.Any(c => c.Name == "Single" && c.Default.Contains("CONVERT([real],'123'")));
Assert.True(table.Columns.Any(c => c.Name == "String" && c.Default.Contains("CONVERT([nvarchar](100),(123)")));
WhenNotSqlCe(
() =>
{
Assert.True(
table.Columns.Any(
c => c.Name == "DateTimeOffset" && c.Default.StartsWith("(CONVERT([datetimeoffset],'1947/08/15 03:33:20'")));
Assert.True(table.Columns.Any(c => c.Name == "Time" && c.Default.StartsWith("(CONVERT([time],'03:33:20'")));
});
}
}
}