-
Notifications
You must be signed in to change notification settings - Fork 306
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Сазонов Александр #237
base: master
Are you sure you want to change the base?
Сазонов Александр #237
Conversation
cs/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs
Outdated
Show resolved
Hide resolved
cs/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs
Outdated
Show resolved
Hide resolved
cs/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterShould.cs
Outdated
Show resolved
Hide resolved
cs/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterShould.cs
Outdated
Show resolved
Hide resolved
cs/TagsCloudVisualization/TagsCloudVisualization/PointExtensionShould.cs
Outdated
Show resolved
Hide resolved
cs/TagsCloudVisualization/TagsCloudVisualization/PointGenerator.cs
Outdated
Show resolved
Hide resolved
cs/TagsCloudVisualization/TagsCloudVisualization/PointGenerator.cs
Outdated
Show resolved
Hide resolved
cs/TagsCloudVisualization/TagsCloudVisualization/PointGenerator.cs
Outdated
Show resolved
Hide resolved
for (var i = 1; i <= stepCount; i++) | ||
{ | ||
var currPoint = _defaultPointGenerator.GetNewPoint(); | ||
if (i % stepToCheck == 0) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А почему именно 100 шаг? Пока не понимаю, что проверяет этот тест в таких органичениях
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я все еще не понимаю, зачем конструкция if (i % radiusCheckPeriod != 0) continue;
)
cs/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterShould.cs
Outdated
Show resolved
Hide resolved
var width = maxX - minX; | ||
var height = maxY - minY; | ||
|
||
return width / height; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А можешь рассказать логику этого теста? Как он проверяет, что итоговые прямогольники похожи на круг
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Там была идея, что круг может быть вписан в квадрат, а у квадрата соотношение сторон единица. Тест переписал на другую логику
|
||
var circleSquare = Math.PI * radius * radius; | ||
var density = fullSquare / circleSquare; | ||
density.Should().BeGreaterThan(0.4); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
И про логику этого теста интересно послушать)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Убрал этот тест и написал новый с другой логикой=)
cs/TagsCloudVisualization/TagsCloudVisualization/PointGenerator.cs
Outdated
Show resolved
Hide resolved
for (var i = 1; i <= stepCount; i++) | ||
{ | ||
var currPoint = _defaultPointGenerator.GetNewPoint(); | ||
if (i % stepToCheck == 0) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я все еще не понимаю, зачем конструкция if (i % radiusCheckPeriod != 0) continue;
)
{ | ||
const int rectangleOutline = 1; | ||
|
||
var bitmap = new Bitmap( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Замечание не поправлено
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Атрибут - решение, но костыльное
Правильное решение <TargetFramework>net8.0-windows</TargetFramework>
, т.к. если есть виндо-зависимый код, то стоит собирать его явно
|
||
private static Color GetRandomColor() | ||
{ | ||
var knownColors = (KnownColor[])Enum.GetValues(typeof(KnownColor)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно ли как-нибудь сократить количество вычисления этого постоянного числа knownColors
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Исправление корректное
А как сократить в случае старого кода?)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Вынести за пределы метода, сделать статичным полем класса
|
||
namespace TagsCloudVisualization; | ||
|
||
public class TagCloud(ICloudLayouter? layouter) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Выглядит слегка как еще одна реализация ICloudLayouter
. А может и нет
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Этот класс служит по факту для хранения размеров лейаута любого вида (если он реализует ICloudLayouter)
{ | ||
var largestSide = _random.Next(100, 200); | ||
var rectangleSizes = GetSizes(_random.Next(5, 10), largestSide); | ||
var radii = new List<double>(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Что такое radii
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
гугл сказал, что это множественное число от radius=)
@@ -0,0 +1,121 @@ | |||
using FluentAssertions; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Переписал тесты. В новых коммитах:
тест PutNextRectangle_ReturnRectanglesInCircle_AfterManyExecution проверяет, что сумма площади всех прямоугольников примерно равна площади окружности, в которой прямоугольники находятся. А также, что расстояние от каждого прямоугольника до центра лейаута меньше, чем радиус окружности. Этот тест говорит о том, что форма облака - окружность, а также, что облако максимально плотное.
тест PutNextRectangle_ReturnRectangleThatNotIntersectsWithOther_AfterManyExecution проверяет, что каждый из прямоугольников на лейауте не пересекается со всеми остальными прямоугольниками, кроме себя самого.
namespace TagsCloudTests; | ||
|
||
[TestFixture] | ||
[Parallelizable(scope: ParallelScope.All)] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А можно ли этот атрибут применить на всю сборку? Чтобы на каждый класс не вешать его
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
да, если использовать наследование, где базовый класс будет иметь все необходимые нам атрибуты
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А еще варианты? Можем в шарпе есть решение?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно через таски. Условно сделать массив тасок со всеми тестами и запустить их параллельно
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно через атрибут на всю сборку - [assembly: Parallelizable(ParallelScope.Children)]
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Атрибут - ок) Также могу порекомендовать такие глобальные штуки выносить в самостоятельные файлы, т.к. они не принадлежат конкретному файлу с тестами, а всем)
var circleSquare = circleRadius * circleRadius * Math.PI; | ||
var precision = circleSquare * 0.475; | ||
|
||
circleSquare.Should().BeApproximately(sumRectanglesSquare, precision); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Для множественного should
нужно использовать враппинг AssertionScope
, чтобы проверял все-все. Потому что если один из них упадет, тест закончится
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А еще можно опустить вложенность) и будет читать вообще легко
resolved
|
||
circleSquare.Should().BeApproximately(sumRectanglesSquare, precision); | ||
foreach (var distanceToCenter in fromRectangleToCenterDistances) | ||
distanceToCenter.Should().BeLessOrEqualTo(circleRadius + 2); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Почему + 2
? Может ли тест перестать работать без единого исправления в нем?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Проверил. Тест падал примерно один раз на несколько тысяч.
Переделал расчет радиуса окружности, теперь нету +2. И увеличил нижнюю планку в рандоме количества прямоугольников, что помогло снизить коэффициент аппроксимации. Тест больше не падает.
@dmitgaranin
Изначально начал пилить кастомные классы, но потом обнаружил библиотеку System.Drawing. Все коммиты с кастомными классами оставил в отдельной ветке