Skip to content

Commit f3ed921

Browse files
committed
test_observer.py
2 parents 01cbdb4 + d2f4adf commit f3ed921

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

test_observer.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
import sys
5+
from io import StringIO
6+
from observer import Subject, Data, DecimalViewer, HexViewer
7+
8+
if sys.version_info < (2, 7):
9+
import unittest2 as unittest
10+
11+
else:
12+
import unittest
13+
14+
from unittest.mock import patch
15+
16+
class TestSubject(unittest.TestCase):
17+
18+
@classmethod
19+
def setUpClass(cls):
20+
cls.s = Subject()
21+
cls.dec_obs = DecimalViewer()
22+
cls.hex_obs = HexViewer()
23+
24+
def test_a_observer_list_shall_be_empty_initially(cls):
25+
cls.assertEqual(len(cls.s._observers), 0)
26+
27+
def test_b_observers_shall_be_attachable(cls):
28+
cls.s.attach(cls.dec_obs)
29+
cls.assertEqual(isinstance(cls.s._observers[0], DecimalViewer), True)
30+
cls.assertEqual(len(cls.s._observers), 1)
31+
cls.s.attach(cls.hex_obs)
32+
cls.assertEqual(isinstance(cls.s._observers[1], HexViewer), True)
33+
cls.assertEqual(len(cls.s._observers), 2)
34+
35+
def test_c_observers_shall_be_detachable(cls):
36+
cls.s.detach(cls.dec_obs)
37+
# hex viewer shall be remaining if dec viewer is detached first
38+
cls.assertEqual(isinstance(cls.s._observers[0], HexViewer), True)
39+
cls.assertEqual(len(cls.s._observers), 1)
40+
cls.s.detach(cls.hex_obs)
41+
cls.assertEqual(len(cls.s._observers), 0)
42+
43+
class TestData(unittest.TestCase):
44+
45+
@classmethod
46+
def setUpClass(cls):
47+
cls.dec_obs = DecimalViewer()
48+
cls.hex_obs = HexViewer()
49+
cls.sub = Data('Data')
50+
#inherited behavior already tested with TestSubject
51+
cls.sub.attach(cls.dec_obs)
52+
cls.sub.attach(cls.hex_obs)
53+
54+
def test_data_change_shall_notify_all_observers_once(cls):
55+
with patch.object(cls.dec_obs, 'update') as mock_dec_obs_update,\
56+
patch.object(cls.hex_obs, 'update') as mock_hex_obs_update:
57+
cls.sub.data = 10
58+
cls.assertEqual(mock_dec_obs_update.call_count, 1)
59+
cls.assertEqual(mock_hex_obs_update.call_count, 1)
60+
61+
def test_data_value_shall_be_changeable(cls):
62+
cls.sub.data = 20
63+
cls.assertEqual(cls.sub._data, 20)
64+
65+
def test_data_name_shall_be_changeable(cls):
66+
cls.sub.name = 'New Data Name'
67+
cls.assertEqual(cls.sub.name, 'New Data Name')
68+
69+
if __name__ == "__main__":
70+
unittest.main()

0 commit comments

Comments
 (0)