• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ricardoboss / STEP / 19003293883

01 Nov 2025 10:06PM UTC coverage: 72.901% (+0.3%) from 72.583%
19003293883

push

github

ricardoboss
style: simplify switch because all branches are handled

503 of 637 branches covered (78.96%)

Branch coverage included in aggregate %.

1 of 1 new or added line in 1 file covered. (100.0%)

17 existing lines in 3 files now uncovered.

3301 of 4581 relevant lines covered (72.06%)

1895.94 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.55
/StepLang/Tokenizing/StringExtensions.cs
1
using System.Diagnostics.CodeAnalysis;
2
using System.Text;
3
using System.Text.RegularExpressions;
4

5
namespace StepLang.Tokenizing;
6

7
public static partial class StringExtensions
8
{
9
        public static bool IsValidIdentifier(this string value)
10
        {
11
                return value.Trim().Length != 0 && !value.GetFirstInvalidIdentifierCharacter().HasValue;
2,749✔
12
        }
13

14
        public static char? GetFirstInvalidIdentifierCharacter(this string value)
15
        {
16
                if (value.Trim().Length == 0)
2,747✔
17
                {
UNCOV
18
                        throw new InvalidOperationException(
×
UNCOV
19
                                "Cannot get the first invalid identifier character of an empty string.");
×
20
                }
21

22
                if (value.Contains('.', StringComparison.InvariantCulture))
2,747✔
23
                {
24
                        return '.';
2✔
25
                }
26

27
                var firstChar = value[0];
2,745✔
28
                if (!char.IsAsciiLetter(firstChar) && firstChar != '_')
2,745✔
29
                {
30
                        return firstChar;
14✔
31
                }
32

33
                var invalidChar = value[1..].FirstOrDefault(c => !char.IsAsciiLetterOrDigit(c) && c != '_');
14,490✔
34

35
                return invalidChar == 0 ? null : invalidChar;
2,731✔
36
        }
37

38
        [return: NotNullIfNotNull(nameof(value))]
39
        public static string? EscapeControlCharacters(this string? value)
40
        {
41
                if (value is null)
248✔
42
                        return null;
1✔
43

44
                if (value.Length == 0)
247✔
45
                        return string.Empty;
2✔
46

47
                var sb = new StringBuilder(value.Length);
245✔
48
                foreach (var c in value)
1,828✔
49
                {
50
                        switch (c)
51
                        {
52
                                case '\n': sb.Append("\\n"); break;
2✔
53
                                case '\r': sb.Append("\\r"); break;
2✔
54
                                case '\t': sb.Append("\\t"); break;
2✔
55
                                case '\\': sb.Append(@"\\"); break;
2✔
56
                                case '\"': sb.Append("\\\""); break;
2✔
57
                                case '\'': sb.Append("\\'"); break;
2✔
58
                                default:
59
                                        if (c is <= '\x1F' or '\x7F')
663✔
60
                                                sb.Append("\\x").Append(((int)c).ToString("X2"));
2✔
61
                                        else
62
                                                sb.Append(c);
661✔
63

64
                                        break;
65
                        }
66
                }
67

68
                return sb.ToString();
245✔
69
        }
70

71
        [return: NotNullIfNotNull(nameof(value))]
72
        public static string? UnescapeControlChars(this string? value)
73
        {
74
                if (value is null)
7,021✔
75
                        return null;
1✔
76

77
                if (value.Length == 0)
7,020✔
78
                        return string.Empty;
103✔
79

80
                return EscapedControlCharacterRegex().Replace(value, m =>
6,917✔
81
                {
6,917✔
82
                        var token = m.Groups[1].Value;
132✔
83
                        return token switch
132✔
84
                        {
132✔
85
                                "\\" => "\\",
16✔
86
                                "\"" => "\"",
88✔
87
                                "'" => "'",
1✔
88
                                "n" => "\n",
20✔
89
                                "r" => "\r",
1✔
90
                                "t" => "\t",
2✔
91
                                _ => ((char)Convert.ToInt32(token[1..], 16)).ToString(),
4✔
92
                        };
132✔
93
                });
6,917✔
94
        }
95

96
        [GeneratedRegex(@"\\(\\|""|'|n|r|t|x[0-9A-Fa-f]{2})", RegexOptions.IgnoreCase)]
97
        private static partial Regex EscapedControlCharacterRegex();
98
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc