< Summary

Information
Class: Services.ApiServices._1CApi.Nomenclature.NomenclatureShadowComparer
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/1CApi/Nomenclature/NomenclatureShadow.cs
Line coverage
100%
Covered lines: 25
Uncovered lines: 0
Coverable lines: 25
Total lines: 80
Line coverage: 100%
Branch coverage
92%
Covered branches: 26
Total branches: 28
Branch coverage: 92.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Compare(...)92.85%2828100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/1CApi/Nomenclature/NomenclatureShadow.cs

#LineLine coverage
 1namespace Services.ApiServices._1CApi.Nomenclature;
 2
 3/// <summary>Режим нового поиска. По умолчанию выключен; включается настройкой <c>OneCNomenclature:ResolverMode</c> (Off
 4public enum NomenclatureResolverMode
 5{
 6    /// <summary>Работает только прежний поиск.</summary>
 7    Off,
 8
 9    /// <summary>
 10    /// Прежний поиск решает как раньше, а новый считает рядом и пишет расхождения в лог. Ничего не создаёт
 11    /// и не меняет решение; нужен, чтобы неделю понаблюдать за различиями на настоящем потоке заказов.
 12    /// </summary>
 13    Shadow,
 14
 15    /// <summary>Новый поиск решает: берёт, отклоняет или создаёт карточку по <see cref="NomenclatureResolvePolicy"/>.</
 16    On
 17}
 18
 19public enum ShadowDiffKind
 20{
 21    Agree,
 22
 23    /// <summary>Прежний код создал карточку, новый взял бы существующую — дубль был бы предотвращён.</summary>
 24    DuplicateAvoided,
 25
 26    /// <summary>Прежний код нашёл одну карточку, новый выбирает другую.</summary>
 27    DifferentCard,
 28
 29    /// <summary>Прежний код нашёл карточку, новый не нашёл (создал бы или отклонил) — потенциальная регрессия.</summary
 30    OldFoundNewMissed,
 31
 32    /// <summary>Новый находит карточку там, где прежний не нашёл (только поиск) — улучшение.</summary>
 33    NewFoundOldMissed,
 34
 35    /// <summary>Прежний код создал карточку, а новый остановился бы из-за неоднозначности.</summary>
 36    AmbiguousWouldBlock
 37}
 38
 39public sealed record ShadowOutcome(ShadowDiffKind Kind, string Description);
 40
 41/// <summary>Сравнение решений прежнего и нового поиска для режима <see cref="NomenclatureResolverMode.Shadow"/>.</summa
 42public static class NomenclatureShadowComparer
 43{
 44    public static ShadowOutcome Compare(Guid? oldRefKey, bool oldCreated, NomenclatureMatch match, NomenclatureMode mode
 45    {
 1346        var decision = NomenclatureResolvePolicy.Decide(match, mode);
 1347        var oldText = oldRefKey?.ToString() ?? "нет";
 1348        var newText = decision.Action switch
 1349        {
 450            NomenclatureAction.UseCard => $"взять {decision.RefKey}",
 251            NomenclatureAction.Create => "создать",
 752            _ => "отклонить"
 1353        };
 1354        var text = $"прежний: {(oldCreated ? "создал " : "")}{oldText}; новый: {newText} ({decision.Reason})";
 55
 1356        if (oldCreated)
 57        {
 458            return decision.Action switch
 459            {
 160                NomenclatureAction.UseCard => new ShadowOutcome(ShadowDiffKind.DuplicateAvoided, text),
 261                NomenclatureAction.Create => new ShadowOutcome(ShadowDiffKind.Agree, text),
 162                _ => new ShadowOutcome(ShadowDiffKind.AmbiguousWouldBlock, text)
 463            };
 64        }
 65
 966        if (oldRefKey.HasValue)
 67        {
 668            if (decision.Action != NomenclatureAction.UseCard)
 469                return new ShadowOutcome(ShadowDiffKind.OldFoundNewMissed, text);
 70
 271            return decision.RefKey == oldRefKey
 272                ? new ShadowOutcome(ShadowDiffKind.Agree, text)
 273                : new ShadowOutcome(ShadowDiffKind.DifferentCard, text);
 74        }
 75
 376        return decision.Action == NomenclatureAction.UseCard
 377            ? new ShadowOutcome(ShadowDiffKind.NewFoundOldMissed, text)
 378            : new ShadowOutcome(ShadowDiffKind.Agree, text);
 79    }
 80}