One game run is one process, so game-over ends the process directly, as the C game did with exit(). myExit now restores the terminal (via the new Terminal.Fini) and calls os.Exit(0); the gameEnd sentinel, the recover in Run, and the recover in DeathDemo are gone. Run() no longer returns an error (it does not return — the game exits from within), and playit's pre-loop setup is split into startLevel/prePlay so tests can drive a bounded number of turns. Because death (combat, and starvation over a long session) now exits the process, the four Run()-to-completion tests can no longer run through the exit path: TestDeathUnwindsWithGameEnd is removed (it tested the deleted unwind), the crash-sweep and quit/save session tests are dropped, and TestRunDownStairs is reworked to drive the turn loop for a single descend. Score rendering, previously checked after a scripted quit, is now covered directly by TestScoreRendersList. Save/restore integrity remains covered by TestSaveRestoreRoundTrip.
31 lines
505 B
Go
31 lines
505 B
Go
package game
|
|
|
|
// testTerm is a headless Terminal for tests: rendering is a no-op and
|
|
// input plays a script, then alternates space/newline so that --More--
|
|
// and [Press return] prompts never block.
|
|
type testTerm struct {
|
|
input []byte
|
|
pos int
|
|
tick int
|
|
}
|
|
|
|
func (t *testTerm) Render(*Window) {}
|
|
|
|
func (t *testTerm) Fini() {}
|
|
|
|
func (t *testTerm) ReadChar() byte {
|
|
if t.pos < len(t.input) {
|
|
c := t.input[t.pos]
|
|
t.pos++
|
|
|
|
return c
|
|
}
|
|
|
|
t.tick++
|
|
if t.tick%2 == 0 {
|
|
return '\n'
|
|
}
|
|
|
|
return ' '
|
|
}
|