Skip to content

Commit 937a4ed

Browse files
authored
Merge pull request faif#319 from gyermolenko/test_order_randomization
Test order randomization
2 parents 1859623 + c0374ff commit 937a4ed

File tree

4 files changed

+51
-168
lines changed

4 files changed

+51
-168
lines changed

tests/behavioral/test_command.py

Lines changed: 0 additions & 57 deletions
This file was deleted.

tests/behavioral/test_observer.py

Lines changed: 29 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,29 @@
1-
import unittest
2-
from unittest.mock import patch
3-
4-
from patterns.behavioral.observer import Subject, Data, DecimalViewer, HexViewer
5-
6-
7-
class TestSubject(unittest.TestCase):
8-
@classmethod
9-
def setUpClass(cls):
10-
cls.s = Subject()
11-
cls.dec_obs = DecimalViewer()
12-
cls.hex_obs = HexViewer()
13-
14-
def test_a_observer_list_shall_be_empty_initially(cls):
15-
cls.assertEqual(len(cls.s._observers), 0)
16-
17-
def test_b_observers_shall_be_attachable(cls):
18-
cls.s.attach(cls.dec_obs)
19-
cls.assertEqual(isinstance(cls.s._observers[0], DecimalViewer), True)
20-
cls.assertEqual(len(cls.s._observers), 1)
21-
cls.s.attach(cls.hex_obs)
22-
cls.assertEqual(isinstance(cls.s._observers[1], HexViewer), True)
23-
cls.assertEqual(len(cls.s._observers), 2)
24-
25-
def test_c_observers_shall_be_detachable(cls):
26-
cls.s.detach(cls.dec_obs)
27-
# hex viewer shall be remaining if dec viewer is detached first
28-
cls.assertEqual(isinstance(cls.s._observers[0], HexViewer), True)
29-
cls.assertEqual(len(cls.s._observers), 1)
30-
cls.s.detach(cls.hex_obs)
31-
cls.assertEqual(len(cls.s._observers), 0)
32-
33-
34-
class TestData(unittest.TestCase):
35-
@classmethod
36-
def setUpClass(cls):
37-
cls.dec_obs = DecimalViewer()
38-
cls.hex_obs = HexViewer()
39-
cls.sub = Data('Data')
40-
# inherited behavior already tested with TestSubject
41-
cls.sub.attach(cls.dec_obs)
42-
cls.sub.attach(cls.hex_obs)
43-
44-
def test_data_change_shall_notify_all_observers_once(cls):
45-
with patch.object(cls.dec_obs, 'update') as mock_dec_obs_update, patch.object(
46-
cls.hex_obs, 'update'
47-
) as mock_hex_obs_update:
48-
cls.sub.data = 10
49-
cls.assertEqual(mock_dec_obs_update.call_count, 1)
50-
cls.assertEqual(mock_hex_obs_update.call_count, 1)
51-
52-
def test_data_value_shall_be_changeable(cls):
53-
cls.sub.data = 20
54-
cls.assertEqual(cls.sub._data, 20)
55-
56-
def test_data_name_shall_be_changeable(cls):
57-
cls.sub.name = 'New Data Name'
58-
cls.assertEqual(cls.sub.name, 'New Data Name')
1+
from unittest.mock import patch, Mock
2+
3+
import pytest
4+
5+
from patterns.behavioral.observer import Data, DecimalViewer, HexViewer
6+
7+
8+
@pytest.fixture
9+
def observable():
10+
return Data('some data')
11+
12+
def test_attach_detach(observable):
13+
decimal_viewer = DecimalViewer()
14+
assert len(observable._observers) == 0
15+
16+
observable.attach(decimal_viewer)
17+
assert decimal_viewer in observable._observers
18+
19+
observable.detach(decimal_viewer)
20+
assert decimal_viewer not in observable._observers
21+
22+
def test_one_data_change_notifies_each_observer_once(observable):
23+
observable.attach(DecimalViewer())
24+
observable.attach(HexViewer())
25+
26+
with patch('patterns.behavioral.observer.DecimalViewer.update', new_callable=Mock()) as mocked_update:
27+
assert mocked_update.call_count == 0
28+
observable.data = 10
29+
assert mocked_update.call_count == 1

tests/behavioral/test_state.py

Lines changed: 21 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,24 @@
1-
import unittest
1+
import pytest
2+
23
from patterns.behavioral.state import Radio
34

45

5-
class RadioTest(unittest.TestCase):
6-
"""
7-
Attention: Test case results depend on test case execution. The test cases
8-
in this integration test class should be executed in an explicit order:
9-
http://stackoverflow.com/questions/5387299/python-unittest-testcase-execution-order
10-
"""
11-
12-
@classmethod
13-
def setUpClass(self):
14-
self.radio = Radio()
15-
16-
def test_initial_state(self):
17-
state = self.radio.state.name
18-
expected_state_name = 'AM'
19-
self.assertEqual(state, expected_state_name)
20-
21-
def test_initial_am_station(self):
22-
station = self.radio.state.stations[self.radio.state.pos]
23-
expected_station = '1250'
24-
self.assertEqual(station, expected_station)
25-
26-
def test_2nd_am_station_after_scan(self):
27-
self.radio.scan()
28-
station = self.radio.state.stations[self.radio.state.pos]
29-
expected_station = '1380'
30-
self.assertEqual(station, expected_station)
31-
32-
def test_3rd_am_station_after_scan(self):
33-
self.radio.scan()
34-
station = self.radio.state.stations[self.radio.state.pos]
35-
expected_station = '1510'
36-
self.assertEqual(station, expected_station)
37-
38-
def test_am_station_overflow_after_scan(self):
39-
self.radio.scan()
40-
station = self.radio.state.stations[self.radio.state.pos]
41-
expected_station = '1250'
42-
self.assertEqual(station, expected_station)
43-
44-
def test_shall_toggle_from_am_to_fm(self):
45-
self.radio.toggle_amfm()
46-
state = self.radio.state.name
47-
expected_state_name = 'FM'
48-
self.assertEqual(state, expected_state_name)
49-
50-
def test_shall_toggle_from_fm_to_am(self):
51-
self.radio.toggle_amfm()
52-
state = self.radio.state.name
53-
expected_state_name = 'AM'
54-
self.assertEqual(state, expected_state_name)
6+
@pytest.fixture
7+
def radio():
8+
return Radio()
9+
10+
def test_initial_state(radio):
11+
assert radio.state.name == 'AM'
12+
13+
def test_initial_am_station(radio):
14+
initial_pos = radio.state.pos
15+
assert radio.state.stations[initial_pos] == '1250'
16+
17+
def test_toggle_amfm(radio):
18+
assert radio.state.name == 'AM'
19+
20+
radio.toggle_amfm()
21+
assert radio.state.name == 'FM'
22+
23+
radio.toggle_amfm()
24+
assert radio.state.name == 'AM'

tox.ini

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ commands =
1111
flake8 patterns/
1212
; `randomly-seed` option from `pytest-randomly` helps with deterministic outputs for examples like `other/blackboard.py`
1313
pytest --randomly-seed=1234 --doctest-modules patterns/
14-
; `-p no:randomly` turns off `randomly` plugin for unit tests
15-
pytest -s -vv --cov={envsitepackagesdir}/patterns --log-level=INFO -p no:randomly tests/
14+
pytest -s -vv --cov={envsitepackagesdir}/patterns --log-level=INFO tests/
1615

1716

1817
[testenv:cov-report]

0 commit comments

Comments
 (0)