Skip to content

Commit b6bf52e

Browse files
authored
Merge pull request #2997 from heplesser/fix-assertdictissubset
Replace assertDictContainsSubset() which has been removed in Python 3.12
2 parents a5f0d71 + 103b270 commit b6bf52e

File tree

4 files changed

+63
-43
lines changed

4 files changed

+63
-43
lines changed

testsuite/pytests/test_helper_functions.py

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,39 @@
1919
# You should have received a copy of the GNU General Public License
2020
# along with NEST. If not, see <http://www.gnu.org/licenses/>.
2121

22-
import unittest
23-
2422
import nest
25-
26-
27-
class TestHelperFunctions(unittest.TestCase):
28-
def test_get_verbosity(self):
29-
verbosity = nest.get_verbosity()
30-
self.assertTrue(isinstance(verbosity, int))
31-
32-
def test_set_verbosity(self):
33-
levels = [
34-
("M_ALL", 0),
35-
("M_DEBUG", 5),
36-
("M_STATUS", 7),
37-
("M_INFO", 10),
38-
("M_DEPRECATED", 18),
39-
("M_WARNING", 20),
40-
("M_ERROR", 30),
41-
("M_FATAL", 40),
42-
("M_QUIET", 100),
43-
]
44-
for level, code in levels:
45-
nest.set_verbosity(level)
46-
verbosity = nest.get_verbosity()
47-
self.assertEqual(verbosity, code)
48-
49-
50-
def suite():
51-
suite = unittest.makeSuite(TestHelperFunctions, "test")
52-
return suite
53-
54-
55-
if __name__ == "__main__":
56-
runner = unittest.TextTestRunner(verbosity=2)
57-
runner.run(suite())
23+
import pytest
24+
import testutil
25+
26+
27+
@pytest.mark.parametrize(
28+
"level, value",
29+
[
30+
("M_ALL", 0),
31+
("M_DEBUG", 5),
32+
("M_STATUS", 7),
33+
("M_INFO", 10),
34+
("M_DEPRECATED", 18),
35+
("M_WARNING", 20),
36+
("M_ERROR", 30),
37+
("M_FATAL", 40),
38+
("M_QUIET", 100),
39+
],
40+
)
41+
def test_set_verbosity(level, value):
42+
nest.set_verbosity(level)
43+
assert nest.get_verbosity() == value
44+
45+
46+
@pytest.mark.parametrize(
47+
"a, b, expected",
48+
[
49+
({}, {}, True),
50+
({}, {"a": 5}, True),
51+
({"a": 5}, {"a": 5}, True),
52+
({"a": 7}, {"a": 5}, False),
53+
({"a": 5, "b": 3}, {"a": 5}, False),
54+
],
55+
)
56+
def test_dict_is_subset(a, b, expected):
57+
assert testutil.dict_is_subset_of(a, b) == expected

testsuite/pytests/test_sp/test_synaptic_elements.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import unittest
2323

2424
import nest
25+
from testutil import dict_is_subset_of
2526

2627
__author__ = "naveau"
2728

@@ -37,7 +38,7 @@ def test_set_status(self):
3738
nest.SetStatus(neuron, {"synaptic_elements": synaptic_element_dict})
3839
neuron_synaptic_elements = nest.GetStatus(neuron, "synaptic_elements")[0]
3940
self.assertIn("SE", neuron_synaptic_elements)
40-
self.assertDictContainsSubset(synaptic_element_dict["SE"], neuron_synaptic_elements["SE"])
41+
self.assertTrue(dict_is_subset_of(synaptic_element_dict["SE"], neuron_synaptic_elements["SE"]))
4142

4243
def test_set_status_overwrite(self):
4344
synaptic_element_dict1 = {"SE1": {"z": 15.0, "growth_curve": "linear"}}
@@ -50,7 +51,7 @@ def test_set_status_overwrite(self):
5051
neuron_synaptic_elements = nest.GetStatus(neuron, "synaptic_elements")[0]
5152
self.assertNotIn("SE1", neuron_synaptic_elements)
5253
self.assertIn("SE2", neuron_synaptic_elements)
53-
self.assertDictContainsSubset(synaptic_element_dict2["SE2"], neuron_synaptic_elements["SE2"])
54+
self.assertTrue(dict_is_subset_of(synaptic_element_dict2["SE2"], neuron_synaptic_elements["SE2"]))
5455

5556
def test_set_defaults(self):
5657
synaptic_element_dict = {"SE": {"z": 15.0, "growth_curve": "linear"}}
@@ -59,7 +60,7 @@ def test_set_defaults(self):
5960
neuron = nest.Create("iaf_psc_alpha", 1)
6061
neuron_synaptic_elements = nest.GetStatus(neuron, "synaptic_elements")[0]
6162
self.assertIn("SE", neuron_synaptic_elements)
62-
self.assertDictContainsSubset(synaptic_element_dict["SE"], neuron_synaptic_elements["SE"])
63+
self.assertTrue(dict_is_subset_of(synaptic_element_dict["SE"], neuron_synaptic_elements["SE"]))
6364

6465
def test_set_defaults_overwrite(self):
6566
synaptic_element_dict1 = {"SE1": {"z": 15.0, "growth_curve": "linear"}}
@@ -72,7 +73,7 @@ def test_set_defaults_overwrite(self):
7273
neuron_synaptic_elements = nest.GetStatus(neuron, "synaptic_elements")[0]
7374
self.assertNotIn("SE1", neuron_synaptic_elements)
7475
self.assertIn("SE2", neuron_synaptic_elements)
75-
self.assertDictContainsSubset(synaptic_element_dict2["SE2"], neuron_synaptic_elements["SE2"])
76+
self.assertTrue(dict_is_subset_of(synaptic_element_dict2["SE2"], neuron_synaptic_elements["SE2"]))
7677

7778

7879
def suite():

testsuite/pytests/test_sp/test_update_synaptic_elements.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import unittest
2323

2424
import nest
25+
from testutil import dict_is_subset_of
2526

2627

2728
class TestUpdateSynapticElements(unittest.TestCase):
@@ -55,8 +56,8 @@ def test_update_synaptic_elements(self):
5556
self.assertIn("Den_ex", neuron_synaptic_elements)
5657
self.assertIn("Axon", neuron_synaptic_elements)
5758

58-
self.assertDictContainsSubset(structural_p_elements["Axon"], neuron_synaptic_elements["Axon"])
59-
self.assertDictContainsSubset(structural_p_elements["Den_ex"], neuron_synaptic_elements["Den_ex"])
59+
self.assertTrue(structural_p_elements["Axon"], neuron_synaptic_elements["Axon"])
60+
self.assertTrue(structural_p_elements["Den_ex"], neuron_synaptic_elements["Den_ex"])
6061

6162
# Update Axon elements
6263
nest.SetStatus(neuron, "synaptic_elements_param", elements_to_update)
@@ -65,9 +66,10 @@ def test_update_synaptic_elements(self):
6566
self.assertIn("Axon", neuron_synaptic_elements)
6667

6768
# Should have been updated
68-
self.assertDictContainsSubset(elements_to_update["Axon"], neuron_synaptic_elements["Axon"])
69+
self.assertTrue(elements_to_update["Axon"], neuron_synaptic_elements["Axon"])
70+
6971
# Should be unchanged
70-
self.assertDictContainsSubset(structural_p_elements["Den_ex"], neuron_synaptic_elements["Den_ex"])
72+
self.assertTrue(structural_p_elements["Den_ex"], neuron_synaptic_elements["Den_ex"])
7173

7274

7375
def suite():

testsuite/pytests/utilities/testutil.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,23 @@ def parameter_fixture(name, default_factory=lambda: None):
3030
return pytest.fixture(autouse=True, name=name)(lambda request: getattr(request, "param", default_factory()))
3131

3232

33+
def dict_is_subset_of(small, big):
34+
"""
35+
Return true if dict `small` is subset of dict `big`.
36+
37+
`small` must contain all keys in `big` with the same values.
38+
"""
39+
40+
# See
41+
# https://stackoverflow.com/questions/20050913/python-unittests-assertdictcontainssubset-recommended-alternative
42+
# https://peps.python.org/pep-0584/
43+
#
44+
# Note: | is **not** a symmetric operator for dicts. `small` must be the second operand to | as it determines
45+
# the value of joint keys in the merged dictionary.
46+
47+
return big == big | small
48+
49+
3350
def isin_approx(A, B, tol=1e-06):
3451
A = np.asarray(A)
3552
B = np.asarray(B)

0 commit comments

Comments
 (0)