counter.py 1.9 KB

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