@@ -1095,7 +1095,7 @@ def test_shift_nodes_merge_attribute(self):
10951095 ), "Original node children changed"
10961096 assert not len (
10971097 list (search .find_path (self .root_overriding , "a/aa" ).children )
1098- ), "Children of node parent not deleted"
1098+ ), "Original node not deleted"
10991099
11001100 def test_shift_nodes_merge_attribute_update (self ):
11011101 from_paths = ["a/aa/bb" ]
@@ -1125,7 +1125,7 @@ def test_shift_nodes_merge_attribute_update(self):
11251125 ), "Original node children changed"
11261126 assert not len (
11271127 list (search .find_path (self .root_overriding , "a/aa" ).children )
1128- ), "Children of node parent not deleted"
1128+ ), "Original node not deleted"
11291129
11301130 def test_shift_nodes_merge_attribute_children (self ):
11311131 from_paths = ["a/aa/bb" ]
@@ -1158,7 +1158,7 @@ def test_shift_nodes_merge_attribute_children(self):
11581158 ), "Original node children changed"
11591159 assert not len (
11601160 list (search .find_path (self .root_overriding , "a/aa" ).children )
1161- ), "Children of node parent not deleted"
1161+ ), "Original node not deleted"
11621162 assert (
11631163 self .root_overriding ["bb" ]["cc" ].get_attr ("age" ) == 2
11641164 ), "Original attribute of children not updated"
@@ -1369,6 +1369,37 @@ def test_shift_nodes_merge_children_overriding(self):
13691369 list (search .find_path (self .root , "a/aa" ).children )
13701370 ), "Node parent not deleted"
13711371
1372+ # merge_children, merge_attribute
1373+ def test_shift_nodes_merge_children_merge_attribute (self ):
1374+ from_paths = ["a/aa/bb" ]
1375+ to_paths = ["/a/bb" ]
1376+
1377+ # Set attribute for node
1378+ self .root_overriding ["aa" ]["bb" ].set_attrs ({"age" : 2 , "gender" : "b" })
1379+ self .root_overriding ["bb" ].set_attrs ({"age" : 1 , "hello" : "world" })
1380+ modify .shift_nodes (
1381+ self .root_overriding ,
1382+ from_paths ,
1383+ to_paths ,
1384+ merge_attribute = True ,
1385+ merge_children = True ,
1386+ )
1387+ assert (
1388+ self .root_overriding ["bb" ].get_attr ("age" ) == 2
1389+ ), "Original attribute not updated"
1390+ assert (
1391+ self .root_overriding ["bb" ].get_attr ("hello" ) == "world"
1392+ ), "Original attribute not present"
1393+ assert (
1394+ self .root_overriding ["bb" ].get_attr ("gender" ) == "b"
1395+ ), "Merge attribute not present"
1396+ assert (
1397+ len (self .root_overriding ["bb" ].children ) == 2
1398+ ), "Original node children not combined with copied node"
1399+ assert not len (
1400+ list (search .find_path (self .root_overriding , "a/aa" ).children )
1401+ ), "Original node not deleted"
1402+
13721403 # merge_leaves, overriding
13731404 def test_shift_nodes_merge_leaves_overriding (self ):
13741405 new_aa = node .Node ("aa" , parent = self .root )
@@ -1405,6 +1436,53 @@ def test_shift_nodes_merge_leaves_overriding(self):
14051436 list (search .find_path (self .root , "a/aa" ).children )
14061437 ), "Node parent deleted"
14071438
1439+ # merge_leaves, merge_attribute
1440+ def test_shift_nodes_merge_leaves_merge_attribute (self ):
1441+ from_paths = ["a/aa/bb" ]
1442+ to_paths = ["/a/bb" ]
1443+
1444+ # Set attribute for node
1445+ self .root_overriding ["aa" ]["bb" ].set_attrs ({"age" : 2 , "gender" : "b" })
1446+ self .root_overriding ["aa" ]["bb" ]["cc" ].extend (
1447+ [node .Node ("cc2" , age = 2 , gender = "c" )]
1448+ )
1449+ self .root_overriding ["bb" ].set_attrs ({"age" : 1 , "hello" : "world" })
1450+ self .root_overriding ["bb" ]["cc2" ].set_attrs ({"age" : 1 , "hello" : "world" })
1451+ modify .shift_nodes (
1452+ self .root_overriding ,
1453+ from_paths ,
1454+ to_paths ,
1455+ merge_attribute = True ,
1456+ merge_leaves = True ,
1457+ )
1458+ assert (
1459+ self .root_overriding ["bb" ].get_attr ("age" ) == 2
1460+ ), "Original attribute not updated"
1461+ assert (
1462+ self .root_overriding ["bb" ].get_attr ("hello" ) == "world"
1463+ ), "Original attribute not present"
1464+ assert (
1465+ self .root_overriding ["bb" ].get_attr ("gender" ) == "b"
1466+ ), "Merge attribute not present"
1467+ assert (
1468+ len (self .root_overriding ["bb" ].children ) == 2
1469+ ), "Original node children not combined with copied node"
1470+ assert not len (
1471+ list (search .find_path (self .root_overriding , "a/aa" ).children )
1472+ ), "Original node not deleted"
1473+ assert (
1474+ self .root_overriding ["bb" ]["cc2" ].get_attr ("age" ) == 2
1475+ ), "Original attribute of leaf not updated"
1476+ assert (
1477+ self .root_overriding ["bb" ]["cc2" ].get_attr ("hello" ) == "world"
1478+ ), "Original attribute of leaf not present"
1479+ assert (
1480+ self .root_overriding ["bb" ]["cc2" ].get_attr ("gender" ) == "c"
1481+ ), "Merge attribute of leaf not present"
1482+ assert (
1483+ self .root_overriding ["bb" ]["dd" ].get_attr ("age" ) == 2
1484+ ), "New leaf not copied over"
1485+
14081486 # merge_children, merge_leaves
14091487 def test_shift_nodes_merge_children_and_leaf_error (self ):
14101488 a = node .Node ("a" , age = 90 )
0 commit comments