counter.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. initial_state = 0
  2. class ActionTypes(object):
  3. SET_STATE = 'counter/SET_STATE'
  4. INCREMENT = 'counter/INCREMENT'
  5. DECREMENT = 'counter/DECREMENT'
  6. class ActionCreators(object):
  7. def set_state(value):
  8. return dict(
  9. type=ActionTypes.SET_STATE,
  10. value=value
  11. )
  12. def increment():
  13. return dict(
  14. type=ActionTypes.INCREMENT
  15. )
  16. def decrement():
  17. return dict(
  18. type=ActionTypes.DECREMENT
  19. )
  20. def reducer (state=None, action=None):
  21. if state is None:
  22. state = initial_state
  23. if not (isinstance(action, dict) and 'type' in action):
  24. return state
  25. if action['type'] == ActionTypes.SET_STATE:
  26. state = action['value']
  27. elif action['type'] == ActionTypes.INCREMENT:
  28. state = state + 1
  29. elif action['type'] == ActionTypes.DECREMENT:
  30. state = state - 1
  31. return state
  32. if __name__ == '__main__':
  33. import unittest
  34. class TestSuite(unittest.TestCase):
  35. def test_action_creators(self):
  36. self.assertEqual(ActionCreators.set_state(12), {'type': 'counter/SET_STATE', 'value': 12})
  37. self.assertEqual(ActionCreators.increment(), {'type': 'counter/INCREMENT'})
  38. self.assertEqual(ActionCreators.decrement(), {'type': 'counter/DECREMENT'})
  39. def test_reducer(self):
  40. self.assertEqual(reducer(None, ActionCreators.set_state(13)), 13)
  41. self.assertEqual(reducer(452, ActionCreators.set_state(13)), 13)
  42. self.assertEqual(reducer(None, ActionCreators.increment()), 1)
  43. self.assertEqual(reducer(341, ActionCreators.increment()), 342)
  44. self.assertEqual(reducer(None, ActionCreators.decrement()), -1)
  45. self.assertEqual(reducer(251, ActionCreators.decrement()), 250)
  46. unittest.main()