2 ******************************************************************************
\r
3 * Copyright (C) 2007-2008, 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 com.ibm.icu.dev.test.TestFmwk;
\r
14 import com.ibm.icu.impl.duration.*;
\r
15 import com.ibm.icu.impl.duration.impl.DataRecord.*;
\r
17 import java.io.BufferedReader;
\r
18 import java.io.InputStream;
\r
19 import java.io.InputStreamReader;
\r
20 import java.io.PrintWriter;
\r
21 import java.util.ArrayList;
\r
22 import java.util.HashMap;
\r
23 import java.util.List;
\r
24 import java.util.Map;
\r
29 public class LanguageTestRoot extends TestFmwk implements TimeUnitConstants {
\r
31 private static final TimeUnit[] units = {
\r
32 TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.WEEK, TimeUnit.DAY, TimeUnit.HOUR,
\r
33 TimeUnit.MINUTE, TimeUnit.SECOND, TimeUnit.MILLISECOND
\r
36 protected boolean inheritTargets() {
\r
40 private static final BasicPeriodFormatterService pfs = BasicPeriodFormatterService
\r
43 private TestData data;
\r
44 private String locale;
\r
46 //private DurationFormatterFactory dfFactory;
\r
47 private PeriodFormatterFactory pfFactory;
\r
48 private PeriodBuilderFactory pbFactory;
\r
50 private PrintWriter pw;
\r
52 private static final Map datacache = new HashMap(); // String->TestData
\r
54 private static final long[] approxDurations = {
\r
55 36525L*24*60*60*10, 3045*24*60*60*10L, 7*24*60*60*1000L, 24*60*60*1000L,
\r
56 60*60*1000L, 60*1000L, 1000L, 1L
\r
59 private static long approximateDuration(TimeUnit unit) {
\r
60 return approxDurations[unit.ordinal()];
\r
63 private static TestData getTestData(String locale) {
\r
65 if (locale.equals("testFullPluralizedForms")) {
\r
68 TestData data = (TestData) datacache.get(locale);
\r
71 InputStream is = LanguageTestRoot.class
\r
72 .getResourceAsStream("testdata/testdata_" + locale
\r
76 System.out.println("test data for locale '" + locale
\r
79 InputStreamReader isr = new InputStreamReader(is, "UTF-8");
\r
80 data = new FileTestData(isr);
\r
81 } catch (Exception e) {
\r
82 System.err.println(e.getMessage());
\r
83 // swallow any exception
\r
89 public LanguageTestRoot(String locale, boolean ignore) {
\r
90 this(getTestData(locale), locale);
\r
93 public LanguageTestRoot(TestData data, String locale) {
\r
95 data = DefaultData.getInstance();
\r
98 this.locale = locale;
\r
101 public static void writeData(PrintWriter pw, String locale)
\r
103 LanguageTestRoot test = new LanguageTestRoot(DefaultData.getInstance(),
\r
105 test.writeData(pw);
\r
108 private void writeData(PrintWriter writer) throws Exception {
\r
112 testFullPluralizedForms();
\r
121 testCustomMinutes();
\r
124 testLimitedUnits();
\r
130 testFractionalUnits();
\r
133 testMultipleUnits();
\r
140 protected void xAssertEquals(String msg, String[] expected, int n,
\r
143 pw.println(actual);
\r
145 // java doesn't dump enough context to be useful, so do it myself
\r
146 if (actual == null) {
\r
147 assertEquals(msg, expected[n], actual);
\r
149 if (!actual.equals(expected[n])) {
\r
153 + asciify("expected '" + expected[n]
\r
154 + "' but got '" + actual + "'"));
\r
160 protected static String timestring(Period ts) {
\r
161 StringBuffer buf = new StringBuffer();
\r
162 if (ts.isMoreThan()) {
\r
164 } else if (ts.isLessThan()) {
\r
167 for (int i = 0; i < units.length; ++i) {
\r
168 TimeUnit p = units[i];
\r
170 buf.append(Float.toString(ts.getCount(p)));
\r
171 buf.append(p.toString().charAt(0));
\r
174 buf.append(ts.isInPast() ? "p" : "f");
\r
175 return buf.toString();
\r
178 protected static String asciify(String s) {
\r
179 StringBuffer sb = null;
\r
180 for (int i = 0, e = s.length(); i < e; ++i) {
\r
181 char c = s.charAt(i);
\r
182 if (c < 0x20 || c > 0x7e) {
\r
184 sb = new StringBuffer();
\r
185 sb.append(s.substring(0, i));
\r
190 } else if (c < 0x100) {
\r
192 } else if (c < 0x1000) {
\r
195 sb.append(Integer.toHexString(c));
\r
203 System.out.println("asciify '" + s + "' --> '" + sb.toString()
\r
206 return sb == null ? s : sb.toString();
\r
209 private void xAssertEquals(String[] expected, int n, String actual) {
\r
210 xAssertEquals(null, expected, n, actual);
\r
213 protected void setUp() throws Exception {
\r
214 pfFactory = pfs.newPeriodFormatterFactory().setLocale(locale);
\r
215 pbFactory = pfs.newPeriodBuilderFactory().setLocale(locale);
\r
218 public void testFullPluralizedForms() throws Exception {
\r
220 int[] counts = data.getFullPluralizedFormCounts();
\r
221 String[] targets = data.getFullPluralizedFormTargets();
\r
223 pw.println("=fullPluralizedFormCounts");
\r
224 for (int i = 0; i < counts.length; ++i) {
\r
226 pw.println(String.valueOf(c));
\r
228 pw.println("=fullPluralizedFormTargets");
\r
232 PeriodFormatter pf = pfFactory.getFormatter();
\r
233 for (int i = 0; i < units.length; ++i) {
\r
234 TimeUnit u = units[i];
\r
235 // System.err.print("\nunit: " + u);
\r
236 PeriodBuilder pb = pbFactory.getFixedUnitBuilder(u);
\r
237 for (int j = 0; j < counts.length; ++j) {
\r
239 // System.err.println("\ncount[" + j + "]: " + c);
\r
240 Period p = pb.create(approximateDuration(u) * c);
\r
241 String string = pf.format(p);
\r
242 xAssertEquals(u.toString() + c, targets, n++, string);
\r
247 public void testMediumForms() throws Exception {
\r
249 String[] targets = data.getMediumFormTargets();
\r
252 pw.println("=mediumFormTargets");
\r
255 pfFactory.setUnitVariant(EUnitVariant.MEDIUM);
\r
256 pfFactory.setDisplayPastFuture(false);
\r
257 PeriodFormatter pf = pfFactory.getFormatter();
\r
259 for (int i = 0; i < units.length; ++i) {
\r
260 TimeUnit u = units[i];
\r
261 PeriodBuilder pb = pbFactory.getFixedUnitBuilder(u);
\r
262 Period p = pb.create(approximateDuration(u) * 3);
\r
263 String string = pf.format(p);
\r
264 xAssertEquals(u.toString(), targets, n++, string);
\r
268 public void testShortForms() throws Exception {
\r
270 String[] targets = data.getShortFormTargets();
\r
273 pw.println("=shortFormTargets");
\r
276 pfFactory.setUnitVariant(EUnitVariant.SHORT);
\r
277 pfFactory.setDisplayPastFuture(false);
\r
278 PeriodFormatter pf = pfFactory.getFormatter();
\r
280 for (int i = 0; i < units.length; ++i) {
\r
281 TimeUnit u = units[i];
\r
282 PeriodBuilder pb = pbFactory.getFixedUnitBuilder(u);
\r
283 Period p = pb.create(approximateDuration(u) * 3);
\r
284 String string = pf.format(p);
\r
285 xAssertEquals(u.toString(), targets, n++, string);
\r
289 public void testCustomMinutes() throws Exception {
\r
291 String[] targets = data.getCustomMinuteTargets();
\r
294 pw.println("=customMinuteTargets");
\r
297 pfFactory.setCountVariant(ECountVariant.INTEGER_CUSTOM);
\r
298 pfFactory.setDisplayPastFuture(false);
\r
299 PeriodFormatter pf = pfFactory.getFormatter();
\r
301 Period p = Period.at(1, HOUR);
\r
303 for (int i = 1; i < 12; ++i) {
\r
304 p = p.and(i * 5, MINUTE).omit(HOUR);
\r
305 xAssertEquals(targets, n++, pf.format(p));
\r
306 p = p.and(1, HOUR);
\r
307 xAssertEquals(targets, n++, pf.format(p));
\r
311 public void testLimitedUnits() throws Exception {
\r
313 String[] targets = data.getLimitedUnitTargets();
\r
316 pw.println("=limitedPeriodTargets");
\r
319 Period p = Period.at(1, MONTH);
\r
321 for (int i = 0; i < 3; ++i) {
\r
333 for (int j = 0; j < 3; ++j) {
\r
334 pfFactory.setDisplayPastFuture(true);
\r
337 pfFactory.setDisplayPastFuture(false);
\r
347 PeriodFormatter pf = pfFactory.getFormatter();
\r
349 p = p.omit(WEEK).omit(DAY);
\r
350 xAssertEquals(targets, n++, pf.format(p));
\r
352 p = p.and(2, WEEK);
\r
353 xAssertEquals(targets, n++, pf.format(p));
\r
356 xAssertEquals(targets, n++, pf.format(p));
\r
360 p = p.omit(MONTH).omit(WEEK).omit(DAY).and(1, HOUR);
\r
361 for (int i = 0; i < 3; ++i) {
\r
373 for (int j = 0; j < 3; ++j) {
\r
374 pfFactory.setDisplayPastFuture(true);
\r
377 pfFactory.setDisplayPastFuture(false);
\r
387 PeriodFormatter pf = pfFactory.getFormatter();
\r
389 p = p.omit(MINUTE).omit(SECOND);
\r
390 xAssertEquals(targets, n++, pf.format(p));
\r
392 p = p.and(2, MINUTE);
\r
393 xAssertEquals(targets, n++, pf.format(p));
\r
395 p = p.and(3, SECOND);
\r
396 xAssertEquals(targets, n++, pf.format(p));
\r
401 public void testHalfUnits() throws Exception {
\r
403 int[] counts = data.getHalfUnitCounts();
\r
404 String[] targets = data.getHalfUnitTargets();
\r
407 pw.println("=halfPeriodCounts");
\r
408 for (int i = 0; i < counts.length; ++i) {
\r
410 pw.println(String.valueOf(c));
\r
412 pw.println("=halfPeriodTargets");
\r
415 pfFactory.setCountVariant(ECountVariant.HALF_FRACTION);
\r
416 pfFactory.setDisplayPastFuture(false);
\r
417 PeriodFormatter pf = pfFactory.getFormatter();
\r
420 for (int i = 0; i < units.length; ++i) {
\r
421 TimeUnit u = units[i];
\r
422 for (int j = 0; j < counts.length; ++j) {
\r
424 Period p = Period.at(c + .5f, u);
\r
425 String string = pf.format(p);
\r
426 xAssertEquals(u.toString(), targets, n++, string);
\r
431 public void testFractionalUnits() throws Exception {
\r
433 float[] counts = data.getFractionalUnitCounts();
\r
434 String[] targets = data.getFractionalUnitTargets();
\r
437 pw.println("=fractionalPeriodCounts");
\r
438 for (int i = 0; i < counts.length; ++i) {
\r
439 float c = counts[i];
\r
440 pw.println(String.valueOf(c));
\r
442 pw.println("=fractionalPeriodTargets");
\r
445 pfFactory.setCountVariant(ECountVariant.DECIMAL2);
\r
446 pfFactory.setDisplayPastFuture(false);
\r
447 PeriodFormatter pf = pfFactory.getFormatter();
\r
450 for (int i = 0; i < units.length; ++i) {
\r
451 TimeUnit u = units[i];
\r
452 for (int j = 0; j < counts.length; ++j) {
\r
453 float c = counts[j];
\r
454 Period p = Period.at(c, u);
\r
455 String string = pf.format(p);
\r
456 xAssertEquals(u.toString(), targets, n++, string);
\r
461 public void testMultipleUnits() throws Exception {
\r
463 String[] targets = data.getMultipleUnitTargets();
\r
466 pw.println("=multiplePeriodTargets");
\r
469 pfFactory.setCountVariant(ECountVariant.INTEGER);
\r
470 pfFactory.setDisplayPastFuture(false);
\r
471 PeriodFormatter pf = pfFactory.getFormatter();
\r
474 for (int i = 0; i < units.length - 1; ++i) {
\r
475 Period p = Period.at(1, units[i]).and(2, units[i + 1]);
\r
476 xAssertEquals(targets, n++, pf.format(p));
\r
477 if (i < units.length - 2) {
\r
478 p = Period.at(1, units[i]).and(3, units[i + 2]);
\r
479 xAssertEquals(targets, n++, pf.format(p));
\r
480 p = Period.at(1, units[i]).and(2, units[i + 1]).and(3,
\r
482 xAssertEquals(targets, n++, pf.format(p));
\r
487 public static abstract class TestData {
\r
488 abstract int[] getFullPluralizedFormCounts();
\r
489 abstract String[] getFullPluralizedFormTargets();
\r
490 abstract String[] getMediumFormTargets();
\r
491 abstract String[] getShortFormTargets();
\r
492 abstract String[] getCustomMinuteTargets();
\r
493 abstract String[] getLimitedUnitTargets();
\r
494 abstract int[] getHalfUnitCounts();
\r
495 abstract String[] getHalfUnitTargets();
\r
496 abstract float[] getFractionalUnitCounts();
\r
497 abstract String[] getFractionalUnitTargets();
\r
498 abstract String[] getMultipleUnitTargets();
\r
503 class FileTestData extends LanguageTestRoot.TestData {
\r
504 private int[] fullPluralizedFormCounts;
\r
505 private String[] fullPluralizedFormTargets;
\r
506 private String[] mediumFormTargets;
\r
507 private String[] shortFormTargets;
\r
508 private String[] customMinuteTargets;
\r
509 private String[] limitedUnitTargets;
\r
510 private int[] halfUnitCounts;
\r
511 private String[] halfUnitTargets;
\r
512 private float[] fractionalUnitCounts;
\r
513 private String[] fractionalUnitTargets;
\r
514 private String[] multipleUnitTargets;
\r
516 int[] getFullPluralizedFormCounts() {
\r
517 return fullPluralizedFormCounts;
\r
520 String[] getFullPluralizedFormTargets() {
\r
521 return fullPluralizedFormTargets;
\r
524 String[] getMediumFormTargets() {
\r
525 return mediumFormTargets;
\r
528 String[] getShortFormTargets() {
\r
529 return shortFormTargets;
\r
532 String[] getCustomMinuteTargets() {
\r
533 return customMinuteTargets;
\r
536 String[] getLimitedUnitTargets() {
\r
537 return limitedUnitTargets;
\r
540 int[] getHalfUnitCounts() {
\r
541 return halfUnitCounts;
\r
544 String[] getHalfUnitTargets() {
\r
545 return halfUnitTargets;
\r
548 float[] getFractionalUnitCounts() {
\r
549 return fractionalUnitCounts;
\r
552 String[] getFractionalUnitTargets() {
\r
553 return fractionalUnitTargets;
\r
556 String[] getMultipleUnitTargets() {
\r
557 return multipleUnitTargets;
\r
560 public FileTestData(InputStreamReader isr) throws Exception {
\r
561 BufferedReader br = new BufferedReader(isr);
\r
566 float[] floatArray;
\r
568 String[] stringArray;
\r
570 void wrapup(List /* of String */list, Element element) {
\r
574 switch (element.mode) {
\r
575 case EMode.mString:
\r
576 stringArray = (String[]) list.toArray(new String[list
\r
581 intArray = new int[list.size()];
\r
582 for (int i = 0, e = intArray.length; i < e; ++i) {
\r
583 intArray[i] = Integer.parseInt((String) list.get(i));
\r
588 floatArray = new float[list.size()];
\r
589 for (int i = 0, e = floatArray.length; i < e; ++i) {
\r
590 floatArray[i] = Float.parseFloat((String) list.get(i));
\r
595 switch (element.which) {
\r
596 case Element.XfullPluralizedFormCounts:
\r
597 FileTestData.this.fullPluralizedFormCounts = intArray;
\r
599 case Element.XfullPluralizedFormTargets:
\r
600 FileTestData.this.fullPluralizedFormTargets = stringArray;
\r
602 case Element.XmediumFormTargets:
\r
603 FileTestData.this.mediumFormTargets = stringArray;
\r
605 case Element.XshortFormTargets:
\r
606 FileTestData.this.shortFormTargets = stringArray;
\r
608 case Element.XcustomMinuteTargets:
\r
609 FileTestData.this.customMinuteTargets = stringArray;
\r
611 case Element.XlimitedUnitTargets:
\r
612 FileTestData.this.limitedUnitTargets = stringArray;
\r
614 case Element.XhalfUnitCounts:
\r
615 FileTestData.this.halfUnitCounts = intArray;
\r
617 case Element.XhalfUnitTargets:
\r
618 FileTestData.this.halfUnitTargets = stringArray;
\r
620 case Element.XfractionalUnitCounts:
\r
621 FileTestData.this.fractionalUnitCounts = floatArray;
\r
623 case Element.XfractionalUnitTargets:
\r
624 FileTestData.this.fractionalUnitTargets = stringArray;
\r
626 case Element.XmultipleUnitTargets:
\r
627 FileTestData.this.multipleUnitTargets = stringArray;
\r
632 Wrapup w = new Wrapup();
\r
634 List /* of String */list = null;
\r
635 Element element = null;
\r
636 String line = null;
\r
637 while (null != (line = br.readLine())) {
\r
638 line = line.trim();
\r
639 if (line.length() == 0 || line.charAt(0) == '#')
\r
641 if (line.charAt(0) == '=') {
\r
642 w.wrapup(list, element);
\r
644 list = new ArrayList();
\r
645 element = Element.forString(line.substring(1));
\r
646 } else if (line.equals("null")) {
\r
652 w.wrapup(list, element);
\r
656 class DefaultData extends LanguageTestRoot.TestData {
\r
657 private static final int[] fullPluralizedFormCounts = { -3, -2, -1, 0, 1,
\r
658 2, 3, 5, 10, 11, 12, 20, 21, 22, 23, 25 };
\r
660 private static final int[] halfUnitCounts = { 0, 1, 2, 5, 10, 11, 12, 20,
\r
663 private static final float[] fractionalUnitCounts = { 0.025f, 1.0f, 1.205f,
\r
666 private static final DefaultData instance = new DefaultData();
\r
668 private DefaultData() {
\r
671 public static DefaultData getInstance() {
\r
675 int[] getFullPluralizedFormCounts() {
\r
676 return fullPluralizedFormCounts;
\r
679 String[] getFullPluralizedFormTargets() {
\r
683 String[] getMediumFormTargets() {
\r
687 String[] getShortFormTargets() {
\r
691 String[] getCustomMinuteTargets() {
\r
695 String[] getLimitedUnitTargets() {
\r
699 int[] getHalfUnitCounts() {
\r
700 return halfUnitCounts;
\r
703 String[] getHalfUnitTargets() {
\r
707 float[] getFractionalUnitCounts() {
\r
708 return fractionalUnitCounts;
\r
711 String[] getFractionalUnitTargets() {
\r
715 String[] getMultipleUnitTargets() {
\r
721 static final int mString = 0;
\r
722 static final int mInt = 1;
\r
723 static final int mFloat = 2;
\r
731 static int counter = 0;
\r
732 static Element[] list = new Element[11];
\r
734 Element(String name) {
\r
736 mode = EMode.mString;
\r
737 this.which = counter++;
\r
738 list[this.which] = this;
\r
741 Element(String name, int mode) {
\r
744 this.which = counter++;
\r
745 list[this.which] = this;
\r
748 static final int XfullPluralizedFormCounts = 0;
\r
749 static final int XfullPluralizedFormTargets = 1;
\r
750 static final int XmediumFormTargets = 2;
\r
751 static final int XshortFormTargets = 3;
\r
752 static final int XcustomMinuteTargets = 4;
\r
753 static final int XlimitedUnitTargets = 5;
\r
754 static final int XhalfUnitCounts = 6;
\r
755 static final int XhalfUnitTargets = 7;
\r
756 static final int XfractionalUnitCounts = 8;
\r
757 static final int XfractionalUnitTargets = 9;
\r
758 static final int XmultipleUnitTargets = 10;
\r
760 static final Element fullPluralizedFormCounts = new Element(
\r
761 "fullPluralizedFormCounts", EMode.mInt);
\r
763 static final Element fullPluralizedFormTargets = new Element(
\r
764 "fullPluralizedFormTargets");
\r
766 static final Element mediumFormTargets = new Element("mediumFormTargets");
\r
768 static final Element shortFormTargets = new Element("shortFormTargets");
\r
770 static final Element customMinuteTargets = new Element(
\r
771 "customMinuteTargets");
\r
773 static final Element limitedUnitTargets = new Element("limitedUnitTargets");
\r
775 static final Element halfUnitCounts = new Element("halfUnitCounts",
\r
778 static final Element halfUnitTargets = new Element("halfUnitTargets");
\r
780 static final Element fractionalUnitCounts = new Element(
\r
781 "fractionalUnitCounts", EMode.mFloat);
\r
783 static final Element fractionalUnitTargets = new Element(
\r
784 "fractionalUnitTargets");
\r
786 static final Element multipleUnitTargets = new Element(
\r
787 "multipleUnitTargets");
\r
789 static Element forString(String s) {
\r
790 for (int i = 0; i < list.length; ++i) {
\r
791 if (list[i].name.equals(s)) {
\r