Skip to content

Commit 08eb43e

Browse files
committed
Исправление проблем после миграции на новую версию платформы
1 parent 106af53 commit 08eb43e

36 files changed

+1919
-1103
lines changed

.github/copilot-instructions.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Всегда отвечай мне используя русский язык.
2+
Всегда пиши комментарии в коде на русском языке.
3+
Комментарии к классам, структурам делегатам и перечислениям, а также к их членам всегда пиши в xml-виде.
4+
При написании комментариев (ели они короткие) в коде предпочитай размещение комментария в конце той же строке, что и сам комментируемый код.
5+
xml-комментарий, если он состоит из одного предложения, пиши в одной строке с открывающим и закрывающим тегом.
6+
xml-комментарий, если он состоит из одного предложения, не ставь в конце точку.
7+
Каждый элемент xml-комментария пиши в отдельной строке.
8+
Старайся избегать тривиальных комментариев.
9+
При герерации кода старайся минимизировать количество фигурных скобок.
10+
При генерации кода используй самые современные виды синтаксических конструкций языка.
11+
Всегда старайся минимизировтаь размер кода если не запрошено иное.
12+
Используй стиль именования локальных переменных snake_case.
13+
Используй стиль именования входных переменных методов PascalCase.
14+
Используй стиль именования полей классов _PascalCase для нестатических переменных и __PascalCase для статических переменных.
15+
Ппредпочитай английский язык при именовании переменных, методов, классов и прочих сущностей.
16+
При инициализации массивов, списков и словарей используй выражения инициализации массивов.
17+
При объявлении переменных предпочитай использовать ключевое слово var.
18+
При написании системных комментариев старайся писать их компактно в одну строку, если длина текста небольшая.

MathCore.TestsExtensions.sln

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 17
4-
VisualStudioVersion = 17.4.33103.184
3+
# Visual Studio Version 18
4+
VisualStudioVersion = 18.0.11205.157 d18.0
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MathCore.TestsExtensions", "MathCore.TestsExtensions\MathCore.TestsExtensions.csproj", "{0F039156-E6CB-4EFB-A863-13A1AC2DD4AE}"
77
EndProject
88
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MathCore.TestsExtensions.Tests", "Tests\MathCore.TestsExtensions.Tests\MathCore.TestsExtensions.Tests.csproj", "{10093BD2-D872-4383-B075-92850E009647}"
99
EndProject
10+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Service", ".Service", "{29B29638-89EC-4383-B587-AE8C981DED4F}"
11+
ProjectSection(SolutionItems) = preProject
12+
.github\copilot-instructions.md = .github\copilot-instructions.md
13+
EndProjectSection
14+
EndProject
15+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{D6A23A02-D860-4101-AB7B-0C7FB57331CB}"
16+
ProjectSection(SolutionItems) = preProject
17+
.github\copilot-instructions.md = .github\copilot-instructions.md
18+
EndProjectSection
19+
EndProject
20+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{83B95A2F-1D99-43CB-BA0C-769D88078D6F}"
21+
EndProject
1022
Global
1123
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1224
Debug|Any CPU = Debug|Any CPU
@@ -25,6 +37,10 @@ Global
2537
GlobalSection(SolutionProperties) = preSolution
2638
HideSolutionNode = FALSE
2739
EndGlobalSection
40+
GlobalSection(NestedProjects) = preSolution
41+
{D6A23A02-D860-4101-AB7B-0C7FB57331CB} = {29B29638-89EC-4383-B587-AE8C981DED4F}
42+
{83B95A2F-1D99-43CB-BA0C-769D88078D6F} = {D6A23A02-D860-4101-AB7B-0C7FB57331CB}
43+
EndGlobalSection
2844
GlobalSection(ExtensibilityGlobals) = postSolution
2945
SolutionGuid = {5C7C0D00-B422-4B19-B6D4-19B55F78389C}
3046
EndGlobalSection

MathCore.TestsExtensions/Accuracy.cs

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,73 @@
11
namespace Microsoft.VisualStudio.TestTools.UnitTesting;
22

3+
/// <summary>Утилиты для создания сравнителей точности и пользовательских сравнителей/проверок равенства</summary>
34
public static class Accuracy
45
{
6+
/// <summary>Создаёт сравнитель чисел типа <see cref="double"/> с заданной абсолютной точностью</summary>
7+
/// <param name="eps">Допустимое отклонение (ε). Должно быть неотрицательным и не NaN</param>
8+
/// <returns>Экземпляр <see cref="IEqualityComparer{Double}"/> и <see cref="IComparer{Double}"/></returns>
9+
/// <exception cref="ArgumentOutOfRangeException">Если <paramref name="eps"/> &lt; 0</exception>
10+
/// <exception cref="ArgumentException">Если <paramref name="eps"/> равен <see cref="double.NaN"/></exception>
511
public static IEqualityComparer<double> Eps(double eps) => new AccuracyComparer(eps);
12+
13+
/// <summary>Создаёт сравнитель целых чисел типа <see cref="int"/> с заданной абсолютной точностью</summary>
14+
/// <param name="eps">Допустимое отклонение (ε). Должно быть неотрицательным</param>
15+
/// <returns>Экземпляр <see cref="IEqualityComparer{Int32}"/> и <see cref="IComparer{Int32}"/></returns>
16+
/// <exception cref="ArgumentOutOfRangeException">Если <paramref name="eps"/> &lt; 0</exception>
617
public static IEqualityComparer<int> Eps(int eps) => new AccuracyComparer(eps);
718

8-
public static IEqualityComparer<T> Equals<T>(Func<T, T, bool> Comparer, Func<T, int> Hasher) => new AccuracyEqualityComparer<T>(Comparer, Hasher);
9-
public static IComparer<T> Compare<T>(Comparison<T> Comparer) => new AccuracyComparer<T>(Comparer);
19+
/// <summary>Создаёт универсальный сравнитель равенства на основе делегатов</summary>
20+
/// <typeparam name="T">Тип сравниваемых объектов</typeparam>
21+
/// <param name="Comparer">Делегат, выполняющий проверку равенства</param>
22+
/// <param name="Hasher">Делегат, вычисляющий хеш-код</param>
23+
/// <returns><see cref="IEqualityComparer{T}"/> использующий предоставленные делегаты</returns>
24+
/// <exception cref="ArgumentNullException">Если один из делегатов равен null</exception>
25+
public static IEqualityComparer<T> Equals<T>(Func<T, T, bool> Comparer, Func<T, int> Hasher) =>
26+
new AccuracyEqualityComparer<T>(Comparer ?? throw new ArgumentNullException(nameof(Comparer)),
27+
Hasher ?? throw new ArgumentNullException(nameof(Hasher)));
28+
29+
/// <summary>Создаёт универсальный сравнитель порядка на основе делегата <see cref="Comparison{T}"/></summary>
30+
/// <typeparam name="T">Тип сравниваемых объектов</typeparam>
31+
/// <param name="Comparer">Делегат сравнения</param>
32+
/// <returns><see cref="IComparer{T}"/> использующий предоставленный делегат</returns>
33+
/// <exception cref="ArgumentNullException">Если <paramref name="Comparer"/> равен null</exception>
34+
public static IComparer<T> Compare<T>(Comparison<T> Comparer) =>
35+
new AccuracyComparer<T>(Comparer ?? throw new ArgumentNullException(nameof(Comparer)));
1036
}
1137

38+
/// <summary>Сравнитель значений типов <see cref="double"/> и <see cref="int"/> с учётом допустимой абсолютной погрешности</summary>
39+
/// <remarks>
40+
/// Для чисел с плавающей точкой равенство определяется условием |x - y| ≤ ε.
41+
/// Для операций хеширования используется нормализация по шагу ε (округление к сетке).
42+
/// </remarks>
43+
/// <param name="Eps">Допустимое отклонение (ε). Должно быть неотрицательным</param>
1244
public readonly struct AccuracyComparer(double Eps) :
1345
IEqualityComparer<double>, IComparer<double>,
1446
IEqualityComparer<int>, IComparer<int>
1547
{
48+
/// <summary>Допустимое абсолютное отклонение</summary>
1649
private double Eps { get; init; } = Eps switch
1750
{
1851
< 0 => throw new ArgumentOutOfRangeException(nameof(Eps), Eps, "Значение точности не должно быть меньше нуля"),
1952
double.NaN => throw new ArgumentException("Значение точности не должно быть NaN", nameof(Eps)),
2053
_ => Eps
2154
};
2255

56+
/// <summary>Проверяет равенство двух значений <see cref="double"/> с учётом точности</summary>
2357
public bool Equals(double x, double y) => Math.Abs(x - y) <= Eps;
2458

25-
public int GetHashCode(double x) => x is double.NaN
26-
? x.GetHashCode()
59+
/// <summary>Вычисляет хеш-код для значения <see cref="double"/>, нормализуя его относительно точности</summary>
60+
/// <param name="x">Значение</param>
61+
/// <returns>Хеш-код</returns>
62+
public int GetHashCode(double x) => x is double.NaN
63+
? x.GetHashCode()
2764
: (Math.Round(x * Eps) / Eps).GetHashCode();
2865

66+
/// <summary>Сравнивает два значения <see cref="double"/> с учётом допустимой погрешности</summary>
67+
/// <param name="x">Первое значение</param>
68+
/// <param name="y">Второе значение</param>
69+
/// <returns>0 если считаются равными; -1 или 1 в зависимости от знака разности</returns>
70+
/// <exception cref="InvalidOperationException">Если одно из значений равно <see cref="double.NaN"/></exception>
2971
public int Compare(double x, double y)
3072
{
3173
var delta = x - y;
@@ -38,15 +80,19 @@ public int Compare(double x, double y)
3880
{ nameof(y), y },
3981
}
4082
};
41-
return Math.Abs(delta) <= Eps
42-
? 0
83+
return Math.Abs(delta) <= Eps
84+
? 0
4385
: Math.Sign(delta);
4486
}
4587

88+
/// <summary>Проверяет равенство двух значений <see cref="int"/> с учётом допустимого отклонения</summary>
4689
public bool Equals(int x, int y) => Math.Abs(x - y) <= Eps;
4790

91+
/// <summary>Вычисляет хеш-код для целого значения с учётом нормализации к сетке точности</summary>
4892
public int GetHashCode(int x) => (Math.Round(x * Eps) / Eps).GetHashCode();
4993

94+
/// <summary>Сравнивает два значения <see cref="int"/> с учётом допустимого отклонения</summary>
95+
/// <returns>0 если считаются равными; -1 или 1 в зависимости от знака разности</returns>
5096
public int Compare(int x, int y)
5197
{
5298
var delta = x - y;
@@ -56,14 +102,24 @@ public int Compare(int x, int y)
56102
}
57103
}
58104

105+
/// <summary>Универсальный сравнитель равенства на основе переданных делегатов</summary>
106+
/// <typeparam name="T">Тип сравниваемых объектов</typeparam>
107+
/// <param name="Comparer">Делегат проверки равенства</param>
108+
/// <param name="Hasher">Делегат вычисления хеш-кода</param>
59109
public class AccuracyEqualityComparer<T>(Func<T, T, bool> Comparer, Func<T, int> Hasher) : IEqualityComparer<T>
60110
{
111+
/// <summary>Проверяет равенство двух объектов</summary>
61112
public bool Equals(T x, T y) => Comparer(x, y);
62113

114+
/// <summary>Вычисляет хеш-код объекта</summary>
63115
public int GetHashCode(T obj) => Hasher(obj);
64116
}
65117

118+
/// <summary>Универсальный сравнитель порядка на основе делегата <see cref="Comparison{T}"/></summary>
119+
/// <typeparam name="T">Тип сравниваемых объектов</typeparam>
120+
/// <param name="Comparer">Делегат сравнения</param>
66121
public class AccuracyComparer<T>(Comparison<T> Comparer) : IComparer<T>
67122
{
123+
/// <summary>Сравнивает два значения</summary>
68124
public int Compare(T x, T y) => Comparer(x, y);
69125
}

MathCore.TestsExtensions/Attributes/DataTestMethodIterativeAttribute.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22
// ReSharper disable MemberCanBePrivate.Global
33
// ReSharper disable UnusedAutoPropertyAccessor.Global
44

5+
using System.Runtime.CompilerServices;
6+
57
namespace Microsoft.VisualStudio.TestTools.UnitTesting;
68

79
/// <summary>Итерационное выполнение теста на основе данных с заданием числа итераций для набора статистики</summary>
810
/// <remarks>Инициализация итерационного теста на основе данных</remarks>
911
/// <param name="IterationsCount">Число итераций</param>
1012
[AttributeUsage(AttributeTargets.Method)]
11-
public class DataTestMethodIterativeAttribute(int IterationsCount) : TestMethodAttribute
13+
public class DataTestMethodIterativeAttribute(int IterationsCount, [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = -1)
14+
: TestMethodAttribute(callerFilePath, callerLineNumber)
1215
{
1316
/// <summary>Число итераций повторения теста</summary>
1417
private readonly int _IterationsCount = IterationsCount;
@@ -17,13 +20,13 @@ public class DataTestMethodIterativeAttribute(int IterationsCount) : TestMethodA
1720
public bool StopAtFirstFail { get; set; }
1821

1922
/// <inheritdoc />
20-
public override TestResult[] Execute(ITestMethod TestMethod)
23+
public override async Task<TestResult[]> ExecuteAsync(ITestMethod TestMethod)
2124
{
2225
var results = new List<TestResult>();
2326
var stop_at_first_fail = this.StopAtFirstFail;
2427
for (var count = 0; count < _IterationsCount; count++)
2528
{
26-
var test_results = base.Execute(TestMethod);
29+
var test_results = await base.ExecuteAsync(TestMethod);
2730
results.AddRange(test_results);
2831
if (stop_at_first_fail && test_results.Any(r => r.TestFailureException != null)) break;
2932
}

MathCore.TestsExtensions/Attributes/TestClassHandlerAttribute.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class TestClassHandlerAttribute(string ExceptionHandlerMethod) : TestClas
99

1010
public TestClassHandlerAttribute() : this(null!) { }
1111

12-
public override TestMethodAttribute GetTestMethodAttribute(TestMethodAttribute? Attribute)
12+
public override TestMethodAttribute GetTestMethodAttribute(TestMethodAttribute Attribute)
1313
{
1414
if(ExceptionHandlerMethod is { Length: > 0 } method_name)
1515
if (Attribute is TestMethodHandlerAttribute handler_attribute)
@@ -27,6 +27,6 @@ public override TestMethodAttribute GetTestMethodAttribute(TestMethodAttribute?
2727
HandlePassed = HandlePassed,
2828
};
2929

30-
return base.GetTestMethodAttribute(Attribute)!;
30+
return base.GetTestMethodAttribute(Attribute!)!;
3131
}
3232
}

MathCore.TestsExtensions/Attributes/TestMethodHandlerAttribute.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
using System.Reflection;
2+
using System.Runtime.CompilerServices;
23

34
namespace Microsoft.VisualStudio.TestTools.UnitTesting;
45

56
[AttributeUsage(AttributeTargets.Method)]
6-
public class TestMethodHandlerAttribute(string? ExceptionHandlerMethod, string? DisplayName = null)
7-
: TestMethodAttribute(DisplayName)
7+
public class TestMethodHandlerAttribute(string? ExceptionHandlerMethod, bool HandlePassed = false, [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = -1) : TestMethodAttribute(callerFilePath, callerLineNumber)
88
{
9-
public TestMethodHandlerAttribute() : this(null) { }
9+
public TestMethodHandlerAttribute(bool HandlePassed = false, [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = -1) : this(null, HandlePassed, callerFilePath, callerLineNumber) { }
1010

1111
public string? ExceptionHandlerMethod { get; set; } = ExceptionHandlerMethod;
1212

13-
public bool HandlePassed { get; set; }
13+
public bool HandlePassed { get; set; } = HandlePassed;
1414

15-
public override TestResult[] Execute(ITestMethod Method)
15+
public override async Task<TestResult[]> ExecuteAsync(ITestMethod Method)
1616
{
17+
1718
if (ExceptionHandlerMethod is not { Length: > 0 } handler_method_name)
18-
return base.Execute(Method);
19+
return await base.ExecuteAsync(Method);
1920

2021
var test_class = Method.MethodInfo.DeclaringType ?? throw new InvalidOperationException("Невозможно определить класс модульного теста");
2122

@@ -32,9 +33,9 @@ public override TestResult[] Execute(ITestMethod Method)
3233
test_class.GetMethod(handler_method_name, private_static, null, [test_result_type], null);
3334

3435
if (handler_method_info is null)
35-
return base.Execute(Method);
36+
return await base.ExecuteAsync(Method);
3637

37-
var result = base.Execute(Method);
38+
var result = await base.ExecuteAsync(Method);
3839

3940
var results_to_process = HandlePassed
4041
? result

MathCore.TestsExtensions/Attributes/TestMethodIterativeAttribute.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
namespace Microsoft.VisualStudio.TestTools.UnitTesting;
1+
using System.Runtime.CompilerServices;
2+
3+
namespace Microsoft.VisualStudio.TestTools.UnitTesting;
24

35
/// <summary>Итерационное выполнение теста с заданием числа итераций для набора статистики</summary>
46
/// <remarks>Инициализация итерационного теста</remarks>
57
/// <param name="IterationsCount">Число итераций</param>
68
[AttributeUsage(AttributeTargets.Method)]
7-
public class TestMethodIterativeAttribute(int IterationsCount) : TestMethodAttribute
9+
public class TestMethodIterativeAttribute(int IterationsCount, [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = -1) : TestMethodAttribute(callerFilePath, callerLineNumber)
810
{
911
/// <summary>Число итераций повторения теста</summary>
1012
private readonly int _IterationsCount = IterationsCount;
@@ -13,13 +15,13 @@ public class TestMethodIterativeAttribute(int IterationsCount) : TestMethodAttri
1315
public bool StopAtFirstFail { get; set; }
1416

1517
/// <inheritdoc />
16-
public override TestResult[] Execute(ITestMethod TestMethod)
18+
public override async Task<TestResult[]> ExecuteAsync(ITestMethod TestMethod)
1719
{
1820
var results = new List<TestResult>();
1921
var stop_at_first_fail = StopAtFirstFail;
2022
for (var count = 0; count < _IterationsCount; count++)
2123
{
22-
var test_results = base.Execute(TestMethod);
24+
var test_results = await base.ExecuteAsync(TestMethod);
2325
results.AddRange(test_results);
2426
if (stop_at_first_fail && test_results.Any(r => r.TestFailureException != null)) break;
2527
}

0 commit comments

Comments
 (0)