public void AddLast_ItemShallBeAdded_ToTheEndOfList()
        {
            // Arrange
            var linkedList = new SinglyLinkList<decimal>();

            var lastItem = new SinglyLinkListNode<decimal>(10.0m);

            // Act
            linkedList.AddLast(lastItem);

            // Assert
            Assert.AreEqual(1, linkedList.Count, "There should be 1 item.");
            Assert.AreEqual(lastItem, linkedList.GetHeadAndTail().Item1, "Head should point to the same item.");
            Assert.AreEqual(lastItem, linkedList.GetHeadAndTail().Item2, "Tail should point to the same item.");
        }
        public void AddLast_WhenThereAreMoreElements_ShouldAddToTheLastPosition()
        {
            // Arrange
            var linkedList = new SinglyLinkList<decimal>();

            linkedList.AddFirst(new SinglyLinkListNode<decimal>(2.0m));
            linkedList.AddFirst(new SinglyLinkListNode<decimal>(3.4m));

            // Act
            linkedList.AddLast(new SinglyLinkListNode<decimal>(5.5m));

            // Assert
            Assert.AreEqual(5.5m, linkedList.GetHeadAndTail().Item2.Value, "Should contain expected value.");
            Assert.AreEqual(3.4m, linkedList.ElementAt(0), "Should be the expected value.");
            Assert.AreEqual(2.0m, linkedList.ElementAt(1), "Should be the expected value.");
            Assert.AreEqual(5.5m, linkedList.ElementAt(2), "Should be the expected value.");
        }
        public void AddLast_WhenThereAreOnlySingleItemInTheListAddingNew_ShouldBeTheLast()
        {
            // Arrange
            var linkedList = new SinglyLinkList<short>();
            linkedList.AddFirst(new SinglyLinkListNode<short>(1));

            // Act
            linkedList.AddLast(new SinglyLinkListNode<short>(3));

            // Assert
            Assert.AreEqual(1, linkedList.GetHeadAndTail().Item1.Value, "Should contain the expected value.");
            Assert.AreEqual(3, linkedList.GetHeadAndTail().Item2.Value, "Should contain the expected value.");
            Assert.AreEqual(linkedList.GetHeadAndTail().Item1.Next, linkedList.GetHeadAndTail().Item2, "Head should point to tail.");
        }
        public void Remove_WhenIsOnlySingleItem_RemovingItShouldResetHeadAndTail()
        {
            // Arrange
            var linkedList = new SinglyLinkList<string>();
            linkedList.AddLast(new SinglyLinkListNode<string>("Hello"));

            // Act
            linkedList.Remove("Hello");

            // Assert
            Assert.IsNull(linkedList.GetHeadAndTail().Item1, "Should be null.");
            Assert.IsNull(linkedList.GetHeadAndTail().Item2, "Should be null.");
            Assert.AreEqual(0, linkedList.Count, "Should not have any value.");
        }
        public void RemoveLast_WhenThereAreItemsMultipleItems_ShoudlRemoveLast()
        {
            // Arrange
            var linkedList = new SinglyLinkList<string>();

            linkedList.AddFirst(new SinglyLinkListNode<string>("Hello"));
            linkedList.AddLast(new SinglyLinkListNode<string>("There"));
            linkedList.AddLast(new SinglyLinkListNode<string>("SomeMore"));

            // Act
            linkedList.RemoveLast();

            // Assert
            Assert.AreEqual("Hello", linkedList.GetHeadAndTail().Item1.Value, "Should contain the expected value.");
            Assert.AreEqual("There", linkedList.GetHeadAndTail().Item2.Value, "Should contain the expected value.");
            Assert.AreEqual(linkedList.GetHeadAndTail().Item1.Next, linkedList.GetHeadAndTail().Item2, "Pointer should be correct.");
            Assert.AreEqual(2, linkedList.Count, "Should contain the expected number of items.");
        }