feat(v3.2.7): expand WCAG ruleset to 127 rules, add HTML syntax linter, single-pass rule engine, template preprocessor, and accessibility analytics

This commit is contained in:
Enes Yakıştır
2026-08-16 22:00:30 +03:00
parent 9a6784ad19
commit 2de1f34878
93 changed files with 4879 additions and 305 deletions
@@ -0,0 +1,35 @@
<?php
namespace YakNet\AccessibilityConsole\Tests\Analytics;
use PHPUnit\Framework\TestCase;
use YakNet\AccessibilityConsole\Analytics\AccessibilityTelemetry;
use YakNet\AccessibilityConsole\Core\Severity;
use YakNet\AccessibilityConsole\Core\Violation;
use YakNet\AccessibilityConsole\Core\WCAGStandard;
class AccessibilityTelemetryTest extends TestCase
{
private AccessibilityTelemetry $telemetry;
protected function setUp(): void
{
$this->telemetry = new AccessibilityTelemetry();
}
public function testComputesDefectDensityAndRatios(): void
{
$violations = [
new Violation(ruleId: 'R1', message: 'M1', severity: Severity::ERROR, standard: WCAGStandard::A),
new Violation(ruleId: 'R2', message: 'M2', severity: Severity::WARNING, standard: WCAGStandard::AA),
];
$metrics = $this->telemetry->computeMetrics($violations, 2000);
$this->assertSame(2, $metrics['total_violations']);
$this->assertSame(1, $metrics['error_count']);
$this->assertSame(1, $metrics['warning_count']);
$this->assertSame(1.0, $metrics['defect_density_per_kloc']); // 2 violations / 2 kloc = 1.0
$this->assertSame(50.0, $metrics['critical_blockers_ratio']); // 1 / 2 = 50%
}
}
@@ -0,0 +1,48 @@
<?php
namespace YakNet\AccessibilityConsole\Tests\Analytics;
use PHPUnit\Framework\TestCase;
use YakNet\AccessibilityConsole\Analytics\ComplianceMatrixGenerator;
use YakNet\AccessibilityConsole\Core\Severity;
use YakNet\AccessibilityConsole\Core\Violation;
use YakNet\AccessibilityConsole\Core\WCAGStandard;
class ComplianceMatrixGeneratorTest extends TestCase
{
private ComplianceMatrixGenerator $generator;
protected function setUp(): void
{
$this->generator = new ComplianceMatrixGenerator();
}
public function testGeneratesMatrixSuccessfully(): void
{
$violations = [
new Violation(
ruleId: 'WCAG_1_1_1_ALT',
message: 'Image alt missing',
severity: Severity::ERROR,
standard: WCAGStandard::A
),
new Violation(
ruleId: 'WCAG_2_4_4_LINK_TEXT',
message: 'Link text empty',
severity: Severity::ERROR,
standard: WCAGStandard::A
),
];
$matrix = $this->generator->generate($violations, 127);
$this->assertArrayHasKey('overall_compliance_percentage', $matrix);
$this->assertArrayHasKey('principles', $matrix);
$this->assertArrayHasKey('levels', $matrix);
$this->assertSame(1, $matrix['principles']['Perceivable']['violations']);
$this->assertSame(1, $matrix['principles']['Operable']['violations']);
$this->assertSame(0, $matrix['principles']['Understandable']['violations']);
$this->assertSame('Pass', $matrix['principles']['Understandable']['status']);
}
}