Skip to content

Commit

Permalink
Add counter controller
Browse files Browse the repository at this point in the history
  • Loading branch information
c-mita committed Jun 20, 2016
1 parent ea3ecea commit c76fd2d
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 0 deletions.
36 changes: 36 additions & 0 deletions malcolm/controllers/countercontroller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from malcolm.core.controller import Controller
from malcolm.core.attribute import Attribute
from malcolm.core.numbermeta import NumberMeta
from malcolm.core.mapmeta import MapMeta
from malcolm.core.method import Method

from pkg_resources import require
require("numpy")
import numpy as np

class CounterController(Controller):

def __init__(self, block):
super(CounterController, self).__init__(block)
self.counter = Attribute("counter",
NumberMeta("counter", "A counter", np.int32))
self.counter.set_value(0)

def _reset(self):
self.counter.set_value(0)

def _increment(self):
self.counter.set_value(self.counter.value + 1)

def create_methods(self):
increment = Method("increment", "increment the counter")
increment.set_function(self._increment)
increment.set_function_takes(MapMeta("takes"))
increment.set_function_returns(MapMeta("returnes"))
yield increment

reset = Method("reset", "reset the counter")
reset.set_function(self._reset)
reset.set_function_takes(MapMeta("takes"))
reset.set_function_returns(MapMeta("returnes"))
yield reset
50 changes: 50 additions & 0 deletions tests/test_controllers/test_countercontroller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import unittest

from . import util
from mock import Mock

from malcolm.controllers.countercontroller import CounterController


class TestCounterController(unittest.TestCase):
def test_init(self):
block = Mock()
c = CounterController(block)
self.assertIs(block, c.block)
self.assertEquals(2, len(block.add_method.call_args_list))
method_1 = block.add_method.call_args_list[0][0][0]
method_2 = block.add_method.call_args_list[1][0][0]
self.assertEquals("increment", method_1.name)
self.assertEquals(c._increment, method_1.func)
self.assertEquals("reset", method_2.name)
self.assertEquals(c._reset, method_2.func)

def test_increment_increments(self):
c = CounterController(Mock())
self.assertEquals(0, c.counter.value)
c._increment()
self.assertEquals(1, c.counter.value)
c._increment()
self.assertEquals(2, c.counter.value)

def test_increment_calls_on_changed(self):
c = CounterController(Mock())
c.counter.on_changed = Mock(side_effect=c.counter.on_changed)
c._increment()
c.counter.on_changed.assert_called_once_with([["value"], 1])

def test_reset_sets_zero(self):
c = CounterController(Mock())
c.counter.value = 1234
c._reset()
self.assertEquals(0, c.counter.value)

def test_reset_calls_on_changed(self):
c = CounterController(Mock())
c.counter.value = 1234
c.counter.on_changed = Mock(side_effect=c.counter.on_changed)
c._reset()
c.counter.on_changed.assert_called_once_with([["value"], 0])

if __name__ == "__main__":
unittest.main(verbosity=2)

0 comments on commit c76fd2d

Please sign in to comment.