
# Zmogljivost in testiranje

TailwindPHP daje prednost pravilnosti. Sprememba, značilna za PHP, ki pospeši delovanje, ne da bi spremenila izhod, se uporabi in označi z `@port-deviation:performance`. Enakovrednost z TailwindCSS ni samoumevna — nenehno se preverja z lastno zbirko testov Tailwind.

## Zmogljivost

Prenos PHP daje prednost ujemanju z izhodom TailwindCSS pred surovo prepustnostjo, izvirni TypeScript pa ostane hitrejši ne glede na to — JIT v V8 prevede najbolj obremenjene poti v izvorno kodo, česar PHP ne more doseči. Če za vsako zahtevo ali stran ustvarjate CSS, znova uporabite en prevajalnik (glejte [generateExact()](https://tailwindphp.inline0.dev/sl/docs/api#accumulating-vs-exact-generation)) in ohranite njegovo stanje ob vzpostavitvi z [`stateCacheFile`](https://tailwindphp.inline0.dev/sl/docs/advanced/caching#compiler-state-cache).

Nekaj najbolj obremenjenih poti ima ročno uglašene optimizacije, ki **ohranijo povsem enak izhod**:

- **`ast.php` `toCss()`** — delčke zbira v polju in jih enkrat pretvori v niz z `implode`, namesto da bi večkrat združeval nize; uporablja tudi vnaprej izračunane nize za zamike.
- **`css-parser.php`** — primerja znake neposredno, ne prek `ord()`, ter spremlja dolžine medpomnilnika, namesto da bi znova izračunaval `strlen()`.

Oboje je dokumentirano z `@port-deviation:performance` in preverjeno z zbirko testov — ne more spremeniti ustvarjenega CSS.

### Primerjalni preizkusi

V imeniku `benchmarks/` je orodje za primerjavo. Zaženite ga takole:

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

Vzorčni rezultati na PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

| Primerjalni preizkus | PHP | TypeScript |
|-----------|-----|------------|
| `css-parser` v preflight.css | ~816 ops/s | ~15.45K ops/s (≈20× hitreje) |
| `toCss` | ~65.85K ops/s | ~2.59M ops/s (≈39× hitreje) |

TypeScript je pričakovano hitrejši pri teh nizkonivojskih operacijah. Za ustvarjanje CSS za celotno stran — kar je dejanski primer uporabe — je zmogljivost PHP ustrezna (v vzorčnem zagonu približno 14 ms na stran). Pri ponovljenem enakem vhodu strošek v celoti odpravi [datotečni predpomnilnik](https://tailwindphp.inline0.dev/sl/docs/advanced/caching).

## Testiranje in enakovrednost

Testi zagotavljajo, da prenos PHP ustvari enak izhod kot TailwindCSS. Uporabljata se dva pristopa.

**1. Testi z izluščanjem.** Skripti v `test-coverage/` razčlenita lastne datoteke `.test.ts` projekta TailwindCSS in izluščita testne primere v JSON. Nato PHPUnit te primere izvede prek TailwindPHP in primerja izhod s pričakovanim CSS. Ker pričakovani rezultati izvirajo neposredno iz izvornega projekta, se vsako odstopanje v vedenju PHP pokaže kot napaka. Testi pokrivajo zapletena področja: pripomočke, različice, integracijo, funkcije CSS in teste na ravni brskalnika `ui.spec`.

**2. Ročno preneseni enotski testi.** Preprostejše testne datoteke TypeScript (AST, razčlenjevanje CSS, ubežni znaki, razčlenjevanje kandidatov in vrednosti …) so neposredno prenesene v PHP in shranjene ob izvorni kodi kot `*.test.php`; njihova struktura in trditve posnemajo izvirnike.

Cikel je **izlušči → zaženi → preveri**: znova izluščite primere iz trenutne reference TailwindCSS, zaženite zbirko in vsako odstopanje povzroči neuspeh. Tako prenos ostaja usklajen z izvirnim projektom, posodobitev TailwindCSS pa je mogoče preveriti samodejno, namesto z ročnim pregledom. Odstopanja povzročijo neuspeh v CI.

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

Od izdaje 1.7.0 je uspešno opravljenih **4,427 testov** (referenca TailwindCSS v4.3.3):

| Zbirka | Testi | Vir |
|-------|-------|--------|
| Izluščene zbirke TailwindCSS (pripomočki 706, različice 164, index 148, css-functions 64, `ui.spec` 68) | 1,150 | izluščeno iz `.test.ts` / `.spec.ts` |
| Pokritost API (pripomočki, modifikatorji, različice, direktive, vtičniki, uvozi, `@source`, predpomnjenje, javni API) | 2,252 | `tests/` |
| Enotski testi ob izvorni kodi (razčlenjevalnik, AST, kandidati, tema, pripomočki, razčlenjevalnik izbirnikov, transformacije lightningcss, minifikator) | 767 | prenosi `*.test.php` in testi, specifični za PHP |
| CLI (razčlenjevanje argumentov, izhod, gradnje) | 84 | `tests/Cli*Test.php` |
| Prenosi vtičnikov (tipografija, obrazci) | 45 | ob vtičnikih `*.test.php` |
| Spremljevalne knjižnice (clsx, tailwind-merge, CVA) | 129 | referenčne zbirke |

## Kakovost kode

Oblikovanje in statična analiza se izvajata s skripti 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 deluje na stopnji 4 (`phpstan.neon`), z nekaj prezrtimi vzorci za dinamične oblike polj, ki jih uporablja arhitektura na podlagi funkcij. Analizirajo se vse izvorne datoteke, testne pa so izključene.

Za zgradbo, ki jo preverjajo ti testi, in mesta, kjer so zabeležena odstopanja, glejte [Arhitektura](https://tailwindphp.inline0.dev/sl/docs/advanced/architecture).
