// Una misma prueba para varias representaciones: el template pide operaciones, no una clase base.
#include <cassert>
#include <deque>
#include <iostream>
#include <list>

#include "dlist.h"

// Compila con cualquier D que tenga estas operaciones.
template <typename D>
void test_both_ends() {
    D deque;
    assert(deque.empty());
    deque.push_back(2);
    deque.push_back(3);
    deque.push_front(1);
    assert(deque.size() == 3);
    assert(deque.front() == 1);
    assert(deque.back() == 3);

    int expected = 1;
    for (int value : deque) {
        assert(value == expected);
        expected++;
    }

    deque.pop_front();
    deque.pop_back();
    assert(deque.size() == 1);
    assert(deque.front() == 2);
    assert(deque.back() == 2);
}

int main() {
    test_both_ends<DList<int>>();
    std::cout << "DList: ok\n";
    test_both_ends<std::list<int>>();
    std::cout << "std::list: ok\n";
    test_both_ends<std::deque<int>>();
    std::cout << "std::deque: ok\n";
    return 0;
}
