From 2857706afa4d4c1839d28830566ea01abe0caeac Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 11:39:51 +0800 Subject: [PATCH 01/19] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ObjectExtensions.cs | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs index 76864758e..f137f67fa 100644 --- a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs +++ b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs @@ -130,37 +130,28 @@ public static class ObjectExtensions /// public static bool TryConvertTo(this string? source, [MaybeNullWhen(false)] out TValue val) { - var ret = false; + bool ret; var type = Nullable.GetUnderlyingType(typeof(TValue)) ?? typeof(TValue); if (type == typeof(string)) { val = (TValue)(object)source!; ret = true; } + else if (source == null) + { + + val = default; + ret = true; + } + else if (source == string.Empty) + { + ret = BindConverter.TryConvertTo(source, CultureInfo.InvariantCulture, out val); + } else { - try - { - if (source == null) - { - val = default; - ret = true; - } - else if (source == string.Empty) - { - ret = BindConverter.TryConvertTo(source, CultureInfo.InvariantCulture, out val); - } - else - { - var isBoolean = type == typeof(bool); - var v = isBoolean ? (object)source.Equals("true", StringComparison.CurrentCultureIgnoreCase) : source; - ret = BindConverter.TryConvertTo(v, CultureInfo.InvariantCulture, out val); - } - } - catch - { - val = default; - } + var isBoolean = type == typeof(bool); + var v = isBoolean ? (object)source.Equals("true", StringComparison.CurrentCultureIgnoreCase) : source; + ret = BindConverter.TryConvertTo(v, CultureInfo.InvariantCulture, out val); } return ret; } -- Gitee From 010b33cfc7f80728a5551acd7f612fd857ae4316 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 11:40:07 +0800 Subject: [PATCH 02/19] =?UTF-8?q?refactor:=20=E5=88=A0=E9=99=A4=E5=86=97?= =?UTF-8?q?=E4=BD=99=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Extensions/UtilityTest.cs | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 test/UnitTest/Extensions/UtilityTest.cs diff --git a/test/UnitTest/Extensions/UtilityTest.cs b/test/UnitTest/Extensions/UtilityTest.cs deleted file mode 100644 index 907e22267..000000000 --- a/test/UnitTest/Extensions/UtilityTest.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -// Website: https://www.blazor.zone or https://argozhang.github.io/ - -using BootstrapBlazor.Shared; - -namespace UnitTest.Extensions; - -public class UtilityTest : BootstrapBlazorTestBase -{ - [Fact] - public void GetKeyValue_Ok() - { - var foo = new Foo() { Id = 1 }; - var v = Utility.GetKeyValue(foo); - Assert.Equal(1, v); - - object foo1 = new Foo() { Id = 2 }; - v = Utility.GetKeyValue(foo1); - Assert.Equal(2, v); - } -} -- Gitee From 746806c516cdb4b86f32d6911c34bce5e20a6b0f Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 11:40:31 +0800 Subject: [PATCH 03/19] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20Convert=20?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ObjectExtensionsTest.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 test/UnitTest/Extensions/ObjectExtensionsTest.cs diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs new file mode 100644 index 000000000..2b0ee530e --- /dev/null +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -0,0 +1,22 @@ +// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Website: https://www.blazor.zone or https://argozhang.github.io/ + +using BootstrapBlazor.Shared; + +namespace UnitTest.Extensions; + +public class ObjectExtensionsTest +{ + [Theory] + [InlineData(null, "")] + [InlineData("95%", "95%")] + [InlineData("95px", "95px")] + [InlineData("95", "95px")] + [InlineData("test", "")] + public static void ConvertToPercentString_Ok(string? source, string expect) + { + var actual = source.ConvertToPercentString(); + Assert.Equal(expect, actual); + } +} -- Gitee From 77897681d7b688665f342562d87a2d753cb00278 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 11:40:45 +0800 Subject: [PATCH 04/19] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20IsNumber=20?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ObjectExtensionsTest.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index 2b0ee530e..3b8dab2ed 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -19,4 +19,26 @@ public class ObjectExtensionsTest var actual = source.ConvertToPercentString(); Assert.Equal(expect, actual); } + + [Theory] + [InlineData(typeof(int?), true)] + [InlineData(typeof(long?), true)] + [InlineData(typeof(float?), true)] + [InlineData(typeof(short?), true)] + [InlineData(typeof(double?), true)] + [InlineData(typeof(decimal?), true)] + [InlineData(typeof(int), true)] + [InlineData(typeof(long), true)] + [InlineData(typeof(float), true)] + [InlineData(typeof(short), true)] + [InlineData(typeof(double), true)] + [InlineData(typeof(decimal), true)] + [InlineData(typeof(DateTime?), false)] + [InlineData(typeof(DateTime), false)] + [InlineData(typeof(string), false)] + public static void IsNumber_Ok(Type source, bool expect) + { + var actual = source.IsNumber(); + Assert.Equal(expect, actual); + } } -- Gitee From 823027ec248d76b9763af20d16391b6e0eb97977 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 11:40:59 +0800 Subject: [PATCH 05/19] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20IsDateTime?= =?UTF-8?q?=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Extensions/ObjectExtensionsTest.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index 3b8dab2ed..f0b2e80e0 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -41,4 +41,16 @@ public class ObjectExtensionsTest var actual = source.IsNumber(); Assert.Equal(expect, actual); } + + [Theory] + [InlineData(typeof(DateTime?), false)] + [InlineData(typeof(DateTime), false)] + [InlineData(typeof(DateTimeOffset?), false)] + [InlineData(typeof(DateTimeOffset), false)] + [InlineData(typeof(string), false)] + public static void IsDateTime_Ok(Type source, bool expect) + { + var actual = source.IsDateTime(); + Assert.Equal(expect, actual); + } } -- Gitee From c1c639af33ea2ac740065f85feb1f6316f35f0ab Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 11:41:15 +0800 Subject: [PATCH 06/19] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20GetTypeDesc?= =?UTF-8?q?=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Extensions/ObjectExtensionsTest.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index f0b2e80e0..503ec61bc 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -53,4 +53,16 @@ public class ObjectExtensionsTest var actual = source.IsDateTime(); Assert.Equal(expect, actual); } + + [Theory] + [InlineData(typeof(SortOrder), "枚举")] + [InlineData(typeof(int), "数字")] + [InlineData(typeof(DateTimeOffset), "日期")] + [InlineData(typeof(string), "字符串")] + [InlineData(typeof(Foo), "字符串")] + public static void GetTypeDesc_Ok(Type source, string expect) + { + var actual = source.GetTypeDesc(); + Assert.Equal(expect, actual); + } } -- Gitee From bdbccb861583e5d26e257d9c7df42b9a2c5341ea Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 11:41:31 +0800 Subject: [PATCH 07/19] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20TryConvert?= =?UTF-8?q?=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ObjectExtensionsTest.cs | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index 503ec61bc..5d59db239 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -65,4 +65,54 @@ public class ObjectExtensionsTest var actual = source.GetTypeDesc(); Assert.Equal(expect, actual); } + + [Fact] + public static void TryConvertTo_Ok() + { + var source = "test"; + var result = source.TryConvertTo(typeof(string), out var v); + Assert.True(result); + Assert.Equal(source, v); + + source = "123"; + result = source.TryConvertTo(typeof(int), out var i); + Assert.True(result); + Assert.Equal(123, i); + } + + [Fact] + public static void TryConvertTo_Generic() + { + var source = "123"; + var result = source.TryConvertTo(out var v); + Assert.True(result); + Assert.Equal(123, v); + + source = null; + result = source.TryConvertTo(out var s); + Assert.True(result); + Assert.Null(s); + + result = source.TryConvertTo(out var i); + Assert.True(result); + Assert.Equal(0, i); + + source = ""; + result = source.TryConvertTo(out var e); + Assert.False(result); + + source = "False"; + result = source.TryConvertTo(out var b1); + Assert.True(result); + Assert.False(b1); + + source = "false"; + result = source.TryConvertTo(out var b2); + Assert.True(result); + Assert.False(b2); + + source = "test"; + result = source.TryConvertTo(out var dt); + Assert.False(result); + } } -- Gitee From 78a815c479cfd2fbc24813b9f9ec962558c1c335 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 12:02:16 +0800 Subject: [PATCH 08/19] =?UTF-8?q?Revert=20"refactor:=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 2857706afa4d4c1839d28830566ea01abe0caeac. --- .../Extensions/ObjectExtensions.cs | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs index f137f67fa..76864758e 100644 --- a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs +++ b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs @@ -130,28 +130,37 @@ public static class ObjectExtensions /// public static bool TryConvertTo(this string? source, [MaybeNullWhen(false)] out TValue val) { - bool ret; + var ret = false; var type = Nullable.GetUnderlyingType(typeof(TValue)) ?? typeof(TValue); if (type == typeof(string)) { val = (TValue)(object)source!; ret = true; } - else if (source == null) - { - - val = default; - ret = true; - } - else if (source == string.Empty) - { - ret = BindConverter.TryConvertTo(source, CultureInfo.InvariantCulture, out val); - } else { - var isBoolean = type == typeof(bool); - var v = isBoolean ? (object)source.Equals("true", StringComparison.CurrentCultureIgnoreCase) : source; - ret = BindConverter.TryConvertTo(v, CultureInfo.InvariantCulture, out val); + try + { + if (source == null) + { + val = default; + ret = true; + } + else if (source == string.Empty) + { + ret = BindConverter.TryConvertTo(source, CultureInfo.InvariantCulture, out val); + } + else + { + var isBoolean = type == typeof(bool); + var v = isBoolean ? (object)source.Equals("true", StringComparison.CurrentCultureIgnoreCase) : source; + ret = BindConverter.TryConvertTo(v, CultureInfo.InvariantCulture, out val); + } + } + catch + { + val = default; + } } return ret; } -- Gitee From 14d830b0f4a7eb555b7491d1ba3ea40e2e394208 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 12:05:53 +0800 Subject: [PATCH 09/19] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=85=AC=E5=BC=80=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Extensions/ObjectExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs index 76864758e..f19196448 100644 --- a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs +++ b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs @@ -170,7 +170,7 @@ public static class ObjectExtensions /// /// /// - internal static string ToFileSizeString(this long fileSize) => fileSize switch + public static string ToFileSizeString(this long fileSize) => fileSize switch { >= 1024 and < 1024 * 1024 => $"{Math.Round(fileSize / 1024D, 0, MidpointRounding.AwayFromZero)} KB", >= 1024 * 1024 and < 1024 * 1024 * 1024 => $"{Math.Round(fileSize / 1024 / 1024D, 0, MidpointRounding.AwayFromZero)} MB", -- Gitee From 3c9a775c46176b91533392d7c5e6b07a4b0f23d7 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 12:06:31 +0800 Subject: [PATCH 10/19] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Extensions/ObjectExtensionsTest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index 5d59db239..b5b562fcd 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -43,10 +43,10 @@ public class ObjectExtensionsTest } [Theory] - [InlineData(typeof(DateTime?), false)] - [InlineData(typeof(DateTime), false)] - [InlineData(typeof(DateTimeOffset?), false)] - [InlineData(typeof(DateTimeOffset), false)] + [InlineData(typeof(DateTime?), true)] + [InlineData(typeof(DateTime), true)] + [InlineData(typeof(DateTimeOffset?), true)] + [InlineData(typeof(DateTimeOffset), true)] [InlineData(typeof(string), false)] public static void IsDateTime_Ok(Type source, bool expect) { -- Gitee From d584f7aae1b9fe872d7074d1762b61178573107d Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 12:09:43 +0800 Subject: [PATCH 11/19] =?UTF-8?q?refactor:=20=E7=B2=BE=E7=AE=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Extensions/ObjectExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs index f19196448..017306a93 100644 --- a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs +++ b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs @@ -113,7 +113,7 @@ public static class ObjectExtensions else { var methodInfo = typeof(ObjectExtensions).GetMethods().FirstOrDefault(m => m.IsGenericMethod)!.MakeGenericMethod(type); - var v = type == typeof(string) ? null : Activator.CreateInstance(type); + var v = Activator.CreateInstance(type); var args = new object?[] { source, v }; ret = (bool)methodInfo.Invoke(null, args)!; val = ret ? args[1] : null; -- Gitee From cdcbf9bc116da17d3e232b0e53761f7b315f8602 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 12:10:15 +0800 Subject: [PATCH 12/19] =?UTF-8?q?test:=20=E8=A1=A5=E5=85=85=20TryConvert?= =?UTF-8?q?=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Extensions/ObjectExtensionsTest.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index b5b562fcd..d98aa669b 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -78,6 +78,10 @@ public class ObjectExtensionsTest result = source.TryConvertTo(typeof(int), out var i); Assert.True(result); Assert.Equal(123, i); + + source = "123"; + result = source.TryConvertTo(typeof(DateTime), out var d); + Assert.False(result); } [Fact] @@ -114,5 +118,10 @@ public class ObjectExtensionsTest source = "test"; result = source.TryConvertTo(out var dt); Assert.False(result); + + source = typeof(Foo).Name; + result = source.TryConvertTo(out var f); + Assert.False(result); + } } } -- Gitee From 7987b1d7acef72484fb85baa5d1c145b7870f19f Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 12:10:31 +0800 Subject: [PATCH 13/19] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20ToFileSize?= =?UTF-8?q?=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Extensions/ObjectExtensionsTest.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index d98aa669b..a5d654533 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -123,5 +123,17 @@ public class ObjectExtensionsTest result = source.TryConvertTo(out var f); Assert.False(result); } + + [Theory] + [InlineData(100f, "100 B")] + [InlineData(1024f, "1 KB")] + [InlineData(1024 * 1024f, "1 MB")] + [InlineData(1024 * 1024 * 1024f, "1 GB")] + public void ToFileSizeString_Ok(long source, string expect) + { + var actual = source.ToFileSizeString(); + Assert.Equal(expect, actual); + } + } } -- Gitee From 7461210841c917a0a129bc6e9345061bf575c5a2 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 12:22:20 +0800 Subject: [PATCH 14/19] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20IsEditable?= =?UTF-8?q?=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ObjectExtensionsTest.cs | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index a5d654533..231b85dcb 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -135,5 +135,63 @@ public class ObjectExtensionsTest Assert.Equal(expect, actual); } + [Theory] + [InlineData(ItemChangedType.Add)] + [InlineData(ItemChangedType.Update)] + public void IsEditable_Editable(ItemChangedType itemChangedType) + { + var editorItem = new EditorItem(); + Assert.True(editorItem.IsEditable(itemChangedType)); + } + + [Theory] + [InlineData(ItemChangedType.Add)] + [InlineData(ItemChangedType.Update)] + public void IsEditable_Readonly(ItemChangedType itemChangedType) + { + var editorItem = new EditorItem(); + editorItem.SetParametersAsync(ParameterView.FromDictionary(new Dictionary + { + ["Readonly"] = true + })); + Assert.False(editorItem.IsEditable(itemChangedType)); + } + + [Theory] + [InlineData(ItemChangedType.Add, true)] + [InlineData(ItemChangedType.Add, false)] + public void IsEditable_IsReadonlyWhenAdd(ItemChangedType itemChangedType, bool val) + { + var editorItem = new EditorItem() + { + IsReadonlyWhenAdd = val + }; + Assert.Equal(val, !editorItem.IsEditable(itemChangedType)); + } + + [Theory] + [InlineData(ItemChangedType.Update, true)] + [InlineData(ItemChangedType.Update, false)] + public void IsEditable_IsReadonlyWhenEdit(ItemChangedType itemChangedType, bool val) + { + var editorItem = new EditorItem() + { + IsReadonlyWhenEdit = val + }; + Assert.Equal(val, !editorItem.IsEditable(itemChangedType)); + } + + [Theory] + [InlineData(ItemChangedType.Add)] + [InlineData(ItemChangedType.Update)] + public void IsEditable_Search(ItemChangedType itemChangedType) + { + var editorItem = new EditorItem(); + editorItem.SetParametersAsync(ParameterView.FromDictionary(new Dictionary + { + ["Editable"] = false + })); + Assert.True(editorItem.IsEditable(itemChangedType, true)); + } } } -- Gitee From 9be5e43561560632f4c0d5d38b1d8aad2a0b1471 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 12:22:39 +0800 Subject: [PATCH 15/19] =?UTF-8?q?test:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Extensions/ObjectExtensionsTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index 231b85dcb..cb6c9874c 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -120,7 +120,7 @@ public class ObjectExtensionsTest Assert.False(result); source = typeof(Foo).Name; - result = source.TryConvertTo(out var f); + result = source.TryConvertTo(out var f); Assert.False(result); } -- Gitee From e57747338b6b9dc5a31dda65c930f7005f3db4b4 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 12:36:14 +0800 Subject: [PATCH 16/19] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E8=BD=AC=E5=8C=96=E5=99=A8=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ObjectExtensionsTest.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index cb6c9874c..dbb2ffa22 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -3,6 +3,8 @@ // Website: https://www.blazor.zone or https://argozhang.github.io/ using BootstrapBlazor.Shared; +using System.ComponentModel; +using System.Globalization; namespace UnitTest.Extensions; @@ -122,6 +124,10 @@ public class ObjectExtensionsTest source = typeof(Foo).Name; result = source.TryConvertTo(out var f); Assert.False(result); + + source = typeof(Dummy).FullName; + result = source.TryConvertTo(out var _); + Assert.True(result); } [Theory] @@ -193,5 +199,23 @@ public class ObjectExtensionsTest })); Assert.True(editorItem.IsEditable(itemChangedType, true)); } + + [TypeConverter(typeof(DummyConverter))] + private class Dummy + { + public string? Name { get; set; } + } + + private class DummyConverter : TypeConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) + { + return true; + } + + public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) + { + return new Dummy(); + } } } -- Gitee From 9653b054843f98ba2d309ddaace14e920ef8d661 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 13:06:01 +0800 Subject: [PATCH 17/19] =?UTF-8?q?refactor:=20=E7=B2=BE=E7=AE=80=E5=A4=9A?= =?UTF-8?q?=E7=BA=A7=E7=B1=BB=E5=B1=9E=E6=80=A7=E6=98=AF=E5=90=A6=E5=8F=AA?= =?UTF-8?q?=E8=AF=BB=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Extensions/ObjectExtensions.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs index 017306a93..1d54ac94c 100644 --- a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs +++ b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs @@ -203,13 +203,14 @@ public static class ObjectExtensions var fieldName = col.GetFieldName(); var canWrite = IsDynamicObject(); return canWrite || (fieldName.Contains('.') - ? modelType.GetPropertyByName(fieldName)?.CanWrite ?? false - : ComplexCanWrite()); + ? ComplexCanWrite() + : modelType.GetPropertyByName(fieldName)?.CanWrite ?? false); bool IsDynamicObject() => modelType == typeof(DynamicObject); bool ComplexCanWrite() { + var ret = false; var propertyNames = fieldName.Split('.'); PropertyInfo? propertyInfo = null; Type? propertyType = null; @@ -226,7 +227,11 @@ public static class ObjectExtensions propertyType = propertyInfo.PropertyType; } } - return propertyInfo?.CanWrite ?? false; + if (propertyInfo != null) + { + ret = propertyInfo.CanWrite; + } + return ret; } } } -- Gitee From 782e1bcb00c0ac198b435b0b083f907eec0f1cd5 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 13:06:13 +0800 Subject: [PATCH 18/19] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20CanWrite=20?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ObjectExtensionsTest.cs | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index dbb2ffa22..0144ea34b 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -200,10 +200,46 @@ public class ObjectExtensionsTest Assert.True(editorItem.IsEditable(itemChangedType, true)); } + [Fact] + public void CanWrite_Ok() + { + var item = new MockEditItem() { FieldName = "Name" }; + var result = item.CanWrite(typeof(Foo)); + Assert.True(result); + + item = new MockEditItem() { FieldName = "Test" }; + result = item.CanWrite(typeof(Foo)); + Assert.False(result); + + var item2 = new MockEditItem() { FieldName = "Foo.Name" }; + result = item2.CanWrite(typeof(Dummy)); + Assert.True(result); + + item2 = new MockEditItem() { FieldName = "Count" }; + result = item2.CanWrite(typeof(Dummy)); + Assert.False(result); + + // DynamicObject always return True + Assert.True(item2.CanWrite(typeof(DynamicObject))); + } + + [Theory] + [InlineData("Test.Name")] + [InlineData("Foo.Test")] + public void CanWrite_Exception(string fieldName) + { + var item = new MockEditItem() { FieldName = fieldName }; + Assert.Throws(() => item.CanWrite(typeof(Dummy))); + } + [TypeConverter(typeof(DummyConverter))] private class Dummy { public string? Name { get; set; } + + public Foo Foo { get; set; } = new Foo(); + + public int Count { get; } } private class DummyConverter : TypeConverter @@ -218,4 +254,13 @@ public class ObjectExtensionsTest return new Dummy(); } } + + private class MockEditItem : EditorItem, IEditorItem + { + public string? FieldName { get; set; } + + string IEditorItem.GetFieldName() => FieldName!; + + public Dummy Dummy { get; set; } = new Dummy(); + } } -- Gitee From 0afb4869d05e632e77fa92984f4659c393cb6472 Mon Sep 17 00:00:00 2001 From: Argo-Lenovo Date: Mon, 6 Jun 2022 13:13:53 +0800 Subject: [PATCH 19/19] =?UTF-8?q?refactor:=20=E7=B2=BE=E7=AE=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Extensions/ObjectExtensions.cs | 4 +--- test/UnitTest/Extensions/ObjectExtensionsTest.cs | 6 +----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs index 1d54ac94c..6902ee8a1 100644 --- a/src/BootstrapBlazor/Extensions/ObjectExtensions.cs +++ b/src/BootstrapBlazor/Extensions/ObjectExtensions.cs @@ -202,9 +202,7 @@ public static class ObjectExtensions { var fieldName = col.GetFieldName(); var canWrite = IsDynamicObject(); - return canWrite || (fieldName.Contains('.') - ? ComplexCanWrite() - : modelType.GetPropertyByName(fieldName)?.CanWrite ?? false); + return canWrite || ComplexCanWrite(); bool IsDynamicObject() => modelType == typeof(DynamicObject); diff --git a/test/UnitTest/Extensions/ObjectExtensionsTest.cs b/test/UnitTest/Extensions/ObjectExtensionsTest.cs index 0144ea34b..b7eb4c395 100644 --- a/test/UnitTest/Extensions/ObjectExtensionsTest.cs +++ b/test/UnitTest/Extensions/ObjectExtensionsTest.cs @@ -207,10 +207,6 @@ public class ObjectExtensionsTest var result = item.CanWrite(typeof(Foo)); Assert.True(result); - item = new MockEditItem() { FieldName = "Test" }; - result = item.CanWrite(typeof(Foo)); - Assert.False(result); - var item2 = new MockEditItem() { FieldName = "Foo.Name" }; result = item2.CanWrite(typeof(Dummy)); Assert.True(result); @@ -224,7 +220,7 @@ public class ObjectExtensionsTest } [Theory] - [InlineData("Test.Name")] + [InlineData("Test")] [InlineData("Foo.Test")] public void CanWrite_Exception(string fieldName) { -- Gitee