Skip to content
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

Open
wants to merge 52 commits into
base: master
Choose a base branch
from

Conversation

AlexxSaz
Copy link

@dmitgaranin

Изначально начал пилить кастомные классы, но потом обнаружил библиотеку System.Drawing. Все коммиты с кастомными классами оставил в отдельной ветке

cs/TagsCloudVisualization/TagsCloudVisualization.sln Outdated Show resolved Hide resolved
for (var i = 1; i <= stepCount; i++)
{
var currPoint = _defaultPointGenerator.GetNewPoint();
if (i % stepToCheck == 0)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А почему именно 100 шаг? Пока не понимаю, что проверяет этот тест в таких органичениях

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/CircularCloudLayouterShould.cs Outdated Show resolved Hide resolved
cs/TagsCloudVisualization/CircularCloudLayouterShould.cs Outdated Show resolved Hide resolved
cs/TagsCloudVisualization/CircularCloudLayouterShould.cs Outdated Show resolved Hide resolved
var width = maxX - minX;
var height = maxY - minY;

return width / height;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А можешь рассказать логику этого теста? Как он проверяет, что итоговые прямогольники похожи на круг

Copy link
Author

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);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И про логику этого теста интересно послушать)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Убрал этот тест и написал новый с другой логикой=)

cs/TagsCloudVisualization/PointGenerator.cs Outdated Show resolved Hide resolved
cs/TagsCloudVisualization/PointGeneratorShould.cs Outdated Show resolved Hide resolved
for (var i = 1; i <= stepCount; i++)
{
var currPoint = _defaultPointGenerator.GetNewPoint();
if (i % stepToCheck == 0)

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/CircularCloudLayouter.cs Outdated Show resolved Hide resolved
cs/TagsCloudVisualization/CircularCloudLayouter.cs Outdated Show resolved Hide resolved
{
const int rectangleOutline = 1;

var bitmap = new Bitmap(

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему-то почти все строчки в этом файле подсвечиваются
image

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Замечание не поправлено

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));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно ли как-нибудь сократить количество вычисления этого постоянного числа knownColors?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправление корректное
А как сократить в случае старого кода?)

Copy link
Author

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)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Выглядит слегка как еще одна реализация ICloudLayouter. А может и нет

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Этот класс служит по факту для хранения размеров лейаута любого вида (если он реализует ICloudLayouter)

cs/TagsCloudTests/CloudLayouterShould.cs Outdated Show resolved Hide resolved
{
var largestSide = _random.Next(100, 200);
var rectangleSizes = GetSizes(_random.Next(5, 10), largestSide);
var radii = new List<double>();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Что такое radii?

Copy link
Author

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;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не нашел тестов на :
image

Если такие есть, отпиши в этом комменте их названия и логику работы. Потому что те, что я нашел, как будто не проверяют все эти требования

Copy link
Author

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)]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А можно ли этот атрибут применить на всю сборку? Чтобы на каждый класс не вешать его

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да, если использовать наследование, где базовый класс будет иметь все необходимые нам атрибуты

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А еще варианты? Можем в шарпе есть решение?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно через таски. Условно сделать массив тасок со всеми тестами и запустить их параллельно

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно через атрибут на всю сборку - [assembly: Parallelizable(ParallelScope.Children)]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Атрибут - ок) Также могу порекомендовать такие глобальные штуки выносить в самостоятельные файлы, т.к. они не принадлежат конкретному файлу с тестами, а всем)

cs/TagsCloudTests/TagCloudCreatorShould.cs Show resolved Hide resolved
var circleSquare = circleRadius * circleRadius * Math.PI;
var precision = circleSquare * 0.475;

circleSquare.Should().BeApproximately(sumRectanglesSquare, precision);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для множественного should нужно использовать враппинг AssertionScope, чтобы проверял все-все. Потому что если один из них упадет, тест закончится

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);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему + 2? Может ли тест перестать работать без единого исправления в нем?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Проверил. Тест падал примерно один раз на несколько тысяч.

Переделал расчет радиуса окружности, теперь нету +2. И увеличил нижнюю планку в рандоме количества прямоугольников, что помогло снизить коэффициент аппроксимации. Тест больше не падает.

cs/TagsCloudTests/PointExtensionShould.cs Outdated Show resolved Hide resolved
cs/TagsCloudTests/PointGeneratorShould.cs Outdated Show resolved Hide resolved
cs/TagsCloudTests/TagsCloudTests.csproj Outdated Show resolved Hide resolved
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants