
# Performanță și testare

TailwindPHP optimizează în primul rând pentru corectitudine. Când o modificare specifică PHP accelerează execuția fără să schimbe rezultatul, aceasta este aplicată și marcată `@port-deviation:performance`. Paritatea cu TailwindCSS nu este presupusă — este verificată continuu cu suita de teste proprie a lui Tailwind.

## Performanță

Portarea PHP prioritizează potrivirea rezultatului TailwindCSS în locul debitului brut, iar originalul TypeScript rămâne oricum mai rapid — compilatorul JIT al lui V8 compilează căile intens utilizate în cod nativ într-un mod pe care PHP nu îl poate egala. Pentru CSS generat la fiecare cerere sau pagină, reutilizați un singur compilator (consultați [generateExact()](https://tailwindphp.inline0.dev/ro/docs/api#accumulating-vs-exact-generation)) și persistați starea de inițializare cu [`stateCacheFile`](https://tailwindphp.inline0.dev/ro/docs/advanced/caching#compiler-state-cache).

Câteva căi intens utilizate au optimizări ajustate manual care **păstrează rezultatul identic**:

- **`ast.php` `toCss()`** — adună fragmente într-un tablou și le `implode` o singură dată, în loc să concateneze repetat șiruri, și folosește șiruri de indentare precomputate.
- **`css-parser.php`** — compară caracterele direct, fără să treacă prin `ord()`, și urmărește lungimea bufferelor în loc să recalculeze `strlen()`.

Ambele sunt documentate cu `@port-deviation:performance` și condiționate de suita de teste — nu pot modifica CSS generat.

### Teste de performanță

Directorul `benchmarks/` conține un instrument de comparare. Rulați-l astfel:

```bash
composer bench         # PHP vs TypeScript
composer bench:save    # write benchmarks/results.json
```

Rezultate de probă pe PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

| Test de performanță | PHP | TypeScript |
|-----------|-----|------------|
| `css-parser` pe preflight.css | ~816 ops/s | ~15.45K ops/s (≈20× mai rapid) |
| `toCss` | ~65.85K ops/s | ~2.59M ops/s (≈39× mai rapid) |

TypeScript este mai rapid pentru aceste operații de nivel scăzut, așa cum era de așteptat. Pentru generarea CSS a unei pagini întregi — cazul de utilizare real — performanța PHP este adecvată (aproximativ 14 ms per pagină în rularea de probă). Pentru intrări identice repetate, [cache-ul de fișiere](https://tailwindphp.inline0.dev/ro/docs/advanced/caching) elimină complet acest cost.

## Testare și paritate

Testele garantează că portarea PHP produce același rezultat ca TailwindCSS. Două abordări funcționează împreună.

**1. Teste bazate pe extragere.** Scripturile din `test-coverage/` analizează fișierele `.test.ts` proprii ale lui TailwindCSS și extrag cazurile de test în JSON. Apoi, PHPUnit rulează cazurile prin TailwindPHP și compară rezultatul cu valoarea CSS așteptată. Deoarece așteptările provin direct din amonte, orice abatere de la comportamentul PHP devine vizibilă printr-un eșec. Aceste teste acoperă componentele complexe: utilitare, variante, integrare, funcții CSS și testele `ui.spec` la nivel de browser.

**2. Teste unitare portate manual.** Fișierele de testare TypeScript mai simple (AST, analiză sintactică CSS, escape, analiza candidaților, analiza valorilor, …) sunt portate direct în PHP și se află lângă sursa lor ca `*.test.php`, oglindind structura și aserțiunile originalelor.

Bucla este **extrage → rulează → verifică**: extrageți din nou din referința TailwindCSS actuală, rulați suita, iar orice abatere provoacă un eșec. Astfel, portarea rămâne sincronizată cu sursa din amonte, iar o actualizare TailwindCSS poate fi validată automat, în loc să fie verificată prin inspecție. Abaterile provoacă eșecul CI.

```bash
composer extract   # re-extract test cases from the TailwindCSS reference
composer test      # run the full suite
```

La versiunea 1.7.0 sunt **4,427 teste trecute** (referința TailwindCSS v4.3.3):

| Suită | Teste | Sursă |
|-------|-------|--------|
| Suite TailwindCSS extrase (utilitare 706, variante 164, index 148, css-functions 64, `ui.spec` 68) | 1,150 | extrase din `.test.ts` / `.spec.ts` |
| Acoperirea API (utilitare, modificatori, variante, directive, pluginuri, importuri, `@source`, cache, API public) | 2,252 | `tests/` |
| Teste unitare lângă sursă (parser, AST, candidați, temă, utils, parser de selectori, transformări lightningcss, minificator) | 767 | portări `*.test.php` și teste specifice PHP |
| CLI (analiza argumentelor, rezultate, compilări) | 84 | `tests/Cli*Test.php` |
| Portări de pluginuri (typography, forms) | 45 | `*.test.php` lângă pluginuri |
| Biblioteci auxiliare (clsx, tailwind-merge, CVA) | 129 | suite de referință |

## Calitatea codului

Formatarea și analiza statică rulează prin scripturile Composer:

```bash
composer lint      # Pint --test  (check formatting)
composer format    # Pint         (fix formatting)
composer analyse   # PHPStan      (static analysis, level 4)
composer quality   # lint + analyse
```

PHPStan rulează la nivelul 4 (`phpstan.neon`), cu o listă scurtă de tipare ignorate pentru formele dinamice de tablou folosite de arhitectura bazată pe funcții. Sunt analizate toate fișierele sursă; fișierele de test sunt excluse.

Pentru structura verificată de aceste teste și locurile unde sunt consemnate abaterile, consultați [Arhitectură](https://tailwindphp.inline0.dev/ro/docs/advanced/architecture).
