feat: story 2 — Characters can Deal Damage to Characters

- Allium spec: damage-and-health.allium
- 5 fast-check properties: damage reduces health, health non-negative,
  death at zero, self-damage forbidden, dead cannot take damage
- Character.createWithHealth factory for testing with arbitrary health
- Character.dealDamage(target, damage) method
This commit is contained in:
2026-06-13 15:28:34 +01:00
parent 75c7c63dda
commit fc2cf73b34
3 changed files with 202 additions and 9 deletions
+49
View File
@@ -0,0 +1,49 @@
-- allium: 3
-- allium: damage-and-health
------------------------------------------------------------
-- Rules
------------------------------------------------------------
rule DamageReducesHealth {
when: Character.dealDamage(attacker, target, damage)
requires: attacker.name != target.name
requires: target.status = alive
ensures: target.health.value = target.health.value - damage
ensures:
if target.health.value - damage <= 0:
target.status = dead
else:
target.status = alive
}
rule SelfDamageForbidden {
when: Character.dealDamage(attacker, target, damage)
requires: attacker.name = target.name
ensures:
target.health.value = target.health.value
target.status = target.status
}
rule DeadCannotTakeDamage {
when: Character.dealDamage(attacker, target, damage)
requires: target.status = dead
ensures:
target.health.value = target.health.value
target.status = dead
}
------------------------------------------------------------
-- Invariants
------------------------------------------------------------
invariant HealthNonNegative {
for c in Characters:
c.health.value >= 0
}
invariant DeathAtZeroHealth {
for c in Characters:
c.health.value = 0 implies c.status = dead
}