12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2007-2012, International Business Machines Corporation and         *
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Iterator;
152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport java.util.List;
162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test;
182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.runner.RunWith;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.ModuleTest;
212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.dev.test.ModuleTest.TestDataPair;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestDataModule;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestDataModule.DataMap;
242d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.dev.test.TestDataModule.TestData;
252d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.util.CalendarFieldsSet;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.util.DateTimeStyleSet;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DateFormat;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.SimpleDateFormat;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Calendar;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeZone;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport junitparams.JUnitParamsRunner;
352d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport junitparams.Parameters;
362d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author srl
392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * @author sgill
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert@RunWith(JUnitParamsRunner.class)
432d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertpublic class DataDrivenFormatTest extends TestFmwk {
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param baseName
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locName
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public DataDrivenFormatTest() {
502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        //super("com/ibm/icu/dev/data/testdata/", "format");
512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @SuppressWarnings("unused")
542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    private List<TestDataPair> getTestData() throws Exception {
552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        return ModuleTest.getTestData("com/ibm/icu/dev/data/testdata/", "format");
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* (non-Javadoc)
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.dev.test.ModuleTest#processModules()
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Parameters(method="getTestData")
632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void formatTest(TestDataPair pair) {
642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        TestData td = pair.td;
652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        DataMap settings = pair.dm;
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        String type = settings.getString("Type");
692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        if(type.equals("date_format")) {
712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            testConvertDate(td, settings, true);
722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        } else if(type.equals("date_parse")) {
732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            testConvertDate(td, settings, false);
742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        } else {
752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            errln("Unknown type: " + type);
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String kPATTERN = "PATTERN=";
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String kMILLIS = "MILLIS=";
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String kRELATIVE_MILLIS = "RELATIVE_MILLIS=";
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String kRELATIVE_ADD = "RELATIVE_ADD:";
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void testConvertDate(TestDataModule.TestData testData, DataMap  settings, boolean fmt) {
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat basicFmt = new SimpleDateFormat("EEE MMM dd yyyy / YYYY'-W'ww-ee");
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int n = 0;
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Iterator iter = testData.getDataIterator(); iter.hasNext();) {
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ++n;
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            long now = System.currentTimeMillis();
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DataMap currentCase = (DataMap) iter.next();
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String caseString = "["+testData.getName()+"#"+n+(fmt?"format":"parse")+"]";
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String locale = currentCase.getString("locale");
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String zone = currentCase.getString("zone");
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String spec = currentCase.getString("spec");
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String date = currentCase.getString("date");
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str = currentCase.getString("str");
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date fromDate = null;
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean useDate = false;
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ULocale loc = new ULocale(locale);
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pattern = null;
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//            boolean usePattern = false;
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat format = null;
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateTimeStyleSet styleSet;
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            CalendarFieldsSet fromSet = null;
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // parse 'spec'  - either 'PATTERN=yy mm dd' or 'DATE=x,TIME=y'
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(spec.startsWith(kPATTERN)) {
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pattern = spec.substring(kPATTERN.length());
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//                usePattern = true;
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                format = new SimpleDateFormat(pattern, loc);
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                styleSet = new DateTimeStyleSet();
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                styleSet.parseFrom(spec);
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                format = DateFormat.getDateTimeInstance(styleSet.getDateStyle(), styleSet.getTimeStyle(), loc);
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Calendar cal = Calendar.getInstance(loc);
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (zone.length() > 0) {
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                TimeZone tz = TimeZone.getFrozenTimeZone(zone);
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                cal.setTimeZone(tz);
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                format.setTimeZone(tz);
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // parse 'date' - either 'MILLIS=12345' or  a CalendarFieldsSet
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(date.startsWith(kMILLIS)) {
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                useDate = true;
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fromDate = new Date(Long.parseLong(date.substring(kMILLIS.length())));
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else if(date.startsWith(kRELATIVE_MILLIS)) {
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                useDate = true;
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fromDate = new Date(now+Long.parseLong(date.substring(kRELATIVE_MILLIS.length())));
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else if(date.startsWith(kRELATIVE_ADD)) {
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String add = date.substring(kRELATIVE_ADD.length()); // "add" is a string indicating which fields to add
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CalendarFieldsSet addSet = new CalendarFieldsSet();
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                addSet.parseFrom(add);
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                useDate = true;
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                cal.clear();
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                cal.setTimeInMillis(now);
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                /// perform op on 'to calendar'
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int q=0; q<addSet.fieldCount(); q++) {
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (addSet.isSet(q)) {
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (q == Calendar.DATE) {
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            cal.add(q,addSet.get(q));
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } else {
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            cal.set(q,addSet.get(q));
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fromDate = cal.getTime();
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fromSet = new CalendarFieldsSet();
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fromSet.parseFrom(date);
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // run the test
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(fmt) {
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringBuffer output = new StringBuffer();
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                cal.clear();
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                FieldPosition pos = new FieldPosition(0);
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(useDate) {
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    output = format.format(fromDate, output, pos);
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    fromSet.setOnCalendar(cal);
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    format.format(cal, output, pos);
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(output.toString().equals(str)) {
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln(caseString + " Success - strings match: " + output);
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln(caseString + " FAIL: got " + output + " expected " + str);
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else { // parse
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                cal.clear();
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ParsePosition pos = new ParsePosition(0);
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                format.parse(str, cal, pos);
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(useDate) {
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Date gotDate = cal.getTime();
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if(gotDate.equals(fromDate)) {
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        logln(caseString + " SUCCESS: got=parse="+str);
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else {
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(caseString + " FAIL: parsed " + str + " but got " +
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                basicFmt.format(gotDate) + " - " + gotDate + "  expected " +
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                basicFmt.format(fromDate));
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else  {
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    CalendarFieldsSet diffSet = new CalendarFieldsSet();
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if(!fromSet.matches(cal, diffSet)) {
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String diffs = diffSet.diffFrom(fromSet);
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(caseString + " FAIL:  differences: " + diffs);
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else {
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        logln(caseString + " SUCCESS: got=parse: " + str + " - " + fromSet.toString());
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
205