/** Copyright (C) 2008, International Business Machines Corporation and Others. All Rights Reserved. **/

/* NOTE: this file is AUTOMATICALLY GENERATED by gentest. */

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

public class DebugUtilitiesData extends Object {
    public static final String ICU4C_VERSION="3.9.2";
    public static final int UDebugEnumType = 0;
    public static final int UCalendarDateFields = 1;
    public static final int UCalendarMonths = 2;
    public static final int UDateFormatStyle = 3;
    public static final String [] TYPES = { 
        "UDebugEnumType", /* 0 */
        "UCalendarDateFields", /* 1 */
        "UCalendarMonths", /* 2 */
        "UDateFormatStyle", /* 3 */
    };

    public static final String [][] NAMES = { 
        /* UDebugEnumType, 0 */
        { 
           "UDebugEnumType", /* 0 */ 
           "UCalendarDateFields", /* 1 */ 
           "UCalendarMonths", /* 2 */ 
           "UDateFormatStyle", /* 3 */ 
        },
        /* UCalendarDateFields, 1 */
        { 
           "ERA", /* 0 */ 
           "YEAR", /* 1 */ 
           "MONTH", /* 2 */ 
           "WEEK_OF_YEAR", /* 3 */ 
           "WEEK_OF_MONTH", /* 4 */ 
           "DATE", /* 5 */ 
           "DAY_OF_YEAR", /* 6 */ 
           "DAY_OF_WEEK", /* 7 */ 
           "DAY_OF_WEEK_IN_MONTH", /* 8 */ 
           "AM_PM", /* 9 */ 
           "HOUR", /* 10 */ 
           "HOUR_OF_DAY", /* 11 */ 
           "MINUTE", /* 12 */ 
           "SECOND", /* 13 */ 
           "MILLISECOND", /* 14 */ 
           "ZONE_OFFSET", /* 15 */ 
           "DST_OFFSET", /* 16 */ 
           "YEAR_WOY", /* 17 */ 
           "DOW_LOCAL", /* 18 */ 
           "EXTENDED_YEAR", /* 19 */ 
           "JULIAN_DAY", /* 20 */ 
           "MILLISECONDS_IN_DAY", /* 21 */ 
           "IS_LEAP_MONTH", /* 22 */ 
        },
        /* UCalendarMonths, 2 */
        { 
           "JANUARY", /* 0 */ 
           "FEBRUARY", /* 1 */ 
           "MARCH", /* 2 */ 
           "APRIL", /* 3 */ 
           "MAY", /* 4 */ 
           "JUNE", /* 5 */ 
           "JULY", /* 6 */ 
           "AUGUST", /* 7 */ 
           "SEPTEMBER", /* 8 */ 
           "OCTOBER", /* 9 */ 
           "NOVEMBER", /* 10 */ 
           "DECEMBER", /* 11 */ 
           "UNDECIMBER", /* 12 */ 
        },
        /* UDateFormatStyle, 3 */
        { 
           "FULL", /* 0 */ 
           "LONG", /* 1 */ 
           "MEDIUM", /* 2 */ 
           "SHORT", /* 3 */ 
        },
    };

    public static final int [][] VALUES = { 
        /* UDebugEnumType, 0 */
        { 
           0, /* UDebugEnumType */
           1, /* UCalendarDateFields */
           2, /* UCalendarMonths */
           3, /* UDateFormatStyle */
        },
        /* UCalendarDateFields, 1 */
        { 
           com.ibm.icu.util.Calendar.ERA, /* 0 */
           com.ibm.icu.util.Calendar.YEAR, /* 1 */
           com.ibm.icu.util.Calendar.MONTH, /* 2 */
           com.ibm.icu.util.Calendar.WEEK_OF_YEAR, /* 3 */
           com.ibm.icu.util.Calendar.WEEK_OF_MONTH, /* 4 */
           com.ibm.icu.util.Calendar.DATE, /* 5 */
           com.ibm.icu.util.Calendar.DAY_OF_YEAR, /* 6 */
           com.ibm.icu.util.Calendar.DAY_OF_WEEK, /* 7 */
           com.ibm.icu.util.Calendar.DAY_OF_WEEK_IN_MONTH, /* 8 */
           com.ibm.icu.util.Calendar.AM_PM, /* 9 */
           com.ibm.icu.util.Calendar.HOUR, /* 10 */
           com.ibm.icu.util.Calendar.HOUR_OF_DAY, /* 11 */
           com.ibm.icu.util.Calendar.MINUTE, /* 12 */
           com.ibm.icu.util.Calendar.SECOND, /* 13 */
           com.ibm.icu.util.Calendar.MILLISECOND, /* 14 */
           com.ibm.icu.util.Calendar.ZONE_OFFSET, /* 15 */
           com.ibm.icu.util.Calendar.DST_OFFSET, /* 16 */
           com.ibm.icu.util.Calendar.YEAR_WOY, /* 17 */
           com.ibm.icu.util.Calendar.DOW_LOCAL, /* 18 */
           com.ibm.icu.util.Calendar.EXTENDED_YEAR, /* 19 */
           com.ibm.icu.util.Calendar.JULIAN_DAY, /* 20 */
           com.ibm.icu.util.Calendar.MILLISECONDS_IN_DAY, /* 21 */
           com.ibm.icu.util.ChineseCalendar.IS_LEAP_MONTH, /* 22 */
        },
        /* UCalendarMonths, 2 */
        { 
           com.ibm.icu.util.Calendar.JANUARY, /* 0 */
           com.ibm.icu.util.Calendar.FEBRUARY, /* 1 */
           com.ibm.icu.util.Calendar.MARCH, /* 2 */
           com.ibm.icu.util.Calendar.APRIL, /* 3 */
           com.ibm.icu.util.Calendar.MAY, /* 4 */
           com.ibm.icu.util.Calendar.JUNE, /* 5 */
           com.ibm.icu.util.Calendar.JULY, /* 6 */
           com.ibm.icu.util.Calendar.AUGUST, /* 7 */
           com.ibm.icu.util.Calendar.SEPTEMBER, /* 8 */
           com.ibm.icu.util.Calendar.OCTOBER, /* 9 */
           com.ibm.icu.util.Calendar.NOVEMBER, /* 10 */
           com.ibm.icu.util.Calendar.DECEMBER, /* 11 */
           com.ibm.icu.util.Calendar.UNDECIMBER, /* 12 */
        },
        /* UDateFormatStyle, 3 */
        { 
           0, /* FULL */
           1, /* LONG */
           2, /* MEDIUM */
           3, /* SHORT */
        },
    };

}
