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

Бабинцев Григорий #244

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

Conversation

qreaqtor
Copy link

@qreaqtor qreaqtor commented Dec 2, 2024

No description provided.

using Markdown.Parser;
using FluentAssertions;

namespace Markdown.Tests

Choose a reason for hiding this comment

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

Этот файл не подключен к проекту. Скорее всего ты нажал удалить в райдере. Но проекты (csproj) лишь исключаются из решения (sln), а файлы физически остаются. Но это была правильная идея для расположения тестов. Тогда здесь были бы файлы MdTetsts, HtmlBuilderTests, MarkdownParserTests


private int shift;

public HtmlBuilder(Dictionary<Tag, string> htmlTagsMarkupDict)

Choose a reason for hiding this comment

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

Предлагаю его спрятать внутрь реализации. В конструктор выносятся внешние зависимости (Singleton) и реализации интерфейсов. В данном случае словарь мапинга больше похож на внутрянку билдера. Но, можно передавать файл настроек и из него подтягивать, если необходимо

foreach (var token in tokens)
{
var htmlMarkup = _htmlTagsMarkupDict[token.TagType];
var tag = token.TagType;

Choose a reason for hiding this comment

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

Всё-таки это tagType ну или textType

var htmlMarkup = _htmlTagsMarkupDict[token.TagType];
var tag = token.TagType;

htmlTags.Add(new HtmlTag(tag, token.StartIndex, false, htmlMarkup));

Choose a reason for hiding this comment

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

У нас уже имеется htmlMarkup, точно нужно сохранять tag?

htmlResultText.Insert(tag.Index + shift, tag.GetMarkup());
}

private int GetMdTagLength(HtmlTag tag)

Choose a reason for hiding this comment

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

Ой какая страшная логика. Сюда будет сложно добавить обработку нового типа. Может добавим в тэг информацию о длине? Тогда сможем сделать маркдаун независимую реализацию генератора.

needClosingTags.Clear();
offsetTags.Clear();

currentIndex = 0;

Choose a reason for hiding this comment

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

А вот здесь и теряются индексы при переносе строк. Достаточно сохранять общий offset до начала текущей строки (не забывая про \n) и тогда ситуация починится


public List<Token> ParseMarkdown(string markdownText)
{
var lines = markdownText.Split('\n');

Choose a reason for hiding this comment

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

Хорошая идея работать с одной и той же строкой, быстро и экономно по памяти. Но здесь концепция нарушается при разбиении на отдельные строки (ещё одна копия входных данных). Думаю, написать на индексах по строке, с проверкой на \n или сразу получить список индексов для всех переносов будет не очень сложно, а выигрыш будет по памяти в два раза

return fountedTokens;
}

private void SearchTokensInLine(string line, List<Token> fountedTokens)

Choose a reason for hiding this comment

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

foundedTokens )

@@ -0,0 +1,2 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

Choose a reason for hiding this comment

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

У тестов не делают Program файл и в целом Main метод, так как точка входа генерируется при сборке фреймворком для тестов

@@ -0,0 +1,2 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

Choose a reason for hiding this comment

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

В Program обычно пишут какой-нибудь базовый код запуска, чтобы не приходилось думать, а где точка входа. Здесь можно написать в сокращённом виде

var builder = new HtmlBuilder(MarkdownConfig.HtmlTags);
var parser = new MarkdownParser(new TagChecker(), MarkdownConfig.DifferentTags, MarkdownConfig.MdTags);
var md = new Md(parser, builder);

var text = File.ReadAllText("Input.md");
File.WriteAllText("Result.html", md.Render(text));

Или по старинке

namespace Markdown;

public static class Program
{
    public static void Main(string[] args)
    {
        var builder = new HtmlBuilder(MarkdownConfig.HtmlTags);
        var parser = new MarkdownParser(new TagChecker(), MarkdownConfig.DifferentTags, MarkdownConfig.MdTags);
        var md = new Md(parser, builder);

        var text = File.ReadAllText("Input.md");
        File.WriteAllText("Result.html", md.Render(text));
    }
}

Но тогда компилятор будет ругаться на несколько точек входа, так как тесты генерируют свой Main код. Для этого их и выносят в отдельный проект

}
}

public static IEnumerable<TestCaseData> TestsWithIntersectionTags

Choose a reason for hiding this comment

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

Не хватает теста на пересечение тегов "H _e __l_ l__ o", "H _e __l_ l__ o"

{
var shift = _mdTags[token.TagType].Length;
var diffTagType = _differentTagTypes[token.TagType];
var anyWhiteSpace = line.Substring(token.StartIndex + 1, token.EndIndex - token.StartIndex - 1).Any(char.IsWhiteSpace);

Choose a reason for hiding this comment

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

Создаёт копию строки. Лучше написать экстеншн, который проверит наличие пробелов через индекс

@@ -0,0 +1,53 @@
using FluentAssertions;

Choose a reason for hiding this comment

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

Есть рекомендация писать отдельные тесты ещё и на каждый из модулей. То есть отдельно проверять, что правильно работает парсер, и отдельно - что правильно генерируется итоговый текст. Помогает понять, в каком месте именно происходит ошибка. Ну и сильно сокращает написание тестов при добавлении ещё одного типа оформления

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