using System; using System.Collections.Generic; using Util.Helpers; using Util.Tests.Samples; using Xunit; using Convert = Util.Helpers.Convert; namespace Util.Tests.Helpers; /// /// 类型转换测试 /// public class ConvertTest { #region ToInt /// /// 转换为整型 /// /// 输入值 /// 结果 [Theory] [InlineData( null, 0 )] [InlineData( "", 0 )] [InlineData( "1A", 0 )] [InlineData( "0", 0 )] [InlineData( "1", 1 )] [InlineData( "1778019.78", 1778020 )] [InlineData( "1778019.7801684", 1778020 )] public void TestToInt( object input, int result ) { Assert.Equal( result, Convert.ToInt( input ) ); } #endregion #region ToIntOrNull /// /// 转换为可空整型 /// /// 输入值 /// 结果 [Theory] [InlineData( null, null )] [InlineData( "", null )] [InlineData( "1A", null )] [InlineData( "0", 0 )] [InlineData( "1", 1 )] [InlineData( "1778019.78", 1778020 )] [InlineData( "1778019.7801684", 1778020 )] public void TestToIntOrNull( object input, int? result ) { Assert.Equal( result, Convert.ToIntOrNull( input ) ); } #endregion #region ToLong /// /// 转换为64位整型 /// /// 输入值 /// 结果 [Theory] [InlineData( null, 0 )] [InlineData( "", 0 )] [InlineData( "1A", 0 )] [InlineData( "0", 0 )] [InlineData( "1", 1 )] [InlineData( "1778019.7801684", 1778020 )] [InlineData( "177801978016841234", 177801978016841234 )] public void TestToLong( object input, long result ) { Assert.Equal( result, Convert.ToLong( input ) ); } #endregion #region ToLongOrNull /// /// 转换为64位可空整型 /// /// 输入值 /// 结果 [Theory] [InlineData( null, null )] [InlineData( "", null )] [InlineData( "1A", null )] [InlineData( "0", 0L )] [InlineData( "1", 1L )] [InlineData( "1778019.7801684", 1778020L )] [InlineData( "177801978016841234", 177801978016841234L )] public void TestToLongOrNull( object input, long? result ) { Assert.Equal( result, Convert.ToLongOrNull( input ) ); } #endregion #region ToFloat /// /// 转换为32位浮点型 /// /// 输入值 /// 结果 /// 小数位数 [Theory] [InlineData( null, 0, null )] [InlineData( "", 0, null )] [InlineData( "1A", 0, null )] [InlineData( "0", 0, null )] [InlineData( "1", 1, null )] [InlineData( "1.2", 1.2, null )] [InlineData( "12.346", 12.35, 2 )] public void TestToFloat( object input, float result, int? digits ) { Assert.Equal( result, Convert.ToFloat( input, digits ) ); } #endregion #region ToFloatOrNull /// /// 转换为32位可空浮点型 /// /// 输入值 /// 结果 /// 小数位数 [Theory] [InlineData( null, null, null )] [InlineData( "", null, null )] [InlineData( "1A", null, null )] [InlineData( "0", 0f, null )] [InlineData( "1", 1f, null )] [InlineData( "1.2", 1.2f, null )] [InlineData( "12.346", 12.35f, 2 )] public void TestToFloatOrNull( object input, float? result, int? digits ) { Assert.Equal( result, Convert.ToFloatOrNull( input, digits ) ); } #endregion #region ToDouble /// /// 转换为64位浮点型 /// /// 输入值 /// 结果 /// 小数位数 [Theory] [InlineData( null, 0, null )] [InlineData( "", 0, null )] [InlineData( "1A", 0, null )] [InlineData( "0", 0, null )] [InlineData( "1", 1, null )] [InlineData( "1.2", 1.2, null )] [InlineData( "12.235", 12.24, 2 )] [InlineData( "12.345", 12.34, 2 )] [InlineData( "12.3451", 12.35, 2 )] [InlineData( "12.346", 12.35, 2 )] public void TestToDouble( object input, double result, int? digits ) { Assert.Equal( result, Convert.ToDouble( input, digits ) ); } #endregion #region ToDoubleOrNull /// /// 转换为64位可空浮点型 /// /// 输入值 /// 结果 /// 小数位数 [Theory] [InlineData( null, null, null )] [InlineData( "", null, null )] [InlineData( "1A", null, null )] [InlineData( "0", 0d, null )] [InlineData( "1", 1d, null )] [InlineData( "1.2", 1.2, null )] [InlineData( "12.355", 12.36, 2 )] public void TestToDoubleOrNull( object input, double? result, int? digits ) { Assert.Equal( result, Convert.ToDoubleOrNull( input, digits ) ); } #endregion #region ToDecimal /// /// 转换为128位浮点型 /// /// 输入值 /// 结果 /// 小数位数 [Theory] [InlineData( null, 0, null )] [InlineData( "", 0, null )] [InlineData( "1A", 0, null )] [InlineData( "0", 0, null )] [InlineData( "1", 1, null )] [InlineData( "1.2", 1.2, null )] [InlineData( "12.235", 12.24, 2 )] [InlineData( "12.345", 12.34, 2 )] [InlineData( "12.3451", 12.35, 2 )] [InlineData( "12.346", 12.35, 2 )] public void TestToDecimal( object input, decimal result, int? digits ) { Assert.Equal( result, Convert.ToDecimal( input, digits ) ); } #endregion #region ToDecimalOrNull /// /// 转换为128位可空浮点型,验证 /// /// 输入值 /// 结果 /// 小数位数 [Theory] [InlineData( null, null, null )] [InlineData( "", null, null )] [InlineData( "1A", null, null )] [InlineData( "1A", null, 2 )] public void TestToDecimalOrNull_Validate( object input, decimal? result, int? digits ) { Assert.Equal( result, Convert.ToDecimalOrNull( input, digits ) ); } /// /// 转换为128位可空浮点型,输入值为"0" /// [Fact] public void TestToDecimalOrNull() { Assert.Equal( 0M, Convert.ToDecimalOrNull( "0" ) ); Assert.Equal( 1.2M, Convert.ToDecimalOrNull( "1.2" ) ); Assert.Equal( 23.46M, Convert.ToDecimalOrNull( "23.456", 2 ) ); } #endregion #region ToBool /// /// 转换为布尔型 /// /// 输入值 /// 结果 [Theory] [InlineData( null, null )] [InlineData( "false", false )] [InlineData( "true", true )] [InlineData( 0, false )] [InlineData( 1, true )] [InlineData( "0", false )] [InlineData( "1", true )] public void TestToBool( object input, bool result ) { Assert.Equal( result, Convert.ToBool( input ) ); } #endregion #region ToBoolOrNull /// /// 转换为可空布尔型 /// /// 输入值 /// 结果 [Theory] [InlineData( null, null )] [InlineData( "false", false )] [InlineData( "true", true )] [InlineData( 0, false )] [InlineData( 1, true )] [InlineData( "0", false )] [InlineData( "1", true )] public void TestToBoolOrNull( object input, bool? result ) { Assert.Equal( result, Convert.ToBoolOrNull( input ) ); } #endregion #region ToDateTime /// /// 转换为日期,验证 /// [Fact] public void TestToDateTime_Validate() { Assert.Equal( DateTime.MinValue, Convert.ToDateTime( null ) ); Assert.Equal( DateTime.MinValue, Convert.ToDateTime( "" ) ); Assert.Equal( DateTime.MinValue, Convert.ToDateTime( "1A" ) ); } /// /// 转换为日期 /// [Fact] public void TestToDateTime() { Assert.Equal( new DateTime( 2000, 1, 1 ), Convert.ToDateTime( "2000-1-1" ) ); } #endregion #region ToDateTimeOrNull /// /// 转换为可空日期,验证 /// /// 输入值 /// 结果 [Theory] [InlineData( null, null )] [InlineData( "", null )] [InlineData( "1A", null )] public void TestToDateTimeOrNull_Validate( object input, DateTime? result ) { Assert.Equal( result, Convert.ToDateTimeOrNull( input ) ); } /// /// 转换为可空日期 /// [Fact] public void TestToDateTimeOrNull() { Assert.Equal( new DateTime( 2000, 1, 1 ), Convert.ToDateTimeOrNull( "2000-1-1" ) ); } #endregion #region ToGuid /// /// 转换为Guid,验证 /// [Fact] public void TestToGuid_Validate() { Assert.Equal( Guid.Empty, Convert.ToGuid( null ) ); Assert.Equal( Guid.Empty, Convert.ToGuid( "" ) ); Assert.Equal( Guid.Empty, Convert.ToGuid( "1A" ) ); } /// /// 转换为Guid /// [Fact] public void TestToGuid() { Assert.Equal( new Guid( "B9EB56E9-B720-40B4-9425-00483D311DDC" ), Convert.ToGuid( "B9EB56E9-B720-40B4-9425-00483D311DDC" ) ); } #endregion #region ToGuidOrNull /// /// 转换为可空Guid,验证 /// /// 输入值 /// 结果 [Theory] [InlineData( null, null )] [InlineData( "", null )] [InlineData( "1A", null )] public void TestToGuidOrNull_Validate( object input, Guid? result ) { Assert.Equal( result, Convert.ToGuidOrNull( input ) ); } /// /// 转换为可空Guid - 转换字符串 /// [Fact] public void TestToGuidOrNull_1() { Assert.Equal( new Guid( "B9EB56E9-B720-40B4-9425-00483D311DDC" ), Convert.ToGuidOrNull( "B9EB56E9-B720-40B4-9425-00483D311DDC" ) ); } /// /// 转换为可空Guid - 转换字节数组 /// [Fact] public void TestToGuidOrNull_2() { var guid = Guid.NewGuid(); var bytes = guid.ToByteArray(); Assert.Equal( guid, Convert.ToGuidOrNull( bytes ) ); } /// /// 转换为可空Guid - 转换字节数组 - 空guid /// [Fact] public void TestToGuidOrNull_3() { var guid = Guid.Empty; var bytes = guid.ToByteArray(); Assert.Equal( guid, Convert.ToGuidOrNull( bytes ) ); } #endregion #region ToGuidList /// /// 转换为Guid集合 /// [Fact] public void TestToGuidList() { Assert.Empty( Convert.ToGuidList( null ) ); Assert.Empty( Convert.ToGuidList( "" ) ); const string guid = "83B0233C-A24F-49FD-8083-1337209EBC9A"; Assert.Single( Convert.ToGuidList( guid ) ); Assert.Equal( new Guid( guid ), Convert.ToGuidList( guid )[0] ); const string guid2 = "83B0233C-A24F-49FD-8083-1337209EBC9A,EAB523C6-2FE7-47BE-89D5-C6D440C3033A"; Assert.Equal( 2, Convert.ToGuidList( guid2 ).Count ); Assert.Equal( new Guid( "83B0233C-A24F-49FD-8083-1337209EBC9A" ), Convert.ToGuidList( guid2 )[0] ); Assert.Equal( new Guid( "EAB523C6-2FE7-47BE-89D5-C6D440C3033A" ), Convert.ToGuidList( guid2 )[1] ); } /// /// 转换为Guid集合 /// [Fact] public void TestToGuidList_2() { const string guid = "83B0233C-A24F-49FD-8083-1337209EBC9A,,EAB523C6-2FE7-47BE-89D5-C6D440C3033A,"; Assert.Equal( 2, Convert.ToGuidList( guid ).Count ); Assert.Equal( new Guid( "83B0233C-A24F-49FD-8083-1337209EBC9A" ), Convert.ToGuidList( guid )[0] ); Assert.Equal( new Guid( "EAB523C6-2FE7-47BE-89D5-C6D440C3033A" ), Convert.ToGuidList( guid )[1] ); } #endregion #region ToList /// /// 泛型集合转换 /// [Fact] public void TestToList() { Assert.Empty( Convert.ToList( null ) ); Assert.Single( Convert.ToList( "1" ) ); Assert.Equal( 2, Convert.ToList( "1,2" ).Count ); Assert.Equal( 2, Convert.ToList( "1,2" )[1] ); } #endregion #region To /// /// 测试通用泛型转换 /// [Fact] public void TestTo() { Assert.Null( Convert.To( "" ) ); Assert.Equal( "1A", Convert.To( "1A" ) ); Assert.Equal( 0, Convert.To( null ) ); Assert.Equal( 0, Convert.To( "" ) ); Assert.Equal( 0, Convert.To( "2A" ) ); Assert.Equal( 1, Convert.To( "1" ) ); Assert.Null( Convert.To( null ) ); Assert.Null( Convert.To( "" ) ); Assert.Null( Convert.To( "3A" ) ); Assert.Equal( Guid.Empty, Convert.To( "" ) ); Assert.Equal( Guid.Empty, Convert.To( "4A" ) ); Assert.Equal( new Guid( "B9EB56E9-B720-40B4-9425-00483D311DDC" ), Convert.To( "B9EB56E9-B720-40B4-9425-00483D311DDC" ) ); Assert.Equal( new Guid( "B9EB56E9-B720-40B4-9425-00483D311DDC" ), Convert.To( "B9EB56E9-B720-40B4-9425-00483D311DDC" ) ); Assert.Equal( 12.5, Convert.To( "12.5" ) ); Assert.Equal( 12.5, Convert.To( "12.5" ) ); Assert.Equal( 12.5M, Convert.To( "12.5" ) ); Assert.True( Convert.To( "true" ) ); Assert.Equal( new DateTime( 2000, 1, 1 ), Convert.To( "2000-1-1" ) ); Assert.Equal( new DateTime( 2000, 1, 1 ), Convert.To( "2000-1-1" ) ); var guid = Guid.NewGuid(); Assert.Equal( guid.ToString(), Convert.To( guid ) ); Assert.Equal( EnumSample.C, Convert.To( "c" ) ); } /// /// 测试通用泛型转换 - 转换对象副本 /// [Fact] public void TestTo_2() { Sample4 sample = new Sample4 { StringValue = "a" }; var result = Convert.To( sample.GetClone() ); Assert.Equal( "a", result?.StringValue ); } /// /// 测试通用泛型转换 - 转换Json元素 /// [Fact] public void TestTo_3() { //序列化再反序列化字典 var dic = new Dictionary { {"a", new Sample3 {StringValue = "a"}}, {"b", new Sample3 {StringValue = "b"}} }; var json = Json.ToJson( dic ); dic = Json.ToObject>( json ); //从字典中获取元素并转换 var element = dic["b"]; var result = Convert.To( element ); //验证 Assert.Equal( "b", result?.StringValue ); } #endregion #region ToDictionary /// /// 测试对象转换为属性名值对 /// [Fact] public void TestToDictionary_1() { var sample = new Sample2 { BoolValue = true, Description = "Description", StringValue = "StringValue", IntValue = 2, Display = "Display", NullableBoolValue = true, DisplayName = "DisplayName", DisplayName2 = "DisplayName2", Test3 = new Sample3 { StringValue = "a" }, TestList = new List { new() { StringValue = "a" }, new() { StringValue = "b" } } }; var result = Convert.ToDictionary( sample ); Assert.Equal( 10, result.Count ); Assert.Equal( "Description", result["Description"] ); Assert.Equal( "Display", result["Display"] ); Assert.Equal( "DisplayName", result["DisplayName"] ); Assert.Equal( "DisplayName2", result["DisplayName2"] ); Assert.Equal( 2, result["IntValue"] ); } /// /// 测试对象转换为属性名值对 /// [Fact] public void TestToDictionary_2() { var sample = new Sample2 { BoolValue = true, Description = "Description", StringValue = "StringValue", IntValue = 2, Display = "Display", NullableBoolValue = true, DisplayName = "DisplayName", DisplayName2 = "DisplayName2", Test3 = new Sample3 { StringValue = "a" }, TestList = new List { new() { StringValue = "a" }, new() { StringValue = "b" } } }; var result = Convert.ToDictionary( sample,true ); Assert.Equal( 10, result.Count ); Assert.Equal( "Description", result["描述"] ); Assert.Equal( "Display", result["Display"] ); Assert.Equal( "DisplayName", result["显示名"] ); Assert.Equal( "DisplayName2", result["DisplayName2"] ); Assert.Equal( 2, result["IntValue"] ); } /// /// 测试对象转换为属性名值对 - 传入字典 /// [Fact] public void TestToDictionary_3() { var content = new Dictionary { { "Code", "a" }, { "Price", 0 } }; var result = Convert.ToDictionary( content ); Assert.Equal( 2, result.Count ); Assert.Equal( "a", result["Code"] ); Assert.Equal( 0, result["Price"] ); } #endregion }