// CIS-62 circularly-linked list

// circularly_linked_main.cpp
#include <cassert>
#include <iostream>
#include "circularly_linked_list.h"

using namespace std;

int main( )
{
    Node n12( 12 );
    Node n99( 99 );
    Node n37( 37 );

    assert( n12.is_single() );
    assert( n12.distance( n12 ) == 0 );
    assert( n12.size() == 1 );

    n12.insert( n99 );
    assert( n12.distance( n12 ) == 2 );
    assert( n12.size() == 2 );
    print_list( n12 ); // 12 99
    print_list( n99 ); // 99 12

    n99.insert( n37 );
    assert( n12.distance( n12 ) == 3 );

    print_list( n12 ); // 12 99 37
    print_list( n99 ); // 99 37 12
    print_list( n37 ); // 37 12 99

    Node single;
    bool result = n12.remove( single );
    assert( result == false );

    n12.remove( n99 );
    print_list( n12 ); // 12 37

    n12.insert( n99 );
    print_list( n12 ); // 12 99 37

    n12.remove( n12 );
    print_list( n99 ); // 99 37

    n99.remove( n37 );
    assert( n99.is_single() );
    assert( n37.is_single() );
    assert( n12.is_single() );
    print_list( n99 ); // 99

    n99.remove( n99 );
    print_list( n99 ); // 99

    n37.insert( n99 );
    n99.insert( n12 );

    print_list( n37 ); // 37 99 12

    Node n55 = n12;
    n55.data = 55;
    print_list( n55 ); // 55 37 99 12

    result = n99.remove( n99 );
    assert( result );
    print_list( n99 ); // 99
    print_list( n55 ); // 55 37 12

    return 0;
}

