Browse Source

feat: 添加Lion.AbpPro.Core单元测试

pull/126/head
wangjun 3 years ago
parent
commit
37e5752d61
  1. 1
      aspnet-core/frameworks/src/Lion.AbpPro.Core/GlobalUsings.cs
  2. 4
      aspnet-core/frameworks/src/Lion.AbpPro.Core/System/Collections/Generic/CollectionExtensions.cs
  3. 76
      aspnet-core/frameworks/src/Lion.AbpPro.Core/System/DateTimeExtensions.cs
  4. 1
      aspnet-core/frameworks/src/Lion.AbpPro.Core/System/EnumExtensions.cs
  5. 25
      aspnet-core/frameworks/src/Lion.AbpPro.Core/System/ExceptionExtensions.cs
  6. 28
      aspnet-core/frameworks/src/Lion.AbpPro.Core/System/LongExtensions.cs
  7. 5
      aspnet-core/frameworks/src/Lion.AbpPro.Core/System/Reflection/MemberInfoExtensions.cs
  8. 21
      aspnet-core/frameworks/src/Lion.AbpPro.Core/System/Reflection/PropertyInfoExtensions.cs
  9. 44
      aspnet-core/frameworks/src/Lion.AbpPro.Core/System/Text/StringBuilderExtensions.cs
  10. 289
      aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/Collections/Generic/CollectionExtensionsTests.cs
  11. 62
      aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/DateTimeExtensionsTests.cs
  12. 82
      aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/ExceptionExtensionsTests.cs
  13. 58
      aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/Reflection/MemberInfoExtensionsTests.cs
  14. 87
      aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/Reflection/MethodInfoExtensionsTests.cs
  15. 101
      aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/Text/StringBuilderExtensionsTest.cs
  16. 3
      aspnet-core/frameworks/test/Lion.AbpPro.EntityFrameworkCore.Mysql.Tests/Entities/Blogs/IBlogsRepository.cs

1
aspnet-core/frameworks/src/Lion.AbpPro.Core/GlobalUsings.cs

@ -1,5 +1,6 @@
// Global using directives
global using System.ComponentModel;
global using System.ComponentModel.DataAnnotations;
global using System.Diagnostics;
global using System.Globalization;

4
aspnet-core/frameworks/src/Lion.AbpPro.Core/System/Collections/Generic/CollectionExtensions.cs

@ -35,10 +35,10 @@ public static class CollectionExtensions
public static void AddIfNotExist<T>(this ICollection<T> collection, T value, Func<T, bool> existFunc = null)
{
if (collection is null) throw new ArgumentNullException();
var exists = existFunc == null ? collection!.Contains(value) : collection!.Any(existFunc);
var exists = existFunc == null ? collection.Contains(value) : collection.Any(existFunc);
if (!exists)
{
collection!.Add(value);
collection.Add(value);
}
}

76
aspnet-core/frameworks/src/Lion.AbpPro.Core/System/DateTimeExtensions.cs

@ -38,37 +38,6 @@ public static class DateTimeExtensions
return weeks.Contains(dateTime.DayOfWeek);
}
/// <summary>
/// 获取时间相对唯一字符串
/// </summary>
/// <param name="dateTime"></param>
/// <param name="millisecond">是否使用毫秒</param>
/// <returns></returns>
public static string ToUniqueString(this DateTime dateTime, bool millisecond = false)
{
var seconds = dateTime.Hour * 3600 + dateTime.Minute * 60 + dateTime.Second;
var value = $"{dateTime:yyyy}{dateTime.DayOfYear}{seconds}";
if (millisecond)
{
return value + dateTime.ToString("fff");
}
return value;
}
/// <summary>
/// 将时间转换为JS时间格式(Date.getTime())
/// </summary>
/// <param name="dateTime"></param>
/// <param name="millisecond">是否使用毫秒</param>
public static string ToJsGetTime(this DateTime dateTime, bool millisecond = true)
{
var utc = dateTime.ToUniversalTime();
var span = utc.Subtract(new DateTime(1970, 1, 1));
return Math.Round(millisecond ? span.TotalMilliseconds : span.TotalSeconds).ToString(CultureInfo.InvariantCulture);
}
/// <summary>
/// 将时间类型转成int类型. 例如 2021-09-01 => 20210901
/// </summary>
@ -89,7 +58,7 @@ public static class DateTimeExtensions
/// <summary>
/// 获取指定日期 当天的最大时间
/// 例如 2021-09-10 11:22:33.123456 转换后 2021-09-10 23:59:59.9999999
/// 例如 2021-09-10 11:22:33.123 转换后 2021-09-10 23:59:59.999
/// </summary>
public static DateTime? ToCurrentDateMaxDateTime(this DateTime? dateTime)
{
@ -98,11 +67,11 @@ public static class DateTimeExtensions
/// <summary>
/// 获取指定日期 当天的最大时间
/// 例如 2021-09-10 11:22:33.123456 转换后 2021-09-10 23:59:59.9999999
/// 例如 2021-09-10 11:22:33.123 转换后 2021-09-10 23:59:59.999
/// </summary>
public static DateTime ToCurrentDateMaxDateTime(this DateTime dateTime)
{
return dateTime.Date.AddDays(1).AddTicks(-1);
return dateTime.Date.AddDays(1).AddMilliseconds(-1);
}
/// <summary>
@ -110,7 +79,7 @@ public static class DateTimeExtensions
/// </summary>
public static DateTime? ToCurrentDateMinDateTime(this DateTime? dateTime)
{
return dateTime?.Date.AddTicks(1);
return dateTime?.Date;
}
/// <summary>
@ -118,7 +87,7 @@ public static class DateTimeExtensions
/// </summary>
public static DateTime ToCurrentDateMinDateTime(this DateTime dateTime)
{
return dateTime.Date.AddTicks(1);
return dateTime.Date;
}
/// <summary>
@ -138,55 +107,42 @@ public static class DateTimeExtensions
/// <summary>
/// 转为秒级时间戳
/// <param name="dateTime">时间</param>
/// <param name="timeZoneInfo">默认 TimeZoneInfo.Utc</param>
/// <remarks>
///时间戳实际就是当前时间距离1970年1月1日0点0时0分0秒(转换成北京时间是1970年1月1日8点0时0分0秒)距离你要计算的时间的秒数或者毫秒数 一般来说:我们用的时间戳到秒的话是10位,到毫秒的话是13位
/// </remarks>
/// </summary>
public static long ToSecondTimeStamp(this DateTime dateTime, TimeZoneInfo timeZoneInfo = null)
public static long ToUnixTimeSeconds(this DateTime dateTime)
{
timeZoneInfo ??= TimeZoneInfo.Utc;
var dtStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1, 0, 0, 0), timeZoneInfo);
long timeStamp = Convert.ToInt32((dateTime - dtStart).TotalSeconds);
return timeStamp;
return (new DateTimeOffset(dateTime)).ToUnixTimeSeconds();
}
/// <summary>
/// 转为秒级时间戳
/// <param name="dateTime">时间</param>
/// <param name="timeZoneInfo">默认 TimeZoneInfo.Utc</param>
/// </summary>
public static long? ToSecondTimeStamp(this DateTime? dateTime, TimeZoneInfo timeZoneInfo = null)
public static long? ToUnixTimeSeconds(this DateTime? dateTime)
{
if (!dateTime.HasValue) return null;
timeZoneInfo ??= TimeZoneInfo.Utc;
var dtStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1, 0, 0, 0), timeZoneInfo);
long timeStamp = Convert.ToInt32((dateTime.Value - dtStart).TotalSeconds);
return timeStamp;
return (new DateTimeOffset(dateTime.Value)).ToUnixTimeSeconds();
}
/// <summary>
/// 转为毫秒级时间戳
/// <param name="dateTime">时间</param>
/// <param name="timeZoneInfo">默认 TimeZoneInfo.Utc</param>
/// </summary>
public static long ToMilliSecondTimeStamp(this DateTime dateTime, TimeZoneInfo timeZoneInfo = null)
public static long? ToUnixTimeMilliseconds(this DateTime dateTime)
{
timeZoneInfo ??= TimeZoneInfo.Utc;
var dtStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1, 0, 0, 0), timeZoneInfo);
var timeStamp = Convert.ToInt64((dateTime - dtStart).TotalMilliseconds);
return timeStamp;
return (new DateTimeOffset(dateTime)).ToUnixTimeMilliseconds();
}
/// <summary>
/// 转为毫秒级时间戳
/// <param name="dateTime">时间</param>
/// <param name="timeZoneInfo">默认 TimeZoneInfo.Utc</param>
/// </summary>
public static long? ToMilliSecondTimeStamp(this DateTime? dateTime, TimeZoneInfo timeZoneInfo = null)
public static long? ToUnixTimeMilliseconds(this DateTime? dateTime)
{
if (!dateTime.HasValue) return null;
timeZoneInfo ??= TimeZoneInfo.Utc;
var dtStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1, 0, 0, 0), timeZoneInfo);
var timeStamp = Convert.ToInt64((dateTime.Value - dtStart).TotalMilliseconds);
return timeStamp;
return (new DateTimeOffset(dateTime.Value)).ToUnixTimeMilliseconds();
}
/// <summary>

1
aspnet-core/frameworks/src/Lion.AbpPro.Core/System/EnumExtensions.cs

@ -1,5 +1,4 @@
using System.Collections.Specialized;
using System.ComponentModel;
using System.Reflection;
namespace System;

25
aspnet-core/frameworks/src/Lion.AbpPro.Core/System/ExceptionExtensions.cs

@ -1,4 +1,5 @@
using System.Runtime.ExceptionServices;
using Volo.Abp.ExceptionHandling;
namespace System;
@ -16,14 +17,13 @@ public static class ExceptionExtensions
public static string FormatMessage(this Exception e, bool isHideStackTrace = false)
{
var sb = new StringBuilder();
var count = 0;
var appString = string.Empty;
while (e != null)
if (e == null) return sb.ToString();
if (e is IHasErrorCode errorCodeException)
{
if (count > 0)
{
appString += " ";
sb.AppendLine($"{appString}异常Code:{errorCodeException.Code}");
}
sb.AppendLine($"{appString}异常消息:{e.Message}");
sb.AppendLine($"{appString}异常类型:{e.GetType().FullName}");
sb.AppendLine($"{appString}异常方法:{(e.TargetSite == null ? null : e.TargetSite.Name)}");
@ -32,23 +32,12 @@ public static class ExceptionExtensions
{
sb.AppendLine($"{appString}异常堆栈:{e.StackTrace}");
}
if (e.InnerException != null)
{
if (e.InnerException == null) return sb.ToString();
sb.AppendLine($"{appString}内部异常:");
count++;
e = e.InnerException;
}
}
return sb.ToString();
}
/// <summary>
/// 将异常重新抛出
/// </summary>
public static void ReThrow(this Exception exception)
{
ExceptionDispatchInfo.Capture(exception).Throw();
}
/// <summary>
/// 如果条件成立,则抛出异常

28
aspnet-core/frameworks/src/Lion.AbpPro.Core/System/LongExtensions.cs

@ -0,0 +1,28 @@
using System.Collections.Specialized;
using System.Reflection;
namespace System;
/// <summary>
/// long<see cref="long"/>的扩展辅助操作方法
/// </summary>
public static class LongExtensions
{
/// <summary>
/// 时间戳转本地时间-时间戳精确到秒
/// </summary>
public static DateTime ToLocalTimeDateBySeconds(this long unix)
{
var dto = DateTimeOffset.FromUnixTimeSeconds(unix);
return dto.ToLocalTime().DateTime;
}
/// <summary>
/// 时间戳转本地时间-时间戳精确到毫秒
/// </summary>
public static DateTime ToLocalTimeDateByMilliseconds(this long unix)
{
var dto = DateTimeOffset.FromUnixTimeMilliseconds(unix);
return dto.ToLocalTime().DateTime;
}
}

5
aspnet-core/frameworks/src/Lion.AbpPro.Core/System/Reflection/MemberInfoExtensions.cs

@ -1,13 +1,10 @@
using System.ComponentModel;
namespace System.Reflection;
namespace System.Reflection;
/// <summary>
/// 成员<see cref="MemberInfo"/>的扩展辅助操作方法
/// </summary>
public static class MemberInfoExtensions
{
/// <summary>
/// 获取成员元数据的Description特性描述信息。
/// </summary>

21
aspnet-core/frameworks/src/Lion.AbpPro.Core/System/Reflection/PropertyInfoExtensions.cs

@ -1,21 +0,0 @@
namespace System.Reflection;
/// <summary>
/// 属性<see cref="MethodInfo"/>的扩展辅助操作方法
/// </summary>
public static class PropertyInfoExtensions
{
/// <summary>
/// 返回当前属性信息是否为virtual
/// </summary>
public static bool IsVirtual(this PropertyInfo property)
{
var accessor = property.GetAccessors().FirstOrDefault();
if (accessor == null)
{
return false;
}
return accessor.IsVirtual && !accessor.IsFinal;
}
}

44
aspnet-core/frameworks/src/Lion.AbpPro.Core/System/Text/StringBuilderExtensions.cs

@ -197,48 +197,4 @@ public static class StringBuilderExtensions
return new string(cs);
}
public static StringBuilder AppendLineWithControlChar(this StringBuilder stringBuilder, StringBuilder sb, string newLine)
{
if (stringBuilder is null) throw new ArgumentNullException();
stringBuilder = AppendWithControlChar(stringBuilder, sb.ToString());
return stringBuilder.Append(newLine);
}
public static StringBuilder AppendLineWithControlChar(this StringBuilder stringBuilder, string str, string newLine)
{
if (stringBuilder is null) throw new ArgumentNullException();
stringBuilder = AppendWithControlChar(stringBuilder, str);
return stringBuilder.Append(newLine);
}
public static StringBuilder AppendWithControlChar(this StringBuilder stringBuilder, StringBuilder sb)
{
if (stringBuilder is null) throw new ArgumentNullException();
return AppendWithControlChar(stringBuilder, sb.ToString());
}
public static StringBuilder AppendWithControlChar(this StringBuilder stringBuilder, string str)
{
if (str.Contains('\b'))
{
foreach (var c in str)
{
if (c == '\b')
{
stringBuilder.Length--;
}
else
{
stringBuilder.Append(c);
}
}
}
else
{
stringBuilder.Append(str);
}
return stringBuilder;
}
}

289
aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/Collections/Generic/CollectionExtensionsTests.cs

@ -3,34 +3,283 @@
public class CollectionExtensionsTests
{
[Fact]
public void AddIfNotExistTest()
public void AddIf_WithFlagTrue_ShouldAddItem()
{
var numbers = new List<int>() { 1, 2, 3 };
numbers.AddIfNotExist(2);
numbers.Count(m => m == 2).ShouldBe(1);
numbers.AddIfNotExist(5);
numbers.Count(m => m == 5).ShouldBe(1);
// Arrange
var collection = new List<int>();
numbers = null;
Should.Throw<ArgumentNullException>(() =>
// Act
collection.AddIf(1, true);
// Assert
collection.ShouldContain(1);
}
[Fact]
public void AddIf_WithFlagFalse_ShouldNotAddItem()
{
// Arrange
var collection = new List<int>();
// Act
collection.AddIf(1, false);
// Assert
collection.ShouldBeEmpty();
}
[Fact]
public void AddIf_WithFuncReturningTrue_ShouldAddItem()
{
// Arrange
var collection = new List<int>();
Func<bool> func = () => true;
// Act
collection.AddIf(1, func);
// Assert
collection.ShouldContain(1);
}
[Fact]
public void AddIf_WithFuncReturningFalse_ShouldNotAddItem()
{
// Arrange
var collection = new List<int>();
Func<bool> func = () => false;
// Act
collection.AddIf(1, func);
// Assert
collection.ShouldBeEmpty();
}
[Fact]
public void AddIf_WithNullCollection_ShouldThrowArgumentNullException()
{
// Arrange
ICollection<int> collection = null;
// Act & Assert
Should.Throw<ArgumentNullException>(() => collection.AddIf(1, true));
}
[Theory]
[InlineData(true, new int[] { 1, 2, 3 }, 4)]
[InlineData(false, new int[] { 1, 2, 3 }, 2)]
public void AddIf_WhenFuncReturnsTrue_AddsValueToCollection(bool exists, IEnumerable<int> existingValues, int valueToAdd)
{
// Arrange
var collection = new List<int>(existingValues);
var func = () => exists ? existingValues.Contains(valueToAdd) : !existingValues.Contains(valueToAdd);
// Act
collection.AddIf(valueToAdd, func);
// Assert
if (exists)
{
collection.ShouldBe(existingValues);
}
else
{
collection.ShouldContain(valueToAdd);
}
}
[Fact]
public void AddIfNotExist_WhenCollectionIsNull_ThrowsArgumentNullException()
{
// Arrange
ICollection<int> collection = null;
var value = 42;
// Act & Assert
Should.Throw<ArgumentNullException>(() => collection.AddIfNotExist(value));
}
[Fact]
public void AddIfNotExist_WhenValueExistsInCollection_AddsNothingToCollection()
{
// Arrange
var collection = new List<int> { 1, 2, 3 };
var valueToAdd = 2;
// Act
collection.AddIfNotExist(valueToAdd);
// Assert
collection.ShouldBe(new[] { 1, 2, 3 });
}
[Fact]
public void AddIfNotExist_WhenValueDoesNotExistInCollection_AddsValueToCollection()
{
// Arrange
var collection = new List<int> { 1, 2, 3 };
var valueToAdd = 4;
// Act
collection.AddIfNotExist(valueToAdd);
// Assert
collection.ShouldBe(new[] { 1, 2, 3, 4 });
}
[Fact]
public void AddIfNotExist_WhenExistFuncIsProvided_UsesExistFuncToDetermineIfValueExists()
{
// Arrange
ICollection<string> collection = new List<string> { "Foo", "Bar" };
var valueToAdd = "baz";
Func<string, bool> existFunc = s => s.StartsWith("b");
// Act
collection.AddIfNotExist(valueToAdd, existFunc);
// Assert
collection.ShouldBe(new[] { "Foo", "Bar", "baz" });
}
[Fact]
public void AddIfNotNull_WhenCollectionIsNull_ThrowsArgumentNullException()
{
// Arrange
ICollection<string> collection = null;
var valueToAdd = "Foo";
// Act & Assert
Should.Throw<ArgumentNullException>(() => collection.AddIfNotNull(valueToAdd));
}
[Fact]
public void AddIfNotNull_WhenValueIsNull_DoesNotAddValueToCollection()
{
// Arrange
var collection = new List<string>();
string valueToAdd = null;
// Act
collection.AddIfNotNull(valueToAdd);
// Assert
collection.ShouldBeEmpty();
}
[Fact]
public void AddIfNotNull_WhenValueIsNotNull_AddsValueToCollection()
{
// Arrange
var collection = new List<string>();
var valueToAdd = "Foo";
// Act
collection.AddIfNotNull(valueToAdd);
// Assert
collection.ShouldBe(new[] { "Foo" });
}
[Fact]
public void GetOrAdd_Should_Return_Existing_Item()
{
// arrange
var collection = new List<string> { "existing item" };
var factory = new FakeFactory();
// act
var result = collection.GetOrAdd(item => item == "existing item", factory.Create);
// assert
result.ShouldBe("existing item");
collection.Count.ShouldBe(1);
}
[Fact]
public void GetOrAdd_Should_Add_New_Item()
{
// arrange
var collection = new List<string>();
var factory = new FakeFactory();
// act
var result = collection.GetOrAdd(item => item == "new item", factory.Create);
// assert
result.ShouldBe("new item");
collection.ShouldContain(result);
}
[Fact]
public void IsContinuous_WithNull_ReturnsFalse()
{
// Arrange
List<int> numList = null;
// Act
bool result = numList.IsContinuous();
// Assert
result.ShouldBeFalse();
}
[Fact]
public void IsContinuous_WithEmptyList_ReturnsFalse()
{
// Arrange
List<int> numList = new List<int>();
// Act
bool result = numList.IsContinuous();
// Assert
result.ShouldBeFalse();
}
[Fact]
public void IsContinuous_WithNonSequentialNumbers_ReturnsFalse()
{
// Arrange
List<int> numList = new List<int> { 1, 3, 5, 7 };
// Act
bool result = numList.IsContinuous();
// Assert
result.ShouldBeFalse();
}
[Fact]
public void IsContinuous_WithSequentialNumbers_ReturnsTrue()
{
numbers.AddIfNotExist(3);
});
// Arrange
List<int> numList = new List<int> { 1, 2, 3, 4, 5 };
// Act
bool result = numList.IsContinuous();
// Assert
result.ShouldBeTrue();
}
[Fact]
public void AddIfNotNullTest()
public void IsContinuous_WithReverseSequentialNumbers_ReturnsTrue()
{
var strings = new List<string>() { "abc", "bcd", "cde" };
strings.AddIfNotNull(null);
strings.Count.ShouldBe(3);
strings.AddIfNotNull("abc");
strings.Count.ShouldBe(4);
// Arrange
List<int> numList = new List<int> { 5, 4, 3, 2, 1 };
// Act
bool result = numList.IsContinuous();
// Assert
result.ShouldBeTrue();
}
strings = null;
Should.Throw<ArgumentNullException>(() =>
private class FakeFactory
{
strings.AddIfNotNull("abc");
});
public string Create() => "new item";
}
}

62
aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/DateTimeExtensionsTests.cs

@ -3,40 +3,56 @@
public class DateTimeExtensionsTests
{
[Fact]
public void IsWeekendTest()
public void IsWeekend_ReturnsTrueForWeekends()
{
var dt = new DateTime(2021, 4, 24);
dt.IsWeekend().ShouldBeTrue();
dt = new DateTime(2021, 4, 25);
dt.IsWeekend().ShouldBeTrue();
for (var i = 1; i <= 5; i++)
{
dt = new DateTime(2021, 4, 25 + i);
dt.IsWeekend().ShouldBeFalse();
}
new DateTime(2021, 9, 11).IsWeekend().ShouldBeTrue(); // Saturday
new DateTime(2021, 9, 12).IsWeekend().ShouldBeTrue(); // Sunday
}
[Fact]
public void IsWeekdayTest()
public void IsWeekend_ReturnsFalseForWeekdays()
{
var dt = new DateTime(2021, 4, 24);
dt.IsWeekday().ShouldBeFalse();
dt = new DateTime(2021, 4, 25);
dt.IsWeekday().ShouldBeFalse();
for (var i = 1; i <= 5; i++)
new DateTime(2021, 9, 13).IsWeekend().ShouldBeFalse(); // Monday
new DateTime(2021, 9, 14).IsWeekend().ShouldBeFalse(); // Tuesday
new DateTime(2021, 9, 15).IsWeekend().ShouldBeFalse(); // Wednesday
new DateTime(2021, 9, 16).IsWeekend().ShouldBeFalse(); // Thursday
new DateTime(2021, 9, 17).IsWeekend().ShouldBeFalse(); // Friday
}
[Fact]
public void ToCurrentDateMinDateTime_ReturnsExpectedValue()
{
dt = new DateTime(2021, 4, 25 + i);
dt.IsWeekday().ShouldBeTrue();
var dateTime = new DateTime(2021, 9, 10, 11, 22, 33, 123);
dateTime.ToCurrentDateMinDateTime().ShouldBe(new DateTime(2021, 9, 10, 0, 0, 0));
}
[Fact]
public void ToUnixTimeSeconds_ReturnsExpectedValue()
{
// Arrange
var dateTime = new DateTime(2021, 9, 15, 12, 34, 56);
// Act
var timeStamp = dateTime.ToUnixTimeSeconds();
// Assert
timeStamp.ToLocalTimeDateBySeconds().ShouldBe(dateTime);
}
[Fact]
public void ToUniqueStringTest()
public void ToUnixTimeMilliseconds_ReturnsExpectedValue()
{
var dt = new DateTime(2021, 4, 24,21,30,23);
dt.ToUniqueString().ShouldBe("202111477423");
dt = dt.AddMilliseconds(-1);
dt.ToUniqueString(true).ShouldBe("202111477422999");
// Arrange
var dateTime = new DateTime(2021, 9, 15, 12, 34, 56);
// Act
var timeStamp = dateTime.ToUnixTimeMilliseconds();
// Assert
timeStamp.Value.ToLocalTimeDateByMilliseconds().ShouldBe(dateTime);
}
[Fact]

82
aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/ExceptionExtensionsTests.cs

@ -0,0 +1,82 @@
using System.Text;
namespace System;
public class ExceptionExtensionsTests
{
[Fact]
public void FormatMessage_ReturnsFormattedString()
{
// Arrange
var exception = new Exception("Test exception");
exception.Data["CustomData"] = "Custom value";
var isHideStackTrace = false;
var expectedMessage = new StringBuilder()
.AppendLine("异常消息:Test exception")
.AppendLine("异常类型:System.Exception")
.AppendLine("异常方法:")
.AppendLine("异常源:")
.AppendLine("异常堆栈: at YourNamespace.Tests.ExceptionExtensionsTests.FormatMessage_ReturnsFormattedString()")
.AppendLine("内部异常:")
.ToString();
// Act
var result = exception.FormatMessage(isHideStackTrace);
// Assert
result.ShouldBe(expectedMessage);
}
// [Fact]
// public void ReThrow_RethrowsException()
// {
// // Arrange
// var originalException = new Exception("Original exception");
//
// // Act & Assert
// Should.Throw<Exception>(() => originalException.ReThrow());
// }
//
[Fact]
public void ThrowIf_ThrowsExceptionIfConditionIsTrue()
{
// Arrange
var exception = new InvalidOperationException("Test exception");
var isThrow = true;
// Act & Assert
Should.Throw<InvalidOperationException>(() => exception.ThrowIf(isThrow));
}
[Fact]
public void ThrowIf_DoesNotThrowExceptionIfConditionIsFalse()
{
// Arrange
var exception = new InvalidOperationException("Test exception");
var isThrow = false;
// Act & Assert
exception.ThrowIf(isThrow); // Should not throw an exception
}
[Fact]
public void ThrowIf_ThrowsExceptionIfConditionFunctionIsTrue()
{
// Arrange
var exception = new InvalidOperationException("Test exception");
// Act & Assert
Should.Throw<InvalidOperationException>(() => exception.ThrowIf(() => true));
}
[Fact]
public void ThrowIf_DoesNotThrowExceptionIfConditionFunctionIsFalse()
{
// Arrange
var exception = new InvalidOperationException("Test exception");
// Act & Assert
exception.ThrowIf(() => false); // Should not throw an exception
}
}

58
aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/Reflection/MemberInfoExtensionsTests.cs

@ -0,0 +1,58 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace System.Reflection;
public class MemberInfoExtensionsTests
{
private class TestClass
{
[Description("Test property")]
public string TestProperty { get; set; }
[DisplayName("Test method")]
public void TestMethod() {}
[Display(Name = "Test field")]
public int TestField;
}
[Fact]
public void GetDescription_ReturnsDescriptionAttribute_WhenExists()
{
// Arrange
var memberInfo = typeof(TestClass).GetProperty(nameof(TestClass.TestProperty));
// Act
var result = memberInfo.GetDescription();
// Assert
result.ShouldBe("Test property");
}
[Fact]
public void GetDescription_ReturnsDisplayNameAttribute_WhenDescriptionAttributeNotExists()
{
// Arrange
var memberInfo = typeof(TestClass).GetMethod(nameof(TestClass.TestMethod));
// Act
var result = memberInfo.GetDescription();
// Assert
result.ShouldBe("Test method");
}
[Fact]
public void GetDescription_ReturnsDisplayAttribute_WhenBothDescriptionAndDisplayNameAttributesNotExists()
{
// Arrange
var memberInfo = typeof(TestClass).GetField(nameof(TestClass.TestField));
// Act
var result = memberInfo.GetDescription();
// Assert
result.ShouldBe("Test field");
}
}

87
aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/Reflection/MethodInfoExtensionsTests.cs

@ -0,0 +1,87 @@
namespace System.Reflection;
public class MethodInfoExtensionsTests
{
private abstract class BaseClass
{
public virtual void Method1() {}
public virtual async Task<int> Method2Async() { await Task.Delay(1); return 42; }
public void Method3() {}
}
private class DerivedClass : BaseClass
{
public override void Method1() {}
public override async Task<int> Method2Async() { await Task.Delay(1); return 43; }
public new void Method3() {}
}
[Fact]
public void IsAsync_ReturnsFalse_WhenReturnTypeIsNotTask()
{
// Arrange
var methodInfo = typeof(BaseClass).GetMethod(nameof(BaseClass.Method1));
// Act
var result = methodInfo.IsAsync();
// Assert
result.ShouldBeFalse();
}
[Fact]
public void IsAsync_ReturnsTrue_WhenReturnTypeIsTaskOfT()
{
// Arrange
var methodInfo = typeof(BaseClass).GetMethod(nameof(BaseClass.Method2Async));
// Act
var result = methodInfo.IsAsync();
// Assert
result.ShouldBeTrue();
}
[Fact]
public void IsOverridden_ReturnsFalse_WhenMethodIsNotOverridden()
{
// Arrange
var methodInfo = typeof(BaseClass).GetMethod(nameof(BaseClass.Method3));
// Act
var result = methodInfo.IsOverridden();
// Assert
result.ShouldBeFalse();
}
[Fact]
public void IsOverridden_ReturnsTrue_WhenMethodIsOverridden()
{
// Arrange
var methodInfo = typeof(DerivedClass).GetMethod(nameof(DerivedClass.Method1));
// Act
var result = methodInfo.IsOverridden();
// Assert
result.ShouldBeTrue();
}
[Fact]
public void IsOverridden_ReturnsFalse_WhenMethodIsHiddenByNew()
{
// Arrange
var methodInfo = typeof(DerivedClass).GetMethod(nameof(DerivedClass.Method3));
// Act
var result = methodInfo.IsOverridden();
// Assert
result.ShouldBeFalse();
}
}

101
aspnet-core/frameworks/test/Lion.AbpPro.Core.Tests/System/Text/StringBuilderExtensionsTest.cs

@ -1,58 +1,91 @@
namespace System.Text;
public class StringBuilderExtensionsTest
namespace System.Text
{
public class StringBuilderExtensionsTest
{
[Fact]
public void TrimTest()
public void TrimStart_RemovesLeadingWhitespace()
{
var sb = new StringBuilder(" hello world ");
sb.Trim().ToString().ShouldBe("hello world");
var sb = new StringBuilder(" hello");
sb.TrimStart();
sb.ToString().ShouldBe("hello");
}
[Fact]
public void TrimStartTest()
public void TrimStart_RemovesLeadingChar()
{
var sb = new StringBuilder();
sb.TrimStart('a').ToString().ShouldBe(string.Empty);
sb.Append("asdfgef");
sb.TrimStart('a').ToString().ShouldBe("sdfgef");
sb.Insert(0, " ");
sb.TrimStart().ToString().ShouldBe("sdfgef");
sb.TrimStart("sdf").ToString().ShouldBe("gef");
sb.TrimStart("gef").ToString().ShouldBe(string.Empty);
var sb = new StringBuilder("***hello");
sb.TrimStart('*');
sb.ToString().ShouldBe("hello");
}
[Fact]
public void TrimEndTest()
public void TrimStart_RemovesLeadingChars()
{
var sb = new StringBuilder("asdfgef");
var sb = new StringBuilder("###hello");
sb.TrimStart(new char[] { '#' });
sb.ToString().ShouldBe("hello");
}
sb.TrimEnd((string)null).ToString().ShouldBe("asdfgef");
[Fact]
public void TrimStart_RemovesLeadingString()
{
var sb = new StringBuilder("world of warcraft");
sb.TrimStart("world of");
sb.ToString().ShouldBe(" warcraft");
}
sb.TrimEnd('a').ToString().ShouldBe("asdfgef");
[Fact]
public void TrimEnd_RemovesTrailingWhitespace()
{
var sb = new StringBuilder("world ");
sb.TrimEnd();
sb.ToString().ShouldBe("world");
}
sb.TrimEnd('f').ToString().ShouldBe("asdfge");
[Fact]
public void TrimEnd_RemovesTrailingChar()
{
var sb = new StringBuilder("hello***");
sb.TrimEnd('*');
sb.ToString().ShouldBe("hello");
}
sb.Append(" ");
sb.TrimEnd().ToString().ShouldBe("asdfge");
[Fact]
public void TrimEnd_RemovesTrailingChars()
{
var sb = new StringBuilder("hello###");
sb.TrimEnd(new char[] { '#' });
sb.ToString().ShouldBe("hello");
}
sb.TrimEnd(new[] { 'g', 'e' }).ToString().ShouldBe("asdf");
sb.TrimEnd("asdf").ToString().ShouldBe(string.Empty);
[Fact]
public void TrimEnd_RemovesTrailingString()
{
var sb = new StringBuilder("world of warcraft");
sb.TrimEnd("of warcraft");
sb.ToString().ShouldBe("world ");
}
[Fact]
public void SubStringTest()
public void Trim_RemovesLeadingAndTrailingWhitespace()
{
var sb = new StringBuilder("asdfgef");
Should.Throw<ArgumentOutOfRangeException>(() =>
var sb = new StringBuilder(" foo ");
sb.Trim();
sb.ToString().ShouldBe("foo");
}
[Fact]
public void Substring_ReturnsSubstringWithCorrectLength()
{
sb.SubString(0, 8);
});
sb.SubString(0, 3).ToString().ShouldBe("asd");
var sb = new StringBuilder("abcdefg");
sb.SubString(1, 3).ShouldBe("bcd");
}
[Fact]
public void Substring_ThrowsExceptionWhenStartPlusLengthIsGreaterThanLength()
{
var sb = new StringBuilder("abcdefg");
Should.Throw<ArgumentOutOfRangeException>(() => sb.SubString(2, 6));
}
}
}

3
aspnet-core/frameworks/test/Lion.AbpPro.EntityFrameworkCore.Mysql.Tests/Entities/Blogs/IBlogsRepository.cs

@ -1,7 +1,6 @@
using Lion.AbpPro.EntityFrameworkCore.Tests.Entities.Blogs;
using Volo.Abp.Domain.Repositories;
namespace Lion.AbpPro.EntityFrameworkCore.Tests.Blogs;
namespace Lion.AbpPro.EntityFrameworkCore.Tests.Entities.Blogs;
public interface IBlogRepository : IBasicRepository<Blog, Guid>
{

Loading…
Cancel
Save