def setUp(self):
     self.linkedList = DoublyLinkedList()
class Test(unittest.TestCase):
    def setUp(self):
        self.linkedList = DoublyLinkedList()

    def tearDown(self):
        self.linkedList = None

    def testEmptyOnEmptyLinkedList(self):
        isEmpty = self.linkedList.empty()

        string = self.linkedList.toString()

        self.assertTrue(isEmpty is True)
        self.assertTrue(string == "empty Doubly Linked List")

    def testEmptyOnNonEmptyLinkedList(self):
        self.linkedList.append(1)
        isEmpty = self.linkedList.empty()

        string = self.linkedList.toString()

        self.assertTrue(isEmpty is False)
        self.assertTrue(string == "Doubly Linked List with the following nodes:\n\t - [Node with key: 1]\n")

    def testAppendToEmptyLinkedList(self):
        self.linkedList.append(1)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.getHead().getKey() == 1)
        self.assertTrue(self.linkedList.getTail().getKey() == 1)
        self.assertTrue(string == "Doubly Linked List with the following nodes:\n\t - [Node with key: 1]\n")

    def testAppendToNonEmptyLinkedList(self):
        self.linkedList.append(1)
        self.linkedList.append(2)
        self.linkedList.append(3)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.getHead().getKey() == 1)
        self.assertTrue(self.linkedList.getTail().getKey() == 3)
        self.assertTrue(
            string
            == "Doubly Linked List with the following nodes:\n\t - [head]\t[Node with key: 1]\n\t - [Node with key: 2]\n\t - [tail]\t[Node with key: 3]\n"
        )

    def testPrependToEmptyLinkedList(self):
        self.linkedList.prepend(1)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.getHead().getKey() == 1)
        self.assertTrue(self.linkedList.getTail().getKey() == 1)
        self.assertTrue(string == "Doubly Linked List with the following nodes:\n\t - [Node with key: 1]\n")

    def testPrependToNonEmptyLinkedList(self):
        self.linkedList.append(2)
        self.linkedList.append(3)
        self.linkedList.prepend(1)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.getHead().getKey() == 1)
        self.assertTrue(self.linkedList.getTail().getKey() == 3)
        self.assertTrue(
            string
            == "Doubly Linked List with the following nodes:\n\t - [head]\t[Node with key: 1]\n\t - [Node with key: 2]\n\t - [tail]\t[Node with key: 3]\n"
        )

    def testInsertAfterEmptyLinkedList(self):
        self.linkedList.insertAfter(1, 0)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.empty() is True)
        self.assertTrue(string == "empty Doubly Linked List")

    def testInsertAfterNonEmptyLinkedList(self):
        self.linkedList.append(1)
        self.linkedList.insertAfter(2, 1)
        self.linkedList.insertAfter(3, 2)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.getHead().getKey() == 1)
        self.assertTrue(self.linkedList.getTail().getKey() == 3)
        self.assertTrue(
            string
            == "Doubly Linked List with the following nodes:\n\t - [head]\t[Node with key: 1]\n\t - [Node with key: 2]\n\t - [tail]\t[Node with key: 3]\n"
        )

    def testInsertBeforeEmptyLinkedList(self):
        self.linkedList.insertBefore(0, 1)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.empty() is True)
        self.assertTrue(string == "empty Doubly Linked List")

    def testInsertBeforeNonEmptyLinkedList(self):
        self.linkedList.append(3)
        self.linkedList.insertBefore(1, 3)
        self.linkedList.insertBefore(2, 3)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.getHead().getKey() == 1)
        self.assertTrue(self.linkedList.getTail().getKey() == 3)
        self.assertTrue(
            string
            == "Doubly Linked List with the following nodes:\n\t - [head]\t[Node with key: 1]\n\t - [Node with key: 2]\n\t - [tail]\t[Node with key: 3]\n"
        )

    def testDeleteFromEmptyLinkedList(self):
        self.linkedList.delete(1)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.empty() is True)
        self.assertTrue(string == "empty Doubly Linked List")

    def testDeleteHeadFromNonEmptyLinkedList(self):
        self.linkedList.append(0)
        self.linkedList.append(1)
        self.linkedList.insertAfter(3, 1)
        self.linkedList.insertBefore(2, 3)
        self.linkedList.delete(0)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.getHead().getKey() == 1)
        self.assertTrue(self.linkedList.getTail().getKey() == 3)
        self.assertTrue(
            string
            == "Doubly Linked List with the following nodes:\n\t - [head]\t[Node with key: 1]\n\t - [Node with key: 2]\n\t - [tail]\t[Node with key: 3]\n"
        )

    def testDeleteMiddleNodeFromEmptyLinkedList(self):
        self.linkedList.prepend(2)
        self.linkedList.insertBefore(1, 2)
        self.linkedList.insertAfter(4, 1)
        self.linkedList.append(3)
        self.linkedList.delete(4)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.getHead().getKey() == 1)
        self.assertTrue(self.linkedList.getTail().getKey() == 3)
        self.assertTrue(
            string
            == "Doubly Linked List with the following nodes:\n\t - [head]\t[Node with key: 1]\n\t - [Node with key: 2]\n\t - [tail]\t[Node with key: 3]\n"
        )

    def testDeleteTailFromNonEmptyLinkedList(self):
        self.linkedList.append(2)
        self.linkedList.prepend(1)
        self.linkedList.insertAfter(4, 2)
        self.linkedList.append(3)
        self.linkedList.delete(4)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.getHead().getKey() == 1)
        self.assertTrue(self.linkedList.getTail().getKey() == 3)
        self.assertTrue(
            string
            == "Doubly Linked List with the following nodes:\n\t - [head]\t[Node with key: 1]\n\t - [Node with key: 2]\n\t - [tail]\t[Node with key: 3]\n"
        )

    def testFindFromEmptyLinkedList(self):
        self.linkedList.find(1)

        string = self.linkedList.toString()

        self.assertTrue(self.linkedList.empty() is True)
        self.assertTrue(string == "empty Doubly Linked List")

    def testFindFromNonEmptyLinkedList(self):
        self.linkedList.append(3)
        self.linkedList.prepend(1)
        self.linkedList.insertAfter(2, 1)

        self.assertTrue(self.linkedList.find(2).toString() == "[Node with key: 2]")