1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package org.apache.harmony.tests.java.text;
19
20import java.text.DateFormat;
21import java.text.NumberFormat;
22import java.text.SimpleDateFormat;
23import java.text.DateFormat.Field;
24import java.util.Calendar;
25import java.util.Date;
26import java.util.GregorianCalendar;
27import java.util.Locale;
28import java.util.TimeZone;
29import java.util.Vector;
30
31import org.apache.harmony.tests.java.text.Support_Format.FieldContainer;
32
33public class Support_SimpleDateFormat extends Support_Format {
34
35  public Support_SimpleDateFormat(String p1) {
36    super(p1);
37  }
38
39  @Override public void runTest() {
40    t_formatToCharacterIterator();
41    t_format_with_FieldPosition();
42  }
43
44  public static void main(String[] args) {
45    new Support_SimpleDateFormat("").runTest();
46  }
47
48  public void t_format_with_FieldPosition() {
49    TimeZone tz = TimeZone.getTimeZone("EST");
50    Calendar cal = new GregorianCalendar(tz);
51    cal.set(1999, Calendar.SEPTEMBER, 13, 17, 19, 01);
52    cal.set(Calendar.MILLISECOND, 0);
53    Date date = cal.getTime();
54    SimpleDateFormat format = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.US);
55    format.setTimeZone(tz);
56
57    // test with all pattern chars, and multiple occurences
58    format.applyPattern("G GGGG y yy yyyy M MM MMM MMMM d dd ddd " +
59                        "k kk kkk H HH HHH h hh hhh m mmm s ss sss S SS SSS EE EEEE " +
60                        "D DD DDD F FF w www W WWW " +
61                        "a  aaa  K KKK z zzzz Z ZZZZ");
62
63    StringBuffer textBuffer = new StringBuffer();
64    // Really, GGGG should be "Anno Domini", but the RI doesn't support that and no one cares.
65    textBuffer.append("AD AD 1999 99 1999 9 09 Sep September 13 13 013 ");
66    textBuffer.append("17 17 017 17 17 017 5 05 005 19 019 1 01 001 0 00 000 Mon Monday ");
67    textBuffer.append("256 256 256 2 02 38 038 3 003 ");
68    textBuffer.append("PM  PM  5 005 GMT-05:00 GMT-05:00 -0500 GMT-05:00");
69
70    // to avoid passing the huge StringBuffer each time.
71    super.text = textBuffer.toString();
72
73    // test if field positions are set correctly for these fields occurring
74    // multiple times.
75    t_FormatWithField(0, format, date, null, Field.ERA, 0, 2);
76    t_FormatWithField(1, format, date, null, Field.YEAR, 6, 10);
77    t_FormatWithField(2, format, date, null, Field.MONTH, 19, 20);
78    t_FormatWithField(3, format, date, null, Field.DAY_OF_MONTH, 38, 40);
79    t_FormatWithField(4, format, date, null, Field.HOUR_OF_DAY1, 48, 50);
80    t_FormatWithField(5, format, date, null, Field.HOUR_OF_DAY0, 58, 60);
81    t_FormatWithField(6, format, date, null, Field.HOUR1, 68, 69);
82    t_FormatWithField(7, format, date, null, Field.MINUTE, 77, 79);
83    t_FormatWithField(8, format, date, null, Field.SECOND, 84, 85);
84    t_FormatWithField(9, format, date, null, Field.MILLISECOND, 93, 94);
85    t_FormatWithField(10, format, date, null, Field.DAY_OF_WEEK, 102, 105);
86    t_FormatWithField(11, format, date, null, Field.DAY_OF_YEAR, 113, 116);
87    t_FormatWithField(12, format, date, null, Field.DAY_OF_WEEK_IN_MONTH, 125, 126);
88    t_FormatWithField(13, format, date, null, Field.WEEK_OF_YEAR, 130, 132);
89    t_FormatWithField(14, format, date, null, Field.WEEK_OF_MONTH, 137, 138);
90    t_FormatWithField(15, format, date, null, Field.AM_PM, 143, 145);
91    t_FormatWithField(16, format, date, null, Field.HOUR0, 151, 152);
92    t_FormatWithField(17, format, date, null, Field.TIME_ZONE, 157, 166);
93
94    // test fields that are not included in the formatted text
95    t_FormatWithField(18, format, date, null, NumberFormat.Field.EXPONENT_SIGN, 0, 0);
96
97    // test with simple example
98    format.applyPattern("h:m z");
99
100    super.text = "5:19 GMT-05:00";
101    t_FormatWithField(21, format, date, null, Field.HOUR1, 0, 1);
102    t_FormatWithField(22, format, date, null, Field.MINUTE, 2, 4);
103    t_FormatWithField(23, format, date, null, Field.TIME_ZONE, 5, 14);
104
105    // test fields that are not included in the formatted text
106    t_FormatWithField(24, format, date, null, Field.ERA, 0, 0);
107    t_FormatWithField(25, format, date, null, Field.YEAR, 0, 0);
108    t_FormatWithField(26, format, date, null, Field.MONTH, 0, 0);
109    t_FormatWithField(27, format, date, null, Field.DAY_OF_MONTH, 0, 0);
110    t_FormatWithField(28, format, date, null, Field.HOUR_OF_DAY1, 0, 0);
111    t_FormatWithField(29, format, date, null, Field.HOUR_OF_DAY0, 0, 0);
112    t_FormatWithField(30, format, date, null, Field.SECOND, 0, 0);
113    t_FormatWithField(31, format, date, null, Field.MILLISECOND, 0, 0);
114    t_FormatWithField(32, format, date, null, Field.DAY_OF_WEEK, 0, 0);
115    t_FormatWithField(33, format, date, null, Field.DAY_OF_YEAR, 0, 0);
116    t_FormatWithField(34, format, date, null, Field.DAY_OF_WEEK_IN_MONTH, 0, 0);
117    t_FormatWithField(35, format, date, null, Field.WEEK_OF_YEAR, 0, 0);
118    t_FormatWithField(36, format, date, null, Field.WEEK_OF_MONTH, 0, 0);
119    t_FormatWithField(37, format, date, null, Field.AM_PM, 0, 0);
120    t_FormatWithField(38, format, date, null, Field.HOUR0, 0, 0);
121
122    t_FormatWithField(39, format, date, null, NumberFormat.Field.EXPONENT, 0, 0);
123
124    // test with simple example with pattern char Z
125    format.applyPattern("h:m Z z");
126    super.text = "5:19 -0500 GMT-05:00";
127    t_FormatWithField(40, format, date, null, Field.HOUR1, 0, 1);
128    t_FormatWithField(41, format, date, null, Field.MINUTE, 2, 4);
129    t_FormatWithField(42, format, date, null, Field.TIME_ZONE, 5, 10);
130  }
131
132  public void t_formatToCharacterIterator() {
133    TimeZone tz = TimeZone.getTimeZone("EST");
134    Calendar cal = new GregorianCalendar(tz);
135    cal.set(1999, Calendar.SEPTEMBER, 13, 17, 19, 01);
136    cal.set(Calendar.MILLISECOND, 0);
137    Date date = cal.getTime();
138    SimpleDateFormat format = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.US);
139    format.setTimeZone(tz);
140
141    format.applyPattern("yyyyMMddHHmmss");
142    t_Format(1, date, format, getDateVector1());
143
144    format.applyPattern("w W dd MMMM yyyy EEEE");
145    t_Format(2, date, format, getDateVector2());
146
147    format.applyPattern("h:m z");
148    t_Format(3, date, format, getDateVector3());
149
150    format.applyPattern("h:m Z");
151    t_Format(5, date, format, getDateVector5());
152
153    // with all pattern chars, and multiple occurences
154    format.applyPattern("G GGGG y yy yyyy M MM MMM MMMM d dd ddd k kk kkk H HH HHH h hh hhh m mmm s ss sss S SS SSS EE EEEE D DD DDD F FF w www W WWW a  aaa  K KKK z zzzz Z ZZZZ");
155    t_Format(4, date, format, getDateVector4());
156  }
157
158  private Vector<FieldContainer> getDateVector1() {
159    // "19990913171901"
160    Vector<FieldContainer> v = new Vector<FieldContainer>();
161    v.add(new FieldContainer(0, 4, Field.YEAR));
162    v.add(new FieldContainer(4, 6, Field.MONTH));
163    v.add(new FieldContainer(6, 8, Field.DAY_OF_MONTH));
164    v.add(new FieldContainer(8, 10, Field.HOUR_OF_DAY0));
165    v.add(new FieldContainer(10, 12, Field.MINUTE));
166    v.add(new FieldContainer(12, 14, Field.SECOND));
167    return v;
168  }
169
170  private Vector<FieldContainer> getDateVector2() {
171    // "12 3 5 March 2002 Monday"
172    Vector<FieldContainer> v = new Vector<FieldContainer>();
173    v.add(new FieldContainer(0, 2, Field.WEEK_OF_YEAR));
174    v.add(new FieldContainer(3, 4, Field.WEEK_OF_MONTH));
175    v.add(new FieldContainer(5, 7, Field.DAY_OF_MONTH));
176    v.add(new FieldContainer(8, 17, Field.MONTH));
177    v.add(new FieldContainer(18, 22, Field.YEAR));
178    v.add(new FieldContainer(23, 29, Field.DAY_OF_WEEK));
179    return v;
180  }
181
182  private Vector<FieldContainer> getDateVector3() {
183    // "5:19 EDT"
184    Vector<FieldContainer> v = new Vector<FieldContainer>();
185    v.add(new FieldContainer(0, 1, Field.HOUR1));
186    v.add(new FieldContainer(2, 4, Field.MINUTE));
187    v.add(new FieldContainer(5, 14, Field.TIME_ZONE));
188    return v;
189  }
190
191  private Vector<FieldContainer> getDateVector5() {
192    // "5:19 -0400"
193    Vector<FieldContainer> v = new Vector<FieldContainer>();
194    v.add(new FieldContainer(0, 1, Field.HOUR1));
195    v.add(new FieldContainer(2, 4, Field.MINUTE));
196    v.add(new FieldContainer(5, 10, Field.TIME_ZONE));
197    return v;
198  }
199
200  private Vector<FieldContainer> getDateVector4() {
201    Vector<FieldContainer> v = new Vector<FieldContainer>();
202
203    // "AD AD 1999 99 1999 9 09 Sep September 13 13 013 17 17 017 17 17 017 5
204    // 05
205    // 005 19 019 1 01 001 0 00 000 Mon Monday 256 256 256 2 02 38 038 3 003
206    // PM
207    // PM 5 005 EDT Eastern Daylight Time -0400 -0400"
208    v.add(new FieldContainer(0, 2, Field.ERA));
209    v.add(new FieldContainer(3, 5, Field.ERA));
210    v.add(new FieldContainer(6, 10, Field.YEAR));
211    v.add(new FieldContainer(11, 13, Field.YEAR));
212    v.add(new FieldContainer(14, 18, Field.YEAR));
213    v.add(new FieldContainer(19, 20, Field.MONTH));
214    v.add(new FieldContainer(21, 23, Field.MONTH));
215    v.add(new FieldContainer(24, 27, Field.MONTH));
216    v.add(new FieldContainer(28, 37, Field.MONTH));
217    v.add(new FieldContainer(38, 40, Field.DAY_OF_MONTH));
218    v.add(new FieldContainer(41, 43, Field.DAY_OF_MONTH));
219    v.add(new FieldContainer(44, 47, Field.DAY_OF_MONTH));
220    v.add(new FieldContainer(48, 50, Field.HOUR_OF_DAY1));
221    v.add(new FieldContainer(51, 53, Field.HOUR_OF_DAY1));
222    v.add(new FieldContainer(54, 57, Field.HOUR_OF_DAY1));
223    v.add(new FieldContainer(58, 60, Field.HOUR_OF_DAY0));
224    v.add(new FieldContainer(61, 63, Field.HOUR_OF_DAY0));
225    v.add(new FieldContainer(64, 67, Field.HOUR_OF_DAY0));
226    v.add(new FieldContainer(68, 69, Field.HOUR1));
227    v.add(new FieldContainer(70, 72, Field.HOUR1));
228    v.add(new FieldContainer(73, 76, Field.HOUR1));
229    v.add(new FieldContainer(77, 79, Field.MINUTE));
230    v.add(new FieldContainer(80, 83, Field.MINUTE));
231    v.add(new FieldContainer(84, 85, Field.SECOND));
232    v.add(new FieldContainer(86, 88, Field.SECOND));
233    v.add(new FieldContainer(89, 92, Field.SECOND));
234    v.add(new FieldContainer(93, 94, Field.MILLISECOND));
235    v.add(new FieldContainer(95, 97, Field.MILLISECOND));
236    v.add(new FieldContainer(98, 101, Field.MILLISECOND));
237    v.add(new FieldContainer(102, 105, Field.DAY_OF_WEEK));
238    v.add(new FieldContainer(106, 112, Field.DAY_OF_WEEK));
239    v.add(new FieldContainer(113, 116, Field.DAY_OF_YEAR));
240    v.add(new FieldContainer(117, 120, Field.DAY_OF_YEAR));
241    v.add(new FieldContainer(121, 124, Field.DAY_OF_YEAR));
242    v.add(new FieldContainer(125, 126, Field.DAY_OF_WEEK_IN_MONTH));
243    v.add(new FieldContainer(127, 129, Field.DAY_OF_WEEK_IN_MONTH));
244    v.add(new FieldContainer(130, 132, Field.WEEK_OF_YEAR));
245    v.add(new FieldContainer(133, 136, Field.WEEK_OF_YEAR));
246    v.add(new FieldContainer(137, 138, Field.WEEK_OF_MONTH));
247    v.add(new FieldContainer(139, 142, Field.WEEK_OF_MONTH));
248    v.add(new FieldContainer(143, 145, Field.AM_PM));
249    v.add(new FieldContainer(147, 149, Field.AM_PM));
250    v.add(new FieldContainer(151, 152, Field.HOUR0));
251    v.add(new FieldContainer(153, 156, Field.HOUR0));
252    v.add(new FieldContainer(157, 166, Field.TIME_ZONE));
253    v.add(new FieldContainer(167, 176, Field.TIME_ZONE));
254    v.add(new FieldContainer(177, 182, Field.TIME_ZONE));
255    v.add(new FieldContainer(183, 192, Field.TIME_ZONE));
256    return v;
257  }
258}
259