Artifact 3d15ff20e76164b83101d0ebb98e6f6c64de1b1b
1 import game;
2 import util;
3
4 interface GameObserver
5 {
6 // this(in Game g);
7 void on_game_changed(char c, in Game g, bool finished);
8 }
9
10 class Driver
11 {
12 this(Game g) { this.game = g; }
13 this(File game_data) { this(new Game(game_data)); }
14
15 void command(char c)
16 {
17 if( finished )
18 return;
19 if( c == 'A' )
20 aborted = true;
21 else
22 game.command(c);
23 foreach(ob; observers)
24 ob.on_game_changed(c, game, finished);
25 }
26
27 T addObserver(T)()
28 {
29 T t = new T(game);
30 observers ~= t;
31 return t;
32 }
33
34 @property bool finished()
35 {
36 return game.cleared || game.dead || aborted;
37 }
38
39 private:
40 Game game;
41 GameObserver[] observers;
42 bool aborted = false;
43 }
44
45 unittest
46 {
47 static class MockGame : Game {
48 this() { super(null,null,null); }
49 string log;
50 void command(char c) { log ~= c; }
51 }
52 static class MockObserver : GameObserver {
53 string log;
54 this(in Game g) {}
55 void on_game_changed(char c, in Game g, bool fin) { log~=c; if(fin)log~="$"; }
56 }
57
58 auto g = new MockGame;
59 auto d = new Driver(g);
60 auto o = d.addObserver!MockObserver();
61 foreach(char c; "UDLRSAUDLRSA")
62 d.command(c);
63 assert(g.log == "UDLRS");
64 assert(o.log == "UDLRSA$");
65 }