#include<iostream>

#include <cppunit/ui/text/TestRunner.h>
//#include <cppunit/TestFixture.h>
#include <cppunit/TestAssert.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestCase.h>
//#include <cppunit/TestCaller.h>
//#include <cppunit/CompilerOutputter.h>
//#include <cppunit/XmlOutputter.h>

#include"max.h"

class Int {
private:
 int _val;
public:
 Int(int i):_val(i) {};
 int val()const {return _val;};
 friend bool operator>(const Int &a,const Int &b)  {
 return a._val>b._val; 
 }
};


class Max_test : public CppUnit::TestCase {
public:

  void runTest() {
    CPPUNIT_ASSERT_EQUAL(1,max(1,2)); /*sztucznie wproadzony bÅ?ad!*/
    CPPUNIT_ASSERT_EQUAL(2,max(2,1));

    CPPUNIT_ASSERT_EQUAL(1,max(1,1));
    CPPUNIT_ASSERT_EQUAL(2,max(2,2));

    Int i(5);
    Int j(6);

    CPPUNIT_ASSERT_EQUAL( 6,max(i,j).val() );
    CPPUNIT_ASSERT_EQUAL( 6,max(j,i).val() );
    CPPUNIT_ASSERT_EQUAL( 6,max(j,j).val() );
    CPPUNIT_ASSERT_EQUAL( 5,max(i,i).val() );

    CPPUNIT_ASSERT_EQUAL( 6,max(&i,&j)->val() );
    CPPUNIT_ASSERT_EQUAL( 6,max(&j,&i)->val() );
    CPPUNIT_ASSERT_EQUAL( 6,max(&j,&j)->val() );
    CPPUNIT_ASSERT_EQUAL( 5,max(&i,&i)->val() );

    CPPUNIT_ASSERT_EQUAL(strcmp(max("abcd","acde"),"acde"),0);
    CPPUNIT_ASSERT_EQUAL(strcmp(max("acde","abcd"),"acde"),0);
    CPPUNIT_ASSERT_EQUAL(strcmp(max("abcd","abcd"),"abcd"),0);
    CPPUNIT_ASSERT_EQUAL(strcmp(max("acde","acde"),"acde"),0);

    char s1[]="abcde";
    char s2[]="ac";
    CPPUNIT_ASSERT_EQUAL(strcmp(max(s1,s2),s2),0);
    CPPUNIT_ASSERT_EQUAL(strcmp(max(s2,s1),s2),0);
    CPPUNIT_ASSERT_EQUAL(strcmp(max(s1,s1),s1),0);
    CPPUNIT_ASSERT_EQUAL(strcmp(max(s2,s2),s2),0);


  }


};


main() {

Max_test *max = new Max_test;

CppUnit::TextUi::TestRunner runner;
runner.addTest( max );
 
runner.run();


}
 
