/**
*******************************************************************************
* Copyright (C) 1996-2001, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/lang/UCharacterCompare.java,v $ 
* $Date: 2002/04/04 00:52:31 $ 
* $Revision: 1.10 $
*
*******************************************************************************
*/

package com.ibm.icu.dev.test.lang;

import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.lang.UCharacterCategory;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Hashtable;
import java.util.Enumeration;

/**
* A class to compare the difference in methods between java.lang.Character and
* UCharacter
* @author Syn Wee Quek
* @since oct 06 2000
* @see com.ibm.icu.text.UCharacter
*/

public final class UCharacterCompare
{ 
  // private variables ================================================
  
  private static Hashtable m_hashtable_ = new Hashtable();
  
  // public methods ======================================================
  
  /**
  * Main testing method
  */
  public static void main(String arg[])
  {
  	System.out.println("Starting character compare");
    try
    {
      FileWriter f;
      if (arg.length == 0)
        f = new FileWriter("compare.txt");
      else
        f = new FileWriter(arg[0]);
      PrintWriter p = new PrintWriter(f);
      p.print("char  character name                                                           ");
      p.println("method name               ucharacter character");
      for (char i = Character.MIN_VALUE; i < Character.MAX_VALUE; i ++)
      {
      	System.out.println("character \\u" + Integer.toHexString(i));
        if (UCharacter.isDefined(i) != Character.isDefined(i))
          trackDifference(p, i, "isDefined()", "" + UCharacter.isDefined(i), 
                          "" + Character.isDefined(i));
        else
        {
          if (UCharacter.digit(i, 10) != Character.digit(i, 10))
            trackDifference(p, i, "digit()", "" + UCharacter.digit(i, 10),
                            "" + Character.digit(i, 10));
          if (UCharacter.getNumericValue(i) != Character.getNumericValue(i))
            trackDifference(p, i, "getNumericValue()", 
                            "" + UCharacter.getNumericValue(i),
                            "" + Character.getNumericValue(i));
          if (!compareType(UCharacter.getType(i), Character.getType(i)))
            trackDifference(p, i, "getType()", "" + UCharacter.getType(i),
                            "" + Character.getType(i));
          if (UCharacter.isDigit(i) != Character.isDigit(i))
            trackDifference(p, i, "isDigit()",
                            "" + UCharacter.isDigit(i), 
                            "" + Character.isDigit(i));
          if (UCharacter.isISOControl(i) != Character.isISOControl(i))
            trackDifference(p, i, "isISOControl()", 
                            "" + UCharacter.isISOControl(i),
                            "" + Character.isISOControl(i));
          if (UCharacter.isLetter(i) != Character.isLetter(i))
            trackDifference(p, i, "isLetter()", "" + UCharacter.isLetter(i),
                            "" + Character.isLetter(i));
          if (UCharacter.isLetterOrDigit(i) != Character.isLetterOrDigit(i))
            trackDifference(p, i, "isLetterOrDigit()", 
                            "" + UCharacter.isLetterOrDigit(i),
                            "" + Character.isLetterOrDigit(i));
          if (UCharacter.isLowerCase(i) != Character.isLowerCase(i))
            trackDifference(p, i, "isLowerCase()", 
                            "" + UCharacter.isLowerCase(i),
                            "" + Character.isLowerCase(i));
          if (UCharacter.isWhitespace(i) != Character.isWhitespace(i))
            trackDifference(p, i, "isWhitespace()", 
                            "" + UCharacter.isWhitespace(i),
                            "" + Character.isWhitespace(i));
          if (UCharacter.isSpaceChar(i) != Character.isSpaceChar(i))
            trackDifference(p, i, "isSpaceChar()", 
                            "" + UCharacter.isSpaceChar(i),
                            "" + Character.isSpaceChar(i));
          if (UCharacter.isTitleCase(i) != Character.isTitleCase(i))
            trackDifference(p, i, "isTitleChar()", 
                            "" + UCharacter.isTitleCase(i),
                            "" + Character.isTitleCase(i));
          if (UCharacter.isUnicodeIdentifierPart(i) != 
              Character.isUnicodeIdentifierPart(i))
            trackDifference(p, i, "isUnicodeIdentifierPart()", 
                            "" + UCharacter.isUnicodeIdentifierPart(i),
                            "" + Character.isUnicodeIdentifierPart(i));
          if (UCharacter.isUnicodeIdentifierStart(i) != 
              Character.isUnicodeIdentifierStart(i))
            trackDifference(p, i, "isUnicodeIdentifierStart()",
                            "" + UCharacter.isUnicodeIdentifierStart(i),
                            "" + Character.isUnicodeIdentifierStart(i));
          if (UCharacter.isIdentifierIgnorable(i) != 
              Character.isIdentifierIgnorable(i))
            trackDifference(p, i, "isIdentifierIgnorable()",
                            "" + UCharacter.isIdentifierIgnorable(i),
                            "" + Character.isIdentifierIgnorable(i));
          if (UCharacter.isUpperCase(i) != Character.isUpperCase(i))
            trackDifference(p, i, "isUpperCase()", 
                            "" + UCharacter.isUpperCase(i),
                            "" + Character.isUpperCase(i));
          if (UCharacter.toLowerCase(i) != Character.toLowerCase(i))
            trackDifference(p, i, "toLowerCase()", 
                            Integer.toHexString(UCharacter.toLowerCase(i)),
                            Integer.toHexString(Character.toLowerCase(i)));
          if (!UCharacter.toString(i).equals(new Character(i).toString()))
            trackDifference(p, i, "toString()",
                            UCharacter.toString(i),
                            new Character(i).toString());
          if (UCharacter.toTitleCase(i) != Character.toTitleCase(i))
            trackDifference(p, i, "toTitleCase()",
                            Integer.toHexString(UCharacter.toTitleCase(i)),
                            Integer.toHexString(Character.toTitleCase(i)));
          if (UCharacter.toUpperCase(i) != Character.toUpperCase(i))
            trackDifference(p, i, "toUpperCase()",
                            Integer.toHexString(UCharacter.toUpperCase(i)),
                            Integer.toHexString(Character.toUpperCase(i)));
        }
      }
      summary(p);
      p.close();
    } 
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }
  
  // private methods ===================================================
  
  /**
  * Comparing types
  * @param uchartype UCharacter type
  * @param jchartype java.lang.Character type
  */
  private static boolean compareType(int uchartype, int jchartype)
  {
    if (uchartype == UCharacterCategory.UNASSIGNED && 
        jchartype == Character.UNASSIGNED)
      return true;
    if (uchartype == UCharacterCategory.UPPERCASE_LETTER && 
        jchartype == Character.UPPERCASE_LETTER)
      return true;                                                   
    if (uchartype == UCharacterCategory.LOWERCASE_LETTER && 
        jchartype == Character.LOWERCASE_LETTER)
      return true;                                                   
    if (uchartype == UCharacterCategory.TITLECASE_LETTER && 
        jchartype == Character.TITLECASE_LETTER)
      return true;
    if (uchartype == UCharacterCategory.MODIFIER_LETTER && 
        jchartype == Character.MODIFIER_LETTER)
      return true;
    if (uchartype == UCharacterCategory.OTHER_LETTER && 
        jchartype == Character.OTHER_LETTER)
      return true;
    if (uchartype == UCharacterCategory.NON_SPACING_MARK && 
        jchartype == Character.NON_SPACING_MARK)
      return true;
    if (uchartype == UCharacterCategory.ENCLOSING_MARK && 
        jchartype == Character.ENCLOSING_MARK)
      return true;
    if (uchartype == UCharacterCategory.COMBINING_SPACING_MARK && 
        jchartype == Character.COMBINING_SPACING_MARK)
      return true;
	  if (uchartype == UCharacterCategory.DECIMAL_DIGIT_NUMBER && 
        jchartype == Character.DECIMAL_DIGIT_NUMBER)
      return true;
	  if (uchartype == UCharacterCategory.LETTER_NUMBER && 
        jchartype == Character.LETTER_NUMBER)
      return true;
	  if (uchartype == UCharacterCategory.OTHER_NUMBER && 
        jchartype == Character.OTHER_NUMBER)
      return true;
	  if (uchartype == UCharacterCategory.SPACE_SEPARATOR && 
        jchartype == Character.SPACE_SEPARATOR)
      return true;
	  if (uchartype == UCharacterCategory.LINE_SEPARATOR && 
        jchartype == Character.LINE_SEPARATOR)
      return true;
	  if (uchartype == UCharacterCategory.PARAGRAPH_SEPARATOR && 
        jchartype == Character.PARAGRAPH_SEPARATOR)
      return true;
	  if (uchartype == UCharacterCategory.CONTROL && 
        jchartype == Character.CONTROL)
      return true;
    if (uchartype == UCharacterCategory.FORMAT && 
        jchartype == Character.FORMAT)
      return true;
	  if (uchartype == UCharacterCategory.PRIVATE_USE && 
        jchartype == Character.PRIVATE_USE)
      return true;
    if (uchartype == UCharacterCategory.SURROGATE && 
        jchartype == Character.SURROGATE)
      return true;
    if (uchartype == UCharacterCategory.DASH_PUNCTUATION && 
        jchartype == Character.DASH_PUNCTUATION)
      return true;
	  if (uchartype == UCharacterCategory.START_PUNCTUATION && 
        jchartype == Character.START_PUNCTUATION)
      return true;
	  if (uchartype == UCharacterCategory.END_PUNCTUATION && 
        jchartype == Character.END_PUNCTUATION)
      return true;
    if (uchartype == UCharacterCategory.CONNECTOR_PUNCTUATION && 
        jchartype == Character.CONNECTOR_PUNCTUATION)
      return true;
    if (uchartype == UCharacterCategory.OTHER_PUNCTUATION && 
        jchartype == Character.OTHER_PUNCTUATION)
      return true;
	  if (uchartype == UCharacterCategory.MATH_SYMBOL && 
        jchartype == Character.MATH_SYMBOL)
      return true;
	  if (uchartype == UCharacterCategory.CURRENCY_SYMBOL && 
        jchartype == Character.CURRENCY_SYMBOL)
      return true;
	  if (uchartype == UCharacterCategory.MODIFIER_SYMBOL && 
        jchartype == Character.MODIFIER_SYMBOL)
      return true;
	  if (uchartype == UCharacterCategory.OTHER_SYMBOL && 
        jchartype == Character.OTHER_SYMBOL)
      return true;
	  if (uchartype == UCharacterCategory.INITIAL_PUNCTUATION && 
        jchartype == Character.START_PUNCTUATION)
      return true;
    if (uchartype == UCharacterCategory.FINAL_PUNCTUATION && 
        jchartype == Character.END_PUNCTUATION)
      return true;
	  /*if (uchartype == UCharacterCategory.GENERAL_OTHER_TYPES && 
        jchartype == Character.GENERAL_OTHER_TYPES)
      return true;*/
    return false;
	}
	
	/**
	* Difference writing to file
	* @param f file outputstream
	* @param ch code point
	* @param method for testing
	* @param ucharval UCharacter value after running method
	* @param charval Character value after running method
	* @exception thrown when error occur in writing to file
	*/
	private static void trackDifference(PrintWriter f, int ch, String method,
	                                    String ucharval, String charval)
	  throws Exception
	{
	  if (m_hashtable_.containsKey(method))
	  {
	    Integer value = (Integer)m_hashtable_.get(method);
	    m_hashtable_.put(method, new Integer(value.intValue() + 1));
	  }
	  else
	    m_hashtable_.put(method, new Integer(1));
	  
	  String temp = Integer.toHexString(ch);
	  StringBuffer s = new StringBuffer(temp);
	  for (int i = 0; i < 6 - temp.length(); i ++)
	    s.append(' ');
	  temp = UCharacter.getExtendedName(ch);
	  if (temp == null)
	    temp = " ";
	  s.append(temp);
	  for (int i = 0; i < 73 - temp.length(); i ++)
	    s.append(' ');
	  
	  s.append(method);
	  for (int i = 0; i < 27 - method.length(); i ++)
	    s.append(' ');
	  s.append(ucharval);
	  for (int i = 0; i < 11 - ucharval.length(); i ++)
	    s.append(' ');
	  s.append(charval);
	  f.println(s.toString());
	}
	
	/**
	* Does up a summary of the differences
	* @param f file outputstream
	*/
	private static void summary(PrintWriter f)
	{
	  f.println("==================================================");
	  f.println("Summary of differences");
	  for (Enumeration e = m_hashtable_.keys() ; e.hasMoreElements() ;) 
	  {
	    StringBuffer method = new StringBuffer((String)e.nextElement());
	    int count = ((Integer)m_hashtable_.get(method.toString())).intValue();
	    for (int i = 30 - method.length(); i > 0; i --)
	      method.append(' ');
      f.println(method + "  " + count);
    }
	}
}

