/** Copyright (C) 2007, 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.7.2";
    public static final int UDebugEnumType = 0;
    public static final int UCalendarDateFields = 1;
    public static final int UCalendarMonths = 2;
    public static final String [] TYPES = { 
        "UDebugEnumType", /* 0 */
        "UCalendarDateFields", /* 1 */
        "UCalendarMonths", /* 2 */
    };

    public static final String [][] NAMES = { 
        /* UDebugEnumType, 0 */
        { 
           "UDebugEnumType", /* 0 */ 
           "UCalendarDateFields", /* 1 */ 
           "UCalendarMonths", /* 2 */ 
        },
        /* 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 */ 
        },
        /* 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 */ 
        },
    };

    public static final int [][] VALUES = { 
        /* UDebugEnumType, 0 */
        { 
           0, /* UDebugEnumType */
           1, /* UCalendarDateFields */
           2, /* UCalendarMonths */
        },
        /* 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 */
        },
        /* 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 */
        },
    };

}
