public void TestDoublyLinkedList()
        {
            int retVal;
            DoublyLinkedList dll = new DoublyLinkedList(5);

            // Push()
            dll.DeleteAt(0);
            dll.Push(1);    // LL is empty
            Assert.AreEqual(new List<int>() { 1 }, dll.ReturnList());
            dll.Push(2);    // LL.count == 1
            Assert.AreEqual(new List<int>() { 2, 1 }, dll.ReturnList());
            dll.Push(3);    // LL.count > 1
            Assert.AreEqual(new List<int>() { 3, 2, 1 }, dll.ReturnList());

            // Delete()
            dll.InitializeDLL();
            retVal = dll.Delete(111); // doesn't exist
            Assert.AreEqual(new List<int>() { 5, 4, 3, 2, 1,0 }, dll.ReturnList());
            Assert.AreEqual(-1, retVal);
            retVal = dll.Delete(0); // exists at tail
            Assert.AreEqual(new List<int>() { 5, 4, 3, 2, 1 }, dll.ReturnList());
            Assert.AreEqual(0, retVal);
            retVal = dll.Delete(5); // exists at head
            Assert.AreEqual(new List<int>() { 4, 3, 2, 1 }, dll.ReturnList());
            Assert.AreEqual(5, retVal);
            retVal = dll.Delete(3); // exists between head and tail
            Assert.AreEqual(new List<int>() { 4, 2, 1 }, dll.ReturnList());
            Assert.AreEqual(3, retVal);

            // DeleteAt()
            dll.InitializeDLL();
            retVal = dll.DeleteAt(-23); // invalid index
            Assert.AreEqual(new List<int>() { 5, 4, 3, 2, 1, 0 }, dll.ReturnList());
            Assert.AreEqual(-1, retVal);
            retVal = dll.DeleteAt(7); // invalid index
            Assert.AreEqual(new List<int>() { 5, 4, 3, 2, 1, 0 }, dll.ReturnList());
            Assert.AreEqual(-1, retVal);
            retVal = dll.DeleteAt(0); // exists at head
            Assert.AreEqual(new List<int>() { 4, 3, 2, 1, 0 }, dll.ReturnList());
            Assert.AreEqual(5, retVal);
            retVal = dll.DeleteAt(4); // exists at tail
            Assert.AreEqual(new List<int>() { 4, 3, 2, 1 }, dll.ReturnList());
            Assert.AreEqual(0, retVal);
            retVal = dll.DeleteAt(1); // exists between head and tail
            Assert.AreEqual(new List<int>() { 4, 2, 1 }, dll.ReturnList());
            Assert.AreEqual(3, retVal);

            // Search()
            dll.InitializeDLL();
            Assert.AreEqual(-1, dll.Search(111)); // doesn't exist
            Assert.AreEqual(5, dll.Search(5)); // exists at head
            Assert.AreEqual(0, dll.Search(0)); // exists at tail
            Assert.AreEqual(3, dll.Search(3)); // exists in between head and tail
            Assert.AreEqual(new List<int>() { 5, 4, 3, 2, 1, 0 }, dll.ReturnList());

            // Append()
            dll = new DoublyLinkedList(0);
            dll.DeleteAt(0);
            dll.Append(0); // LL is empty
            Assert.AreEqual(new List<int>() { 0 }, dll.ReturnList());
            dll.Append(1); // LL.count = 1
            Assert.AreEqual(new List<int>() { 0, 1 }, dll.ReturnList());
            dll.Append(2);
            Assert.AreEqual(new List<int>() { 0, 1, 2 }, dll.ReturnList());
            dll.Append(3); // LL.count > 1
            Assert.AreEqual(new List<int>() { 0, 1, 2, 3 }, dll.ReturnList());

            // Pop()
            dll = new DoublyLinkedList(0);
            dll.Append(1);
            dll.Append(2);
            Assert.AreEqual(2, dll.Pop()); // LL.count > 1;
            Assert.AreEqual(new List<int>() { 0, 1 }, dll.ReturnList());
            Assert.AreEqual(1, dll.Pop()); // LL.count > 1;
            Assert.AreEqual(new List<int>() { 0 }, dll.ReturnList());
            Assert.AreEqual(0, dll.Pop()); // LL.count == 1;
            Assert.AreEqual(new List<int>(), dll.ReturnList());
            Boolean isException = false;
            try
            {
                dll.Pop();
            }
            catch
            {
                isException = true;
            }
            Assert.IsTrue(isException);
        }