import random
from enigma_sim import crypt, A
from enigma.machine import EnigmaMachine  # py-enigma (implémentation indépendante)
# 1) vecteur classique
assert crypt("AAAAA", ["I","II","III"], "AAA", "AAA") == "BDZGO"
# 2) message réel : opération Barbarossa, 7 juillet 1941 (partie 1)
c = "EDPUDNRGYSZRCXNUYTPOMRMBOFKTBZREZKMLXLVEFGUEYSIOZVEQMIKUBPMMYLKLTTDEISMDICAGYKUACTCDOMOHWXMUUIAUBSTSLRNBZSZWNRFXWFYSSXJZVIJHIDISHPRKLKAYUPADTXQSPINQMATLPIFSVKDASCTACDPBOPVHJK"
p = crypt(c, ["II","IV","V"], "BUL", "BLA", "AV BS CG DL FU HZ IN KM OW RX")
print("Barbarossa:", p[:60]); assert p.startswith("AUFKLXABTEILUNGXVONXKURTINOWAXKURTINOWAXNORDWESTLXSEBEZ")
# 3) 2000 clés aléatoires comparées à py-enigma
rng = random.Random(1)
for _ in range(2000):
    rot = rng.sample(["I","II","III","IV","V"], 3)
    rings = "".join(rng.choice(A) for _ in range(3)); pos = "".join(rng.choice(A) for _ in range(3))
    letters = rng.sample(A, 20); plugs = " ".join(letters[i]+letters[i+1] for i in range(0,20,2))
    msg = "".join(rng.choice(A) for _ in range(rng.randint(1,300)))
    m = EnigmaMachine.from_key_sheet(rotors=" ".join(rot), reflector="B", ring_settings=[A.index(r) for r in rings], plugboard_settings=plugs)
    m.set_display(pos)
    assert m.process_text(msg) == crypt(msg, rot, rings, pos, plugs)
    assert crypt(crypt(msg, rot, rings, pos, plugs), rot, rings, pos, plugs) == msg
print("OK : BDZGO, Barbarossa 1941, 2000 clés aléatoires identiques à py-enigma, réciprocité")
