/*
 ******************************************************************************
 * 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]);
//    			}
//    		}
//    	}
//    }
}
