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.text.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.text.tests.java.text.Support_Format.FieldContainer;
32
33
34public class Support_SimpleDateFormat extends Support_Format {
35
36	public Support_SimpleDateFormat(String p1) {
37		super(p1);
38	}
39
40	@Override
41    public void runTest() {
42		t_formatToCharacterIterator();
43		t_format_with_FieldPosition();
44	}
45
46	public static void main(String[] args) {
47		new Support_SimpleDateFormat("").runTest();
48	}
49
50	public void t_format_with_FieldPosition() {
51		TimeZone tz = TimeZone.getTimeZone("EST");
52		Calendar cal = new GregorianCalendar(tz);
53		cal.set(1999, Calendar.SEPTEMBER, 13, 17, 19, 01);
54		cal.set(Calendar.MILLISECOND, 0);
55		Date date = cal.getTime();
56		SimpleDateFormat format = (SimpleDateFormat) DateFormat
57                .getDateInstance(DateFormat.DEFAULT, Locale.US);
58		format.setTimeZone(tz);
59
60		// test with all pattern chars, and multiple occurances
61		format
62				.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");
63
64		StringBuffer textbuffer = new StringBuffer(
65				"AD Anno Domini 99 99 1999 9 09 Sep September 13 13 013 17 17 017 17 17 017 5 05");
66		textbuffer
67				.append(" 005 19 019 1 01 001 0 00 000 Mon Monday 256 256 256 2 02 38 038 3 003 PM");
68		textbuffer.append("  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 occuring
74		// multiple times.
75		t_FormatWithField(0, format, date, null, Field.ERA, 0, 2);
76		t_FormatWithField(1, format, date, null, Field.YEAR, 15, 17);
77		t_FormatWithField(2, format, date, null, Field.MONTH, 26, 27);
78		t_FormatWithField(3, format, date, null, Field.DAY_OF_MONTH, 45, 47);
79		t_FormatWithField(4, format, date, null, Field.HOUR_OF_DAY1, 55, 57);
80		t_FormatWithField(5, format, date, null, Field.HOUR_OF_DAY0, 65, 67);
81		t_FormatWithField(6, format, date, null, Field.HOUR1, 75, 76);
82		t_FormatWithField(7, format, date, null, Field.MINUTE, 84, 86);
83		t_FormatWithField(8, format, date, null, Field.SECOND, 91, 92);
84		t_FormatWithField(9, format, date, null, Field.MILLISECOND, 100, 101);
85		t_FormatWithField(10, format, date, null, Field.DAY_OF_WEEK, 109, 112);
86		t_FormatWithField(11, format, date, null, Field.DAY_OF_YEAR, 120, 123);
87		t_FormatWithField(12, format, date, null, Field.DAY_OF_WEEK_IN_MONTH,
88				132, 133);
89		t_FormatWithField(13, format, date, null, Field.WEEK_OF_YEAR, 137, 139);
90		t_FormatWithField(14, format, date, null, Field.WEEK_OF_MONTH, 144, 145);
91		t_FormatWithField(15, format, date, null, Field.AM_PM, 150, 152);
92		t_FormatWithField(16, format, date, null, Field.HOUR0, 158, 159);
93		t_FormatWithField(17, format, date, null, Field.TIME_ZONE, 164, 173);
94
95		// test fields that are not included in the formatted text
96		t_FormatWithField(18, format, date, null,
97				NumberFormat.Field.EXPONENT_SIGN, 0, 0);
98
99		// test with simple example
100		format.applyPattern("h:m z");
101
102		super.text = "5:19 GMT-05:00";
103		t_FormatWithField(21, format, date, null, Field.HOUR1, 0, 1);
104		t_FormatWithField(22, format, date, null, Field.MINUTE, 2, 4);
105		t_FormatWithField(23, format, date, null, Field.TIME_ZONE, 5, 14);
106
107		// test fields that are not included in the formatted text
108
109		t_FormatWithField(24, format, date, null, Field.ERA, 0, 0);
110		t_FormatWithField(25, format, date, null, Field.YEAR, 0, 0);
111		t_FormatWithField(26, format, date, null, Field.MONTH, 0, 0);
112		t_FormatWithField(27, format, date, null, Field.DAY_OF_MONTH, 0, 0);
113		t_FormatWithField(28, format, date, null, Field.HOUR_OF_DAY1, 0, 0);
114		t_FormatWithField(29, format, date, null, Field.HOUR_OF_DAY0, 0, 0);
115		t_FormatWithField(30, format, date, null, Field.SECOND, 0, 0);
116		t_FormatWithField(31, format, date, null, Field.MILLISECOND, 0, 0);
117		t_FormatWithField(32, format, date, null, Field.DAY_OF_WEEK, 0, 0);
118		t_FormatWithField(33, format, date, null, Field.DAY_OF_YEAR, 0, 0);
119		t_FormatWithField(34, format, date, null, Field.DAY_OF_WEEK_IN_MONTH,
120				0, 0);
121		t_FormatWithField(35, format, date, null, Field.WEEK_OF_YEAR, 0, 0);
122		t_FormatWithField(36, format, date, null, Field.WEEK_OF_MONTH, 0, 0);
123		t_FormatWithField(37, format, date, null, Field.AM_PM, 0, 0);
124		t_FormatWithField(38, format, date, null, Field.HOUR0, 0, 0);
125
126		t_FormatWithField(39, format, date, null, NumberFormat.Field.EXPONENT,
127				0, 0);
128
129		// test with simple example with pattern char Z
130		format.applyPattern("h:m Z z");
131		super.text = "5:19 -0500 GMT-05:00";
132		t_FormatWithField(40, format, date, null, Field.HOUR1, 0, 1);
133		t_FormatWithField(41, format, date, null, Field.MINUTE, 2, 4);
134		t_FormatWithField(42, format, date, null, Field.TIME_ZONE, 5, 10);
135	}
136
137	public void t_formatToCharacterIterator() {
138		TimeZone tz = TimeZone.getTimeZone("EST");
139		Calendar cal = new GregorianCalendar(tz);
140		cal.set(1999, Calendar.SEPTEMBER, 13, 17, 19, 01);
141		cal.set(Calendar.MILLISECOND, 0);
142		Date date = cal.getTime();
143		SimpleDateFormat format = (SimpleDateFormat) DateFormat
144                .getDateInstance(DateFormat.DEFAULT, Locale.US);
145		format.setTimeZone(tz);
146
147		format.applyPattern("yyyyMMddHHmmss");
148		t_Format(1, date, format, getDateVector1());
149
150		format.applyPattern("w W dd MMMM yyyy EEEE");
151		t_Format(2, date, format, getDateVector2());
152
153		format.applyPattern("h:m z");
154		t_Format(3, date, format, getDateVector3());
155
156		format.applyPattern("h:m Z");
157		t_Format(5, date, format, getDateVector5());
158
159		// with all pattern chars, and multiple occurances
160		format
161				.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");
162		t_Format(4, date, format, getDateVector4());
163	}
164
165	private Vector<FieldContainer> getDateVector1() {
166		// "19990913171901"
167		Vector<FieldContainer> v = new Vector<FieldContainer>();
168		v.add(new FieldContainer(0, 4, Field.YEAR));
169		v.add(new FieldContainer(4, 6, Field.MONTH));
170		v.add(new FieldContainer(6, 8, Field.DAY_OF_MONTH));
171		v.add(new FieldContainer(8, 10, Field.HOUR_OF_DAY0));
172		v.add(new FieldContainer(10, 12, Field.MINUTE));
173		v.add(new FieldContainer(12, 14, Field.SECOND));
174		return v;
175	}
176
177	private Vector<FieldContainer> getDateVector2() {
178		// "12 3 5 March 2002 Monday"
179		Vector<FieldContainer> v = new Vector<FieldContainer>();
180		v.add(new FieldContainer(0, 2, Field.WEEK_OF_YEAR));
181		v.add(new FieldContainer(3, 4, Field.WEEK_OF_MONTH));
182		v.add(new FieldContainer(5, 7, Field.DAY_OF_MONTH));
183		v.add(new FieldContainer(8, 17, Field.MONTH));
184		v.add(new FieldContainer(18, 22, Field.YEAR));
185		v.add(new FieldContainer(23, 29, Field.DAY_OF_WEEK));
186		return v;
187	}
188
189	private Vector<FieldContainer> getDateVector3() {
190		// "5:19 EDT"
191		Vector<FieldContainer> v = new Vector<FieldContainer>();
192		v.add(new FieldContainer(0, 1, Field.HOUR1));
193		v.add(new FieldContainer(2, 4, Field.MINUTE));
194		v.add(new FieldContainer(5, 14, Field.TIME_ZONE));
195		return v;
196	}
197
198	private Vector<FieldContainer> getDateVector5() {
199		// "5:19 -0400"
200		Vector<FieldContainer> v = new Vector<FieldContainer>();
201		v.add(new FieldContainer(0, 1, Field.HOUR1));
202		v.add(new FieldContainer(2, 4, Field.MINUTE));
203		v.add(new FieldContainer(5, 10, Field.TIME_ZONE));
204		return v;
205	}
206
207	private Vector<FieldContainer> getDateVector4() {
208		Vector<FieldContainer> v = new Vector<FieldContainer>();
209
210		// "AD AD 99 99 1999 9 09 Sep September 13 13 013 17 17 017 17 17 017 5
211		// 05
212		// 005 19 019 1 01 001 0 00 000 Mon Monday 256 256 256 2 02 38 038 3 003
213		// PM
214		// PM 5 005 EDT Eastern Daylight Time -0400 -0400"
215		v.add(new FieldContainer(0, 2, Field.ERA));
216		v.add(new FieldContainer(3, 5, Field.ERA));
217		v.add(new FieldContainer(6, 8, Field.YEAR));
218		v.add(new FieldContainer(9, 11, Field.YEAR));
219		v.add(new FieldContainer(12, 16, Field.YEAR));
220		v.add(new FieldContainer(17, 18, Field.MONTH));
221		v.add(new FieldContainer(19, 21, Field.MONTH));
222		v.add(new FieldContainer(22, 25, Field.MONTH));
223		v.add(new FieldContainer(26, 35, Field.MONTH));
224		v.add(new FieldContainer(36, 38, Field.DAY_OF_MONTH));
225		v.add(new FieldContainer(39, 41, Field.DAY_OF_MONTH));
226		v.add(new FieldContainer(42, 45, Field.DAY_OF_MONTH));
227		v.add(new FieldContainer(46, 48, Field.HOUR_OF_DAY1));
228		v.add(new FieldContainer(49, 51, Field.HOUR_OF_DAY1));
229		v.add(new FieldContainer(52, 55, Field.HOUR_OF_DAY1));
230		v.add(new FieldContainer(56, 58, Field.HOUR_OF_DAY0));
231		v.add(new FieldContainer(59, 61, Field.HOUR_OF_DAY0));
232		v.add(new FieldContainer(62, 65, Field.HOUR_OF_DAY0));
233		v.add(new FieldContainer(66, 67, Field.HOUR1));
234		v.add(new FieldContainer(68, 70, Field.HOUR1));
235		v.add(new FieldContainer(71, 74, Field.HOUR1));
236		v.add(new FieldContainer(75, 77, Field.MINUTE));
237		v.add(new FieldContainer(78, 81, Field.MINUTE));
238		v.add(new FieldContainer(82, 83, Field.SECOND));
239		v.add(new FieldContainer(84, 86, Field.SECOND));
240		v.add(new FieldContainer(87, 90, Field.SECOND));
241		v.add(new FieldContainer(91, 92, Field.MILLISECOND));
242		v.add(new FieldContainer(93, 95, Field.MILLISECOND));
243		v.add(new FieldContainer(96, 99, Field.MILLISECOND));
244		v.add(new FieldContainer(100, 103, Field.DAY_OF_WEEK));
245		v.add(new FieldContainer(104, 110, Field.DAY_OF_WEEK));
246		v.add(new FieldContainer(111, 114, Field.DAY_OF_YEAR));
247		v.add(new FieldContainer(115, 118, Field.DAY_OF_YEAR));
248		v.add(new FieldContainer(119, 122, Field.DAY_OF_YEAR));
249		v.add(new FieldContainer(123, 124, Field.DAY_OF_WEEK_IN_MONTH));
250		v.add(new FieldContainer(125, 127, Field.DAY_OF_WEEK_IN_MONTH));
251		v.add(new FieldContainer(128, 130, Field.WEEK_OF_YEAR));
252		v.add(new FieldContainer(131, 134, Field.WEEK_OF_YEAR));
253		v.add(new FieldContainer(135, 136, Field.WEEK_OF_MONTH));
254		v.add(new FieldContainer(137, 140, Field.WEEK_OF_MONTH));
255		v.add(new FieldContainer(141, 143, Field.AM_PM));
256		v.add(new FieldContainer(145, 147, Field.AM_PM));
257		v.add(new FieldContainer(149, 150, Field.HOUR0));
258		v.add(new FieldContainer(151, 154, Field.HOUR0));
259		v.add(new FieldContainer(155, 164, Field.TIME_ZONE));
260		v.add(new FieldContainer(165, 174, Field.TIME_ZONE));
261		v.add(new FieldContainer(175, 180, Field.TIME_ZONE));
262		v.add(new FieldContainer(181, 186, Field.TIME_ZONE));
263		return v;
264	}
265
266}
267