I've already made all the changes suggested here. Here is the link for round 2: Linked list implementation along with unit test [Round 2]
I want to see how other people think of my code, so here it goes. This is my first time writing a unit test. I'm wondering if there needs to be more tests for the LinkedList class and also if I'm writing them correctly.
I've made the Node class public so I can use it for a binary tree implementation later.
namespace DataStructuresAndAlgorithms.DataStructures
{
public class Node<T>
{
public T Data { get; set; }
public Node<T> Next { get; set; }
public Node<T> Previous { get; set; }
public Node() { }
public Node(T t)
{
Data = t;
}
}
}
Implementation
using System;
using System.Collections.Generic;
namespace DataStructuresAndAlgorithms.DataStructures
{
public class LinkedList<T>
{
public Node<T> Head { get; private set; }
public Node<T> Tail { get; private set; }
public LinkedList(Node<T> node)
{
Head = node;
Tail = node;
}
public void AddToFirst(Node<T> toAdd)
{
toAdd.Next = Head;
Head = toAdd;
}
public void AddToLast(Node<T> toAdd)
{
Tail.Next = toAdd;
Tail = toAdd;
}
public void RemoveFirst()
{
Head = Head.Next;
}
public void RemoveLast()
{
var pointer = Head;
while (pointer.Next != Tail)
{
pointer = pointer.Next;
}
// pointer is now before Tail
Tail = pointer;
Tail.Next = null;
}
public IEnumerator<Node<T>> GetEnumerator()
{
var pointer = Head;
while (pointer != null)
{
yield return pointer;
pointer = pointer.Next;
}
}
}
}
Unit Test
using System;
using Xunit;
using DataStructuresAndAlgorithms.DataStructures;
namespace DataStructuresAndAlgorithms.DataStructures.Tests
{
public class LinkedListTest
{
[Fact]
public void AddToFirst_Node_Should_Become_Head()
{
// Arrange
var myLinkedList = new LinkedList<int>(new Node<int>(45));
// Act
var nodeToAdd = new Node<int>(67);
myLinkedList.AddToFirst(nodeToAdd);
// Assert
var theNode = GetNodeFromList<int>(myLinkedList, nodeToAdd);
Assert.Equal(nodeToAdd, theNode);
Assert.Equal(45, theNode.Next.Data);
}
[Fact]
public void AddToLast_Node_Should_Become_Tail()
{
// Arrange
var myLinkedList = new LinkedList<int>(new Node<int>(35));
// Act
var nodeToAdd = new Node<int>(14);
myLinkedList.AddToLast(nodeToAdd);
// Assert
var theNode = GetNodeFromList<int>(myLinkedList, nodeToAdd);
Assert.Equal(nodeToAdd, theNode);
}
[Fact]
public void RemoveFirst_Next_Node_Should_Be_Head()
{
// Arrange
var myLinkedList = new LinkedList<int>(new Node<int>(777));
var node1 = new Node<int>(1);
myLinkedList.AddToLast(node1);
var node2 = new Node<int>(2);
myLinkedList.AddToLast(node2);
var node3 = new Node<int>(3);
myLinkedList.AddToLast(node3);
// Act
myLinkedList.RemoveFirst();
// Assert
var theNode = GetNodeFromList<int>(myLinkedList, node1);
Assert.Equal(node1, myLinkedList.Head);
}
[Fact]
public void RemoveLast_Next_Node_Should_Be_Tail()
{
// Arrange
var myLinkedList = new LinkedList<int>(new Node<int>(777));
var node1 = new Node<int>(1);
myLinkedList.AddToLast(node1);
var node2 = new Node<int>(2);
myLinkedList.AddToLast(node2);
var node3 = new Node<int>(3);
myLinkedList.AddToLast(node3);
// Act
myLinkedList.RemoveLast();
// Assert
var theNode = GetNodeFromList<int>(myLinkedList, node2);
Assert.Equal(node2, myLinkedList.Tail);
}
public static Node<T> GetNodeFromList<T>(LinkedList<T> someLinkedList, Node<T> someNode) where T : struct
{
using (var itr = someLinkedList.GetEnumerator())
{
while (itr.Current != someNode)
{
itr.MoveNext();
}
return itr.Current;
}
}
}
}
Presentation
using System;
using System.Collections;
using DataStructuresAndAlgorithms.DataStructures;
namespace DataStructuresAndAlgorithms.Presentation.Console
{
class Program
{
static void Main(string[] args)
{
RunNode();
System.Console.WriteLine();
RunLinkedList();
}
static void RunNode()
{
System.Console.WriteLine("Running the Node class");
System.Console.WriteLine("----------------------");
var myNode = new Node<int>(32);
System.Console.WriteLine(myNode.Data);
}
static void RunLinkedList()
{
System.Console.WriteLine("Running the LinkedList class");
System.Console.WriteLine("----------------------------");
var myLinkedList = new LinkedList<int>(new Node<int>(99));
myLinkedList.AddToFirst(new Node<int>(56));
myLinkedList.AddToFirst(new Node<int>(23));
myLinkedList.AddToFirst(new Node<int>(33));
myLinkedList.AddToLast(new Node<int>(8888));
myLinkedList.RemoveLast();
myLinkedList.RemoveFirst();
System.Console.WriteLine("HEAD = " + myLinkedList.Head.Data);
System.Console.WriteLine("TAIL = " + myLinkedList.Tail.Data);
using (var linkedListEnumerator = myLinkedList.GetEnumerator())
{
while (linkedListEnumerator.MoveNext())
{
System.Console.WriteLine(linkedListEnumerator.Current.Data);
}
}
}
}
}
```