1 Instantiating the MiniDraw FrameworkThe HotCiv GUI Instantiating the MiniDraw Framework
2 Henrik Bærbak Christensen[Demo] Ant update AU Henrik Bærbak Christensen
3 The Framework iterationLearning Objectives: Frameworks: Configure/specialize MiniDraw to support HotCiv GUI See MiniDraw as example of a framework See a lot of patterns in action TDD and Stubs You willdevelop the GUI the TDD way Keep focus & take small steps No automated testing though... You willdevelop the GUI based only on stubs Integration testing Last piece of the puzzle: Integrate into GUI SemiCiv AU Henrik Bærbak Christensen
4 Henrik Bærbak ChristensenThe Exercise Sequence Basically TDD iterations 36.37: Observer on Game 36.38: Create a new Drawing that responds to Game state changes using the observer Game → GUI integration [partially solved in CivDrawing!] 36.39: Create a Tool to move units GUI → Game integration 36.40 – 36.44: Create tools to do all the other stuff End of turn, change production, execute unit action, ... i.e. Add features in fast focused iterations... AU Henrik Bærbak Christensen
5 Henrik Bærbak Christensen2014 Additions Now all boilerplate execution code is part of the provided zip AU Henrik Bærbak Christensen
6 Henrik Bærbak ChristensenExample Test ‘EndOfTurnTool’ AU Henrik Bærbak Christensen
7 Make the Tools Context SensitiveLimit the tool’s applicability to the rectangles that actually define what is being clicked GfxConstants.java AU Henrik Bærbak Christensen
8 Patterns for Integration
9 Henrik Bærbak ChristensenThe design Proper design pattern protocols Facade pattern [GUI inform Domain] Observer pattern [Domain inform GUI] only rely on interfaces I can develop the GUI using Stub implementations of the Domain’s Facade and Observer roles Facade = Interface Game Observer = Interface GameListener reuse MiniDraw’s graphical abilities let someone else do the dirty job... AU Henrik Bærbak Christensen
10 GUI Three layers MiniDraw hotciv.view: HotSpotsfor figures, tools, drawing and Drawingview etc CivDrawing Your production code AU Henrik Bærbak Christensen
11 Exercise: Compositional?How does this look, using a compositional approach? CivDrawing AU Henrik Bærbak Christensen
12 Henrik Bærbak ChristensenPresent code… AU Henrik Bærbak Christensen
13 Henrik Bærbak ChristensenCentral Protocol The protocol between GUI and Domain: GUI Domain Facade pattern (Game interface) MVC + Adapter: A tool translates mouse clicks to proper method UnitMoveTool: drag translates into ‘moveUnit’ EndOfTurnTool: click translates into ‘endOfTurn’… GUI Domain Observer pattern (GameObserver interface) Drawing must react upon events from domain worldChangedAt() AU Henrik Bærbak Christensen
14 Henrik Bærbak ChristensenExample: Moving Units Moving units means invoking game’s “moveUnit” The special dSoftArk provided code implements this Civ worldChangedAt boardIterator AU Henrik Bærbak Christensen
15 Henrik Bærbak ChristensenExample: Moving Units Facade Observer worldChangedAt GUI Domain GUI AU Henrik Bærbak Christensen
16 Henrik Bærbak ChristensenCode View Brute-force Brute redrawing AU Henrik Bærbak Christensen
17 Testing without production code?The GUI can be completely developed without any real domain production code no Alpha, ..., Delta, nor SemiCiv Why? Because I program to an interface! Game g = new MyParticularStubForThisIteration(); g.moveUnit( ... ); g.endOfTurn(); AU Henrik Bærbak Christensen
18 Henrik Bærbak ChristensenExample: 36.38 Goal: Implement CivDrawing Responsibility: update graphics upon game state changes A testing tool to trigger game state changes AU Henrik Bærbak Christensen
19 Henrik Bærbak ChristensenDemo: ant update AU Henrik Bærbak Christensen
20 Henrik Bærbak ChristensenTest Stubs Game implementation? Complete façade, has not sub-objects Units: only three moveUnit: only moves red archer… Conclusion: simple code But Sufficient for our sprint goal: to develop the CivDrawing that responds to unit moves, etc. AU Henrik Bærbak Christensen
21 Henrik Bærbak ChristensenTest Stubs Requirement: Enough to test all GUI related behaviour Example Must be able to GUI’s behaviour for illegal moves – therefore some moves must be invalid! AU Henrik Bærbak Christensen
22 Henrik Bærbak ChristensenWhat about TDD Can I develop the GUI by TDD? Yes: Define a test first, like “MapView”: OneStepTest: draw the world… “TestModelUpdate”: see game state changes reflected ... and then implement the proper MiniDraw role implementations that makes this happen! No: I cannot make it automated as I have to visually inspect the result to verify behaviour but manual tests are better than no tests!!! especially when I refactored the damn thing to use MiniDraw instead of JHotDraw !!! AU Henrik Bærbak Christensen