テストケースを記述する(3)

Jython で作成した)既存のモジュール hexagon.py を再利用しながら、新たなモジュールの動作を検証するために、テストケースを作成します。

class ExWindow(Window):
    def init(self):
        target = "tabControl", "button",
        self._Controls(target)

        self.items = {}
        for e, mino in TestCase():
            tray = Tray()
            mino.tray = tray
            self.items[e] = mino
            item = TabItem(Header=e)
            self.tabControl.Items.Add(item)            
            panel = Canvas()
            item.Content = panel
            self.addTray(panel, tray)
            self.addMino(panel, mino)

        self.tabControl.SelectionChanged += self.selectionChanged
        self.button.Click += self.click
        self.KeyDown += self.keyDown

ジェネレーター TestCase によって、10種類のテトリミノが得られます。さらに、各テトリミノごとに Tray を用意します。

    def addTray(self, panel, tray):
        for k, tile in tray.leftEdges.items():
            panel.Children.Add(tile.shape)
        for k, tile in tray.rightEdges.items():
            panel.Children.Add(tile.shape)
        for k, tile in tray.tiles.items():
            panel.Children.Add(tile.shape)

Tray を構成する各要素(leftEdges/rightEdges/tiles)をパネルに追加します。

    def keyDown(self, sender, e):
        KeyValues(e.Key).switch({
            Key.Right: self.mino.shiftRight,
            Key.Left : self.mino.shiftLeft,
            Key.Up   : self.mino.counterClockwise,
            Key.Down : self.mino.rotateClockwise,
            })
        self.button.Content = self.state()

矢印キーを選択すると、テトリミノを回転(↓|↑)シフト(←|→)できます。テストケース2と違って、ここでは引数を必要としないメソッド群を呼び出します。

class KeyValues:
    def switch(self, cases):
        for key, f in cases.items():
            if key == self.value:
                f()

押されたキーに対応するアクションを起動します。テストケース2と違って、ここでは引数を必要としないメソッド f を呼び出します。