/**
*******************************************************************************
* Copyright (C) 1996-2001, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/unicodetools/com/ibm/text/UCD/GenerateCaseTest.java,v $
* $Date: 2004/02/07 01:01:15 $
* $Revision: 1.2 $
*
*******************************************************************************
*/

package com.ibm.text.UCD;

import java.util.*;
import java.io.*;

import com.ibm.text.utility.*;
import com.ibm.icu.text.UTF16;
import com.ibm.icu.text.UnicodeSet;

abstract public class GenerateCaseTest implements UCD_Types {
    
    public static void main(String[] args) throws IOException {
        System.out.println("Remember to add length marks (half & full) and other punctuation for sentence, with FF61");

        PrintWriter out = Utility.openPrintWriter("CaseTest.txt", Utility.UTF8_WINDOWS);

        out.println("# CaseTest");
        out.println("# Generated: " + Default.getDate() + ", MED");
        Utility.appendFile("CaseTestHeader.txt", Utility.LATIN1, out);
        
        for (int cp = 0; cp < 0x10FFFF; ++cp) {
            Utility.dot(cp);
            if (!Default.ucd().isAllocated(cp)) continue;
            if (Default.ucd().isHangulSyllable(cp)) continue;
            byte cat = Default.ucd().getCategory(cp);
            if (cp == PRIVATE_USE) continue;
            
            String lower = Default.ucd().getCase(cp, FULL, LOWER); 
            String upper = Default.ucd().getCase(cp, FULL, UPPER); 
            String title = Default.ucd().getCase(cp, FULL, TITLE); 
            String fold = Default.ucd().getCase(cp, FULL, FOLD);
            if (lower.equals(upper) 
                && lower.equals(title) 
                && lower.equals(fold)) continue;
            
            String s = UTF16.valueOf(cp);
            write(out, s, true);
            
            // if (cp == '\u0345') continue; // don't add combining for this special case
            
            s = s + testChar;
            
            String s2 = Default.nfd().normalize(s);
            
            String lower1 = Default.nfc().normalize(Default.ucd().getCase(s2, FULL, LOWER)); 
            String upper1 = Default.nfc().normalize(Default.ucd().getCase(s2, FULL, UPPER)); 
            String title1 = Default.nfc().normalize(Default.ucd().getCase(s2, FULL, TITLE)); 
            String fold1 = Default.nfc().normalize(Default.ucd().getCase(s2, FULL, FOLD));
            
            if (lower1.equals(Default.nfc().normalize(lower+testChar))
                && upper1.equals(Default.nfc().normalize(upper+testChar))
                && title1.equals(Default.nfc().normalize(title+testChar))
                && fold1.equals(Default.nfc().normalize(fold+testChar))
            ) continue;
            
            write(out, s, true);
        }
        out.println("# total lines: " + counter);
        out.close();
    }
    
    static final char testChar = '\u0316';
    static int counter = 0;
    
    static void write(PrintWriter out, String ss, boolean doComment) {
        String s = Default.nfd().normalize(ss);
        String lower = Default.nfc().normalize(Default.ucd().getCase(s, FULL, LOWER)); 
        String upper = Default.nfc().normalize(Default.ucd().getCase(s, FULL, UPPER)); 
        String title = Default.nfc().normalize(Default.ucd().getCase(s, FULL, TITLE)); 
        String fold = Default.nfc().normalize(Default.ucd().getCase(s, FULL, FOLD));
        out.println(Utility.hex(ss) + "; "
            + Utility.hex(lower) + "; "
            + Utility.hex(upper) + "; "
            + Utility.hex(title) + "; "
            + Utility.hex(fold)
            + (doComment ?  "\t# " + Default.ucd().getName(ss) : "")
        );
        counter++;
    }
}