/*
 ******************************************************************************
 * Copyright (C) 2005, International Business Machines Corporation and        *
 * others. All Rights Reserved.                                               *
 ******************************************************************************
 */
package com.ibm.icu.tests;

import junit.framework.TestCase;
import com.ibm.icu.dev.test.TestAll;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.dev.test.TestFmwk.TestParams;

//import com.ibm.icu.text.DateFormat;
//import com.ibm.icu.util.Calendar;
//import com.ibm.icu.util.GregorianCalendar;
//import com.ibm.icu.util.TimeZone;
//import com.ibm.icu.util.ULocale;

public class UnitTest extends TestCase {
    
    public void testCalendar() throws Exception {
        runUtility("Calendar");
    }

    public void testCollator() throws Exception {
        runUtility("Collator");
    }

    public void testCompression() throws Exception {
        runUtility("Compression");
    }

    public void testDiagBigDecimal() throws Exception {
        runUtility("DiagBigDecimal");
    }

    public void testFormat() throws Exception {
        runUtility("Format");
    }

    public void testImpl() throws Exception {
        runUtility("Impl");
    }

    public void testNormalizer() throws Exception {
        runUtility("Normalizer");
    }

    public void testProperty() throws Exception {
        runUtility("Property");
    }

    public void testRBBI() throws Exception {
        runUtility("RBBI");
    }

    public void testSearchTest() throws Exception {
        runUtility("SearchTest");
    }

    public void testStringPrep() throws Exception {
        runUtility("StringPrep");
    }

    public void testTestCharsetDetector() throws Exception {
        runUtility("TestCharsetDetector");
    }

    public void testTestUCharacterIterator() throws Exception {
        runUtility("TestUCharacterIterator");
    }

    public void testTimeScale() throws Exception {
        runUtility("TimeScale");
    }

    public void testTimeZone() throws Exception {
        runUtility("TimeZone");
    }

    public void testTranslit() throws Exception {
        runUtility("Translit");
    }

    public void testUtil() throws Exception {
        runUtility("Util");
    }

    public void runUtility(String testname) throws Exception {
        TestParams params = TestParams.create("-n", null);
        TestFmwk test = new TestAll();
        test.resolveTarget(params, testname).run();
        if (params.errorCount > 0) {
            fail(params.errorSummary.toString());
        }
    }
	
    // sample tests from ICU4J test suite

    // Calendar
//    public void testCalendarSimple() throws Exception {
//    	TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
//    	GregorianCalendar gc = new GregorianCalendar(tz);
//    	gc.set(2005,9,17,14,15,33);
//    	Date time = gc.getTime();
//    	
//    	final String[] calendars = {
//    		"buddhist", "chinese", "coptic", "ethiopic", "gregorian", 
//    		"hebrew", "islamic", "islamic-civil", "japanese"
//    	};
//    	final String[] ustimes = {
//    		"Monday, October 17, 2548 BE 2:15:33 PM PDT",
//    		"Monday 22x78-9-15 2:15:33 PM PDT",
//    		"Monday, Baba 7, 1722 2:15:33 PM PDT",
//    		"Monday, Tekemt 7, 1998 2:15:33 PM PDT",
//    		"Monday, October 17, 2005 2:15:33 PM PDT",
//    		"Monday, Tishri 14, 5766 2:15:33 PM PDT",
//    		"Monday, Ramadan 14, 1426 2:15:33 PM PDT",
//    		"Monday, Ramadan 14, 1426 2:15:33 PM PDT",
//    		"Monday, October 17, 17 Heisei 2:15:33 PM PDT",
//    	};
//    	final String[] detimes = {
//    		"Montag, Oktober 17, 2548 BE 2:15:33 nachm. GMT-07:00",
//    		"Montag 22x78-9-15 2:15:33 nachm. GMT-07:00",
//    		"Montag, 7. Baba 1722 14:15 Uhr GMT-07:00",
//    		"Montag, 7. Tekemt 1998 14:15 Uhr GMT-07:00",
//    		"Montag, 17. Oktober 2005 14:15 Uhr GMT-07:00",
//    		"Montag, 14. Tishri 5766 14:15 Uhr GMT-07:00",
//    		"Montag, 14. Ramadan 1426 14:15 Uhr GMT-07:00",
//    		"Montag, 14. Ramadan 1426 14:15 Uhr GMT-07:00",
//    		"Montag, Oktober 17, 17 Heisei 2:15:33 nachm. GMT-07:00",
//    	};
//    	
//    	ULocale[] locales = {ULocale.US, ULocale.GERMANY };
//    	String[][] times = { ustimes, detimes };
//    	for (int j = 0; j < locales.length; ++j) {
//    		ULocale ul = new ULocale("en_US");
//    		for (int i = 0; i < calendars.length; ++i) {
//    			ul = ul.setKeywordValue("calendar", calendars[i]);
//    			Calendar cal = Calendar.getInstance(ul);
//    			DateFormat fmt = cal.getDateTimeFormat(DateFormat.FULL, DateFormat.FULL, locales[j]);
//    			String result = fmt.format(time);
//  			    System.out.println(calendars[i] + ": " + result);
//    			if (!result.equals(times[j][i])) {
//    				fail("calendar: " + calendars[i]);
//    			}
//    		}
//    	}
//    }
}
