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