
# Výkon a testování

TailwindPHP upřednostňuje především správnost. Pokud změna specifická pro PHP zrychlí běh bez změny výstupu, použije se a označí jako `@port-deviation:performance`. Shoda s TailwindCSS se nepředpokládá — průběžně se ověřuje pomocí vlastní testovací sady Tailwind.

## Výkon

Port PHP upřednostňuje shodu s výstupem TailwindCSS před hrubou propustností a původní TypeScript zůstává v každém případě rychlejší — JIT v V8 kompiluje často používané části do nativního kódu, čehož PHP nedokáže dosáhnout. Pro CSS generované při každém požadavku nebo na každé stránce znovu použijte jeden kompilátor (viz [generateExact()](https://tailwindphp.inline0.dev/cs/docs/api#accumulating-vs-exact-generation)) a jeho stav při konstrukci uchovávejte pomocí [`stateCacheFile`](https://tailwindphp.inline0.dev/cs/docs/advanced/caching#compiler-state-cache).

Několik často používaných částí obsahuje ručně laděné optimalizace, které **zachovávají totožný výstup**:

- **`ast.php` `toCss()`** — shromažďuje části do pole a jednou je spojí pomocí `implode`, místo aby opakovaně zřetězovala řetězce; používá také předem vypočítané řetězce odsazení.
- **`css-parser.php`** — porovnává znaky přímo, bez volání `ord()`, a sleduje délky vyrovnávací paměti, místo aby opakovaně počítal `strlen()`.

Obě optimalizace jsou zdokumentované pomocí `@port-deviation:performance` a podmíněné úspěšným průchodem testovací sady — nemohou změnit generované CSS.

### Srovnávací testy

Adresář `benchmarks/` obsahuje nástroj pro srovnávací testy. Spusťte jej takto:

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

Ukázkové výsledky na PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

| Srovnávací test | PHP | TypeScript |
|-----------|-----|------------|
| `css-parser` na preflight.css | ~816 ops/s | ~15.45K ops/s (≈20× rychlejší) |
| `toCss` | ~65.85K ops/s | ~2.59M ops/s (≈39× rychlejší) |

TypeScript je u těchto nízkoúrovňových operací podle očekávání rychlejší. Pro generování celých stránek CSS, což je skutečný případ použití, je výkon PHP dostačující (v ukázkovém běhu přibližně 14 ms na stránku). Při opakovaném použití stejného vstupu [náklady zcela odstraní mezipaměť souborů](https://tailwindphp.inline0.dev/cs/docs/advanced/caching).

## Testování a shoda

Testy zajišťují, že port PHP vytváří stejný výstup jako TailwindCSS. Společně se používají dva přístupy.

**1. Testy založené na extrakci.** Skripty v `test-coverage/` analyzují vlastní soubory `.test.ts` projektu TailwindCSS a extrahují z nich testovací případy do JSON. PHPUnit pak tyto případy předá do TailwindPHP a porovná výstup s očekávaným CSS. Protože očekávané hodnoty pocházejí přímo z upstreamu, každá odchylka v chování PHP se projeví jako chyba. Testy pokrývají složité části: utility, varianty, integraci, funkce CSS a testy `ui.spec` na úrovni prohlížeče.

**2. Ručně portované jednotkové testy.** Jednodušší testovací soubory TypeScript (AST, parsování CSS, escapování, parsování kandidátů, parsování hodnot a další) se portují přímo do PHP a ukládají vedle zdrojového kódu jako `*.test.php`; kopírují strukturu i ověřování původních testů.

Cyklus má podobu **extrahovat → spustit → ověřit**: znovu extrahovat z aktuální reference TailwindCSS, spustit testovací sadu a každou odchylku zachytit jako chybu. Port tak drží krok s upstreamem a aktualizaci TailwindCSS lze ověřit automaticky, nikoli kontrolovat ručně. Při odchylce CI selže.

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

K vydání 1.7.0 je k dispozici **4,427 úspěšných testů** (reference TailwindCSS v4.3.3):

| Sada | Testy | Zdroj |
|-------|-------|--------|
| Extrahované TailwindCSS sady (nástroje 706, varianty 164, index 148, css-functions 64, `ui.spec` 68) | 1,150 | extrahováno z `.test.ts` / `.spec.ts` |
| Pokrytí API (nástroje, modifikátory, varianty, direktivy, pluginy, importy, `@source`, ukládání do mezipaměti, veřejné API) | 2,252 | `tests/` |
| Jednotkové testy vedle zdrojového kódu (parser, AST, kandidáti, motiv, nástroje, parser selektorů, transformace lightningcss, minifikátor) | 767 | porty `*.test.php` a testy specifické pro PHP |
| CLI (zpracování argumentů, výstup, sestavení) | 84 | `tests/Cli*Test.php` |
| Porty pluginů (typografie, formuláře) | 45 | `*.test.php` vedle pluginů |
| Doprovodné knihovny (clsx, tailwind-merge, CVA) | 129 | referenční sady |

## Kvalita kódu

Formátování a statická analýza probíhají pomocí skriptů 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 běží na úrovni 4 (`phpstan.neon`), s krátkým seznamem ignorovaných vzorů pro dynamické tvary polí používané architekturou založenou na funkcích. Analyzují se všechny zdrojové soubory; testovací soubory jsou vyloučeny.

Strukturu ověřovanou těmito testy a zaznamenané odchylky popisuje [Architektura](https://tailwindphp.inline0.dev/cs/docs/advanced/architecture).
