public void TestListaAdd()
        {
            lista = new Lista <int>(0, 1, 2);

            lista.Add(1, 4);
            Assert.AreEqual(4, lista.NumeroElementos,
                            "Añadir un elemento en medio a una lista con 3 elementos no incrementa el número de elementos a 4.");
            Assert.AreEqual("[0, 4, 1, 2]", lista.ToString(),
                            "La operación de añadir un 4 en la posición 1 no lo añade correctamente");

            // Probamos a añadir en la posición 0 (desplaza el resto de elementos a la dcha)
            lista.Add(0, -1);
            Assert.AreEqual(5, lista.NumeroElementos,
                            "Añadir un elemento usando Add() al principio de una lista no incrementa el número de elementos en 1.");
            Assert.AreEqual("[-1, 0, 4, 1, 2]", lista.ToString(),
                            "Añadir un elemento usando Add() al principio de una lista no añade dicho elemento al principio.");

            // Probamos a añadir en la última posición (desplaza el resto de elementos a la dcha,
            // por lo que el elemento añadido no es el último, sino el penúltimo).
            lista.Add(lista.NumeroElementos - 1, 9);
            Assert.AreEqual(6, lista.NumeroElementos,
                            "Añadir un elemento usando Add() en la última posición de una lista no incrementa el número de elementos en 1.");
            Assert.AreEqual("[-1, 0, 4, 1, 9, 2]", lista.ToString(),
                            "Añadir un elemento usando Add() en la última posición de una lista no añade dicho elemento como el penúltimo.");
        }
        public void TestListaDoubles()
        {
            Lista <double> listaStrings = new Lista <double>(1.1, 2.2, 3.3);

            Assert.AreEqual(3, listaStrings.NumeroElementos,
                            "El constructor de la lista funciona mal con doubles.");
            Assert.AreEqual("[1,1, 2,2, 3,3]", listaStrings.ToString(),
                            "El constructor de la lista funciona mal con doubles.");

            listaStrings.AddLast(4.4);
            Assert.AreEqual(4, listaStrings.NumeroElementos,
                            "El método AddLast() de la lista funciona mal con doubles.");
            Assert.AreEqual("[1,1, 2,2, 3,3, 4,4]", listaStrings.ToString(),
                            "El método AddLast() de la lista funciona mal con doubles.");

            listaStrings.RemoveFirst();
            Assert.AreEqual(3, listaStrings.NumeroElementos,
                            "El método RemoveFirst() de la lista funciona mal con doubles.");
            Assert.AreEqual("[2,2, 3,3, 4,4]", listaStrings.ToString(),
                            "El método RemoveFirst() de la lista funciona mal con doubles.");

            Assert.AreEqual(2.2, listaStrings.Get(0),
                            "El método Get() de la lista funciona mal con doubles.");

            Assert.AreEqual(true, listaStrings.Contains(3.3),
                            "El método Contains() de la lista funciona mal con doubles.");
            Assert.AreEqual(false, listaStrings.Contains(5.5),
                            "El método Contains() de la lista funciona mal con doubles.");
        }
        public void TestListaPersonas()
        {
            Lista <Persona> listaStrings = new Lista <Persona>(
                new Persona("Carlos", "Sanabria", "12345678A"));

            Assert.AreEqual(1, listaStrings.NumeroElementos,
                            "El constructor de la lista funciona mal con Personas");
            Assert.AreEqual("[Carlos Sanabria con NIF 12345678A]", listaStrings.ToString(),
                            "El constructor de la lista funciona mal con Personas.");

            listaStrings.AddLast(new Persona("Pedro", "Pérez", "12345678B"));
            Assert.AreEqual(2, listaStrings.NumeroElementos,
                            "El método AddLast() de la lista funciona mal con Personas");
            Assert.AreEqual("[Carlos Sanabria con NIF 12345678A, " +
                            "Pedro Pérez con NIF 12345678B]", listaStrings.ToString(),
                            "El método AddLast() de la lista funciona mal con Personas.");

            listaStrings.RemoveFirst();
            Assert.AreEqual(1, listaStrings.NumeroElementos,
                            "El método RemoveFirst() de la lista funciona mal con Personas");
            Assert.AreEqual("[Pedro Pérez con NIF 12345678B]", listaStrings.ToString(),
                            "El método RemoveFirst() de la lista funciona mal con Personas.");

            Assert.AreEqual("Pedro Pérez con NIF 12345678B", listaStrings.Get(0).ToString(),
                            "El método Get() de la lista funciona mal con Personas");

            Assert.AreEqual(true, listaStrings.Contains(
                                new Persona("Pedro", "Pérez", "12345678B")),
                            "El método Contains() de la lista funciona mal con Personas");
            Assert.AreEqual(false, listaStrings.Contains(
                                new Persona("Luis", "Pérez", "12345678B")),
                            "El método Contains() de la lista funciona mal con Personas");
        }
        public void TestListaStrings()
        {
            Lista <String> listaStrings = new Lista <String>("h", "e", "l", "l", "o");

            Assert.AreEqual(5, listaStrings.NumeroElementos,
                            "El constructor de la lista funciona mal con Strings");
            Assert.AreEqual("[h, e, l, l, o]", listaStrings.ToString(),
                            "El constructor de la lista funciona mal con Strings.");

            listaStrings.AddLast("!");
            Assert.AreEqual(6, listaStrings.NumeroElementos,
                            "El método AddLast() de la lista funciona mal con Strings");
            Assert.AreEqual("[h, e, l, l, o, !]", listaStrings.ToString(),
                            "El método AddLast() de la lista funciona mal con Strings.");

            listaStrings.RemoveFirst();
            Assert.AreEqual(5, listaStrings.NumeroElementos,
                            "El método RemoveFirst() de la lista funciona mal con Strings");
            Assert.AreEqual("[e, l, l, o, !]", listaStrings.ToString(),
                            "El método RemoveFirst() de la lista funciona mal con Strings.");

            Assert.AreEqual("e", listaStrings.Get(0),
                            "El método Get() de la lista funciona mal con Strings");

            Assert.AreEqual(true, listaStrings.Contains("l"),
                            "El método Contains() de la lista funciona mal con Strings");
            Assert.AreEqual(false, listaStrings.Contains("k"),
                            "El método Contains() de la lista funciona mal con Strings");
        }
        public void TestListaRemoveValue()
        {
            lista = new Lista <int>(1, 3, 4);

            bool wasRemoved = lista.RemoveValue(3);

            Assert.AreEqual(2, lista.NumeroElementos,
                            "Borrar usando RemoveValue() un elemento que está en la lista no decrementa en 1 el número de elementos.");
            Assert.AreEqual("[1, 4]", lista.ToString(),
                            "Borrar usando RemoveValue() un elemento que está en la lista no lo borra correctamente.");
            Assert.IsTrue(wasRemoved,
                          "Borrar usando RemoveValue() un elemento que está en la lista no retorna true.");

            wasRemoved = lista.RemoveValue(3);
            Assert.AreEqual(2, lista.NumeroElementos,
                            "Borrar usando RemoveValue() un elemento que NO está en la lista modifica el número de elementos.");
            Assert.AreEqual("[1, 4]", lista.ToString(),
                            "Borrar usando RemoveValue() un elemento que NO está en la lista modifica la lista.");
            Assert.IsFalse(wasRemoved,
                           "Borrar usando RemoveValue() un elemento que NO está en la lista no retorna false.");

            // Intentamos borrar el último elemento, para probar si funciona bien en los extremos
            wasRemoved = lista.RemoveValue(4);
            Assert.AreEqual(1, lista.NumeroElementos,
                            "Borrar usando RemoveValue() el último elemento no decrementa el número de elementos en 1.");
            Assert.AreEqual("[1]", lista.ToString(),
                            "Borrar usando RemoveValue() el último elemento no elimina dicho elemento de la lista.");
            Assert.IsTrue(wasRemoved,
                          "Borrar usando RemoveValue() el último elemento no retorna true.");

            // Probamos con una lista que tiene nulls para ver que no da problemas
            Persona         p             = new Persona("C", "S", "1");
            Lista <Persona> listaConNulls = new Lista <Persona>(null, p, null);

            wasRemoved = listaConNulls.RemoveValue(p);

            Assert.AreEqual(2, listaConNulls.NumeroElementos,
                            "Borrar usando RemoveValue() un elemento que está en la lista no decrementa en 1 el número de elementos.");
            Assert.AreEqual("[, ]", listaConNulls.ToString(),
                            "Borrar usando RemoveValue() un elemento que está en la lista no lo borra correctamente.");
            Assert.IsTrue(wasRemoved,
                          "Borrar usando RemoveValue() un elemento que está en la lista no retorna true.");

            wasRemoved = listaConNulls.RemoveValue(null);
            Assert.AreEqual(1, listaConNulls.NumeroElementos,
                            "Borrar usando RemoveValue() un elemento que está en la lista no decrementa en 1 el número de elementos.");
            Assert.AreEqual("[]", listaConNulls.ToString(),
                            "Borrar usando RemoveValue() un elemento que está en la lista no lo borra correctamente.");
            Assert.IsTrue(wasRemoved,
                          "Borrar usando RemoveValue() un elemento que está en la lista no retorna true.");
        }
        public void TestListaAddLast()
        {
            lista = new Lista <int>();

            lista.AddLast(1);
            Assert.AreEqual(1, lista.NumeroElementos,
                            "Añadir un elemento al final a una lista vacía no incrementa el número de elementos a 1.");
            Assert.AreEqual("[1]", lista.ToString(),
                            "La operación de añadir al final un 1 no lo añade correctamente");

            lista.AddLast(2);
            Assert.AreEqual(2, lista.NumeroElementos,
                            "Añadir un elemento al final a una lista con 1 elemento no incrementa el número de elementos a 2.");
            Assert.AreEqual("[1, 2]", lista.ToString(),
                            "La operación de añadir al final un 2 no lo añade correctamente");
        }
        public void TestListaRemoveLast()
        {
            lista = new Lista <int>(3, 4);

            lista.RemoveLast();
            Assert.AreEqual(1, lista.NumeroElementos,
                            "Borrar un elemento al final de una lista no decrementa el número de elementos en 1.");
            Assert.AreEqual("[3]", lista.ToString(),
                            "La operación de borrar el elemento al final no lo borra correctamente");

            // Probamos a borrar el último elemento cuando la lista solo tiene un elemento
            lista.RemoveLast();
            Assert.AreEqual(0, lista.NumeroElementos,
                            "Borrar un elemento al final de una lista con un único elemento no decrementa el número de elementos a 0.");
            Assert.AreEqual("[]", lista.ToString(),
                            "Borrar un elemento al final de una lista con un único elemento no deja la lista vacía.");
        }
        public void TestListaConstructorVariosEnteros()
        {
            lista = new Lista <int>(1, 2, 3);

            Assert.AreEqual(3, lista.NumeroElementos,
                            "El constructor de lista con varios elementos como parámetro no crea una lista con 3 elementos.");
            Assert.AreEqual("[1, 2, 3]", lista.ToString(),
                            "El constructor de lista con varios elementos como parámetro no crea una lista con los números 1, 2 y 3.");
        }
        public void TestListaConstructorUnSoloElemento()
        {
            lista = new Lista <int>(1);

            Assert.AreEqual(1, lista.NumeroElementos,
                            "El constructor de lista con un elemento no crea una lista con 1 elemento.");
            Assert.AreEqual("[1]", lista.ToString(),
                            "El constructor de lista con un 1 como parámetro no crea una lista con un 1.");
        }
        public void TestConstructorListaVacia()
        {
            lista = new Lista <int>();

            Assert.AreEqual(0, lista.NumeroElementos,
                            "El constructor de lista vacía no crea una lista con 0 elementos.");
            Assert.AreEqual("[]", lista.ToString(),
                            "El constructor de lista vacía no crea una lista vacía.");
        }
        public void TestListaSet()
        {
            lista = new Lista <int>(0, 1, 2);

            lista.Set(0, 9);
            Assert.AreEqual(3, lista.NumeroElementos,
                            "Hacer un Set() incrementa el número de elementos.");
            Assert.AreEqual("[9, 1, 2]", lista.ToString(),
                            "Hacer un Set() no modifica correctamente la lista.");

            lista.Set(1, 8);
            Assert.AreEqual(3, lista.NumeroElementos,
                            "Hacer un Set() incrementa el número de elementos.");
            Assert.AreEqual("[9, 8, 2]", lista.ToString(),
                            "Hacer un Set() no modifica correctamente la lista.");

            lista.Set(2, 7);
            Assert.AreEqual(3, lista.NumeroElementos,
                            "Hacer un Set() incrementa el número de elementos.");
            Assert.AreEqual("[9, 8, 7]", lista.ToString(),
                            "Hacer un Set() no modifica correctamente la lista.");
        }
        public void TestListaConstructorCopia()
        {
            Lista <int> listaOtro = new Lista <int>(1, 2, 3);

            lista = new Lista <int>(listaOtro);

            Assert.AreEqual(listaOtro.NumeroElementos, lista.NumeroElementos,
                            "La lista creada con el constructor de copia tiene el mismo número de elementos que la lista original.");
            Assert.AreEqual(listaOtro.ToString(), lista.ToString(),
                            "La lista creada con el constructor de copia tiene los mismos elementos que la lista original.");

            // Comprobamos que las dos listas son totalmente independientes (modificar una no modifica la otra)
            listaOtro.AddLast(4);
            lista.RemoveFirst();

            Assert.AreEqual(4, listaOtro.NumeroElementos,
                            "La lista creada con el constructor de copia no es independiente de la lista original.");
            Assert.AreEqual("[1, 2, 3, 4]", listaOtro.ToString(),
                            "La lista creada con el constructor de copia no es independiente de la lista original.");
            Assert.AreEqual(2, lista.NumeroElementos,
                            "La lista creada con el constructor de copia no es independiente de la lista original.");
            Assert.AreEqual("[2, 3]", lista.ToString(),
                            "La lista creada con el constructor de copia no es independiente de la lista original.");
        }
        public void TestListaRemoveAt()
        {
            lista = new Lista <int>(1, 2, 3, 4);

            lista.RemoveAt(1);
            Assert.AreEqual(3, lista.NumeroElementos,
                            "Borrar un elemento del medio de una lista de 4 elementos no decrementa el número de elementos a 3.");
            Assert.AreEqual("[1, 3, 4]", lista.ToString(),
                            "La operación de borrar el elemento en la posición 1 no lo borra correctamente");

            // Probamos a eliminar la posición 0
            lista.RemoveAt(0);
            Assert.AreEqual(2, lista.NumeroElementos,
                            "Borrar usando RemoveAt() el elemento en la posición 0 de una lista no decrementa el número de elementos en 1.");
            Assert.AreEqual("[3, 4]", lista.ToString(),
                            "Borrar usando RemoveAt() el elemento en la posición 0 de una lista no elimina el primer elemento.");

            // Probamos a eliminar la última posición
            lista.RemoveAt(lista.NumeroElementos - 1);
            Assert.AreEqual(1, lista.NumeroElementos,
                            "Borrar usando RemoveAt() el elemento en la última posición de una lista no decrementa el número de elementos en 1.");
            Assert.AreEqual("[3]", lista.ToString(),
                            "Borrar usando RemoveAt() el elemento en la última posición de una lista no elimina el último elemento.");
        }
        public void TestListaConstructorArray()
        {
            lista = new Lista <int>(new int[] { 1, 2, 3 });

            Assert.AreEqual(3, lista.NumeroElementos,
                            "El constructor de lista con varios elementos como parámetro no crea una lista con 3 elementos.");
            Assert.AreEqual("[1, 2, 3]", lista.ToString(),
                            "El constructor de lista con varios elementos como parámetro no crea una lista con los números 1, 2 y 3.");

            // Probamos con un array vacío
            lista = new Lista <int>(new int[] { });

            Assert.AreEqual(0, lista.NumeroElementos,
                            "El constructor de lista con un array vacío como parámetro no crea una lista con 0 elementos.");
            Assert.AreEqual("[]", lista.ToString(),
                            "El constructor de lista con un array vacío como parámetro no crea una lista vacía.");
        }
        public void TestListaAddFirst()
        {
            lista = new Lista <int>(1, 2);

            lista.AddFirst(0);
            Assert.AreEqual(3, lista.NumeroElementos,
                            "Añadir un elemento al principio a una lista con 2 elementos no incrementa el número de elementos a 3.");
            Assert.AreEqual("[0, 1, 2]", lista.ToString(),
                            "La operación de añadir al principio un 0 no lo añade correctamente");

            // Probamos a añadir al principio de una lista vacía
            lista = new Lista <int>();

            lista.AddFirst(0);
            Assert.AreEqual(1, lista.NumeroElementos,
                            "Añadir un elemento al principio a una lista vacía no incrementa el número de elementos a 1.");
            Assert.AreEqual("[0]", lista.ToString(),
                            "Añadir un elemento al principio a una lista vacía no añade dicho elemento a la lista.");
        }