#include "Point.h"
#include "PointPair.h"
#include "PointPairSet.h"


int main(int argc, char** argv)
{

    Point p0;
    Point p1(1,1);
    Point p2(3,5);
    Point p3(-10,5);
    Point p4(2,4);
    Point p5(0,-5);
    Point p6(7,7);

    PointPair pp0(p0,p0); //(0,0), (0,0)
    PointPair pp1(p0,p1); //(0,0), (1,1)
    PointPair pp2(p2,p3); //(3,5), (-10,5)
    PointPair pp3(p0,p3); //(0,0), (-10,5)
    PointPair pp4(p2,p4); //(3,5), (2,4)
    PointPair pp5(p5,p5); //(0,-5), (0,-5)
    PointPair pp6(p6,p6); //(0,-5), (0,-5)

    PointPairSet pps0;
    
    cout<<"A: --------------------------------------"<<endl;

    cout<<"pps0: "<<pps0<<endl;
    PointPairSet pps1(pps0);
    cout<<"pps1: "<<pps1<<endl;
    
    cout<<"no elements pps0: "<<pps0.numElements()<<endl;
    cout<<"is empty pps0: "<<pps0.isEmpty()<<endl;
    cout<<"pps0 has "<<pp0<<": "<<pps0.has(pp0)<<endl;
    cout<<"pps0==pps1 "<<(pps0==pps1)<<endl;
    cout<<"pps0!=pps1 "<<(pps0!=pps1)<<endl;

    cout<<"B: --------------------------------------"<<endl;
    pps0.add(pp0);
    cout<<"pps0: "<<pps0<<endl;
    pps1=pps0;
    cout<<"pps1: "<<pps1<<endl;
    
    cout<<"no elements pps0: "<<pps0.numElements()<<endl;
    cout<<"is empty pps0: "<<pps0.isEmpty()<<endl;
    cout<<"pps0 has "<<pp0<<": "<<pps0.has(pp0)<<endl;
    cout<<"pps0 has "<<pp1<<": "<<pps0.has(pp1)<<endl;
    cout<<"pps0==pps1 "<<(pps0==pps1)<<endl;
    cout<<"pps0!=pps1 "<<(pps0!=pps1)<<endl;

    cout<<"C: --------------------------------------"<<endl;
    pps0.add(pp1);
    pps0.add(pp2);
    pps0.add(pp3);
    pps0.add(pp4);
     
    cout<<"pps0: "<<pps0<<endl;
    pps1=pps0;
    cout<<"pps1: "<<pps1<<endl;
    
    cout<<"no elements pps0: "<<pps0.numElements()<<endl;
    cout<<"is empty pps0: "<<pps0.isEmpty()<<endl;
    cout<<"pps0 has "<<pp0<<": "<<pps0.has(pp0)<<endl;
    cout<<"pps0 has "<<pp1<<": "<<pps0.has(pp1)<<endl;
    cout<<"pps0 has "<<pp2<<": "<<pps0.has(pp2)<<endl;
    cout<<"pps0 has "<<pp5<<": "<<pps0.has(pp5)<<endl;
    cout<<"pps1==pps0 "<<(pps0==pps1)<<endl;
    cout<<"pps1!=pps0 "<<(pps0!=pps1)<<endl;

    cout<<"D: --------------------------------------"<<endl;
    pps0.remove(pp2);
    cout<<"pps0: "<<pps0<<endl;

    pps0.remove(pp0);
    cout<<"pps0: "<<pps0<<endl;

    pps0.remove(pp1);
    cout<<"pps0: "<<pps0<<endl;

    pps0.remove(pp1);
    cout<<"pps0: "<<pps0<<endl;
    cout<<"pps1: "<<pps1<<endl;
    
    cout<<"pps0==pps1 "<<(pps0==pps1)<<endl;
    cout<<"pps0!=pps1 "<<(pps0!=pps1)<<endl;
 
    cout<<"E: ---------------------------------------"<<endl;
    pps0=pps1;
    cout<<"pps0: "<<pps0<<endl;

    pps1.clean();
    pps1.force(pp0);
    pps1.force(pp1);
    pps1.force(pp6);
    cout<<"pps1: "<<pps1<<endl;

    pps0+=pps1;
    cout<<"pps0: "<<pps0<<endl;

    PointPairSet* pps2=new PointPairSet(pps0);
    cout<<"pps2: "<<(*pps2)<<endl;

    delete pps2;
    
    pps0.clean();
    cout<<"pps0: "<<pps0<<endl;

    cout<<"F: ---------------------------------------"<<endl;

    pps1=pps1;
    cout<<"pps1: "<<pps1<<endl;

    pps1.force(pp5);
    cout<<"pps1: "<<pps1<<endl;

    pps1.remove(pp5);
    cout<<"pps1: "<<pps1<<endl;

    pps1.remove(pp5);
    cout<<"pps1: "<<pps1<<endl;

    pps1.remove(pp4);
    cout<<"pps1: "<<pps1<<endl;

    cout<<"G: ---------------------------------------"<<endl;

    pps0.clean();
    pps0.remove(pp0);
    cout<<"pps0: "<<pps0<<endl;
    
    cout<<"H: ---------------------------------------"<<endl;

    pps0=pps1;

    cout<<"pps0: "<<pps0<<endl;

    cout<<"pps0 elements:"<<endl;
    for(int i=0;i<(int)pps0.numElements();i++)
        cout<<"  "<<i<<" : "<<pps0[i]<<endl;

    cout<<" "<<10<<" : "<<pps0[10]<<endl;

    cout<<"I: ---------------------------------------"<<endl;

   
    
    return 0;
}
