
## Tests fonctionnels simples : shell direct

```bash
printf 'force\nsetboard ... w - - 0 1\ngo\nquit\n' | ./xboard-engine-tactical 2>&1
```

C'est ce que j'utilise pour presque tous les scénarios ponctuels (mat en 1, position piège, etc.) — rapide à écrire, facile à relire dans les résultats.

## Mesure de temps : Python, pas `time`

J'ai découvert tôt dans ce projet que la commande `time` n'est pas installée dans mon environnement. Du coup, pour chronométrer, j'utilise systématiquement `python3 -c "..."` avec `subprocess.run()` et `time.time()` avant/après :

```python
t0=time.time()
r = subprocess.run(['./xboard-engine-tactical'], input=cmds.encode(), stdout=subprocess.PIPE, timeout=5)
print('elapsed:', time.time()-t0)
```

## Simulation de vraies parties : deux processus en parallèle

Pour valider en conditions réelles (pas juste des positions isolées), j'écris de petits scripts Python qui lancent **deux instances du moteur** via `subprocess.Popen`, et fais transiter les coups de l'un vers l'autre exactement comme le ferait cutechess.

## Mesure de temps sur une position donnée

```python
import subprocess, time
t0 = time.time()
r = subprocess.run(
    ['./xboard-engine-tactical'],
    input=b'new\ngo\nquit\n',
    stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=5
)
print('elapsed:', round(time.time() - t0, 3), 's ->', r.stdout.decode().strip())
print([l for l in r.stderr.decode().splitlines() if 'search' in l])
```

## Même mesure, répétée sur plusieurs positions

```python
import subprocess, time
for label, fen in [
    ('depart', 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'),
    ('finale', '1n4k1/5p2/8/7Q/8/8/P3K3/8 w - - 0 1'),
]:
    t0 = time.time()
    r = subprocess.run(
        ['./xboard-engine-tactical'],
        input=('force\nsetboard ' + fen + '\ngo\nquit\n').encode(),
        stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=5
    )
    print(label, round(time.time() - t0, 3), 's ->',
          r.stdout.decode().strip(),
          [l for l in r.stderr.decode().splitlines() if 'search' in l])
```

## Construction d'une version « avant » pour comparaison directe

C'est celui-ci qui m'a permis de prouver l'effet du bonus positionnel, pas juste l'affirmer : je pars du vrai fichier source, je neutralise le nouveau code par substitution de texte, puis je compile les deux versions séparément.

```python
src = open('xboard-engine-tactical.c').read()

old = "  material = cpmv[curr_e.e_actc] - cpmv[inv_cv[curr_e.e_actc]];\n\n  positional = 0;"
new = "  material = cpmv[curr_e.e_actc] - cpmv[inv_cv[curr_e.e_actc]];\n\n  positional = 0;\n  if (0) {"
assert old in src
src = src.replace(old, new)

old2 = "    };\n\n  return (material + positional);\n}"
new2 = "    };\n  }\n\n  return (material + positional);\n}"
assert old2 in src
src = src.replace(old2, new2, 1)

open('/tmp/no_pos.c', 'w').write(src)
```
