< Summary

Information
Class: AspxLint.Core.Rules.Form001FormMissingRunat
Assembly: AspxLint.Core
File(s): D:\a\claude-aspx-lint\claude-aspx-lint\src\AspxLint.Core\Rules\Form001FormMissingRunat.cs
Line coverage
100%
Covered lines: 20
Uncovered lines: 0
Coverable lines: 20
Total lines: 49
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Id()100%11100%
get_Name()100%11100%
get_Severity()100%11100%
get_Description()100%11100%
get_HasFix()100%11100%
.cctor()100%11100%
Fix(...)100%11100%

File(s)

D:\a\claude-aspx-lint\claude-aspx-lint\src\AspxLint.Core\Rules\Form001FormMissingRunat.cs

#LineLine coverage
 1using System.Text.RegularExpressions;
 2
 3namespace AspxLint.Core.Rules;
 4
 5public sealed class Form001FormMissingRunat : IRule
 6{
 2037    public string Id => "FORM-001";
 288    public string Name => "Balise <form> sans runat=\"server\" dans une page ASPX";
 259    public Severity Severity => Severity.Error;
 10    public string Description =>
 2511        "Une page ASPX qui utilise des controles serveur a besoin d'un <form runat=\"server\"> englobant. Sans cela, le 
 4612    public bool HasFix => true;
 13
 514    private static readonly Regex MasterPageFile = new(
 515        @"MasterPageFile\s*=", RegexOptions.IgnoreCase | RegexOptions.Compiled);
 516    private static readonly Regex AspControl = new(
 517        @"<asp:", RegexOptions.IgnoreCase | RegexOptions.Compiled);
 518    private static readonly Regex DetectRegex = new(
 519        @"<form\b([^>]*?)>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
 520    private static readonly Regex RunatPresent = new(
 521        @"\brunat\s*=\s*[""']?server[""']?", RegexOptions.IgnoreCase | RegexOptions.Compiled);
 22
 23    public IEnumerable<Issue> Detect(string content, string[] lines, RuleContext ctx)
 24    {
 25        if (ctx.Ext != "aspx") yield break;
 26        if (MasterPageFile.IsMatch(content)) yield break;     // content page : le master a deja le form runat
 27        if (!AspControl.IsMatch(content)) yield break;        // pas de controle serveur = pas pertinent
 28
 29        for (int i = 0; i < lines.Length; i++)
 30        {
 31            foreach (Match m in DetectRegex.Matches(lines[i]))
 32            {
 33                if (RunatPresent.IsMatch(m.Groups[1].Value)) continue;
 34                yield return new Issue(Id, Name, Severity,
 35                    i + 1, m.Index + 1, m.Value,
 36                    "Ajouter runat=\"server\" a la balise <form>.");
 37            }
 38        }
 39    }
 40
 41    public string? Fix(string content, RuleContext ctx) =>
 2142        DetectRegex.Replace(content, m =>
 2143        {
 2144            var attrs = m.Groups[1].Value;
 2145            if (RunatPresent.IsMatch(attrs)) return m.Value;
 2146            var cleanAttrs = attrs.TrimEnd();
 2147            return $"<form{cleanAttrs} runat=\"server\">";
 2148        });
 49}