
# Suorituskyky ja testaus

TailwindPHP optimoi ensisijaisesti oikeellisuuden. Kun PHP-kohtainen muutos nopeuttaa toimintaa tulostetta muuttamatta, se otetaan käyttöön ja merkitään tunnisteella `@port-deviation:performance`. Vastaavuutta TailwindCSSn kanssa ei oleteta — se tarkistetaan jatkuvasti Tailwindn omalla testisarjalla.

## Suorituskyky

PHP-porttauksen etusijalla on TailwindCSS-tulosteen vastaavuus raakasuoritusnopeuteen nähden, ja alkuperäinen TypeScript on joka tapauksessa nopeampi — V8n JIT kääntää kuumat koodipolut natiivikoodiksi tavalla, johon PHP ei pysty. Jos CSS luodaan jokaisella pyynnöllä tai sivulla, käytä samaa kääntäjää uudelleen (katso [generateExact()](https://tailwindphp.inline0.dev/fi/docs/api#accumulating-vs-exact-generation)) ja säilytä sen alustustila käyttämällä kohdetta [`stateCacheFile`](https://tailwindphp.inline0.dev/fi/docs/advanced/caching#compiler-state-cache).

Muutamassa kuumassa koodipolussa on käsin viritettyjä optimointeja, jotka **säilyttävät tulosteen ennallaan**:

- **`ast.php` `toCss()`** — kokoaa osat taulukkoon ja suorittaa `implode`n kerran toistuvan merkkijonojen yhdistämisen sijaan sekä käyttää valmiiksi muodostettuja sisennysmerkkijonoja.
- **`css-parser.php`** — vertaa merkkejä suoraan `ord()`n kautta kulkemisen sijaan ja seuraa puskurien pituuksia `strlen()`n uudelleenlaskennan sijaan.

Molemmat on dokumentoitu tunnisteella `@port-deviation:performance` ja testisarja varmistaa ne — ne eivät voi muuttaa luotua CSSa.

### Vertailutestit

Hakemisto `benchmarks/` sisältää vertailutestikehikon. Suorita se näin:

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

Esimerkkituloksia ympäristössä PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

| Vertailutesti | PHP | TypeScript |
|-----------|-----|------------|
| `css-parser` ympäristössä preflight.css | ~816 ops/s | ~15.45K ops/s (≈20× nopeampi) |
| `toCss` | ~65.85K ops/s | ~2.59M ops/s (≈39× nopeampi) |

TypeScript on odotetusti nopeampi näissä matalan tason operaatioissa. Koko sivun CSS-generoinnissa – varsinaisessa käyttötapauksessa – PHP suoriutuu riittävän hyvin (esimerkkiajossa noin 14 ms sivua kohden). Kun syöte on toistuvasti sama, [tiedostovälimuisti](https://tailwindphp.inline0.dev/fi/docs/advanced/caching) poistaa kustannuksen kokonaan.

## Testaus ja vastaavuus

Testien tarkoitus on taata, että PHP-porttaus tuottaa saman tulosteen kuin TailwindCSS. Kaksi menetelmää täydentää toisiaan.

**1. Poimintaan perustuvat testit.** Hakemiston `test-coverage/` skriptit jäsentävät TailwindCSSn omat `.test.ts`-tiedostot ja poimivat testitapaukset JSONiin. PHPUnit suorittaa tapaukset TailwindPHPn kautta ja vertaa tulostetta odotettuun CSSiin. Koska odotukset tulevat suoraan alkupään projektista, poikkeama PHPn toiminnassa havaitaan virheenä. Testit kattavat monimutkaiset osa-alueet: apufunktiot, variantit, integraation, CSS-funktiot ja selaintason `ui.spec`-testit.

**2. Käsin portatut yksikkötestit.** Yksinkertaisemmat TypeScript-testitiedostot (AST, CSS-jäsennys, escapointi, ehdokkaiden jäsennys, arvojen jäsennys, …) portataan suoraan kohteeseen PHP, ja ne sijaitsevat lähdekoodin vieressä `*.test.php`-tiedostoina alkuperäisten rakennetta ja tarkistuksia mukaillen.

Silmukka on **poimi → suorita → varmista**: poimi testit uudelleen nykyisestä TailwindCSS-viitteestä, suorita sarja, ja poikkeamat aiheuttavat virheen. Näin porttaus pysyy ajan tasalla alkupään projektin kanssa, ja TailwindCSSn päivitys voidaan validoida mekaanisesti tarkastelun sijaan. Poikkeama aiheuttaa virheen CI:ssä.

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

Julkaisun 1.7.0 (TailwindCSS v4.3.3-viite) yhteydessä läpäistään **4,427 testiä**:

| Sarja | Testit | Lähde |
|-------|-------|--------|
| Poimitut TailwindCSS-sarjat (apufunktiot 706, variantit 164, index 148, css-functions 64, `ui.spec` 68) | 1,150 | poimittu lähteistä `.test.ts` / `.spec.ts` |
| API-kattavuus (apufunktiot, muuntimet, variantit, direktiivit, lisäosat, tuonnit, `@source`, välimuisti, julkiset APIt) | 2,252 | `tests/` |
| Lähdekoodin viereiset yksikkötestit (jäsennin, AST, ehdokkaat, teema, apufunktiot, valitsinjäsennin, lightningcss-muunnokset, pienentäjä) | 767 | `*.test.php`-porttaukset ja PHP-kohtaiset testit |
| CLI (argumenttien jäsennys, tulosteet, koontiversiot) | 84 | `tests/Cli*Test.php` |
| Lisäosaporttaukset (typografia, lomakkeet) | 45 | `*.test.php` lisäosien vieressä |
| Kumppanikirjastot (clsx, tailwind-merge, CVA) | 129 | viitesarjat |

## Koodin laatu

Muotoilu ja staattinen analyysi suoritetaan Composer-skripteillä:

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

PHPStan suoritetaan tasolla 4 (`phpstan.neon`), ja käytössä on lyhyt luettelo ohitettavia malleja funktionaalisen arkkitehtuurin käyttämille dynaamisille taulukkorakenteille. Kaikki lähdetiedostot analysoidaan, mutta testitiedostot jätetään pois.

Katso [Arkkitehtuuri](https://tailwindphp.inline0.dev/fi/docs/advanced/architecture), jossa kuvataan testien varmistama rakenne ja kirjataan poikkeamat.
