/*
 *******************************************************************************
 * Copyright (C) 1996-2000, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/translit/Attic/UnicodeFilterLogicTest.java,v $ 
 * $Date: 2002/08/28 16:45:19 $ 
 * $Revision: 1.6 $
 *
 *****************************************************************************************
 */
package com.ibm.icu.dev.test.translit;
import com.ibm.icu.lang.*;
import com.ibm.icu.text.*;
import com.ibm.icu.dev.test.*;
import com.ibm.icu.impl.Utility;
import java.text.*;
import java.util.*;

/**
 * @test
 * @summary UnicodeFilterLogic test 
 */
public class UnicodeFilterLogicTest extends TestFmwk {

   public static void main(String[] args) throws Exception {
        new UnicodeFilterLogicTest().run(args);
   }


   UnicodeFilter Filter1=new UnicodeFilter() {
        public boolean contains(int c) {
            if(c == 0x0061 || c == 0x0041 || c == 0x0063 || c == 0x0043)
                return false;
            else
                return true;
        }
        public String toPattern(boolean escapeUnprintable) {
            return "";
        }
        public boolean matchesIndexValue(int v) {
            return false;
        }
        public void addMatchSetTo(UnicodeSet toUnionTo) {}
   };
   UnicodeFilter Filter2=new UnicodeFilter() {
        public boolean contains(int c) {
            if(c == 0x0079 || c == 0x0059 || c == 0x007a || c == 0x005a  || c == 0x0061 || c == 0x0063)
                return false;
            else
                return true;
        }
        public String toPattern(boolean escapeUnprintable) {
            return "";
        }
        public boolean matchesIndexValue(int v) {
            return false;
        }
        public void addMatchSetTo(UnicodeSet toUnionTo) {}
   };

   public void TestAllFilters() {

        Transliterator t1 = Transliterator.getInstance("Any-Hex");
        String 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.setFilter(Filter1);
        expect(t1, "with Filter(acAC)", source, "a\u0062c\u0064A\u0042C\u0044\u0079\u007A\u0059\u005A");
        t1.setFilter(Filter2);
        expect(t1, "with Filter2(acyzYZ)", source, "a\u0062c\u0064\u0041\u0042\u0043\u0044yzYZ");

        UnicodeFilter filterNOT=UnicodeFilterLogic.not(Filter1);
        UnicodeFilter filterAND=UnicodeFilterLogic.and(Filter1, Filter2);
        UnicodeFilter filterOR=UnicodeFilterLogic.or(Filter1, Filter2);

        checkNOT(t1, Filter1, "Filter(acAC)",  source, "\u0061b\u0063d\u0041B\u0043DyzYZ");
        checkNOT(t1, Filter2, "Filter(acyzYZ)", source, "\u0061b\u0063dABCD\u0079\u007A\u0059\u005A");
       // checkNOT(t1, null, "NULL", source, "abcdABCDyzYZ");
        checkNOT(t1, filterNOT, "FilterNOT(Fitler1(acAC))", source, 
                 "a\u0062c\u0064A\u0042C\u0044\u0079\u007A\u0059\u005A");
        checkNOT(t1, filterAND, "FilterAND(Fitler1(acAC),  Filter2(acyzYZ))",  source, 
                  "\u0061b\u0063d\u0041B\u0043D\u0079\u007A\u0059\u005A");
        checkNOT(t1, filterOR, "FilterOR(Fitler1(acAC),  Filter2(acyzYZ))",  source, 
                 "\u0061b\u0063dABCDyzYZ");

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

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

  
}
    //======================================================================
    // Support methods
    //======================================================================

    void checkOR(Transliterator t,
                   UnicodeFilter f1, 
                   UnicodeFilter f2, 
                   String message,
                   String source,
                   String expected){
        UnicodeFilter filter=UnicodeFilterLogic.or(f1, f2);
        t.setFilter(filter);
        expect(t, "with FilterOR(" + message + ")", source, expected);

    }
    void checkAND(Transliterator t,
                   UnicodeFilter f1, 
                   UnicodeFilter f2, 
                   String message,
                   String source,
                   String expected){
        UnicodeFilter filter=UnicodeFilterLogic.and(f1, f2);
        t.setFilter(filter);
        expect(t, "with FilterAND(" + message + ")", source, expected);

    }
    void checkNOT(Transliterator t,
                   UnicodeFilter f1, 
                   String message,
                   String source,
                   String expected){
        UnicodeFilter filter=UnicodeFilterLogic.not(f1);
        t.setFilter(filter);
        expect(t, "with FilterNOT(" + message + ")", source, expected);

    }  
    void expect(Transliterator t,  String message,  String source,  String expectedResult) {
        String rsource = source;
        t.transliterate(rsource);
        expectAux(t.getID() + ":Replaceable " + message, source + "->" + rsource, expectedResult.equals(rsource), expectedResult);

    }
    void expectAux(String tag, String summary, boolean pass, String expectedResult) {
        if (pass) {
            logln("(" + tag+ ") " + Utility.escape(summary));
        } else {
            errln("FAIL: ("+ tag+ ") "
                + Utility.escape(summary)
                + ", expected " + Utility.escape(expectedResult));
        }
    }

}



