def test_compute_references(self): params = { 'pos2ref':[], 'stack':[], 'refKey':'label' } [ self.t1, params ] = TD.preorder_traverse( self.t1, params, XUDiff.compute_references ) [ self.t1, params ] = TD.postorder_traverse( self.t1, params, XUDiff.compute_reference_list ) expected_ref = [ "f.d.a", "f.d.c.b", "f.d.c", "f.d", "f.e", "f" ] for i in range(0, len( params['pos2ref']), 6 ): self.assertEqual( params['pos2ref'][i], expected_ref[i] ) i = i + 1
def test_compute_type_list( self ): params = { 'pos':1, 'pos2type':[] } [ t1, params ] = TD.postorder_traverse( self.t1, params, XUDiff.compute_type_list ) self.assertEqual( len(params['pos2type']), 6 ) expected_types = [ "line", "line", "paragraph", "section", "section", "text" ] for i in range(0, len( params['pos2type'] ) ): self.assertEqual( params['pos2type'][i], expected_types[i] ) i = i + 1
def test_get_lr_keyroots(self): params1 = {"LR_keyroots": {}, "l": []} params2 = {"LR_keyroots": {}, "l": []} [self.t1, params1] = TD.postorder_traverse(self.t1, params1, TD.compute_l) [self.t1, params1] = TD.get_lr_keyroots(self.t1, params1) [self.t2, params2] = TD.postorder_traverse(self.t2, params2, TD.compute_l) [self.t2, params2] = TD.get_lr_keyroots(self.t2, params2) kr1_actual = params1["LR_keyroots"] kr1_expected = [3, 5, 6] kr2_actual = params2["LR_keyroots"] kr2_expected = [2, 5, 6] for i in range(0, 3): self.assertEqual(kr1_actual[i], kr1_expected[i]) self.assertEqual(kr2_actual[i], kr2_expected[i]) # SECOND EXAMPLE params3 = {"LR_keyroots": {}, "l": []} params4 = {"LR_keyroots": {}, "l": []} [self.t3, params3] = TD.postorder_traverse(self.t3, params3, TD.compute_l) [self.t4, params4] = TD.postorder_traverse(self.t4, params4, TD.compute_l) [self.t3, params3] = TD.get_lr_keyroots(self.t3, params3) [self.t4, params4] = TD.get_lr_keyroots(self.t4, params4) kr3_actual = params3["LR_keyroots"] kr3_expected = [2, 4, 5, 7, 8, 9, 10] kr4_actual = params4["LR_keyroots"] kr4_expected = [2, 4, 5, 6, 7] for i in range(0, 7): self.assertEqual(kr3_actual[i], kr3_expected[i]) for i in range(0, 5): self.assertEqual(kr4_actual[i], kr4_expected[i])
def test_compute_labels(self): params1 = {"labels": []} params2 = {"labels": []} [self.t1, params1] = TD.postorder_traverse(self.t1, params1, TD.compute_labels) [self.t2, params2] = TD.postorder_traverse(self.t2, params2, TD.compute_labels) labels1_actual = params1["labels"] labels2_actual = params2["labels"] self.assertEqual(len(labels1_actual), 6) self.assertEqual(len(labels2_actual), 6) labels1_expected = ["a", "b", "c", "d", "e", "f"] labels2_expected = ["a", "b", "d", "c", "e", "f"] for i in range(0, 6): self.assertEqual(labels1_actual[i], labels1_expected[i]) self.assertEqual(labels2_actual[i], labels2_expected[i]) # SECOND EXAMPLE params3 = {"labels": []} params4 = {"labels": []} [self.t3, params3] = TD.postorder_traverse(self.t3, params3, TD.compute_labels) [self.t4, params4] = TD.postorder_traverse(self.t4, params4, TD.compute_labels) labels3_actual = params3["labels"] labels4_actual = params4["labels"] self.assertEqual(len(labels3_actual), 10) self.assertEqual(len(labels4_actual), 7) labels3_expected = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] labels4_expected = ["a", "b", "f", "g", "h", "i", "j"] for i in range(0, 10): self.assertEqual(labels3_actual[i], labels3_expected[i]) for i in range(0, 7): self.assertEqual(labels4_actual[i], labels4_expected[i])
def test_compute_l(self): params1 = {"l": [], "pos": 1} params2 = {"l": [], "pos": 1} [self.t1, params1] = TD.postorder_traverse(self.t1, params1, TD.set_position_to_id) [self.t1, params1] = TD.postorder_traverse(self.t1, params1, TD.compute_l) [self.t2, params2] = TD.postorder_traverse(self.t2, params2, TD.set_position_to_id) [self.t2, params2] = TD.postorder_traverse(self.t2, params2, TD.compute_l) l1_actual = params1["l"] l2_actual = params2["l"] self.assertEqual(len(l1_actual), 6) self.assertEqual(len(l2_actual), 6) l1_expected = [1, 2, 2, 1, 5, 1] l2_expected = [1, 2, 1, 1, 5, 1] for i in range(0, 6): self.assertEqual(l1_actual[i], l1_expected[i]) self.assertEqual(l2_actual[i], l2_expected[i]) # SECOND EXAMPLE params3 = {"l": [], "pos": 1} params4 = {"l": [], "pos": 1} [self.t3, params3] = TD.postorder_traverse(self.t3, params3, TD.set_position_to_id) [self.t3, params3] = TD.postorder_traverse(self.t3, params3, TD.compute_l) [self.t4, params4] = TD.postorder_traverse(self.t4, params4, TD.set_position_to_id) [self.t4, params4] = TD.postorder_traverse(self.t4, params4, TD.compute_l) l3_actual = params3["l"] l4_actual = params4["l"] self.assertEqual(len(l3_actual), 10) self.assertEqual(len(l4_actual), 7) l3_expected = [1, 2, 3, 4, 3, 6, 7, 8, 6, 1] l4_expected = [1, 2, 3, 4, 5, 3, 1] for i in range(0, 10): self.assertEqual(l3_actual[i], l3_expected[i]) for i in range(0, 7): self.assertEqual(l4_actual[i], l4_expected[i])
def test_compute_treedist(self): # Preprocessing params1 = {"LR_keyroots": {}, "l": [], "labels": []} params2 = {"LR_keyroots": {}, "l": [], "labels": []} # -- Compute labels [self.t1, params1] = TD.postorder_traverse(self.t1, params1, TD.compute_labels) [self.t2, params2] = TD.postorder_traverse(self.t2, params2, TD.compute_labels) # -- Compute l [self.t1, params1] = TD.postorder_traverse(self.t1, params1, TD.compute_l) [self.t2, params2] = TD.postorder_traverse(self.t2, params2, TD.compute_l) # -- Compute LR_keyroots [self.t1, params1] = TD.get_lr_keyroots(self.t1, params1) [self.t2, params2] = TD.get_lr_keyroots(self.t2, params2) # First loop of example i_prime = 1 j_prime = 1 i = params1["LR_keyroots"][i_prime - 1] j = params2["LR_keyroots"][j_prime - 1] self.assertEqual(i, 3) self.assertEqual(j, 2) Tree_dist = numpy.zeros([self.t1["id"], self.t2["id"]]) params = {} params["update_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["insert_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["delete_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["gamma"] = TD.unit_cost params["labels1"] = params1["labels"] params["labels2"] = params2["labels"] params["l1"] = params1["l"] params["l2"] = params2["l"] params["tree_dist"] = Tree_dist params = TD.treedist(i, j, params) self.assertEqual(params["tree_dist"][2 - 1, 2 - 1], 0) # self.assertEqual( params['edit_ops'][ 2 - 1, 2 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 2 - 1, 2 - 1], 0 ) self.assertEqual(params["tree_dist"][3 - 1, 2 - 1], 1) # self.assertEqual( params['edit_ops'][ 3 - 1, 2 - 1 ], TD.delete ) # self.assertEqual( params['edit_cost'][ 3 - 1, 2 - 1 ], 1 ) # Second loop of example i_prime = 1 j_prime = 2 i = params1["LR_keyroots"][i_prime - 1] j = params2["LR_keyroots"][j_prime - 1] self.assertEqual(i, 3) self.assertEqual(j, 5) params["update_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["insert_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["delete_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params = TD.treedist(i, j, params) self.assertEqual(params["tree_dist"][2 - 1, 5 - 1], 1) # self.assertEqual( params['edit_ops'][ 2 - 1, 5 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 2 - 1, 5 - 1 ], 1 ) self.assertEqual(params["tree_dist"][3 - 1, 5 - 1], 2) # self.assertEqual( params['edit_ops'][ 3 - 1, 5 - 1 ], TD.delete ) # self.assertEqual( params['edit_cost'][ 3 - 1, 5 - 1 ], 1 ) # Third loop of example i_prime = 1 j_prime = 3 i = params1["LR_keyroots"][i_prime - 1] j = params2["LR_keyroots"][j_prime - 1] self.assertEqual(i, 3) self.assertEqual(j, 6) params["update_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["insert_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["delete_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params = TD.treedist(i, j, params) self.assertEqual(params["tree_dist"][2 - 1, 1 - 1], 1) # self.assertEqual( params['edit_ops'][ 2 - 1, 1 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 2 - 1, 1 - 1 ], 1 ) self.assertEqual(params["tree_dist"][2 - 1, 3 - 1], 2) # self.assertEqual( params['edit_ops'][ 2 - 1, 3 - 1 ], TD.insert ) # self.assertEqual( params['edit_cost'][ 2 - 1, 3 - 1 ], 1 ) self.assertEqual(params["tree_dist"][2 - 1, 4 - 1], 3) # self.assertEqual( params['edit_ops'][ 2 - 1, 4 - 1 ], TD.insert ) # self.assertEqual( params['edit_cost'][ 2 - 1, 4 - 1 ], 1 ) self.assertEqual(params["tree_dist"][2 - 1, 6 - 1], 5) # self.assertEqual( params['edit_ops'][ 2 - 1, 6 - 1 ], TD.insert ) # self.assertEqual( params['edit_cost'][ 2 - 1, 6 - 1 ], 1 ) self.assertEqual(params["tree_dist"][3 - 1, 1 - 1], 2) # self.assertEqual( params['edit_ops'][ 3 - 1, 1 - 1 ], TD.delete ) # self.assertEqual( params['edit_cost'][ 3 - 1, 1 - 1 ], 1 ) self.assertEqual(params["tree_dist"][3 - 1, 3 - 1], 2) # self.assertEqual( params['edit_ops'][ 3 - 1, 3 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 3 - 1, 3 - 1 ], 1 ) self.assertEqual(params["tree_dist"][3 - 1, 4 - 1], 2) # self.assertEqual( params['edit_ops'][ 3 - 1, 4 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 3 - 1, 4 - 1 ], 0 ) self.assertEqual(params["tree_dist"][3 - 1, 6 - 1], 4) # self.assertEqual( params['edit_ops'][ 3 - 1, 6 - 1 ], TD.insert ) # self.assertEqual( params['edit_cost'][ 3 - 1, 6 - 1 ], 1 ) # Fourth loop of example i_prime = 2 j_prime = 1 i = params1["LR_keyroots"][i_prime - 1] j = params2["LR_keyroots"][j_prime - 1] self.assertEqual(i, 5) self.assertEqual(j, 2) params["update_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["insert_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["delete_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params = TD.treedist(i, j, params) self.assertEqual(params["tree_dist"][5 - 1, 2 - 1], 1) # self.assertEqual( params['edit_ops'][ 5 - 1, 2 - 1], TD.update ) # self.assertEqual( params['edit_cost'][ 5 - 1, 2 - 1 ], 1 ) # Fifth loop of example i_prime = 2 j_prime = 2 i = params1["LR_keyroots"][i_prime - 1] j = params2["LR_keyroots"][j_prime - 1] self.assertEqual(i, 5) self.assertEqual(j, 5) params["update_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["insert_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["delete_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params = TD.treedist(i, j, params) self.assertEqual(params["tree_dist"][5 - 1, 5 - 1], 0) # self.assertEqual( params['edit_ops'][ 5 - 1, 5 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 5 - 1, 5 - 1 ], 0 ) # Sixth loop of example i_prime = 2 j_prime = 3 i = params1["LR_keyroots"][i_prime - 1] j = params2["LR_keyroots"][j_prime - 1] self.assertEqual(i, 5) self.assertEqual(j, 6) params["update_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["insert_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["delete_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params = TD.treedist(i, j, params) self.assertEqual(params["tree_dist"][5 - 1, 1 - 1], 1) # self.assertEqual( params['edit_ops'][ 5 - 1, 1 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 5 - 1, 1 - 1 ], 1 ) self.assertEqual(params["tree_dist"][5 - 1, 3 - 1], 3) # self.assertEqual( params['edit_ops'][ 5 - 1, 3 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 5 - 1, 3 - 1 ], 1 ) self.assertEqual(params["tree_dist"][5 - 1, 4 - 1], 4) # self.assertEqual( params['edit_ops'][ 5 - 1, 4 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 5 - 1, 4 - 1 ], 1 ) self.assertEqual(params["tree_dist"][5 - 1, 6 - 1], 5) # self.assertEqual( params['edit_ops'][ 5 - 1, 6 - 1 ], TD.insert ) # self.assertEqual( params['edit_cost'][ 5 - 1, 6 - 1 ], 1 ) # Seventh loop of example i_prime = 3 j_prime = 1 i = params1["LR_keyroots"][i_prime - 1] j = params2["LR_keyroots"][j_prime - 1] self.assertEqual(i, 6) self.assertEqual(j, 2) params["update_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["insert_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["delete_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params = TD.treedist(i, j, params) self.assertEqual(params["tree_dist"][1 - 1, 2 - 1], 1) # self.assertEqual( params['edit_ops'][ 1 - 1, 2 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 1 - 1, 2 - 1 ], 1 ) self.assertEqual(params["tree_dist"][4 - 1, 2 - 1], 3) # self.assertEqual( params['edit_ops'][ 4 - 1, 2 - 1 ], TD.delete ) # self.assertEqual( params['edit_cost'][ 4 - 1, 2 - 1 ], 1 ) self.assertEqual(params["tree_dist"][6 - 1, 2 - 1], 5) # self.assertEqual( params['edit_ops'][ 6 - 1, 2 - 1 ], TD.delete ) # self.assertEqual( params['edit_cost'][ 6 - 1, 2 - 1 ], 1 ) # Eighth loop of example i_prime = 3 j_prime = 2 i = params1["LR_keyroots"][i_prime - 1] j = params2["LR_keyroots"][j_prime - 1] self.assertEqual(i, 6) self.assertEqual(j, 5) params["update_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["insert_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["delete_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params = TD.treedist(i, j, params) self.assertEqual(params["tree_dist"][1 - 1, 5 - 1], 1) # self.assertEqual( params['edit_ops'][ 1 - 1, 5 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 1 - 1, 5 - 1 ], 1 ) self.assertEqual(params["tree_dist"][4 - 1, 5 - 1], 4) # self.assertEqual( params['edit_ops'][ 4 - 1, 5 - 1 ], TD.delete ) # self.assertEqual( params['edit_cost'][ 4 - 1, 5 - 1 ], 1 ) self.assertEqual(params["tree_dist"][6 - 1, 5 - 1], 5) # self.assertEqual( params['edit_ops'][ 6 - 1, 5 - 1 ], TD.delete ) # self.assertEqual( params['edit_cost'][ 6 - 1, 5 - 1 ], 1 ) # Ninth loop of example i_prime = 3 j_prime = 3 i = params1["LR_keyroots"][i_prime - 1] j = params2["LR_keyroots"][j_prime - 1] self.assertEqual(i, 6) self.assertEqual(j, 6) params["update_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["insert_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params["delete_edit_cost"] = numpy.zeros([self.t1["id"], self.t2["id"]]) params = TD.treedist(i, j, params) self.assertEqual(params["tree_dist"][1 - 1, 1 - 1], 0) # self.assertEqual( params['edit_ops'][ 1 - 1, 1 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 1 - 1, 1 - 1 ], 0 ) self.assertEqual(params["tree_dist"][4 - 1, 1 - 1], 3) # self.assertEqual( params['edit_ops'][ 4 - 1, 1 - 1 ], TD.delete ) # self.assertEqual( params['edit_cost'][ 4 - 1, 1 - 1 ], 1 ) self.assertEqual(params["tree_dist"][6 - 1, 1 - 1], 5) # self.assertEqual( params['edit_ops'][ 6 - 1, 1 - 1 ], TD.delete ) # self.assertEqual( params['edit_cost'][ 6 - 1, 1 - 1 ], 1 ) self.assertEqual(params["tree_dist"][1 - 1, 3 - 1], 2) # self.assertEqual( params['edit_ops'][ 1 - 1, 3 - 1 ], TD.insert ) # self.assertEqual( params['edit_cost'][ 1 - 1, 3 - 1 ], 1 ) self.assertEqual(params["tree_dist"][4 - 1, 3 - 1], 1) # self.assertEqual( params['edit_ops'][ 4 - 1, 3 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 4 - 1, 3 - 1 ], 0 ) self.assertEqual(params["tree_dist"][6 - 1, 3 - 1], 3) # self.assertEqual( params['edit_ops'][ 6 - 1, 3 - 1 ], TD.delete ) # self.assertEqual( params['edit_cost'][ 6 - 1, 3 - 1 ], 1 ) self.assertEqual(params["tree_dist"][1 - 1, 4 - 1], 3) # self.assertEqual( params['edit_ops'][ 1 - 1, 4 - 1 ], TD.insert ) # self.assertEqual( params['edit_cost'][ 1 - 1, 4 - 1 ], 1 ) self.assertEqual(params["tree_dist"][4 - 1, 4 - 1], 2) # self.assertEqual( params['edit_ops'][ 4 - 1, 4 - 1 ], TD.insert ) # self.assertEqual( params['edit_cost'][ 4 - 1, 4 - 1 ], 1 ) self.assertEqual(params["tree_dist"][6 - 1, 4 - 1], 3) # self.assertEqual( params['edit_ops'][ 6 - 1, 4 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 6 - 1, 4 - 1 ], 1 ) self.assertEqual(params["tree_dist"][1 - 1, 6 - 1], 5) # self.assertEqual( params['edit_ops'][ 1 - 1, 6 - 1 ], TD.insert ) # self.assertEqual( params['edit_cost'][ 1 - 1, 6 - 1 ], 1 ) self.assertEqual(params["tree_dist"][4 - 1, 6 - 1], 4) # self.assertEqual( params['edit_ops'][ 4 - 1, 6 - 1 ], TD.insert ) # self.assertEqual( params['edit_cost'][ 4 - 1, 6 - 1 ], 1 ) self.assertEqual(params["tree_dist"][6 - 1, 6 - 1], 2) # self.assertEqual( params['edit_ops'][ 6 - 1, 6 - 1 ], TD.update ) # self.assertEqual( params['edit_cost'][ 6 - 1, 6 - 1 ], 0 ) expected_tree_dist = numpy.zeros([self.t1["id"], self.t2["id"]]) expected_tree_dist[0, :] = [0, 1, 2, 3, 1, 5] expected_tree_dist[1, :] = [1, 0, 2, 3, 1, 5] expected_tree_dist[2, :] = [2, 1, 2, 2, 2, 4] expected_tree_dist[3, :] = [3, 3, 1, 2, 4, 4] expected_tree_dist[4, :] = [1, 1, 3, 4, 0, 5] expected_tree_dist[5, :] = [5, 5, 3, 3, 5, 2] for i in range(0, self.t1["id"]): for j in range(0, self.t2["id"]): self.assertEqual(params["tree_dist"][i, j], expected_tree_dist[i, j])
def test_postorder_traverse(self): # first we want to do a postorder_traverse that sets IDs as postorder position params1 = {"pos": 1} [self.t1, params1] = TD.postorder_traverse(self.t1, params1, TD.set_position_to_id) self.assertEqual(params1["pos"], 7) self.assertEqual(self.t1["id"], 6) self.assertEqual(self.t1["label"], "f") # children of f self.assertEqual(len(self.t1["children"]), 2) self.assertEqual(self.t1["children"][0]["id"], 4) self.assertEqual(self.t1["children"][0]["label"], "d") self.assertEqual(self.t1["children"][1]["id"], 5) self.assertEqual(self.t1["children"][1]["label"], "e") # children of D self.assertEqual(len(self.t1["children"][0]["children"]), 2) self.assertEqual(self.t1["children"][0]["children"][0]["id"], 1) self.assertEqual(self.t1["children"][0]["children"][0]["label"], "a") self.assertEqual(self.t1["children"][0]["children"][1]["id"], 3) self.assertEqual(self.t1["children"][0]["children"][1]["label"], "c") # children of A self.assertEqual(len(self.t1["children"][0]["children"][0]["children"]), 0) # children of C self.assertEqual(len(self.t1["children"][0]["children"][1]["children"]), 1) self.assertEqual(self.t1["children"][0]["children"][1]["children"][0]["id"], 2) self.assertEqual(self.t1["children"][0]["children"][1]["children"][0]["label"], "b") # children of B self.assertEqual(len(self.t1["children"][0]["children"][1]["children"][0]["children"]), 0) params2 = {"pos": 1} [self.t2, params2] = TD.postorder_traverse(self.t2, params2, TD.set_position_to_id) self.assertEqual(params2["pos"], 7) self.assertEqual(self.t2["id"], 6) self.assertEqual(self.t2["label"], "f") # children of f self.assertEqual(len(self.t2["children"]), 2) self.assertEqual(self.t2["children"][0]["id"], 4) self.assertEqual(self.t2["children"][0]["label"], "c") self.assertEqual(self.t2["children"][1]["id"], 5) self.assertEqual(self.t2["children"][1]["label"], "e") # children of c self.assertEqual(len(self.t2["children"][0]["children"]), 1) self.assertEqual(self.t2["children"][0]["children"][0]["id"], 3) self.assertEqual(self.t2["children"][0]["children"][0]["label"], "d") # children of e self.assertEqual(len(self.t2["children"][1]["children"]), 0) # children of d self.assertEqual(len(self.t2["children"][0]["children"][0]["children"]), 2) self.assertEqual(self.t2["children"][0]["children"][0]["children"][0]["id"], 1) self.assertEqual(self.t2["children"][0]["children"][0]["children"][0]["label"], "a") self.assertEqual(self.t2["children"][0]["children"][0]["children"][1]["id"], 2) self.assertEqual(self.t2["children"][0]["children"][0]["children"][1]["label"], "b") # children of a self.assertEqual(len(self.t2["children"][0]["children"][0]["children"][0]["children"]), 0) # children of b self.assertEqual(len(self.t2["children"][0]["children"][0]["children"][1]["children"]), 0) # SECOND EXAMPLE params3 = {"pos": 1} [self.t3, params3] = TD.postorder_traverse(self.t3, params3, TD.set_position_to_id) self.assertEqual(params3["pos"], 11) self.assertEqual(self.t3["id"], 10) self.assertEqual(self.t3["label"], "j") self.assertEqual(len(self.t3["children"]), 4) params4 = {"pos": 1} [self.t4, params4] = TD.postorder_traverse(self.t4, params4, TD.set_position_to_id) self.assertEqual(params4["pos"], 8) self.assertEqual(self.t4["id"], 7) self.assertEqual(self.t4["label"], "j") self.assertEqual(len(self.t4["children"]), 3)