< Summary

Information
Class: LOCKnet.Core.Services.BackupCodeParser
Assembly: LOCKnet.Core
File(s): /home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.Core/Services/BackupCodeParser.cs
Line coverage
90%
Covered lines: 29
Uncovered lines: 3
Coverable lines: 32
Total lines: 56
Line coverage: 90.6%
Branch coverage
88%
Covered branches: 16
Total branches: 18
Branch coverage: 88.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Parse(...)93.75%161692.3%
Normalize(...)50%2283.33%

File(s)

/home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.Core/Services/BackupCodeParser.cs

#LineLine coverage
 1namespace LOCKnet.Core.Services;
 2
 3/// <summary>
 4/// Parser fuer typische Copy/Paste-Formate von Recovery-/Backup-Codes.
 5/// </summary>
 6public static class BackupCodeParser
 7{
 8  /// <summary>
 9  /// Zerlegt Rohtext in einzelne Codes.
 10  /// Unterstuetzt Zeilenumbrueche sowie komma-/semikolongetrennte Listen.
 11  /// </summary>
 12  /// <param name="raw">Rohtext aus Eingabe oder Zwischenablage.</param>
 13  /// <returns>Normalisierte Liste einzelner Codes in Einfuegereihenfolge ohne Duplikate.</returns>
 14  public static IReadOnlyList<string> Parse(string? raw)
 315  {
 316    if (string.IsNullOrWhiteSpace(raw))
 017      return [];
 18
 319    var result = new List<string>();
 320    var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
 321    var lines = raw.Replace("\r\n", "\n", StringComparison.Ordinal)
 322      .Replace('\r', '\n')
 323      .Split('\n', StringSplitOptions.None);
 24
 2525    foreach (var line in lines)
 826    {
 827      if (string.IsNullOrWhiteSpace(line))
 128        continue;
 29
 730      var parts = line.Contains(',') || line.Contains(';')
 731        ? line.Split([',', ';'], StringSplitOptions.None)
 732        : [line];
 33
 4134      foreach (var part in parts)
 1035      {
 1036        var normalized = Normalize(part);
 1037        if (normalized.Length == 0)
 038          continue;
 39
 1040        if (seen.Add(normalized))
 841          result.Add(normalized);
 1042      }
 743    }
 44
 345    return result;
 346  }
 47
 48  private static string Normalize(string value)
 1049  {
 1050    var trimmed = value.Trim();
 1051    if (trimmed.Length == 0)
 052      return string.Empty;
 53
 1054    return string.Join(' ', trimmed.Split((char[]?)null, StringSplitOptions.RemoveEmptyEntries));
 1055  }
 56}