
# Testler ve git Oracle'ı

Pitmaster, kanonik `git` ikilisini oracle olarak kullanır: `git`, Pitmaster tarafından yazılanı kabul ederse ve Pitmaster, `git` tarafından yazılanı okuyabilirse davranış doğrudur. Test altyapısı Pitmaster deposunda bulunur. Composer paketi yalnızca `src/` ve `bin/pitmaster` içerir; bu nedenle aşağıdaki her şeyi `composer install` işleminden sonra bir klondan çalıştırın.

## Test paketleri

| Komut | Çalıştırdığı | `git` gerekli mi |
|---------|--------------|-------------|
| `composer test:unit` | PHPUnit `unit` paketi: yalıtılmış bileşen testleri | Hayır |
| `composer test:integration` | PHPUnit `integration` paketi: aynı depolarda çalışan Pitmaster ve `git` | Evet |
| `composer test:oracle` | `bin/test-regression`: tüm oracle senaryoları | Evet |
| `composer test` | PHPUnit (her iki paket) ve oracle regresyonu | Evet |
| `./bin/verify-all` | `composer verify`: destek kanıtı, üst akış sapması, kanıt yapıtı, mutasyon duman testi, `composer audit`, PHPStan, kodlama standartları ve `composer test` | Evet |

CI, birim paketini birkaç PHP sürümünde, entegrasyon paketini, oracle regresyonunu (`PITMASTER_TEST_JOBS=4`) ve destek kanıtı ile üst akış sapması denetimlerini çalıştırır.

## Oracle senaryoları

Her senaryo, `scenarios/<category>/` altında bir dizindir (toplam 761; Pitmaster için yazılan 156 ve diğer Git uygulamalardan içe aktarılan 605):

```
scenarios/diff/diff-add-lines/
  scenario.json   # commands and expectations
  setup.sh        # builds the starting repository
  oracle/         # outputs captured from git
```

`scenario.json`, `git` ile çalıştırılacak komutu ve eşdeğer Pitmaster komutunu, ayrıca eşleşmesi gerekenleri belirtir:

```json
{
    "name": "diff-add-lines",
    "category": "diff",
    "operations": ["diff"],
    "oracle_commands": { "diff": "git -c color.ui=never diff" },
    "actual_commands": { "diff": "php \"{{ROOT}}/bin/pitmaster\" diff | perl -pe 's/\\e\\[[0-9;]*m//g'" },
    "expectations": { "exact_match": ["diff"], "fsck_clean": true }
}
```

Bir çalıştırma, `setup.sh` tarafından oluşturulan depoyu kopyalar, oracle ve Pitmaster komutlarını ayrı kopyalarda çalıştırır ve çıktıları, nesneleri, başvuruları ve günlüğü karşılaştırır. `fsck_clean` ayrıca `git fsck` öğesinin Pitmaster tarafından yazılan depoyu kabul etmesini gerektirir. Oracle çıktısı eksikse veya yenileniyorsa `git` üzerinden yakalanır; aksi hâlde commit edilmiş `oracle/` dosyaları kullanılır.

Bir senaryo, kurulumunun oluşturduğu durumları tam olarak kapsar. Örneğin diff senaryoları değiştirilmiş dosyaları karşılaştırır; bu nedenle [Diff](https://pitmaster.inline0.dev/tr/docs/operations/diff) içinde listelenen yeni, silinmiş ve ikili dosyalara ilişkin diff çıktısı farklılıkları bu senaryolarca yakalanmaz.

### Senaryolarla çalışma

```bash
./bin/test-scenario <name>                 # oracle, actual, compare for one scenario
./bin/test-regression                      # all scenarios
./bin/test-regression --jobs 4             # in parallel (or PITMASTER_TEST_JOBS=4)
./bin/test-regression --category diff      # one category
./bin/test-regression --fast               # pass/fail only, no reports

./bin/oracle <name>                        # capture git output for a scenario
./bin/oracle --refresh <name>              # re-capture, for example after a git upgrade
./bin/actual <name>                        # run Pitmaster and capture its output
./bin/compare <name>                       # compare oracle and actual output
```

Birden çok git sürümünü denetlemek için bunları `PITMASTER_TEST_GIT_BINARIES` içinde listeleyin ve duman testini çalıştırın:

```bash
PITMASTER_TEST_GIT_BINARIES=/path/to/git-2.45:/path/to/git-2.46 \
  vendor/bin/phpunit --filter MultiGitVersionSmokeTest
```

## Üst akış derlemleri

`scenarios/upstream/` altındaki senaryolar, diğer uygulamaların test paketlerinden içe aktarılır: git uygulamasının kendi test paketi (412), isomorphic-git (71), libgit2 (63), go-git (46), JGit (7) ve dulwich (6). Gereken fikstür ağaçları `fixtures/upstream/` altında tedarik edilir; böylece tüm derlem yeni bir checkout'ta ağ erişimi veya makineye özgü yollar olmadan çalışır. Kurulum betikleri bunları `PITMASTER_ROOT` ortam değişkeni aracılığıyla bulur.

`composer verify:drift` (`bin/audit-upstream-drift`), tedarik edilen her üst akış durumunun bir senaryoya eşlendiğini denetler.

## Destek matrisi

Depodaki `SUPPORT_MATRIX.md`, kapsama alınan her git özelliği durumuyla birlikte listeler:

| Durum | Anlamı |
|--------|---------|
| `DONE` | Beyan edilen eşdeğerlik kapsamı içinde uygulandı ve oracle ile doğrulandı |
| `PART` | Kısmen uygulandı |
| `TODO` | Kapsam içinde, henüz uygulanmadı |
| `DEFER` | Henüz planlanmadı |
| `N/A` | Kapsam dışında |

Dosya, `config/support-matrix.json` üzerinden `bin/support-matrix` tarafından oluşturulur. `config/support-evidence.json`, her `DONE` ve `PART` satırını somut testlere ve oracle senaryolarına bağlar; `composer verify:evidence` ise bir satırın kanıtı yoksa başarısız olur. CI matrisi yeniden oluşturur ve commit edilmiş dosya farklıysa başarısız olur.

Bir `DONE` satırı, bunun için kaydedilen senaryoların git ile eşleştiği anlamına gelir. Bu senaryoların dışındaki davranışlar yine farklılık gösterebilir; bilinen farklılıklar [sorun izleyicisinde](https://github.com/inline0/pitmaster/issues) takip edilir.

## Kıyaslamalar

Performans çalışmaları, `bench/` altındaki test düzeneğini kullanır:

```bash
composer bench -- --suite=smoke --runs=1 --warmups=0   # quick check
composer bench:baseline                                # full report
composer bench:compare -- <before.json> <after.json>   # compare two reports
composer bench:verify -- <report.json> bench/reports/smoke-thresholds.json
```

CI, duman testi raporunu commit edilmiş eşiklerle doğrular.
