/*****************************************************************************************
*                                                                                       *
* COPYRIGHT:                                                                            *
*   (C) Copyright International Business Machines Corporation,  2000                    *
*   Licensed Material - Program-Property of IBM - All Rights Reserved.                  *
*   US Government Users Restricted Rights - Use, duplication, or disclosure             *
*   restricted by GSA ADP Schedule Contract with IBM Corp.                              *
*                                                                                       *
*****************************************************************************************
************************************************************************
*   Date        Name        Description
*   03/22/2000   Madhu        Creation.
************************************************************************/

#include "ittrans.h"
#include "ufltlgts.h"
#include "unicode/utypes.h"
#include "unicode/translit.h"
#include "unicode/unifilt.h"
#include "unicode/unifltlg.h"
#include "intltest.h"

//---------------------------------------------
// runIndexedTest
//---------------------------------------------

void UnicodeFilterLogicTest::runIndexedTest( int32_t index, UBool exec, char* &name, char* par )
{
    if (exec) logln((UnicodeString)"TestSuite UnicodeFilterLogic API ");
    switch (index) {
     
        case 0: name = "TestAll"; if (exec) TestAll(); break;
       
        default: name = ""; break; /*needed to end loop*/
    }
}

class Filter1: public UnicodeFilter{
	virtual UnicodeFilter* clone() const{
		return new Filter1(*this);
	}
	virtual UBool contains(UChar c) const {
		if(c == 'a' || c == 'A' || c == 'c' || c == 'C')
			return FALSE;
		else
			return TRUE;
	}
};
class Filter2: public UnicodeFilter{
	virtual UnicodeFilter* clone() const{
		return new Filter2(*this);
	}
	virtual UBool contains(UChar c) const {
		if(c == 'y' || c == 'Y' || c == 'z' || c == 'Z'  || c =='a' || c == 'c')
			return FALSE;
		else
			return TRUE;
	}
};


void UnicodeFilterLogicTest::TestAll(){
	
	Transliterator *t1=Transliterator::createInstance("Unicode-Hex");
	if(t1 == 0){
		errln("FAIL: Error in instantiation.");
		return;
	}
	UnicodeString source("abcdABCDyzYZ");
	
	//sanity testing wihtout any filter
	expect(*t1, "without any Filter", source, "\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A");
	//sanity testing using the Filter1(acAC) and Filter2(acyzYZ)
	t1->adoptFilter(new Filter1);
	expect(*t1, "with Filter(acAC)", source, "a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A");
	t1->adoptFilter(new Filter2);
	expect(*t1, "with Filter2(acyzYZ)", source, "a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ");


   	UnicodeFilter *filterNOT=UnicodeFilterLogic::createNot(new Filter1);
	UnicodeFilter *filterAND=UnicodeFilterLogic::createAnd(new Filter1, new Filter2);
	UnicodeFilter *filterOR=UnicodeFilterLogic::createOr(new Filter1, new Filter2);
   
	TestNOT(*t1, new Filter1, "Filter(acAC)", 
		source, "\\u0061b\\u0063d\\u0041B\\u0043DyzYZ");
	TestNOT(*t1, new Filter2, "Filter(acyzYZ)",
		source, "\\u0061b\\u0063dABCD\\u0079\\u007A\\u0059\\u005A");
	TestNOT(*t1, NULL, "NULL",
		source, "abcdABCDyzYZ");
	TestNOT(*t1, filterNOT, "FilterNOT(Fitler1(acAC))",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestNOT(*t1, filterAND, "FilterAND(Fitler1(acAC),  Filter2(acyzYZ))",
		source, "\\u0061b\\u0063d\\u0041B\\u0043D\\u0079\\u007A\\u0059\\u005A");
	TestNOT(*t1, filterOR, "FilterOR(Fitler1(acAC),  Filter2(acyzYZ))",
		source, "\\u0061b\\u0063dABCDyzYZ");

	TestAND(*t1, new Filter1, new Filter2, "Filter1(a,c,A,C), Filter2(acyzYZ)", 
		source, "a\\u0062c\\u0064A\\u0042C\\u0044yzYZ");
	TestAND(*t1, new Filter2, new Filter1, "Filter2(acyzYZ), Filter1(a,c,A,C), ", 
		source, "a\\u0062c\\u0064A\\u0042C\\u0044yzYZ");
	TestAND(*t1, new Filter1, NULL, "Filter1(a,c,A,C), NULL", 
		source, "a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestAND(*t1, NULL, new Filter2, "NULL, Filter2(acyzYZ)",
		source, "a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ");
	TestAND(*t1, NULL, NULL, "NULL, NULL", 
		source, "\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestAND(*t1, filterAND, NULL, "FilterAND(Fitler1(acAC),  Filter2(acyzYZ)), NULL",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044yzYZ");
	TestAND(*t1, filterAND, new Filter1, "FilterAND(Fitler1(acAC),  Filter2(acyzYZ)), Filter1(acAC)",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044yzYZ");
	TestAND(*t1, filterAND, new Filter2, "FilterAND(Fitler1(acAC),  Filter2(acyzYZ)), Filter2(acyzYZ)",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044yzYZ");
	TestAND(*t1, new Filter1, filterAND, "Filter1(acAC), FilterAND(Filter1(acAC), Fitler1(acAC))",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044yzYZ");
	TestAND(*t1, new Filter2, filterAND, "Filter2(acyzYZ), FilterAND(Filter1(acAC), Fitler1(acAC))",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044yzYZ");
	TestAND(*t1, filterOR, NULL, "FilterOR(Fitler1(acAC),  Filter2(acyzYZ)), NULL",
		source, "a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestAND(*t1, filterOR, new Filter1, "FilterOR(Fitler1(acAC),  Filter2(acyzYZ)), Fitler1(acAC)",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestAND(*t1, filterOR, new Filter2, "FilterOR(Fitler1(acAC),  Filter2(acyzYZ)), Fitler2(acyzYZ)",
		source, "a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ");
	TestAND(*t1, filterNOT, new Filter1, "FilterNOT(Fitler1(acAC)), Fitler1(acAC)",
		source, "abcdABCDyzYZ");
	TestAND(*t1, new Filter1, filterNOT, "Fitler1(acAC), FilterNOT(Fitler1(acAC))",
		source, "abcdABCDyzYZ");
	TestAND(*t1, filterNOT, new Filter2, "FilterNOT(Fitler1(acAC)), Fitler2(acyzYZ)",
		source, "abcd\\u0041B\\u0043DyzYZ");
	TestAND(*t1, new Filter2, filterNOT, "Fitler2(acyzYZ), FilterNOT(Fitler1(acAC))",
		source, "abcd\\u0041B\\u0043DyzYZ");

	TestOR(*t1, new Filter1, new Filter2, "Filter1(a,c,A,C), Filter2(acyzYZ)",
		source, "a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestOR(*t1, new Filter2, new Filter1, "Filter2(acyzYZ), Filter1(a,c,A,C)",
		source, "a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestOR(*t1, new Filter1, NULL, "Filter1(a,c,A,C), NULL",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestOR(*t1, NULL, new Filter2, "NULL, Filter2(acyzYZ)",
		source, "a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ");
	TestOR(*t1, NULL, NULL, "NULL, NULL",
		source, "\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestOR(*t1, filterAND, NULL, "FilterAND(Fitler1(acAC),  Filter2(acyzYZ)), NULL",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044yzYZ");
	TestOR(*t1, filterAND, new Filter1, "FilterAND(Fitler1(acAC),  Filter2(acyzYZ)), Filter1(acAC)",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestOR(*t1, filterAND, new Filter2, "FilterAND(Fitler1(acAC),  Filter2(acyzYZ)), Filter2(acyzYZ)",
		source, "a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ");
	TestOR(*t1, new Filter1, filterAND, "Filter1(acAC), FilterAND(Filter1(acAC), Fitler1(acAC))",
		source, "a\\u0062c\\u0064A\\u0042C\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestOR(*t1, new Filter2, filterAND, "Filter2(acyzYZ), FilterAND(Filter1(acAC), Fitler1(acAC))",
		source, "a\\u0062c\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ");
	TestOR(*t1, filterNOT, new Filter1, "FilterNOT(Fitler1(acAC)), Fitler1(acAC)",
		source, "\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestOR(*t1, new Filter1, filterNOT, "Fitler1(acAC), FilterNOT(Fitler1(acAC))",
		source, "\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044\\u0079\\u007A\\u0059\\u005A");
	TestOR(*t1, filterNOT, new Filter2, "FilterNOT(Fitler1(acAC)), Fitler1(acyzYZ)",
		source, "\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ");
	TestOR(*t1, new Filter2, filterNOT, "Fitler2(acyzYZ), FilterNOT(Fitler1(acAC))",
		source, "\\u0061\\u0062\\u0063\\u0064\\u0041\\u0042\\u0043\\u0044yzYZ");


	delete filterNOT;
	delete filterAND;
	delete filterOR;
	delete t1;

}
void UnicodeFilterLogicTest::TestNOT(Transliterator& t,
									 const UnicodeFilter* f1, 
									 const UnicodeString& message,
									 const UnicodeString& source,
									 const UnicodeString& expected){
	UnicodeFilter *filter=UnicodeFilterLogic::createNot(f1);
    t.adoptFilter(filter);
	expect(t, "with FilterNOT(" + message + ")", source, expected);
	
}
void UnicodeFilterLogicTest::TestAND(Transliterator& t,
									 const UnicodeFilter* f1, 
									 const UnicodeFilter* f2, 
									 const UnicodeString& message,
									 const UnicodeString& source,
									 const UnicodeString& expected){
	UnicodeFilter *filter=UnicodeFilterLogic::createAnd(f1, f2);
    t.adoptFilter(filter);
	expect(t, "with FilterAND(" + message + ")", source, expected);
	
}
void UnicodeFilterLogicTest::TestOR(Transliterator& t,
									 const UnicodeFilter* f1, 
									 const UnicodeFilter* f2, 
									 const UnicodeString& message,
									 const UnicodeString& source,
									 const UnicodeString& expected){
	UnicodeFilter *filter=UnicodeFilterLogic::createOr(f1, f2);
    t.adoptFilter(filter);
	expect(t, "with FilterOR(" + message + ")", source, expected);
	
}

void UnicodeFilterLogicTest::expect(const Transliterator& t,
								 const UnicodeString& message,
                                const UnicodeString& source,
                                const UnicodeString& expectedResult) {
    
	
    UnicodeString rsource(source);
    t.transliterate(rsource);
    expectAux(t.getID() + ":Replaceable " + message, source + "->" + rsource, rsource==expectedResult, expectedResult);

}
void UnicodeFilterLogicTest::expectAux(const UnicodeString& tag,
                                   const UnicodeString& summary, UBool pass,
                                   const UnicodeString& expectedResult) {
    if (pass) {
        logln(UnicodeString("(")+tag+") " + prettify(summary));
    } else {
        errln(UnicodeString("FAIL: (")+tag+") "
              + prettify(summary)
              + ", expected " + prettify(expectedResult));
    }
}


