2 ******************************************************************************
\r
3 * Copyright (C) 2007-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 ******************************************************************************
\r
8 // Copyright 2006 Google Inc. All Rights Reserved.
\r
10 package com.ibm.icu.dev.test.duration;
\r
12 import java.io.BufferedReader;
\r
13 import java.io.InputStream;
\r
14 import java.io.InputStreamReader;
\r
15 import java.io.PrintWriter;
\r
16 import java.util.ArrayList;
\r
17 import java.util.HashMap;
\r
18 import java.util.List;
\r
19 import java.util.Map;
\r
21 import com.ibm.icu.dev.test.TestFmwk;
\r
22 import com.ibm.icu.impl.duration.BasicPeriodFormatterService;
\r
23 import com.ibm.icu.impl.duration.Period;
\r
24 import com.ibm.icu.impl.duration.PeriodBuilder;
\r
25 import com.ibm.icu.impl.duration.PeriodBuilderFactory;
\r
26 import com.ibm.icu.impl.duration.PeriodFormatter;
\r
27 import com.ibm.icu.impl.duration.PeriodFormatterFactory;
\r
28 import com.ibm.icu.impl.duration.TimeUnit;
\r
29 import com.ibm.icu.impl.duration.TimeUnitConstants;
\r
30 import com.ibm.icu.impl.duration.impl.DataRecord.ECountVariant;
\r
31 import com.ibm.icu.impl.duration.impl.DataRecord.EUnitVariant;
\r
36 public class LanguageTestRoot extends TestFmwk implements TimeUnitConstants {
\r
38 private static final TimeUnit[] units = {
\r
39 TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.WEEK, TimeUnit.DAY, TimeUnit.HOUR,
\r
40 TimeUnit.MINUTE, TimeUnit.SECOND, TimeUnit.MILLISECOND
\r
43 protected boolean inheritTargets() {
\r
47 private static final BasicPeriodFormatterService pfs = BasicPeriodFormatterService
\r
50 private TestData data;
\r
51 private String locale;
\r
53 //private DurationFormatterFactory dfFactory;
\r
54 private PeriodFormatterFactory pfFactory;
\r
55 private PeriodBuilderFactory pbFactory;
\r
57 private PrintWriter pw;
\r
59 private static final Map datacache = new HashMap(); // String->TestData
\r
61 private static final long[] approxDurations = {
\r
62 36525L*24*60*60*10, 3045*24*60*60*10L, 7*24*60*60*1000L, 24*60*60*1000L,
\r
63 60*60*1000L, 60*1000L, 1000L, 1L
\r
66 private static long approximateDuration(TimeUnit unit) {
\r
67 return approxDurations[unit.ordinal()];
\r
70 private static TestData getTestData(String locale) {
\r
72 if (locale.equals("testFullPluralizedForms")) {
\r
75 TestData data = (TestData) datacache.get(locale);
\r
78 InputStream is = LanguageTestRoot.class
\r
79 .getResourceAsStream("testdata/testdata_" + locale
\r
83 System.out.println("test data for locale '" + locale
\r
86 InputStreamReader isr = new InputStreamReader(is, "UTF-8");
\r
87 data = new FileTestData(isr);
\r
88 } catch (Exception e) {
\r
89 System.err.println(e.getMessage());
\r
90 // swallow any exception
\r
96 public LanguageTestRoot(String locale, boolean ignore) {
\r
97 this(getTestData(locale), locale);
\r
100 public LanguageTestRoot(TestData data, String locale) {
\r
101 if (data == null) {
\r
102 data = DefaultData.getInstance();
\r
105 this.locale = locale;
\r
108 public static void writeData(PrintWriter pw, String locale)
\r
110 LanguageTestRoot test = new LanguageTestRoot(DefaultData.getInstance(),
\r
112 test.writeData(pw);
\r
115 private void writeData(PrintWriter writer) throws Exception {
\r
119 testFullPluralizedForms();
\r
128 testCustomMinutes();
\r
131 testLimitedUnits();
\r
137 testFractionalUnits();
\r
140 testMultipleUnits();
\r
147 protected void xAssertEquals(String msg, String[] expected, int n,
\r
150 pw.println(actual);
\r
152 // java doesn't dump enough context to be useful, so do it myself
\r
153 if (actual == null) {
\r
154 assertEquals(msg, expected[n], actual);
\r
156 if (!actual.equals(expected[n])) {
\r
160 + asciify("expected '" + expected[n]
\r
161 + "' but got '" + actual + "'"));
\r
167 protected static String timestring(Period ts) {
\r
168 StringBuffer buf = new StringBuffer();
\r
169 if (ts.isMoreThan()) {
\r
171 } else if (ts.isLessThan()) {
\r
174 for (int i = 0; i < units.length; ++i) {
\r
175 TimeUnit p = units[i];
\r
177 buf.append(Float.toString(ts.getCount(p)));
\r
178 buf.append(p.toString().charAt(0));
\r
181 buf.append(ts.isInPast() ? "p" : "f");
\r
182 return buf.toString();
\r
185 protected static String asciify(String s) {
\r
186 StringBuffer sb = null;
\r
187 for (int i = 0, e = s.length(); i < e; ++i) {
\r
188 char c = s.charAt(i);
\r
189 if (c < 0x20 || c > 0x7e) {
\r
191 sb = new StringBuffer();
\r
192 sb.append(s.substring(0, i));
\r
197 } else if (c < 0x100) {
\r
199 } else if (c < 0x1000) {
\r
202 sb.append(Integer.toHexString(c));
\r
210 System.out.println("asciify '" + s + "' --> '" + sb.toString()
\r
213 return sb == null ? s : sb.toString();
\r
216 private void xAssertEquals(String[] expected, int n, String actual) {
\r
217 xAssertEquals(null, expected, n, actual);
\r
220 protected void setUp() throws Exception {
\r
221 pfFactory = pfs.newPeriodFormatterFactory().setLocale(locale);
\r
222 pbFactory = pfs.newPeriodBuilderFactory().setLocale(locale);
\r
225 public void testFullPluralizedForms() throws Exception {
\r
227 int[] counts = data.getFullPluralizedFormCounts();
\r
228 String[] targets = data.getFullPluralizedFormTargets();
\r
230 pw.println("=fullPluralizedFormCounts");
\r
231 for (int i = 0; i < counts.length; ++i) {
\r
233 pw.println(String.valueOf(c));
\r
235 pw.println("=fullPluralizedFormTargets");
\r
239 PeriodFormatter pf = pfFactory.getFormatter();
\r
240 for (int i = 0; i < units.length; ++i) {
\r
241 TimeUnit u = units[i];
\r
242 // System.err.print("\nunit: " + u);
\r
243 PeriodBuilder pb = pbFactory.getFixedUnitBuilder(u);
\r
244 for (int j = 0; j < counts.length; ++j) {
\r
246 // System.err.println("\ncount[" + j + "]: " + c);
\r
247 Period p = pb.create(approximateDuration(u) * c);
\r
248 String string = pf.format(p);
\r
249 xAssertEquals(u.toString() + c, targets, n++, string);
\r
254 public void testMediumForms() throws Exception {
\r
256 String[] targets = data.getMediumFormTargets();
\r
259 pw.println("=mediumFormTargets");
\r
262 pfFactory.setUnitVariant(EUnitVariant.MEDIUM);
\r
263 pfFactory.setDisplayPastFuture(false);
\r
264 PeriodFormatter pf = pfFactory.getFormatter();
\r
266 for (int i = 0; i < units.length; ++i) {
\r
267 TimeUnit u = units[i];
\r
268 PeriodBuilder pb = pbFactory.getFixedUnitBuilder(u);
\r
269 Period p = pb.create(approximateDuration(u) * 3);
\r
270 String string = pf.format(p);
\r
271 xAssertEquals(u.toString(), targets, n++, string);
\r
275 public void testShortForms() throws Exception {
\r
277 String[] targets = data.getShortFormTargets();
\r
280 pw.println("=shortFormTargets");
\r
283 pfFactory.setUnitVariant(EUnitVariant.SHORT);
\r
284 pfFactory.setDisplayPastFuture(false);
\r
285 PeriodFormatter pf = pfFactory.getFormatter();
\r
287 for (int i = 0; i < units.length; ++i) {
\r
288 TimeUnit u = units[i];
\r
289 PeriodBuilder pb = pbFactory.getFixedUnitBuilder(u);
\r
290 Period p = pb.create(approximateDuration(u) * 3);
\r
291 String string = pf.format(p);
\r
292 xAssertEquals(u.toString(), targets, n++, string);
\r
296 public void testCustomMinutes() throws Exception {
\r
298 String[] targets = data.getCustomMinuteTargets();
\r
301 pw.println("=customMinuteTargets");
\r
304 pfFactory.setCountVariant(ECountVariant.INTEGER_CUSTOM);
\r
305 pfFactory.setDisplayPastFuture(false);
\r
306 PeriodFormatter pf = pfFactory.getFormatter();
\r
308 Period p = Period.at(1, HOUR);
\r
310 for (int i = 1; i < 12; ++i) {
\r
311 p = p.and(i * 5, MINUTE).omit(HOUR);
\r
312 xAssertEquals(targets, n++, pf.format(p));
\r
313 p = p.and(1, HOUR);
\r
314 xAssertEquals(targets, n++, pf.format(p));
\r
318 public void testLimitedUnits() throws Exception {
\r
320 String[] targets = data.getLimitedUnitTargets();
\r
323 pw.println("=limitedPeriodTargets");
\r
326 Period p = Period.at(1, MONTH);
\r
328 for (int i = 0; i < 3; ++i) {
\r
340 for (int j = 0; j < 3; ++j) {
\r
341 pfFactory.setDisplayPastFuture(true);
\r
344 pfFactory.setDisplayPastFuture(false);
\r
354 PeriodFormatter pf = pfFactory.getFormatter();
\r
356 p = p.omit(WEEK).omit(DAY);
\r
357 xAssertEquals(targets, n++, pf.format(p));
\r
359 p = p.and(2, WEEK);
\r
360 xAssertEquals(targets, n++, pf.format(p));
\r
363 xAssertEquals(targets, n++, pf.format(p));
\r
367 p = p.omit(MONTH).omit(WEEK).omit(DAY).and(1, HOUR);
\r
368 for (int i = 0; i < 3; ++i) {
\r
380 for (int j = 0; j < 3; ++j) {
\r
381 pfFactory.setDisplayPastFuture(true);
\r
384 pfFactory.setDisplayPastFuture(false);
\r
394 PeriodFormatter pf = pfFactory.getFormatter();
\r
396 p = p.omit(MINUTE).omit(SECOND);
\r
397 xAssertEquals(targets, n++, pf.format(p));
\r
399 p = p.and(2, MINUTE);
\r
400 xAssertEquals(targets, n++, pf.format(p));
\r
402 p = p.and(3, SECOND);
\r
403 xAssertEquals(targets, n++, pf.format(p));
\r
408 public void testHalfUnits() throws Exception {
\r
410 int[] counts = data.getHalfUnitCounts();
\r
411 String[] targets = data.getHalfUnitTargets();
\r
414 pw.println("=halfPeriodCounts");
\r
415 for (int i = 0; i < counts.length; ++i) {
\r
417 pw.println(String.valueOf(c));
\r
419 pw.println("=halfPeriodTargets");
\r
422 pfFactory.setCountVariant(ECountVariant.HALF_FRACTION);
\r
423 pfFactory.setDisplayPastFuture(false);
\r
424 PeriodFormatter pf = pfFactory.getFormatter();
\r
427 for (int i = 0; i < units.length; ++i) {
\r
428 TimeUnit u = units[i];
\r
429 for (int j = 0; j < counts.length; ++j) {
\r
431 Period p = Period.at(c + .5f, u);
\r
432 String string = pf.format(p);
\r
433 xAssertEquals(u.toString(), targets, n++, string);
\r
438 public void testFractionalUnits() throws Exception {
\r
440 float[] counts = data.getFractionalUnitCounts();
\r
441 String[] targets = data.getFractionalUnitTargets();
\r
444 pw.println("=fractionalPeriodCounts");
\r
445 for (int i = 0; i < counts.length; ++i) {
\r
446 float c = counts[i];
\r
447 pw.println(String.valueOf(c));
\r
449 pw.println("=fractionalPeriodTargets");
\r
452 pfFactory.setCountVariant(ECountVariant.DECIMAL2);
\r
453 pfFactory.setDisplayPastFuture(false);
\r
454 PeriodFormatter pf = pfFactory.getFormatter();
\r
457 for (int i = 0; i < units.length; ++i) {
\r
458 TimeUnit u = units[i];
\r
459 for (int j = 0; j < counts.length; ++j) {
\r
460 float c = counts[j];
\r
461 Period p = Period.at(c, u);
\r
462 String string = pf.format(p);
\r
463 xAssertEquals(u.toString(), targets, n++, string);
\r
468 public void testMultipleUnits() throws Exception {
\r
470 String[] targets = data.getMultipleUnitTargets();
\r
473 pw.println("=multiplePeriodTargets");
\r
476 pfFactory.setCountVariant(ECountVariant.INTEGER);
\r
477 pfFactory.setDisplayPastFuture(false);
\r
478 PeriodFormatter pf = pfFactory.getFormatter();
\r
481 for (int i = 0; i < units.length - 1; ++i) {
\r
482 Period p = Period.at(1, units[i]).and(2, units[i + 1]);
\r
483 xAssertEquals(targets, n++, pf.format(p));
\r
484 if (i < units.length - 2) {
\r
485 p = Period.at(1, units[i]).and(3, units[i + 2]);
\r
486 xAssertEquals(targets, n++, pf.format(p));
\r
487 p = Period.at(1, units[i]).and(2, units[i + 1]).and(3,
\r
489 xAssertEquals(targets, n++, pf.format(p));
\r
494 public static abstract class TestData {
\r
495 abstract int[] getFullPluralizedFormCounts();
\r
496 abstract String[] getFullPluralizedFormTargets();
\r
497 abstract String[] getMediumFormTargets();
\r
498 abstract String[] getShortFormTargets();
\r
499 abstract String[] getCustomMinuteTargets();
\r
500 abstract String[] getLimitedUnitTargets();
\r
501 abstract int[] getHalfUnitCounts();
\r
502 abstract String[] getHalfUnitTargets();
\r
503 abstract float[] getFractionalUnitCounts();
\r
504 abstract String[] getFractionalUnitTargets();
\r
505 abstract String[] getMultipleUnitTargets();
\r
510 class FileTestData extends LanguageTestRoot.TestData {
\r
511 private int[] fullPluralizedFormCounts;
\r
512 private String[] fullPluralizedFormTargets;
\r
513 private String[] mediumFormTargets;
\r
514 private String[] shortFormTargets;
\r
515 private String[] customMinuteTargets;
\r
516 private String[] limitedUnitTargets;
\r
517 private int[] halfUnitCounts;
\r
518 private String[] halfUnitTargets;
\r
519 private float[] fractionalUnitCounts;
\r
520 private String[] fractionalUnitTargets;
\r
521 private String[] multipleUnitTargets;
\r
523 int[] getFullPluralizedFormCounts() {
\r
524 return fullPluralizedFormCounts;
\r
527 String[] getFullPluralizedFormTargets() {
\r
528 return fullPluralizedFormTargets;
\r
531 String[] getMediumFormTargets() {
\r
532 return mediumFormTargets;
\r
535 String[] getShortFormTargets() {
\r
536 return shortFormTargets;
\r
539 String[] getCustomMinuteTargets() {
\r
540 return customMinuteTargets;
\r
543 String[] getLimitedUnitTargets() {
\r
544 return limitedUnitTargets;
\r
547 int[] getHalfUnitCounts() {
\r
548 return halfUnitCounts;
\r
551 String[] getHalfUnitTargets() {
\r
552 return halfUnitTargets;
\r
555 float[] getFractionalUnitCounts() {
\r
556 return fractionalUnitCounts;
\r
559 String[] getFractionalUnitTargets() {
\r
560 return fractionalUnitTargets;
\r
563 String[] getMultipleUnitTargets() {
\r
564 return multipleUnitTargets;
\r
567 public FileTestData(InputStreamReader isr) throws Exception {
\r
568 BufferedReader br = new BufferedReader(isr);
\r
573 float[] floatArray;
\r
575 String[] stringArray;
\r
577 void wrapup(List /* of String */list, Element element) {
\r
581 switch (element.mode) {
\r
582 case EMode.mString:
\r
583 stringArray = (String[]) list.toArray(new String[list
\r
588 intArray = new int[list.size()];
\r
589 for (int i = 0, e = intArray.length; i < e; ++i) {
\r
590 intArray[i] = Integer.parseInt((String) list.get(i));
\r
595 floatArray = new float[list.size()];
\r
596 for (int i = 0, e = floatArray.length; i < e; ++i) {
\r
597 floatArray[i] = Float.parseFloat((String) list.get(i));
\r
602 switch (element.which) {
\r
603 case Element.XfullPluralizedFormCounts:
\r
604 FileTestData.this.fullPluralizedFormCounts = intArray;
\r
606 case Element.XfullPluralizedFormTargets:
\r
607 FileTestData.this.fullPluralizedFormTargets = stringArray;
\r
609 case Element.XmediumFormTargets:
\r
610 FileTestData.this.mediumFormTargets = stringArray;
\r
612 case Element.XshortFormTargets:
\r
613 FileTestData.this.shortFormTargets = stringArray;
\r
615 case Element.XcustomMinuteTargets:
\r
616 FileTestData.this.customMinuteTargets = stringArray;
\r
618 case Element.XlimitedUnitTargets:
\r
619 FileTestData.this.limitedUnitTargets = stringArray;
\r
621 case Element.XhalfUnitCounts:
\r
622 FileTestData.this.halfUnitCounts = intArray;
\r
624 case Element.XhalfUnitTargets:
\r
625 FileTestData.this.halfUnitTargets = stringArray;
\r
627 case Element.XfractionalUnitCounts:
\r
628 FileTestData.this.fractionalUnitCounts = floatArray;
\r
630 case Element.XfractionalUnitTargets:
\r
631 FileTestData.this.fractionalUnitTargets = stringArray;
\r
633 case Element.XmultipleUnitTargets:
\r
634 FileTestData.this.multipleUnitTargets = stringArray;
\r
639 Wrapup w = new Wrapup();
\r
641 List /* of String */list = null;
\r
642 Element element = null;
\r
643 String line = null;
\r
644 while (null != (line = br.readLine())) {
\r
645 line = line.trim();
\r
646 if (line.length() == 0 || line.charAt(0) == '#')
\r
648 if (line.charAt(0) == '=') {
\r
649 w.wrapup(list, element);
\r
651 list = new ArrayList();
\r
652 element = Element.forString(line.substring(1));
\r
653 } else if (line.equals("null")) {
\r
659 w.wrapup(list, element);
\r
663 class DefaultData extends LanguageTestRoot.TestData {
\r
664 private static final int[] fullPluralizedFormCounts = { -3, -2, -1, 0, 1,
\r
665 2, 3, 5, 10, 11, 12, 20, 21, 22, 23, 25 };
\r
667 private static final int[] halfUnitCounts = { 0, 1, 2, 5, 10, 11, 12, 20,
\r
670 private static final float[] fractionalUnitCounts = { 0.025f, 1.0f, 1.205f,
\r
673 private static final DefaultData instance = new DefaultData();
\r
675 private DefaultData() {
\r
678 public static DefaultData getInstance() {
\r
682 int[] getFullPluralizedFormCounts() {
\r
683 return fullPluralizedFormCounts;
\r
686 String[] getFullPluralizedFormTargets() {
\r
690 String[] getMediumFormTargets() {
\r
694 String[] getShortFormTargets() {
\r
698 String[] getCustomMinuteTargets() {
\r
702 String[] getLimitedUnitTargets() {
\r
706 int[] getHalfUnitCounts() {
\r
707 return halfUnitCounts;
\r
710 String[] getHalfUnitTargets() {
\r
714 float[] getFractionalUnitCounts() {
\r
715 return fractionalUnitCounts;
\r
718 String[] getFractionalUnitTargets() {
\r
722 String[] getMultipleUnitTargets() {
\r
728 static final int mString = 0;
\r
729 static final int mInt = 1;
\r
730 static final int mFloat = 2;
\r
738 static int counter = 0;
\r
739 static Element[] list = new Element[11];
\r
741 Element(String name) {
\r
743 mode = EMode.mString;
\r
744 this.which = counter++;
\r
745 list[this.which] = this;
\r
748 Element(String name, int mode) {
\r
751 this.which = counter++;
\r
752 list[this.which] = this;
\r
755 static final int XfullPluralizedFormCounts = 0;
\r
756 static final int XfullPluralizedFormTargets = 1;
\r
757 static final int XmediumFormTargets = 2;
\r
758 static final int XshortFormTargets = 3;
\r
759 static final int XcustomMinuteTargets = 4;
\r
760 static final int XlimitedUnitTargets = 5;
\r
761 static final int XhalfUnitCounts = 6;
\r
762 static final int XhalfUnitTargets = 7;
\r
763 static final int XfractionalUnitCounts = 8;
\r
764 static final int XfractionalUnitTargets = 9;
\r
765 static final int XmultipleUnitTargets = 10;
\r
767 static final Element fullPluralizedFormCounts = new Element(
\r
768 "fullPluralizedFormCounts", EMode.mInt);
\r
770 static final Element fullPluralizedFormTargets = new Element(
\r
771 "fullPluralizedFormTargets");
\r
773 static final Element mediumFormTargets = new Element("mediumFormTargets");
\r
775 static final Element shortFormTargets = new Element("shortFormTargets");
\r
777 static final Element customMinuteTargets = new Element(
\r
778 "customMinuteTargets");
\r
780 static final Element limitedUnitTargets = new Element("limitedUnitTargets");
\r
782 static final Element halfUnitCounts = new Element("halfUnitCounts",
\r
785 static final Element halfUnitTargets = new Element("halfUnitTargets");
\r
787 static final Element fractionalUnitCounts = new Element(
\r
788 "fractionalUnitCounts", EMode.mFloat);
\r
790 static final Element fractionalUnitTargets = new Element(
\r
791 "fractionalUnitTargets");
\r
793 static final Element multipleUnitTargets = new Element(
\r
794 "multipleUnitTargets");
\r
796 static Element forString(String s) {
\r
797 for (int i = 0; i < list.length; ++i) {
\r
798 if (list[i].name.equals(s)) {
\r