Skip to content

Commit 9f566ff

Browse files
committed
Implement IConvertible on MySqlDateTime. Fixes #798
1 parent 7ec2228 commit 9f566ff

File tree

2 files changed

+104
-4
lines changed

2 files changed

+104
-4
lines changed

src/MySqlConnector/MySql.Data.Types/MySqlDateTime.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace MySql.Data.Types
44
{
5-
public struct MySqlDateTime : IComparable
5+
public struct MySqlDateTime : IComparable, IConvertible
66
{
77
public MySqlDateTime(int year, int month, int day, int hour, int minute, int second, int microsecond)
88
{
@@ -86,5 +86,28 @@ readonly int IComparable.CompareTo(object? obj)
8686
return 1;
8787
return Microsecond.CompareTo(other.Microsecond);
8888
}
89+
90+
DateTime IConvertible.ToDateTime(IFormatProvider? provider) => IsValidDateTime ? GetDateTime() : throw new InvalidCastException();
91+
string IConvertible.ToString(IFormatProvider? provider) => IsValidDateTime ? GetDateTime().ToString(provider) : "0000-00-00";
92+
93+
object IConvertible.ToType(Type conversionType, IFormatProvider? provider) =>
94+
conversionType == typeof(DateTime) ? (object) GetDateTime() :
95+
conversionType == typeof(string) ? ((IConvertible) this).ToString(provider) :
96+
throw new InvalidCastException();
97+
98+
TypeCode IConvertible.GetTypeCode() => TypeCode.Object;
99+
bool IConvertible.ToBoolean(IFormatProvider? provider) => throw new InvalidCastException();
100+
char IConvertible.ToChar(IFormatProvider? provider) => throw new InvalidCastException();
101+
sbyte IConvertible.ToSByte(IFormatProvider? provider) => throw new InvalidCastException();
102+
byte IConvertible.ToByte(IFormatProvider? provider) => throw new InvalidCastException();
103+
short IConvertible.ToInt16(IFormatProvider? provider) => throw new InvalidCastException();
104+
ushort IConvertible.ToUInt16(IFormatProvider? provider) => throw new InvalidCastException();
105+
int IConvertible.ToInt32(IFormatProvider? provider) => throw new InvalidCastException();
106+
uint IConvertible.ToUInt32(IFormatProvider? provider) => throw new InvalidCastException();
107+
long IConvertible.ToInt64(IFormatProvider? provider) => throw new InvalidCastException();
108+
ulong IConvertible.ToUInt64(IFormatProvider? provider) => throw new InvalidCastException();
109+
float IConvertible.ToSingle(IFormatProvider? provider) => throw new InvalidCastException();
110+
double IConvertible.ToDouble(IFormatProvider? provider) => throw new InvalidCastException();
111+
decimal IConvertible.ToDecimal(IFormatProvider? provider) => throw new InvalidCastException();
89112
}
90113
}

tests/MySqlConnector.Tests/MySqlDateTimeTests.cs

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Globalization;
23
using MySql.Data.Types;
34
using Xunit;
45

@@ -30,7 +31,7 @@ public void NonZeroMySqlDateTimeIsValidDateTime()
3031
[Fact]
3132
public void CreateFromDateTime()
3233
{
33-
var msdt = new MySqlDateTime(new DateTime(2018, 6, 9, 12, 34, 56, 123).AddTicks(4560));
34+
var msdt = new MySqlDateTime(s_dateTime);
3435
Assert.True(msdt.IsValidDateTime);
3536
Assert.Equal(2018, msdt.Year);
3637
Assert.Equal(6, msdt.Month);
@@ -45,10 +46,10 @@ public void CreateFromDateTime()
4546
[Fact]
4647
public void GetDateTime()
4748
{
48-
var msdt = new MySqlDateTime(2018, 6, 9, 12, 34, 56, 123456);
49+
var msdt = s_mySqlDateTime;
4950
Assert.True(msdt.IsValidDateTime);
5051
var dt = msdt.GetDateTime();
51-
Assert.Equal(new DateTime(2018, 6, 9, 12, 34, 56, 123).AddTicks(4560), dt);
52+
Assert.Equal(s_dateTime, dt);
5253
}
5354

5455
[Fact]
@@ -67,5 +68,81 @@ public void SetMicrosecond()
6768
msdt.Microsecond = 123456;
6869
Assert.Equal(123, msdt.Millisecond);
6970
}
71+
72+
[Fact]
73+
public void ConvertibleToDateTime()
74+
{
75+
IConvertible convertible = s_mySqlDateTime;
76+
var dt = convertible.ToDateTime(CultureInfo.InvariantCulture);
77+
Assert.Equal(s_dateTime, dt);
78+
}
79+
80+
[Fact]
81+
public void ConvertToDateTime()
82+
{
83+
object obj = s_mySqlDateTime;
84+
var dt = Convert.ToDateTime(obj);
85+
Assert.Equal(s_dateTime, dt);
86+
}
87+
88+
[Fact]
89+
public void ChangeTypeToDateTime()
90+
{
91+
object obj = s_mySqlDateTime;
92+
var dt = Convert.ChangeType(obj, TypeCode.DateTime);
93+
Assert.Equal(s_dateTime, dt);
94+
}
95+
96+
[Fact]
97+
public void NotConvertibleToDateTime()
98+
{
99+
IConvertible convertible = new MySqlDateTime();
100+
#if !BASELINE
101+
Assert.Throws<InvalidCastException>(() => convertible.ToDateTime(CultureInfo.InvariantCulture));
102+
#else
103+
Assert.Throws<MySqlConversionException>(() => convertible.ToDateTime(CultureInfo.InvariantCulture));
104+
#endif
105+
}
106+
107+
[Fact]
108+
public void NotConvertToDateTime()
109+
{
110+
object obj = new MySqlDateTime();
111+
#if !BASELINE
112+
Assert.Throws<InvalidCastException>(() => Convert.ToDateTime(obj));
113+
#else
114+
Assert.Throws<MySqlConversionException>(() => Convert.ToDateTime(obj));
115+
#endif
116+
}
117+
118+
[Fact]
119+
public void NotChangeTypeToDateTime()
120+
{
121+
object obj = new MySqlDateTime();
122+
#if !BASELINE
123+
Assert.Throws<InvalidCastException>(() => Convert.ChangeType(obj, TypeCode.DateTime));
124+
#else
125+
Assert.Throws<MySqlConversionException>(() => Convert.ChangeType(obj, TypeCode.DateTime));
126+
#endif
127+
}
128+
129+
#if !BASELINE
130+
[Fact]
131+
public void ValidDateTimeConvertibleToString()
132+
{
133+
IConvertible convertible = s_mySqlDateTime;
134+
Assert.Equal("06/09/2018 12:34:56", convertible.ToString(CultureInfo.InvariantCulture));
135+
}
136+
137+
[Fact]
138+
public void InvalidDateTimeConvertibleToString()
139+
{
140+
IConvertible convertible = new MySqlDateTime();
141+
Assert.Equal("0000-00-00", convertible.ToString(CultureInfo.InvariantCulture));
142+
}
143+
#endif
144+
145+
static readonly MySqlDateTime s_mySqlDateTime = new MySqlDateTime(2018, 6, 9, 12, 34, 56, 123456);
146+
static readonly DateTime s_dateTime = new DateTime(2018, 6, 9, 12, 34, 56, 123).AddTicks(4560);
70147
}
71148
}

0 commit comments

Comments
 (0)