
# Výkon a testovanie

TailwindPHP uprednostňuje správnosť. Zmeny špecifické pre PHP, ktoré zrýchľujú spracovanie bez zmeny výstupu, sa uplatňujú a označujú ako `@port-deviation:performance`. Zhoda s TailwindCSS sa nepredpokladá — priebežne sa overuje pomocou vlastnej testovacej sady Tailwind.

## Výkon

Port PHP uprednostňuje zhodu výstupu s TailwindCSS pred maximálnou priepustnosťou a pôvodný TypeScript zostáva aj tak rýchlejší — JIT v V8 kompiluje často používané časti do natívneho kódu spôsobom, ktorý PHP nedokáže napodobniť. Pri generovaní CSS pre každú požiadavku alebo stránku opakovane používajte jeden kompilátor (pozrite [generateExact()](https://tailwindphp.inline0.dev/sk/docs/api#accumulating-vs-exact-generation)) a uchovávajte jeho stav po zostavení pomocou [`stateCacheFile`](https://tailwindphp.inline0.dev/sk/docs/advanced/caching#compiler-state-cache).

Niekoľko často používaných častí obsahuje ručne vyladené optimalizácie, ktoré **zachovávajú totožný výstup**:

- **`ast.php` `toCss()`** — zhromažďuje fragmenty v poli a zavolá `implode` iba raz namiesto opakovaného spájania reťazcov; používa tiež vopred vypočítané reťazce odsadenia.
- **`css-parser.php`** — porovnáva znaky priamo namiesto použitia `ord()` a sleduje dĺžky vyrovnávacej pamäte namiesto opakovaného výpočtu `strlen()`.

Obe optimalizácie sú zdokumentované pomocou `@port-deviation:performance` a ich použitie je podmienené úspešným prejdením testovacej sady — nemôžu zmeniť vygenerované CSS.

### Porovnávacie testy

Adresár `benchmarks/` obsahuje testovací nástroj na porovnanie. Spustíte ho takto:

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

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

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

TypeScript je pri týchto nízkoúrovňových operáciách podľa očakávania rýchlejší. Pri generovaní CSS celej stránky — čo je skutočný prípad použitia — je výkon PHP dostatočný (v ukážkovom behu približne 14 ms na stránku). Pri opakovanom rovnakom vstupe odstráni náklady úplne [súborová vyrovnávacia pamäť](https://tailwindphp.inline0.dev/sk/docs/advanced/caching).

## Testovanie a zhoda

Testy zaručujú, že port PHP vytvára rovnaký výstup ako TailwindCSS. Spoločne sa používajú dva prístupy.

**1. Testy založené na extrakcii.** Skripty v `test-coverage/` analyzujú vlastné súbory TailwindCSS `.test.ts` a extrahujú testovacie prípady do JSON. PHPUnit potom spustí tieto prípady cez TailwindPHP a porovná výstup s očakávaným CSS. Keďže očakávané výsledky pochádzajú priamo z upstreamu, každá odchýlka v správaní PHP sa prejaví ako zlyhanie. Tieto testy pokrývajú zložité oblasti: utility, varianty, integráciu, funkcie CSS a testy na úrovni prehliadača `ui.spec`.

**2. Ručne prenesené jednotkové testy.** Jednoduchšie testovacie súbory TypeScript (AST, analýza CSS, escapovanie, analýza kandidátov, analýza hodnôt, …) sa prenášajú priamo do PHP a ako `*.test.php` sa nachádzajú vedľa zdrojového kódu. Kopírujú štruktúru aj tvrdenia pôvodných testov.

Cyklus vyzerá takto: **extrahovať → spustiť → overiť**. Znovu extrahujte testy z aktuálnej referencie TailwindCSS, spustite testovaciu sadu a každá odchýlka spôsobí zlyhanie. Vďaka tomu zostáva prenesená verzia v súlade s upstreamom a aktualizáciu TailwindCSS možno overiť automaticky, nie ručnou kontrolou. Odchýlka spôsobí zlyhanie CI.

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

K vydaniu 1.7.0 (referencia TailwindCSS v4.3.3) prechádza **4,427 testov**:

| Sada | Testy | Zdroj |
|-------|-------|--------|
| Extrahované sady TailwindCSS (utility 706, varianty 164, index 148, css-functions 64, `ui.spec` 68) | 1,150 | extrahované z `.test.ts` / `.spec.ts` |
| Pokrytie API (utility, modifikátory, varianty, direktívy, pluginy, importy, `@source`, cachovanie, verejné API) | 2,252 | `tests/` |
| Jednotkové testy vedľa zdrojového kódu (parser, AST, kandidáty, téma, utility, parser selektorov, transformácie lightningcss, minifikátor) | 767 | porty `*.test.php` a testy špecifické pre PHP |
| CLI (analýza argumentov, výstup, zostavenia) | 84 | `tests/Cli*Test.php` |
| Porty pluginov (typografia, formuláre) | 45 | `*.test.php` vedľa pluginov |
| Sprievodné knižnice (clsx, tailwind-merge, CVA) | 129 | referenčné sady |

## Kvalita kódu

Formátovanie a statická analýza sa spúšťajú pomocou skriptov 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 sa spúšťa na úrovni 4 (`phpstan.neon`) so stručným zoznamom ignorovaných vzorov pre dynamické tvary polí, ktoré používa architektúra založená na funkciách. Analyzujú sa všetky zdrojové súbory; testovacie súbory sú vylúčené.

Štruktúru, ktorú tieto testy overujú, a zaznamenané odchýlky nájdete v časti [Architektúra](https://tailwindphp.inline0.dev/sk/docs/advanced/architecture).
