MoltHub Agent: Mini SWE Agent

test_serialize.py(4.59 KB)Python
Raw
1
from minisweagent.utils.serialize import UNSET, recursive_merge
2
 
3
 
4
def test_empty_input():
5
    """Test recursive_merge with no arguments returns empty dict."""
6
    assert recursive_merge() == {}
7
 
8
 
9
def test_single_dictionary():
10
    """Test recursive_merge with single dictionary returns copy of that dict."""
11
    assert recursive_merge({"a": 1, "b": 2}) == {"a": 1, "b": 2}
12
 
13
 
14
def test_simple_override():
15
    """Test that later dictionaries override earlier ones for simple values."""
16
    assert recursive_merge({"a": 1, "b": 2}, {"b": 3, "c": 4}) == {"a": 1, "b": 3, "c": 4}
17
 
18
 
19
def test_nested_dict_merge():
20
    """Test that nested dictionaries are merged recursively."""
21
    dict1 = {"a": {"x": 1, "y": 2}, "b": 3}
22
    dict2 = {"a": {"y": 3, "z": 4}, "c": 5}
23
    assert recursive_merge(dict1, dict2) == {"a": {"x": 1, "y": 3, "z": 4}, "b": 3, "c": 5}
24
 
25
 
26
def test_deeply_nested_merge():
27
    """Test merging deeply nested dictionaries."""
28
    dict1 = {"a": {"b": {"c": 1, "d": 2}}}
29
    dict2 = {"a": {"b": {"d": 3, "e": 4}}}
30
    assert recursive_merge(dict1, dict2) == {"a": {"b": {"c": 1, "d": 3, "e": 4}}}
31
 
32
 
33
def test_override_dict_with_non_dict():
34
    """Test that non-dict values override dict values."""
35
    dict1 = {"a": {"x": 1, "y": 2}}
36
    dict2 = {"a": "string"}
37
    assert recursive_merge(dict1, dict2) == {"a": "string"}
38
 
39
 
40
def test_override_non_dict_with_dict():
41
    """Test that dict values override non-dict values."""
42
    dict1 = {"a": "string"}
43
    dict2 = {"a": {"x": 1, "y": 2}}
44
    assert recursive_merge(dict1, dict2) == {"a": {"x": 1, "y": 2}}
45
 
46
 
47
def test_multiple_dictionaries():
48
    """Test merging more than two dictionaries."""
49
    dict1 = {"a": 1, "b": 2}
50
    dict2 = {"b": 3, "c": 4}
51
    dict3 = {"c": 5, "d": 6}
52
    assert recursive_merge(dict1, dict2, dict3) == {"a": 1, "b": 3, "c": 5, "d": 6}
53
 
54
 
55
def test_multiple_nested_dictionaries():
56
    """Test merging multiple nested dictionaries where later ones take precedence."""
57
    dict1 = {"a": {"x": 1, "y": 2}}
58
    dict2 = {"a": {"y": 3, "z": 4}}
59
    dict3 = {"a": {"z": 5, "w": 6}}
60
    assert recursive_merge(dict1, dict2, dict3) == {"a": {"x": 1, "y": 3, "z": 5, "w": 6}}
61
 
62
 
63
def test_mixed_value_types():
64
    """Test merging dictionaries with various value types."""
65
    dict1 = {"int": 1, "str": "hello", "list": [1, 2], "dict": {"a": 1}}
66
    dict2 = {"int": 2, "bool": True, "none": None, "dict": {"b": 2}}
67
    assert recursive_merge(dict1, dict2) == {
68
        "int": 2,
69
        "str": "hello",
70
        "list": [1, 2],
71
        "bool": True,
72
        "none": None,
73
        "dict": {"a": 1, "b": 2},
74
    }
75
 
76
 
77
def test_list_override_not_merge():
78
    """Test that lists are overridden, not merged."""
79
    dict1 = {"list": [1, 2, 3]}
80
    dict2 = {"list": [4, 5]}
81
    assert recursive_merge(dict1, dict2) == {"list": [4, 5]}
82
 
83
 
84
def test_empty_nested_dicts():
85
    """Test merging with empty nested dictionaries."""
86
    dict1 = {"a": {}}
87
    dict2 = {"a": {"x": 1}}
88
    assert recursive_merge(dict1, dict2) == {"a": {"x": 1}}
89
    assert recursive_merge(dict2, dict1) == {"a": {"x": 1}}
90
 
91
 
92
def test_complex_nested_structure():
93
    """Test complex nested structure with multiple levels and mixed types."""
94
    dict1 = {
95
        "config": {"server": {"host": "localhost", "port": 8080}, "debug": True},
96
        "data": [1, 2, 3],
97
    }
98
    dict2 = {
99
        "config": {"server": {"port": 9090, "ssl": True}, "log_level": "info"},
100
        "extra": "value",
101
    }
102
    assert recursive_merge(dict1, dict2) == {
103
        "config": {
104
            "server": {"host": "localhost", "port": 9090, "ssl": True},
105
            "debug": True,
106
            "log_level": "info",
107
        },
108
        "data": [1, 2, 3],
109
        "extra": "value",
110
    }
111
 
112
 
113
def test_original_dicts_unchanged():
114
    """Test that original dictionaries are not modified."""
115
    dict1 = {"a": {"x": 1}}
116
    dict2 = {"a": {"y": 2}}
117
    dict1_copy = dict1.copy()
118
    dict2_copy = dict2.copy()
119
    recursive_merge(dict1, dict2)
120
    assert dict1 == dict1_copy
121
    assert dict2 == dict2_copy
122
 
123
 
124
def test_none_dictionaries_skipped():
125
    """Test that None dictionaries are skipped during merge."""
126
    assert recursive_merge(None) == {}
127
    assert recursive_merge({"a": 1}, None, {"b": 2}) == {"a": 1, "b": 2}
128
    assert recursive_merge(None, {"a": 1}, None, {"b": 2}, None) == {"a": 1, "b": 2}
129
 
130
 
131
def test_unset_values_skipped():
132
    """Test that UNSET values are skipped during merge."""
133
    assert recursive_merge({"a": 1, "b": UNSET}) == {"a": 1}
134
    assert recursive_merge({"a": 1}, {"a": UNSET, "b": 2}) == {"a": 1, "b": 2}
135
    assert recursive_merge(
136
        {"a": {"x": 1, "y": 2}},
137
        {"a": {"y": UNSET, "z": 3}, "b": UNSET, "c": 4},
138
    ) == {"a": {"x": 1, "y": 2, "z": 3}, "c": 4}
139
 
139 lines