
# Prestaties en tests

TailwindPHP geeft prioriteit aan juistheid. Waar een wijziging specifiek voor PHP de prestaties verbetert zonder de uitvoer te veranderen, wordt die toegepast en gemarkeerd als `@port-deviation:performance`. Overeenkomst met TailwindCSS wordt niet verondersteld, maar voortdurend gecontroleerd met de eigen testsuite van Tailwind.

## Prestaties

De PHP-port geeft voorrang aan uitvoer die overeenkomt met die van TailwindCSS boven pure doorvoersnelheid, en de originele TypeScript blijft hoe dan ook sneller — de JIT van V8 compileert de drukst gebruikte codepaden naar native code, iets wat PHP niet kan evenaren. Als CSS per verzoek of pagina wordt gegenereerd, hergebruik dan één compiler (zie [generateExact()](https://tailwindphp.inline0.dev/nl/docs/api#accumulating-vs-exact-generation)) en bewaar de initialisatiestatus met [`stateCacheFile`](https://tailwindphp.inline0.dev/nl/docs/advanced/caching#compiler-state-cache).

Enkele druk gebruikte codepaden zijn handmatig geoptimaliseerd, waarbij de **uitvoer identiek blijft**:

- **`ast.php` `toCss()`** — verzamelt fragmenten in een array en `implode` ze één keer, in plaats van strings herhaaldelijk samen te voegen, en gebruikt vooraf berekende inspringstrings.
- **`css-parser.php`** — vergelijkt tekens rechtstreeks in plaats van via `ord()`, en houdt bufferlengtes bij in plaats van `strlen()` telkens opnieuw te berekenen.

Beide zijn gedocumenteerd met `@port-deviation:performance` en afhankelijk gemaakt van de testsuite — ze kunnen de gegenereerde CSS niet veranderen.

### Benchmarks

De map `benchmarks/` bevat een vergelijkingsscript. Voer het zo uit:

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

Voorbeeldresultaten op PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

| Benchmark | PHP | TypeScript |
|-----------|-----|------------|
| `css-parser` op preflight.css | ~816 ops/s | ~15.45K ops/s (≈20× sneller) |
| `toCss` | ~65.85K ops/s | ~2.59M ops/s (≈39× sneller) |

TypeScript is sneller voor deze low-levelbewerkingen, zoals verwacht. Voor het genereren van CSS voor een volledige pagina — het daadwerkelijke gebruik — zijn de prestaties van PHP toereikend (ongeveer 14 ms per pagina in de voorbeeldrun). Bij herhaalde identieke invoer neemt de [ bestandscache](https://tailwindphp.inline0.dev/nl/docs/advanced/caching) de kosten volledig weg.

## Tests en overeenkomst

Tests garanderen dat de PHP-port dezelfde uitvoer produceert als TailwindCSS. Twee benaderingen vullen elkaar aan.

**1. Tests op basis van extractie.** Scripts in `test-coverage/` parsen de eigen `.test.ts`-bestanden van TailwindCSS en halen de testgevallen eruit naar JSON. PHPUnit voert die gevallen vervolgens uit via TailwindPHP en vergelijkt de uitvoer met de verwachte CSS. Omdat de verwachtingen rechtstreeks uit de upstream-bron komen, leidt elke afwijking in het gedrag van PHP tot een fout. Deze tests dekken de complexe onderdelen: hulpfuncties, varianten, integratie, functies van CSS en browsertests op het niveau van `ui.spec`.

**2. Handmatig geporteerde unittests.** Eenvoudigere TypeScript-testbestanden (AST, CSS-parsing, escaping, het parsen van kandidaten en waarden, …) worden rechtstreeks naar PHP geporteerd en staan naast hun broncode als `*.test.php`. Daarbij volgen ze de structuur en beweringen van de oorspronkelijke tests.

De cyclus is **extraheren → uitvoeren → controleren**: extraheer opnieuw uit de actuele TailwindCSS-referentie, voer de testsuite uit en elke afwijking leidt tot een fout. Zo blijft de port synchroon met de upstream-bron en kan een update van TailwindCSS mechanisch worden gevalideerd in plaats van handmatig geïnspecteerd. Afwijkingen laten de CI mislukken.

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

Er zijn 4,427 tests geslaagd volgens release 1.7.0 (referentie TailwindCSS v4.3.3):

| Suite | Tests | Bron |
|-------|-------|--------|
| Geëxtraheerde TailwindCSS-suites (hulpfuncties 706, varianten 164, index 148, css-functions 64, `ui.spec` 68) | 1,150 | geëxtraheerd uit `.test.ts` / `.spec.ts` |
| API-dekking (hulpfuncties, modifiers, varianten, richtlijnen, plugins, imports, `@source`, caching, publieke API) | 2,252 | `tests/` |
| Unittests naast de broncode (parser, AST, kandidaten, thema, hulpfuncties, selectorparser, lightningcss-transformaties, minifier) | 767 | `*.test.php`-ports en PHP-specifieke tests |
| CLI (argumentparsing, uitvoer, builds) | 84 | `tests/Cli*Test.php` |
| Plugin-ports (typography, forms) | 45 | `*.test.php` naast de plugins |
| Companion libraries (clsx, tailwind-merge, CVA) | 129 | referentiesuites |

## Codekwaliteit

Opmaak en statische analyse worden uitgevoerd met scripts van 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 draait op niveau 4 (`phpstan.neon`), met een korte lijst genegeerde patronen voor de dynamische arraystructuren die de functiegebaseerde architectuur gebruikt. Alle bronbestanden worden geanalyseerd; testbestanden zijn uitgesloten.

Zie [Architectuur](https://tailwindphp.inline0.dev/nl/docs/advanced/architecture) voor de structuur die deze tests controleren en waar afwijkingen worden vastgelegd.
