def test_fmap_rope(self):
     test = create_rope_from_map({
         "text": "3",
         "left": {
             "text": "a"
         },
         "right": {
             "text": "5",
             "left": {
                 "text": "b"
             },
             "right": {
                 "text": "7",
                 "left": {
                     "text": "c"
                 },
                 "right": {
                     "text": "d"
                 },
             },
         },
     })
     test_upper = create_rope_from_map({
         "text": "3",
         "left": {
             "text": "A"
         },
         "right": {
             "text": "5",
             "left": {
                 "text": "B"
             },
             "right": {
                 "text": "7",
                 "left": {
                     "text": "C"
                 },
                 "right": {
                     "text": "D"
                 },
             },
         },
     })
     self.assertEqual(fmap_rope(lambda s: s.upper(), test), test_upper)
 def test_extra_credit_rebalancing(self):
     self.assertEqual(
         rebalance(
             create_rope_from_map({
                 "left": {
                     "text": "a"
                 },
                 "right": {
                     "left": {
                         "text": "b"
                     },
                     "right": {
                         "left": {
                             "text": "c"
                         },
                         "right": {
                             "text": "d"
                         }
                     },
                 },
             })).to_dictionary(),
         {
             "size": 4,
             "left": {
                 "size": 2,
                 "left": {
                     "text": "a"
                 },
                 "right": {
                     "text": "b"
                 }
             },
             "right": {
                 "size": 2,
                 "left": {
                     "text": "c"
                 },
                 "right": {
                     "text": "d"
                 }
             },
         },
     )
 def test_rope_basics(self):
     self.assertEqual(str(create_leaf("test")), "test")
     self.assertEqual(create_leaf("test").size(), 4)
     branch = create_rope_from_map({
         "left": {
             "left": {
                 "text": "t"
             },
             "right": {
                 "text": "e"
             },
         },
         "right": {
             "right": {
                 "text": "st"
             }
         },
     })
     self.assertEqual(str(branch), "test")
     self.assertEqual(branch.size(), 4)
    def test_extra_credit_rebalancing(self):
        self.assertEqual(
            rotate_left(
                create_rope_from_map({
                    "text": "3",
                    "left": {
                        "text": "a"
                    },
                    "right": {
                        "text": "5",
                        "left": {
                            "text": "b"
                        },
                        "right": {
                            "text": "7",
                            "left": {
                                "text": "c"
                            },
                            "right": {
                                "text": "d"
                            },
                        },
                    },
                })).to_dictionary(),
            {
                "text": "5",
                "left": {
                    "text": "3",
                    "left": {
                        "text": "a"
                    },
                    "right": {
                        "text": "b"
                    }
                },
                "right": {
                    "text": "7",
                    "left": {
                        "text": "c"
                    },
                    "right": {
                        "text": "d"
                    }
                },
            },
        )
        self.assertEqual(
            rotate_right(
                create_rope_from_map({
                    "text": "5",
                    "left": {
                        "text": "3",
                        "right": {
                            "text": "b"
                        },
                        "left": {
                            "text": "2",
                            "left": {
                                "text": "d"
                            },
                            "right": {
                                "text": "c"
                            },
                        },
                    },
                    "right": {
                        "text": "a"
                    },
                })).to_dictionary(),
            {
                "text": "3",
                "left": {
                    "text": "2",
                    "left": {
                        "text": "d"
                    },
                    "right": {
                        "text": "c"
                    }
                },
                "right": {
                    "text": "5",
                    "left": {
                        "text": "b"
                    },
                    "right": {
                        "text": "a"
                    }
                },
            },
        )

        balancedTree = {
            "text": "b",
            "left": {
                "text": "a"
            },
            "right": {
                "text": "c"
            }
        }

        self.assertEqual(
            rebalance(
                create_rope_from_map({
                    "text": "c",
                    "left": {
                        "text": "a",
                        "right": {
                            "text": "b"
                        }
                    },
                })).to_dictionary(),
            balancedTree,
        )
        self.assertEqual(
            rebalance(
                create_rope_from_map({
                    "text": "c",
                    "left": {
                        "text": "b",
                        "left": {
                            "text": "a"
                        }
                    },
                })).to_dictionary(),
            balancedTree,
        )
        self.assertEqual(
            rebalance(
                create_rope_from_map({
                    "text": "a",
                    "right": {
                        "text": "b",
                        "right": {
                            "text": "c"
                        }
                    },
                })).to_dictionary(),
            balancedTree,
        )
        self.assertEqual(
            rebalance(
                create_rope_from_map({
                    "text": "a",
                    "right": {
                        "text": "c",
                        "left": {
                            "text": "b"
                        }
                    },
                })).to_dictionary(),
            balancedTree,
        )
def create_leaf(text):
    return create_rope_from_map({"text": text})