mirror of
https://github.com/DapperLib/Dapper.git
synced 2026-10-18 14:27:47 +08:00
aecffecae1
* attempt NRT makeover - annotate NRTs on GridReader API - add protected access to some of the GridReader internals - switch GridReader callbacks to be more type-independent docs lib updates; deal with yellow warnings and test failures (SQL server certs and cancellation surfacing differently) fix break simplify proposed GridReader changes to protected OnBeforeGrid and OnAfterGrid[Async] Builds: Bump library versions (#1935) Tests: Upgrade dependencies for Dependabot (#1936) I'll do a pass at all of these later, but getting CVE versions out of the pipe. Resolving 4 alerts here: https://github.com/DapperLib/Dapper/security/dependabot merge and lib updates allow Identity to be constructed on-the-fly inside GridReader fix build warnings include readme rev minor - enable [SkipLocalsInit] everywhere - use NET5_0_OR_GREATER for remoting check # Conflicts: # Dapper/CommandDefinition.cs # Dapper/DefaultTypeMap.cs # Dapper/SqlMapper.Async.cs # Dapper/SqlMapper.IDataReader.cs # Dapper/SqlMapper.Link.cs # Dapper/SqlMapper.cs # Directory.Build.props * shipped, not unshipped * fixup SqlBuilder; use is null / is not null * use central package management (#1949) * Nullable test tweaks * Nuget: let's just remove it! * 2 test fixes from review * fix FindExplicitConstructor * add GetPropertySetterOrThrow * fix NRT on FindConstructor * DapperRow: value is object? * use NotNullWhen * make constructor problem more obvious * test fixes --------- Co-authored-by: Nick Craver <nrcraver@gmail.com>
135 lines
4.4 KiB
C#
135 lines
4.4 KiB
C#
using System.Data;
|
|
using System.Linq;
|
|
using Xunit;
|
|
|
|
namespace Dapper.Tests
|
|
{
|
|
[Collection("EnumTests")]
|
|
public sealed class SystemSqlClientEnumTests : EnumTests<SystemSqlClientProvider> { }
|
|
#if MSSQLCLIENT
|
|
[Collection("EnumTests")]
|
|
public sealed class MicrosoftSqlClientEnumTests : EnumTests<MicrosoftSqlClientProvider> { }
|
|
#endif
|
|
public abstract class EnumTests<TProvider> : TestBase<TProvider> where TProvider : DatabaseProvider
|
|
{
|
|
[Fact]
|
|
public void TestEnumWeirdness()
|
|
{
|
|
Assert.Null(connection.Query<TestEnumClass>("select null as [EnumEnum]").First().EnumEnum);
|
|
Assert.Equal(TestEnum.Bla, connection.Query<TestEnumClass>("select cast(1 as tinyint) as [EnumEnum]").First().EnumEnum);
|
|
}
|
|
|
|
[Fact]
|
|
public void TestEnumStrings()
|
|
{
|
|
Assert.Equal(TestEnum.Bla, connection.Query<TestEnumClassNoNull>("select 'BLA' as [EnumEnum]").First().EnumEnum);
|
|
Assert.Equal(TestEnum.Bla, connection.Query<TestEnumClassNoNull>("select 'bla' as [EnumEnum]").First().EnumEnum);
|
|
|
|
Assert.Equal(TestEnum.Bla, connection.Query<TestEnumClass>("select 'BLA' as [EnumEnum]").First().EnumEnum);
|
|
Assert.Equal(TestEnum.Bla, connection.Query<TestEnumClass>("select 'bla' as [EnumEnum]").First().EnumEnum);
|
|
}
|
|
|
|
[Fact]
|
|
public void TestEnumParamsWithNullable()
|
|
{
|
|
const EnumParam a = EnumParam.A;
|
|
EnumParam? b = EnumParam.B, c = null;
|
|
var obj = connection.Query<EnumParamObject>("select @a as A, @b as B, @c as C",
|
|
new { a, b, c }).Single();
|
|
Assert.Equal(EnumParam.A, obj.A);
|
|
Assert.Equal(EnumParam.B, obj.B);
|
|
Assert.Null(obj.C);
|
|
}
|
|
|
|
[Fact]
|
|
public void TestEnumParamsWithoutNullable()
|
|
{
|
|
const EnumParam a = EnumParam.A;
|
|
const EnumParam b = EnumParam.B, c = 0;
|
|
var obj = connection.Query<EnumParamObjectNonNullable>("select @a as A, @b as B, @c as C",
|
|
new { a, b, c }).Single();
|
|
Assert.Equal(EnumParam.A, obj.A);
|
|
Assert.Equal(EnumParam.B, obj.B);
|
|
Assert.Equal(obj.C, (EnumParam)0);
|
|
}
|
|
|
|
private enum EnumParam : short
|
|
{
|
|
None = 0,
|
|
A = 1,
|
|
B = 2
|
|
}
|
|
|
|
private class EnumParamObject
|
|
{
|
|
public EnumParam A { get; set; }
|
|
public EnumParam? B { get; set; }
|
|
public EnumParam? C { get; set; }
|
|
}
|
|
|
|
private class EnumParamObjectNonNullable
|
|
{
|
|
public EnumParam A { get; set; }
|
|
public EnumParam? B { get; set; }
|
|
public EnumParam? C { get; set; }
|
|
}
|
|
|
|
private enum TestEnum : byte
|
|
{
|
|
Bla = 1
|
|
}
|
|
|
|
private class TestEnumClass
|
|
{
|
|
public TestEnum? EnumEnum { get; set; }
|
|
}
|
|
|
|
private class TestEnumClassNoNull
|
|
{
|
|
public TestEnum EnumEnum { get; set; }
|
|
}
|
|
|
|
[Fact]
|
|
public void AdoNetEnumValue()
|
|
{
|
|
using var cmd = connection.CreateCommand();
|
|
cmd.CommandText = "select @foo";
|
|
var p = cmd.CreateParameter();
|
|
p.ParameterName = "@foo";
|
|
p.DbType = DbType.Int32; // it turns out that this is the key piece; setting the DbType
|
|
p.Value = AnEnum.B;
|
|
cmd.Parameters.Add(p);
|
|
object? value = cmd.ExecuteScalar();
|
|
Assert.NotNull(value);
|
|
AnEnum val = (AnEnum)value;
|
|
Assert.Equal(AnEnum.B, val);
|
|
}
|
|
|
|
[Fact]
|
|
public void DapperEnumValue_SqlServer() => Common.DapperEnumValue(connection);
|
|
|
|
private enum SO27024806Enum
|
|
{
|
|
Foo = 0,
|
|
Bar = 1
|
|
}
|
|
|
|
private class SO27024806Class
|
|
{
|
|
public SO27024806Class(SO27024806Enum myField)
|
|
{
|
|
MyField = myField;
|
|
}
|
|
|
|
public SO27024806Enum MyField { get; set; }
|
|
}
|
|
|
|
[Fact]
|
|
public void SO27024806_TestVarcharEnumMemberWithExplicitConstructor()
|
|
{
|
|
var foo = connection.Query<SO27024806Class>("SELECT 'Foo' AS myField").Single();
|
|
Assert.Equal(SO27024806Enum.Foo, foo.MyField);
|
|
}
|
|
}
|
|
}
|