def setUp(self):
     self.rb = RedBlackTree()
     self.fullRB = RedBlackTree()
     
     self.insertList = [47,30,2,6,12,64,62,98,93,95,97,99,3,4,5,7]
     for item in self.insertList:
         self.assertTrue(self.fullRB.insert(item))
     self.result = '(NoneB)<-62B->(6B,93B)\n'\
              '(62B)<-6B->(3R,30R)\n'\
              '(62B)<-93B->(64B,97R)\n'\
              '(6B)<-3R->(2B,4B)\n'\
              '(6B)<-30R->(12B,47B)\n'\
              '(93B)<-64B->(NoneB,NoneB)\n'\
              '(93B)<-97R->(95B,98B)\n'\
              '(3R)<-2B->(NoneB,NoneB)\n'\
              '(3R)<-4B->(NoneB,5R)\n'\
              '(30R)<-12B->(7R,NoneB)\n'\
              '(30R)<-47B->(NoneB,NoneB)\n'\
              '(97R)<-95B->(NoneB,NoneB)\n'\
              '(97R)<-98B->(NoneB,99R)\n'\
              '(4B)<-5R->(NoneB,NoneB)\n'\
              '(12B)<-7R->(NoneB,NoneB)\n'\
              '(98B)<-99R->(NoneB,NoneB)\n'
class TestRedBlackTree(unittest.TestCase):
    
    def setUp(self):
        self.rb = RedBlackTree()
        self.fullRB = RedBlackTree()
        
        self.insertList = [47,30,2,6,12,64,62,98,93,95,97,99,3,4,5,7]
        for item in self.insertList:
            self.assertTrue(self.fullRB.insert(item))
        self.result = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(3R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(NoneB,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        
    def testEmpty(self):
        self.assertEqual(self.rb.outputTesting(),'(Empty)')
        self.assertFalse(self.rb.find(1))
        self.assertEqual(self.rb.findMax(),None)
        self.assertEqual(self.rb.findMin(),None)
        self.assertFalse(self.rb.delete(1))
        self.assertTrue(self.rb.insert(5))
        self.assertEqual(self.rb.outputTesting(),'(NoneB)<-5B->(NoneB,NoneB)\n')
        print("\ntestEmpty PASSED")
        
    def testInsert(self):
        self.assertTrue(self.rb.insert(47))
        string = '(NoneB)<-47B->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(30))
        string = '(NoneB)<-47B->(30R,NoneB)\n'\
                 '(47B)<-30R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
    
        self.assertTrue(self.rb.insert(2))
        string = '(NoneB)<-30B->(2R,47R)\n'\
                 '(30B)<-2R->(NoneB,NoneB)\n'\
                 '(30B)<-47R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
    
        self.assertTrue(self.rb.insert(6))
        string = '(NoneB)<-30B->(2B,47B)\n'\
                 '(30B)<-2B->(NoneB,6R)\n'\
                 '(30B)<-47B->(NoneB,NoneB)\n'\
                 '(2B)<-6R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(12))
        string = '(NoneB)<-30B->(6B,47B)\n'\
                 '(30B)<-6B->(2R,12R)\n'\
                 '(30B)<-47B->(NoneB,NoneB)\n'\
                 '(6B)<-2R->(NoneB,NoneB)\n'\
                 '(6B)<-12R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(64))
        string = '(NoneB)<-30B->(6B,47B)\n'\
                 '(30B)<-6B->(2R,12R)\n'\
                 '(30B)<-47B->(NoneB,64R)\n'\
                 '(6B)<-2R->(NoneB,NoneB)\n'\
                 '(6B)<-12R->(NoneB,NoneB)\n'\
                 '(47B)<-64R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(62))
        string = '(NoneB)<-30B->(6B,62B)\n'\
                 '(30B)<-6B->(2R,12R)\n'\
                 '(30B)<-62B->(47R,64R)\n'\
                 '(6B)<-2R->(NoneB,NoneB)\n'\
                 '(6B)<-12R->(NoneB,NoneB)\n'\
                 '(62B)<-47R->(NoneB,NoneB)\n'\
                 '(62B)<-64R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(98))
        string = '(NoneB)<-30B->(6B,62R)\n'\
                 '(30B)<-6B->(2R,12R)\n'\
                 '(30B)<-62R->(47B,64B)\n'\
                 '(6B)<-2R->(NoneB,NoneB)\n'\
                 '(6B)<-12R->(NoneB,NoneB)\n'\
                 '(62R)<-47B->(NoneB,NoneB)\n'\
                 '(62R)<-64B->(NoneB,98R)\n'\
                 '(64B)<-98R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(93))
        string = '(NoneB)<-30B->(6B,62R)\n'\
                 '(30B)<-6B->(2R,12R)\n'\
                 '(30B)<-62R->(47B,93B)\n'\
                 '(6B)<-2R->(NoneB,NoneB)\n'\
                 '(6B)<-12R->(NoneB,NoneB)\n'\
                 '(62R)<-47B->(NoneB,NoneB)\n'\
                 '(62R)<-93B->(64R,98R)\n'\
                 '(93B)<-64R->(NoneB,NoneB)\n'\
                 '(93B)<-98R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(95))
        string = '(NoneB)<-62B->(30R,93R)\n'\
                 '(62B)<-30R->(6B,47B)\n'\
                 '(62B)<-93R->(64B,98B)\n'\
                 '(30R)<-6B->(2R,12R)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(93R)<-64B->(NoneB,NoneB)\n'\
                 '(93R)<-98B->(95R,NoneB)\n'\
                 '(6B)<-2R->(NoneB,NoneB)\n'\
                 '(6B)<-12R->(NoneB,NoneB)\n'\
                 '(98B)<-95R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(97))
        string = '(NoneB)<-62B->(30R,93R)\n'\
                 '(62B)<-30R->(6B,47B)\n'\
                 '(62B)<-93R->(64B,97B)\n'\
                 '(30R)<-6B->(2R,12R)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(93R)<-64B->(NoneB,NoneB)\n'\
                 '(93R)<-97B->(95R,98R)\n'\
                 '(6B)<-2R->(NoneB,NoneB)\n'\
                 '(6B)<-12R->(NoneB,NoneB)\n'\
                 '(97B)<-95R->(NoneB,NoneB)\n'\
                 '(97B)<-98R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(99))
        string = '(NoneB)<-62B->(30B,93B)\n'\
                 '(62B)<-30B->(6B,47B)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(30B)<-6B->(2R,12R)\n'\
                 '(30B)<-47B->(NoneB,NoneB)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(6B)<-2R->(NoneB,NoneB)\n'\
                 '(6B)<-12R->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(3))
        string = '(NoneB)<-62B->(30B,93B)\n'\
                 '(62B)<-30B->(6R,47B)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(30B)<-6R->(2B,12B)\n'\
                 '(30B)<-47B->(NoneB,NoneB)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(6R)<-2B->(NoneB,3R)\n'\
                 '(6R)<-12B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(2B)<-3R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(4))
        string = '(NoneB)<-62B->(30B,93B)\n'\
                 '(62B)<-30B->(6R,47B)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(30B)<-6R->(3B,12B)\n'\
                 '(30B)<-47B->(NoneB,NoneB)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(6R)<-3B->(2R,4R)\n'\
                 '(6R)<-12B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(3B)<-2R->(NoneB,NoneB)\n'\
                 '(3B)<-4R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(5))
        string = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(3R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(NoneB,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(30R)<-12B->(NoneB,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        self.assertTrue(self.rb.insert(7))
        string = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(3R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(NoneB,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.rb.outputTesting(),string)
        
        print('\ntextInsert PASSED')
        
    def testDFSorder(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        keys = [62,6,3,2,4,5,30,12,7,47,93,64,97,95,98,99]
        self.assertEqual(self.fullRB.traverseDFSpreorder(),keys)
    
        self.insertList.sort(reverse=False)
        self.assertEqual(self.fullRB.traverseDFSinorder(),self.insertList)
        
        keys = [2,5,4,3,7,12,47,30,6,64,95,99,98,97,93,62]
        self.assertEqual(self.fullRB.traverseDFSpostorder(),keys)
        
        print("\ntestDFS(pre&in&post)order PASSED")
    
    def testFind(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        random.shuffle(self.insertList)
        for item in self.insertList:
            self.assertTrue(self.fullRB.find(item))
        
        #FAIL FIND
        failFinds = [x for x in range(0,101)]
        for item in self.insertList:
            if item in failFinds:
                failFinds.remove(item)
        for item in failFinds:
            self.assertFalse(self.fullRB.find(item))
    
        print("\ntestFind PASSED")
        
    def testDuplicateInsert(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        #Duplicate Insert should fail and NOT change the output
        for item in self.insertList:
            self.assertFalse(self.fullRB.insert(item))
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        print("\ntestDuplicateInsert PASSED")
        
    def testCopy(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        copy = self.fullRB.copyTree()
        self.assertEqual(copy.outputTesting(),self.result)
        
        self.assertTrue(self.fullRB.insert(1))
        self.assertTrue(copy.insert(0))
        
        #fullRB after inserting 1
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(3R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(1R,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(2B)<-1R->(NoneB,NoneB)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        #The copy after inserting 0
        newCopy = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(3R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(0R,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(2B)<-0R->(NoneB,NoneB)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        self.assertEqual(copy.outputTesting(),newCopy)
        print("\ntestCopy PASSED")
    
    def testFindMin(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        #Find Min
        self.assertEqual(self.fullRB.findMin(),2)
        
        #Insert New Min
        self.assertTrue(self.fullRB.insert(0))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(3R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(0R,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(2B)<-0R->(NoneB,NoneB)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Find New Min
        self.assertEqual(self.fullRB.findMin(),0)
    
        print("\ntestFindMin PASSED")
        
    def testFindMax(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        #Find Max
        self.assertEqual(self.fullRB.findMax(),99)
        
        #Insert New Max
        self.assertTrue(self.fullRB.insert(100))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(3R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,99B)\n'\
                 '(3R)<-2B->(NoneB,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-99B->(98R,100R)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'\
                 '(99B)<-98R->(NoneB,NoneB)\n'\
                 '(99B)<-100R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Find New Max
        self.assertEqual(self.fullRB.findMax(),100)
        
        print("\ntestFindMax PASSED")
        
    def testDeleteLeaf(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        #Delete does not require rotations or color changes
        self.assertTrue(self.fullRB.delete(99))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(3R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(NoneB,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,NoneB)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Delete does not require rotations or color changes
        self.assertTrue(self.fullRB.delete(7))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(3R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(NoneB,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(30R)<-12B->(NoneB,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,NoneB)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Delete requires rotation and color changes
        self.assertTrue(self.fullRB.delete(2))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(4R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-4R->(3B,5B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(4R)<-3B->(NoneB,NoneB)\n'\
                 '(4R)<-5B->(NoneB,NoneB)\n'\
                 '(30R)<-12B->(NoneB,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Delete requires color changes
        self.assertTrue(self.fullRB.delete(5))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(4B,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-4B->(3R,NoneB)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(4B)<-3R->(NoneB,NoneB)\n'\
                 '(30R)<-12B->(NoneB,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Delete requires color changes
        self.assertTrue(self.fullRB.delete(12))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(4B,30B)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-4B->(3R,NoneB)\n'\
                 '(6B)<-30B->(NoneB,47R)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(4B)<-3R->(NoneB,NoneB)\n'\
                 '(30B)<-47R->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)

        #Delete requires color changes
        self.assertTrue(self.fullRB.delete(98))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(4B,30B)\n'\
                 '(62B)<-93B->(64B,97B)\n'\
                 '(6B)<-4B->(3R,NoneB)\n'\
                 '(6B)<-30B->(NoneB,47R)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97B->(95R,NoneB)\n'\
                 '(4B)<-3R->(NoneB,NoneB)\n'\
                 '(30B)<-47R->(NoneB,NoneB)\n'\
                 '(97B)<-95R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Delete requires color changes and rotations
        self.assertTrue(self.fullRB.delete(64))
        newResult = '(NoneB)<-62B->(6B,95B)\n'\
                 '(62B)<-6B->(4B,30B)\n'\
                 '(62B)<-95B->(93B,97B)\n'\
                 '(6B)<-4B->(3R,NoneB)\n'\
                 '(6B)<-30B->(NoneB,47R)\n'\
                 '(95B)<-93B->(NoneB,NoneB)\n'\
                 '(95B)<-97B->(NoneB,NoneB)\n'\
                 '(4B)<-3R->(NoneB,NoneB)\n'\
                 '(30B)<-47R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Deletes don't require color changes or rotations
        self.assertTrue(self.fullRB.delete(3))
        self.assertTrue(self.fullRB.delete(47))

        #Delete requires color changes
        self.assertTrue(self.fullRB.delete(4))
        newResult = '(NoneB)<-62B->(6B,95R)\n'\
                 '(62B)<-6B->(NoneB,30R)\n'\
                 '(62B)<-95R->(93B,97B)\n'\
                 '(6B)<-30R->(NoneB,NoneB)\n'\
                 '(95R)<-93B->(NoneB,NoneB)\n'\
                 '(95R)<-97B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Delete requires color changes
        self.assertTrue(self.fullRB.delete(97))
        newResult = '(NoneB)<-62B->(6B,95B)\n'\
                 '(62B)<-6B->(NoneB,30R)\n'\
                 '(62B)<-95B->(93R,NoneB)\n'\
                 '(6B)<-30R->(NoneB,NoneB)\n'\
                 '(95B)<-93R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Deletes don't require color changes or rotations
        self.assertTrue(self.fullRB.delete(30))
        self.assertTrue(self.fullRB.delete(93))
        
        #Delete requires color changes
        self.assertTrue(self.fullRB.delete(95))
        newResult = '(NoneB)<-62B->(6R,NoneB)\n'\
                 '(62B)<-6R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Deletes don't require color changes or rotations
        self.assertTrue(self.fullRB.delete(6))
        self.assertTrue(self.fullRB.delete(62))
        
        self.assertEqual(self.fullRB.outputTesting(),'(Empty)')
        
        print("\ntestDeleteLeaf PASSED")
        
    def testDeleteFail(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        #FAIL DELETES (keys not present)
        failDeletes = [x for x in range(0,101)]
        for item in self.insertList:
            if item in failDeletes:
                failDeletes.remove(item)
        for item in failDeletes:
            self.assertFalse(self.fullRB.delete(item))
            
        #Check to make sure tree was not changed
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        #Successfully delete 99
        self.assertTrue(self.fullRB.delete(99))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(3R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(NoneB,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,NoneB)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Try to delete 99 again
        self.assertFalse(self.fullRB.delete(99))
        
        #Check to make sure tree was not changed
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        print("\ntestDeleteFail PASSED")
    
    def testDeleteInternal(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        #Requires a rotation and color changes
        self.assertTrue(self.fullRB.delete(3))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(4R,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-4R->(2B,5B)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(4R)<-2B->(NoneB,NoneB)\n'\
                 '(4R)<-5B->(NoneB,NoneB)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
    
        #Requires color changes
        self.assertTrue(self.fullRB.delete(4))
        newResult = '(NoneB)<-62B->(6B,93B)\n'\
                 '(62B)<-6B->(2B,30R)\n'\
                 '(62B)<-93B->(64B,97R)\n'\
                 '(6B)<-2B->(NoneB,5R)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(2B)<-5R->(NoneB,NoneB)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
    
        #Requires a rotation and color changes
        self.assertTrue(self.fullRB.delete(93))
        newResult = '(NoneB)<-62B->(6B,97B)\n'\
                 '(62B)<-6B->(2B,30R)\n'\
                 '(62B)<-97B->(64B,98B)\n'\
                 '(6B)<-2B->(NoneB,5R)\n'\
                 '(6B)<-30R->(12B,47B)\n'\
                 '(97B)<-64B->(NoneB,95R)\n'\
                 '(97B)<-98B->(NoneB,99R)\n'\
                 '(2B)<-5R->(NoneB,NoneB)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(64B)<-95R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
    
        #Requires 1 color change
        self.assertTrue(self.fullRB.delete(6))
        newResult = '(NoneB)<-62B->(5B,97B)\n'\
                 '(62B)<-5B->(2B,30R)\n'\
                 '(62B)<-97B->(64B,98B)\n'\
                 '(5B)<-2B->(NoneB,NoneB)\n'\
                 '(5B)<-30R->(12B,47B)\n'\
                 '(97B)<-64B->(NoneB,95R)\n'\
                 '(97B)<-98B->(NoneB,99R)\n'\
                 '(30R)<-12B->(7R,NoneB)\n'\
                 '(30R)<-47B->(NoneB,NoneB)\n'\
                 '(64B)<-95R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires 3 rotations and color changes
        self.assertTrue(self.fullRB.delete(5))
        newResult = '(NoneB)<-62B->(30B,97B)\n'\
                 '(62B)<-30B->(7R,47B)\n'\
                 '(62B)<-97B->(64B,98B)\n'\
                 '(30B)<-7R->(2B,12B)\n'\
                 '(30B)<-47B->(NoneB,NoneB)\n'\
                 '(97B)<-64B->(NoneB,95R)\n'\
                 '(97B)<-98B->(NoneB,99R)\n'\
                 '(7R)<-2B->(NoneB,NoneB)\n'\
                 '(7R)<-12B->(NoneB,NoneB)\n'\
                 '(64B)<-95R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a color change
        self.assertTrue(self.fullRB.delete(97))
        newResult = '(NoneB)<-62B->(30B,95B)\n'\
                 '(62B)<-30B->(7R,47B)\n'\
                 '(62B)<-95B->(64B,98B)\n'\
                 '(30B)<-7R->(2B,12B)\n'\
                 '(30B)<-47B->(NoneB,NoneB)\n'\
                 '(95B)<-64B->(NoneB,NoneB)\n'\
                 '(95B)<-98B->(NoneB,99R)\n'\
                 '(7R)<-2B->(NoneB,NoneB)\n'\
                 '(7R)<-12B->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
    
        #Requires a rotation and color changes
        self.assertTrue(self.fullRB.delete(95))
        newResult = '(NoneB)<-62B->(30B,98B)\n'\
                 '(62B)<-30B->(7R,47B)\n'\
                 '(62B)<-98B->(64B,99B)\n'\
                 '(30B)<-7R->(2B,12B)\n'\
                 '(30B)<-47B->(NoneB,NoneB)\n'\
                 '(98B)<-64B->(NoneB,NoneB)\n'\
                 '(98B)<-99B->(NoneB,NoneB)\n'\
                 '(7R)<-2B->(NoneB,NoneB)\n'\
                 '(7R)<-12B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a rotation and color changes
        self.assertTrue(self.fullRB.delete(98))
        newResult = '(NoneB)<-30B->(7B,62B)\n'\
                 '(30B)<-7B->(2B,12B)\n'\
                 '(30B)<-62B->(47B,64B)\n'\
                 '(7B)<-2B->(NoneB,NoneB)\n'\
                 '(7B)<-12B->(NoneB,NoneB)\n'\
                 '(62B)<-47B->(NoneB,NoneB)\n'\
                 '(62B)<-64B->(NoneB,99R)\n'\
                 '(64B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires color changes
        self.assertTrue(self.fullRB.delete(7))
        newResult = '(NoneB)<-30B->(2B,62R)\n'\
                 '(30B)<-2B->(NoneB,12R)\n'\
                 '(30B)<-62R->(47B,64B)\n'\
                 '(2B)<-12R->(NoneB,NoneB)\n'\
                 '(62R)<-47B->(NoneB,NoneB)\n'\
                 '(62R)<-64B->(NoneB,99R)\n'\
                 '(64B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires color changes and a rotation
        self.assertTrue(self.fullRB.delete(62))
        newResult = '(NoneB)<-30B->(2B,64R)\n'\
                 '(30B)<-2B->(NoneB,12R)\n'\
                 '(30B)<-64R->(47B,99B)\n'\
                 '(2B)<-12R->(NoneB,NoneB)\n'\
                 '(64R)<-47B->(NoneB,NoneB)\n'\
                 '(64R)<-99B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires color changes
        self.assertTrue(self.fullRB.delete(64))
        newResult = '(NoneB)<-30B->(2B,47B)\n'\
                 '(30B)<-2B->(NoneB,12R)\n'\
                 '(30B)<-47B->(NoneB,99R)\n'\
                 '(2B)<-12R->(NoneB,NoneB)\n'\
                 '(47B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a color change
        self.assertTrue(self.fullRB.delete(47))
        newResult = '(NoneB)<-30B->(2B,99B)\n'\
                 '(30B)<-2B->(NoneB,12R)\n'\
                 '(30B)<-99B->(NoneB,NoneB)\n'\
                 '(2B)<-12R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires rotations and color changes
        self.assertTrue(self.fullRB.delete(99))
        newResult = '(NoneB)<-12B->(2B,30B)\n'\
                 '(12B)<-2B->(NoneB,NoneB)\n'\
                 '(12B)<-30B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a color change
        self.assertTrue(self.fullRB.delete(2))
        newResult = '(NoneB)<-12B->(NoneB,30R)\n'\
                 '(12B)<-30R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a color change
        self.assertTrue(self.fullRB.delete(12))
        newResult = '(NoneB)<-30B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a color change
        self.assertTrue(self.fullRB.delete(30))
        newResult = '(Empty)'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        for item in range(0,101):
            self.assertFalse(self.fullRB.delete(item))
            self.assertFalse(self.fullRB.find(item))
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        print("\ntestDeleteInternal PASSED")
        
    def testDeleteRoot(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        #Requires color changes and a rotation
        self.assertTrue(self.fullRB.delete(62))
        newResult = '(NoneB)<-47B->(6B,93B)\n'\
                 '(47B)<-6B->(3R,12R)\n'\
                 '(47B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-12R->(7B,30B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(NoneB,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(12R)<-7B->(NoneB,NoneB)\n'\
                 '(12R)<-30B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires color changes
        self.assertTrue(self.fullRB.delete(47))
        newResult = '(NoneB)<-30B->(6B,93B)\n'\
                 '(30B)<-6B->(3R,12B)\n'\
                 '(30B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-12B->(7R,NoneB)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(NoneB,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(12B)<-7R->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires color changes
        self.assertTrue(self.fullRB.delete(30))
        newResult = '(NoneB)<-12B->(6B,93B)\n'\
                 '(12B)<-6B->(3R,7B)\n'\
                 '(12B)<-93B->(64B,97R)\n'\
                 '(6B)<-3R->(2B,4B)\n'\
                 '(6B)<-7B->(NoneB,NoneB)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(3R)<-2B->(NoneB,NoneB)\n'\
                 '(3R)<-4B->(NoneB,5R)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(4B)<-5R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires color changes and 2 rotations
        self.assertTrue(self.fullRB.delete(12))
        newResult = '(NoneB)<-7B->(3B,93B)\n'\
                 '(7B)<-3B->(2B,5R)\n'\
                 '(7B)<-93B->(64B,97R)\n'\
                 '(3B)<-2B->(NoneB,NoneB)\n'\
                 '(3B)<-5R->(4B,6B)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(5R)<-4B->(NoneB,NoneB)\n'\
                 '(5R)<-6B->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires color changes
        self.assertTrue(self.fullRB.delete(7))
        newResult = '(NoneB)<-6B->(3B,93B)\n'\
                 '(6B)<-3B->(2B,5B)\n'\
                 '(6B)<-93B->(64B,97R)\n'\
                 '(3B)<-2B->(NoneB,NoneB)\n'\
                 '(3B)<-5B->(4R,NoneB)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(5B)<-4R->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a color change
        self.assertTrue(self.fullRB.delete(6))
        newResult = '(NoneB)<-5B->(3B,93B)\n'\
                 '(5B)<-3B->(2B,4B)\n'\
                 '(5B)<-93B->(64B,97R)\n'\
                 '(3B)<-2B->(NoneB,NoneB)\n'\
                 '(3B)<-4B->(NoneB,NoneB)\n'\
                 '(93B)<-64B->(NoneB,NoneB)\n'\
                 '(93B)<-97R->(95B,98B)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a rotation and color changes
        self.assertTrue(self.fullRB.delete(5))
        newResult = '(NoneB)<-93B->(4B,97B)\n'\
                 '(93B)<-4B->(3B,64B)\n'\
                 '(93B)<-97B->(95B,98B)\n'\
                 '(4B)<-3B->(2R,NoneB)\n'\
                 '(4B)<-64B->(NoneB,NoneB)\n'\
                 '(97B)<-95B->(NoneB,NoneB)\n'\
                 '(97B)<-98B->(NoneB,99R)\n'\
                 '(3B)<-2R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a rotation and color changes
        self.assertTrue(self.fullRB.delete(93))
        newResult = '(NoneB)<-64B->(3B,97B)\n'\
                 '(64B)<-3B->(2B,4B)\n'\
                 '(64B)<-97B->(95B,98B)\n'\
                 '(3B)<-2B->(NoneB,NoneB)\n'\
                 '(3B)<-4B->(NoneB,NoneB)\n'\
                 '(97B)<-95B->(NoneB,NoneB)\n'\
                 '(97B)<-98B->(NoneB,99R)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires color changes
        self.assertTrue(self.fullRB.delete(64))
        newResult = '(NoneB)<-4B->(3B,97R)\n'\
                 '(4B)<-3B->(2R,NoneB)\n'\
                 '(4B)<-97R->(95B,98B)\n'\
                 '(3B)<-2R->(NoneB,NoneB)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires color changes
        self.assertTrue(self.fullRB.delete(4))
        newResult = '(NoneB)<-3B->(2B,97R)\n'\
                 '(3B)<-2B->(NoneB,NoneB)\n'\
                 '(3B)<-97R->(95B,98B)\n'\
                 '(97R)<-95B->(NoneB,NoneB)\n'\
                 '(97R)<-98B->(NoneB,99R)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a rotation and color changes
        self.assertTrue(self.fullRB.delete(3))
        newResult = '(NoneB)<-97B->(2B,98B)\n'\
                 '(97B)<-2B->(NoneB,95R)\n'\
                 '(97B)<-98B->(NoneB,99R)\n'\
                 '(2B)<-95R->(NoneB,NoneB)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Root color change
        self.assertTrue(self.fullRB.delete(97))
        newResult = '(NoneB)<-95B->(2B,98B)\n'\
                 '(95B)<-2B->(NoneB,NoneB)\n'\
                 '(95B)<-98B->(NoneB,99R)\n'\
                 '(98B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Rotation and color changes
        self.assertTrue(self.fullRB.delete(95))
        newResult = '(NoneB)<-98B->(2B,99B)\n'\
                 '(98B)<-2B->(NoneB,NoneB)\n'\
                 '(98B)<-99B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Requires a color change
        self.assertTrue(self.fullRB.delete(98))
        newResult = '(NoneB)<-2B->(NoneB,99R)\n'\
                 '(2B)<-99R->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        #Root color change
        self.assertTrue(self.fullRB.delete(2))
        newResult = '(NoneB)<-99B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        self.assertTrue(self.fullRB.delete(99))
        newResult = '(Empty)'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        for item in range(0,101):
            self.assertFalse(self.fullRB.delete(item))
            self.assertFalse(self.fullRB.find(item))
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        print("\ntestDeleteRoot PASSED")
    
    def testDeleteTree(self):
        self.assertEqual(self.fullRB.outputTesting(),self.result)
        
        self.fullRB.deleteTree()
        newResult = '(Empty)'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
    
        for item in range(0,101):
            self.assertFalse(self.fullRB.delete(item))
            self.assertFalse(self.fullRB.find(item))
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        self.assertTrue(self.fullRB.insert(99))
        newResult = '(NoneB)<-99B->(NoneB,NoneB)\n'
        self.assertEqual(self.fullRB.outputTesting(),newResult)
        
        print("\ntestDeleteTree PASSED")
    
    def testListSort(self):
        listToSort = [x for x in range(0,101,1)]
        
        for item in listToSort:
            random.shuffle(listToSort)
            for value in listToSort:
                self.rb.insert(value)
                
            sortedList = self.rb.traverseDFSinorder()
            self.assertEqual(sortedList,[x for x in range(0,101,1)])
            self.rb.deleteTree()

        print("\ntestListSort PASSED")