
# Testimine

Greph valideeritakse kolme testikihiga:

1. **Ühiktestid** isoleeritud komponentidele (parserid, läbikäijad, kodekid, suvandid).
2. **Võrdlustestide regressioonikogu**, mis võrdleb Greph väljundit kanooniliste `grep`, `ripgrep` ja `ast-grep` binaarfailidega kindla stsenaariumide kogumi põhjal.
3. **Päringupõhine funktsioonimaatriks**, mis kontrollib `rg` ja `sg` ümbrisklasside kinnitatud funktsioone.

CI käivitub iga `main`-i tõuke ja iga tõmbetaotluse (`.github/workflows/ci.yml`) korral. See käivitab koodistandardite kontrolli (`composer cs`), staatilise analüüsi (`composer analyse`), PHPUnit ühik- ja integratsioonitestid (`composer test`) ning `composer audit` versiooniga PHP 8.4. Võrdlustestide kogu (`composer test:oracle`) CI-sse ei kuulu ja funktsioonimaatriks luuakse käsitsi käsuga `php bin/feature-matrix`. PHPUnit testikomplekt sisaldab testi, mis loob maatriksi nii, et ülesvoolu tööriistad `rg` ja `sg` on märgitud kättesaamatuks, ning kontrollib aruande struktuuri, nii et ühe päringu taandareng ei põhjusta testi ebaõnnestumist.

## Töötamine kloonitud hoidlaga

Kõik selle lehe toimingud eeldavad hoidla klooni. Kuna 0.2.3 sisaldab pakett Composer ainult `src/` ja nelja käivitatavat käitusfaili; `tests/`, `scenarios/`, `benchmarks/` ja arendusskriptid kataloogis `bin/` on sealt välja jäetud.

```bash
git clone https://github.com/inline0/greph
cd greph
composer install
```

## Testide käivitamine

```bash
# PHPUnit unit and integration suites
composer test

# Oracle regression corpus
composer test:oracle

# Static analysis
composer analyse

# Coding standards
composer cs
composer cs:fix

# Full release-grade verification (analyse + cs + test + test:oracle)
composer verify
```

`composer verify` on iga väljalaske tingimus. Kui see läbi ei lähe, pole muudatus valmis.

## Võrdlusmudel

Greph järgib võrdluspõhist valideerimismudelit. Iga stsenaariumi puhul käivitatakse kolm käsku:

1. **Võrdlus**: `grep`, `ripgrep` või `ast-grep`, mille väljund jäädvustatakse stsenaariumide kogu põhjal.
2. **Tegelik tulemus**: Greph, mille väljund jäädvustatakse sama kogu põhjal.
3. **Võrdleja**: struktureeritud erinevuste võrdlus, mis kontrollib ridade kaupa või semantilist samaväärsust.

Kui Greph erineb võrdlusest, on Greph vale. Kui `grep` ja `rg` erinevad teineteisest, salvestab stsenaarium erinevuse jaotises `oracle_disagreement`, nimetab tööriista, millele Greph jaotises `greph_follows` järgneb, ning märgib võrdluse teise tööriistaga kui `skip`. Kogus esineb mõlemat suunda.

Tekstistsenaariume võrreldakse `grep` ja `rg`-ga, AST- ja ümberkirjutusstsenaariume aga `sg`-ga. Võrdlusväljund jäädvustatakse üks kord ja salvestatakse iga stsenaariumi kataloogi `oracle/` alla, nii et tavalisel käivitamisel on vaja ainult PHP; väliseid tööriistu läheb vaja üksnes võrdlusväljundi jäädvustamiseks või värskendamiseks.

Teostus asub kataloogis `tests/Oracle/` ja stsenaariumid kataloogides `scenarios/text/`, `scenarios/ast/`, `scenarios/rewrite/` ja `scenarios/edge/`.

## Stsenaariumide struktuur

Iga stsenaarium asub eraldiseisvas kataloogis:

```
scenarios/text/literal-simple/
├── scenario.json     # name, category, pattern, flags, path
├── setup/            # corpus to search through
├── oracle/           # captured oracle output (grep.txt, rg.txt, rg.json, ...)
├── actual/           # captured greph output (generated, git-ignored)
└── reports/          # comparison results (generated, git-ignored)
```

`scenario.json` määrab mustri, lipud ja otsingutee. Valikuline objekt `expectations` määrab iga võrdlusvahendi (`exact`, `semantic` või `skip`) võrdlusrežiimi; selle puudumisel võrreldakse tekstistsenaariumides täpselt `grep` ja `rg` ning semantiliselt `rg` JSON, AST- ja ümberkirjutusstsenaariume aga võrreldakse `sg`-ga.

## Ühe stsenaariumi käivitamine

Hoidlas on väike komplekt CLI-tööriistu üksikute stsenaariumidega töötamiseks. Need on arendustööriistad, mitte käitusaja sisenemispunktid: need asuvad käivitatavate käitusfailide kõrval kataloogis `bin/`, kuid ei kuulu paketti Composer. Iga tööriist võtab stsenaariumi nime, mis on kataloogi `scenarios/` suhtes.

```bash
# Capture oracle output for a scenario (needs grep and rg, or sg)
./bin/oracle text/literal-simple

# Run greph against a scenario, capture its output
./bin/actual text/literal-simple

# Diff oracle vs actual
./bin/compare text/literal-simple

# Full pipeline: oracle (only if missing) -> actual -> compare
./bin/test-scenario text/literal-simple

# Recapture the oracle output first
./bin/test-scenario text/literal-simple --refresh
```

## Kogu regressioonikomplekti käivitamine

```bash
# All scenarios (the same as composer test:oracle)
./bin/test-regression

# Filter by category
./bin/test-regression --category text
./bin/test-regression --category ast
./bin/test-regression --category rewrite
./bin/test-regression --category edge

# Print only failures and the summary
./bin/test-regression --fast

# Recapture every oracle before comparing
./bin/test-regression --refresh
```

Stsenaariumid käivitatakse alati ühekaupa. `--jobs N` aktsepteeritakse ja see kuvatakse kokkuvõtterea, kuid see ei käivita midagi paralleelselt ([#7](https://github.com/inline0/greph/issues/7)). Värskelt kloonitud hoidlas nurjuvad `text/no-ignore` ja `text/explicit-file-input`, sest nende näidisfailid kataloogis `setup/vendor/` pole sisse kantud ([#6](https://github.com/inline0/greph/issues/6)).

Regressioonitestide komplekt on uue käitumise kontrollvärav. Uus lipp, erandjuht või veaparandus nõuab stsenaariumi, mis määrab võrdlusvahendi abil oodatava käitumise.

## Vastavusaruanded

```bash
./bin/verify-compliance
```

`verify-compliance` ei käivita ise midagi. See loeb eelmise stsenaariumide käivituse jäetud võrdlus-, tegeliku tulemuse ja aruandefailid ning kuvab, millised stsenaariumid läbivad kontrolli, millised nurjuvad ja millistel aruanne veel puudub. Käivitage esmalt `./bin/test-regression`. `--output report.json` salvestab aruande ka faili JSON. Kasutage seda käsku, kui soovite teada, „kas praegune haru on väljalaskeks valmis“.

## Testipõhine arendustöövoog

Funktsiooni lisamisel:

1. Looge stsenaariumikataloog korpuse ja lippudega, mis uut käitumist kontrollivad.
2. Jäädvustage kanoonilise tööriista väljund käsuga `./bin/oracle <scenario>`.
3. Teostage funktsioon kataloogis `src/`.
4. Kontrollige käsuga `./bin/test-scenario <scenario>`, et Greph vastab võrdlusele.
5. Veenduge käsuga `./bin/test-regression --fast`, et miski muu pole taandunud.
6. Käivitage `composer verify` enne sissekandmist.

Vea parandamisel:

1. Jäädvustage nurjunud sisend stsenaariumina.
2. Kinnitage, et võrdlusvahend väljastab oodatud tulemuse.
3. Kinnitage, et Greph seda ei tee.
4. Parandage viga.
5. Kinnitage, et Greph vastab nüüd võrdlusele.
6. Käivitage `composer verify`.

Stsenaarium jääb jäädavalt korpusesse, et viga ei saaks tagasi tulla ilma `composer test:oracle` (ja `composer verify`) nurjumiseta.
