|
6 | 6 |
|
7 | 7 | import pytest
|
8 | 8 |
|
9 |
| -from nipype.utils.misc import container_to_string, str2bool, flatten, unflatten |
| 9 | +from nipype.utils.misc import ( |
| 10 | + container_to_string, |
| 11 | + str2bool, |
| 12 | + flatten, |
| 13 | + unflatten, |
| 14 | + dict_diff, |
| 15 | +) |
10 | 16 |
|
11 | 17 |
|
12 | 18 | def test_cont_to_str():
|
@@ -95,3 +101,43 @@ def test_rgetcwd(monkeypatch, tmpdir):
|
95 | 101 | monkeypatch.delenv("PWD")
|
96 | 102 | with pytest.raises(OSError):
|
97 | 103 | rgetcwd(error=False)
|
| 104 | + |
| 105 | + |
| 106 | +def test_dict_diff(): |
| 107 | + abtuple = [("a", "b")] |
| 108 | + abdict = dict(abtuple) |
| 109 | + |
| 110 | + # Unchanged |
| 111 | + assert dict_diff(abdict, abdict) == "" |
| 112 | + assert dict_diff(abdict, abtuple) == "" |
| 113 | + assert dict_diff(abtuple, abdict) == "" |
| 114 | + assert dict_diff(abtuple, abtuple) == "" |
| 115 | + |
| 116 | + # Changed keys |
| 117 | + diff = dict_diff({"a": "b"}, {"b": "a"}) |
| 118 | + assert "Dictionaries had differing keys" in diff |
| 119 | + assert "keys not previously seen: {'b'}" in diff |
| 120 | + assert "keys not presently seen: {'a'}" in diff |
| 121 | + |
| 122 | + # Trigger recursive uniformization |
| 123 | + complicated_val1 = [{"a": ["b"], "c": ("d", "e")}] |
| 124 | + complicated_val2 = [{"a": ["x"], "c": ("d", "e")}] |
| 125 | + uniformized_val1 = ({"a": ("b",), "c": ("d", "e")},) |
| 126 | + uniformized_val2 = ({"a": ("x",), "c": ("d", "e")},) |
| 127 | + |
| 128 | + diff = dict_diff({"a": complicated_val1}, {"a": complicated_val2}) |
| 129 | + assert "Some dictionary entries had differing values:" in diff |
| 130 | + assert "a: {!r} != {!r}".format(uniformized_val2, uniformized_val1) in diff |
| 131 | + |
| 132 | + # Trigger shortening |
| 133 | + diff = dict_diff({"a": "b" * 60}, {"a": "c" * 70}) |
| 134 | + assert "Some dictionary entries had differing values:" in diff |
| 135 | + assert "a: 'cccccccccc...cccccccccc' != 'bbbbbbbbbb...bbbbbbbbbb'" in diff |
| 136 | + |
| 137 | + # Fail the dict conversion |
| 138 | + diff = dict_diff({}, "not a dict") |
| 139 | + assert diff == ( |
| 140 | + "Diff between nipype inputs failed:\n" |
| 141 | + "* Cached inputs: {}\n" |
| 142 | + "* New inputs: not a dict" |
| 143 | + ) |
0 commit comments