
# Ydeevne og test

TailwindPHP prioriterer korrekthed. Når en ændring specifik for PHP øger hastigheden uden at ændre output, indføres den og markeres som `@port-deviation:performance`. Paritet med TailwindCSS antages ikke — den verificeres løbende mod Tailwinds egen testsuite.

## Ydeevne

PHP-porteringen prioriterer at matche TailwindCSSs output over rå gennemløbshastighed, og den oprindelige TypeScript er stadig hurtigere — V8s JIT kompilerer de mest brugte kodeveje til native kode på en måde, som PHP ikke kan matche. Ved generering af CSS pr. forespørgsel eller side kan du genbruge én compiler (se [generateExact()](https://tailwindphp.inline0.dev/da/docs/api#accumulating-vs-exact-generation)) og gemme dens opbygningstilstand med [`stateCacheFile`](https://tailwindphp.inline0.dev/da/docs/advanced/caching#compiler-state-cache).

Nogle få mest brugte kodeveje har håndoptimeringer, der **bevarer identisk output**:

- **`ast.php` `toCss()`** — samler fragmenter i et array og `implode`er én gang i stedet for gentagen strengsammenkædning, og bruger forudberegnede indrykningsstrenge.
- **`css-parser.php`** — sammenligner tegn direkte i stedet for at gå gennem `ord()` og holder styr på bufferlængder i stedet for at genberegne `strlen()`.

Begge er dokumenteret med `@port-deviation:performance` og kontrolleres mod testsuiten — de kan ikke ændre det genererede CSS.

### Benchmarks

Mappen `benchmarks/` indeholder et sammenligningsværktøj. Kør det med:

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

Eksempelresultater på PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

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

TypeScript er hurtigere til disse lavniveauoperationer, som forventet. Til generering af CSS for en hel side — det faktiske anvendelsesområde — er PHPs ydeevne tilstrækkelig (omkring 14 ms pr. side i testkørslen). Ved gentagne, identiske input fjerner [filcachen](https://tailwindphp.inline0.dev/da/docs/advanced/caching) omkostningen helt.

## Test og paritet

Testene skal sikre, at PHP-porteringen giver samme output som TailwindCSS. To metoder supplerer hinanden.

**1. Udtrækningsbaserede tests.** Scripts i `test-coverage/` fortolker TailwindCSSs egne `.test.ts`-filer og udtrækker testtilfældene til JSON. Derefter sender PHPUnit tilfældene gennem TailwindPHP og sammenligner outputtet med den forventede CSS. Forventningerne kommer direkte fra upstream, så enhver afvigelse i PHPs adfærd medfører en fejl. Testene dækker de komplekse områder: hjælpeprogrammer, varianter, integration, funktionerne CSS og browserens `ui.spec`-tests.

**2. Håndporterede enhedstests.** Enklere TypeScript-testfiler (AST, CSS-fortolkning, escaping, kandidatanalyse, værdianalyse, …) porteres direkte til PHP og ligger ved siden af deres kilde som `*.test.php`, med samme struktur og kontroller som originalerne.

Processen er **udtræk → kør → verificer**: udtræk på ny fra den aktuelle reference TailwindCSS, kør testsuiten, og enhver afvigelse medfører fejl. Sådan holdes porteringen synkroniseret med upstream, og en opdatering af TailwindCSS kan valideres automatisk i stedet for ved gennemgang. Afvigelser får CI til at fejle.

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

Der er **4,427 beståede tests** fra og med udgivelse 1.7.0 (referencen TailwindCSS v4.3.3):

| Suite | Tests | Kilde |
|-------|-------|--------|
| Udtrukne TailwindCSS-suiter (hjælpefunktioner 706, varianter 164, indeks 148, css-funktioner 64, `ui.spec` 68) | 1,150 | udtrukket fra `.test.ts` / `.spec.ts` |
| API-dækning (hjælpefunktioner, modifikatorer, varianter, direktiver, plugins, importer, `@source`, caching, offentligt API) | 2,252 | `tests/` |
| Enhedstests ved siden af kilden (parser, AST, kandidater, tema, hjælpefunktioner, selector-parser, lightningcss-transformationer, minifier) | 767 | `*.test.php`-porte og tests specifikke for PHP |
| CLI (argumentparsing, output, builds) | 84 | `tests/Cli*Test.php` |
| Plugin-porte (typografi, formularer) | 45 | `*.test.php` ved siden af plugins |
| Tilhørende biblioteker (clsx, tailwind-merge, CVA) | 129 | referencesuiter |

## Kodekvalitet

Formatering og statisk analyse køres via Composer-scripts:

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

PHPStan køres på niveau 4 (`phpstan.neon`) med en kort liste over mønstre, der ignoreres for de dynamiske arraystrukturer, som den funktionsbaserede arkitektur bruger. Alle kildefiler analyseres; testfiler udelades.

Se [Arkitektur](https://tailwindphp.inline0.dev/da/docs/advanced/architecture) for at få mere at vide om strukturen, disse tests verificerer, og hvor afvigelser registreres.
