1c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer/*
2c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
5c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This code is free software; you can redistribute it and/or modify it
6c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * under the terms of the GNU General Public License version 2 only, as
7c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * published by the Free Software Foundation.
8c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
9c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This code is distributed in the hope that it will be useful, but WITHOUT
10c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * version 2 for more details (a copy is included in the LICENSE file that
13c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * accompanied this code).
14c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
15c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * You should have received a copy of the GNU General Public License version
16c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 2 along with this work; if not, write to the Free Software Foundation,
17c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
19c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * or visit www.oracle.com if you need additional information or have any
21c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * questions.
22c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */
23c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
24c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer/*
25c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This file is available under and governed by the GNU General Public
26c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * License version 2 only, as published by the Free Software Foundation.
27c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * However, the following notice accompanied the original version of this
28c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * file:
29c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
30c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Copyright (c) 2008-2012, Stephen Colebourne & Michael Nascimento Santos
31c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
32c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * All rights reserved.
33c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
34c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Redistribution and use in source and binary forms, with or without
35c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * modification, are permitted provided that the following conditions are met:
36c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
37c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *  * Redistributions of source code must retain the above copyright notice,
38c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *    this list of conditions and the following disclaimer.
39c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
40c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *  * Redistributions in binary form must reproduce the above copyright notice,
41c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *    this list of conditions and the following disclaimer in the documentation
42c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *    and/or other materials provided with the distribution.
43c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
44c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *  * Neither the name of JSR-310 nor the names of its contributors
45c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *    may be used to endorse or promote products derived from this software
46c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *    without specific prior written permission.
47c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer *
48c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
51c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
52c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
53c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
54c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
55c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
56c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
57c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
58c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */
60c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerpackage test.java.time.format;
61c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
62c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.temporal.ChronoField.OFFSET_SECONDS;
63c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static org.testng.Assert.assertEquals;
64c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static org.testng.Assert.assertTrue;
65c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
66c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.text.ParsePosition;
67c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.ZoneOffset;
68c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalAccessor;
69c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
70c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport org.testng.annotations.DataProvider;
71c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport org.testng.annotations.Test;
72c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
73c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer/**
74c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Test ZoneOffsetPrinterParser.
75c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */
76c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer@Test
77c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerpublic class TestZoneOffsetParser extends AbstractTestPrinterParser {
78c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
79c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
80c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @DataProvider(name="error")
81c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    Object[][] data_error() {
82c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new Object[][] {
83c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "Z", "hello", -1, IndexOutOfBoundsException.class},
84c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "Z", "hello", 6, IndexOutOfBoundsException.class},
85c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        };
86c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
87c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
88c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="error")
89c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_error(String pattern, String noOffsetText, String text, int pos, Class<?> expected) {
90c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        try {
91c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            getFormatter(pattern, noOffsetText).parseUnresolved(text, new ParsePosition(pos));
92c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        } catch (RuntimeException ex) {
93c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            assertTrue(expected.isInstance(ex));
94c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
95c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
96c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
97c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
98c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_exactMatch_UTC() throws Exception {
99c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
100c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "Z").parseUnresolved("Z", pos);
101c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 1);
102c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
103c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
104c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
105c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_startStringMatch_UTC() throws Exception {
106c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
107c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "Z").parseUnresolved("ZOTHER", pos);
108c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 1);
109c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
110c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
111c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
112c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_midStringMatch_UTC() throws Exception {
113c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(5);
114c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "Z").parseUnresolved("OTHERZOTHER", pos);
115c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 6);
116c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
117c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
118c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
119c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_endStringMatch_UTC() throws Exception {
120c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(5);
121c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "Z").parseUnresolved("OTHERZ", pos);
122c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 6);
123c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
124c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
125c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
126c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
127c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_exactMatch_UTC_EmptyUTC() throws Exception {
128c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
129c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "").parseUnresolved("", pos);
130c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 0);
131c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
132c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
133c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
134c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_startStringMatch_UTC_EmptyUTC() throws Exception {
135c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
136c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "").parseUnresolved("OTHER", pos);
137c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 0);
138c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
139c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
140c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
141c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_midStringMatch_UTC_EmptyUTC() throws Exception {
142c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(5);
143c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "").parseUnresolved("OTHEROTHER", pos);
144c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 5);
145c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
146c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
147c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
148c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_endStringMatch_UTC_EmptyUTC() throws Exception {
149c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(5);
150c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "").parseUnresolved("OTHER", pos);
151c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 5);
152c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
153c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
154c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
155c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
156c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @DataProvider(name="offsets")
157c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    Object[][] provider_offsets() {
158c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new Object[][] {
159c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "+00", ZoneOffset.UTC},
160c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "-00", ZoneOffset.UTC},
161c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "+01", ZoneOffset.ofHours(1)},
162c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "-01", ZoneOffset.ofHours(-1)},
163c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
164c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "+0000", ZoneOffset.UTC},
165c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "-0000", ZoneOffset.UTC},
166c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "+0102", ZoneOffset.ofHoursMinutes(1, 2)},
167c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "-0102", ZoneOffset.ofHoursMinutes(-1, -2)},
168c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
169c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+00:00", ZoneOffset.UTC},
170c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "-00:00", ZoneOffset.UTC},
171c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+01:02", ZoneOffset.ofHoursMinutes(1, 2)},
172c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "-01:02", ZoneOffset.ofHoursMinutes(-1, -2)},
173c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
174c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+0000", ZoneOffset.UTC},
175c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "-0000", ZoneOffset.UTC},
176c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+0100", ZoneOffset.ofHoursMinutesSeconds(1, 0, 0)},
177c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+0159", ZoneOffset.ofHoursMinutesSeconds(1, 59, 0)},
178c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+0200", ZoneOffset.ofHoursMinutesSeconds(2, 0, 0)},
179c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+1800", ZoneOffset.ofHoursMinutesSeconds(18, 0, 0)},
180c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+010215", ZoneOffset.ofHoursMinutesSeconds(1, 2, 15)},
181c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "-0100", ZoneOffset.ofHoursMinutesSeconds(-1, 0, 0)},
182c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "-0200", ZoneOffset.ofHoursMinutesSeconds(-2, 0, 0)},
183c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "-1800", ZoneOffset.ofHoursMinutesSeconds(-18, 0, 0)},
184c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
185c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+000000", ZoneOffset.UTC},
186c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "-000000", ZoneOffset.UTC},
187c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+010000", ZoneOffset.ofHoursMinutesSeconds(1, 0, 0)},
188c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+010203", ZoneOffset.ofHoursMinutesSeconds(1, 2, 3)},
189c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+015959", ZoneOffset.ofHoursMinutesSeconds(1, 59, 59)},
190c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+020000", ZoneOffset.ofHoursMinutesSeconds(2, 0, 0)},
191c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+180000", ZoneOffset.ofHoursMinutesSeconds(18, 0, 0)},
192c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "-010000", ZoneOffset.ofHoursMinutesSeconds(-1, 0, 0)},
193c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "-020000", ZoneOffset.ofHoursMinutesSeconds(-2, 0, 0)},
194c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "-180000", ZoneOffset.ofHoursMinutesSeconds(-18, 0, 0)},
195c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
196c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+00:00", ZoneOffset.UTC},
197c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "-00:00", ZoneOffset.UTC},
198c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+01:00", ZoneOffset.ofHoursMinutesSeconds(1, 0, 0)},
199c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+01:02", ZoneOffset.ofHoursMinutesSeconds(1, 2, 0)},
200c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+01:59", ZoneOffset.ofHoursMinutesSeconds(1, 59, 0)},
201c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+02:00", ZoneOffset.ofHoursMinutesSeconds(2, 0, 0)},
202c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+18:00", ZoneOffset.ofHoursMinutesSeconds(18, 0, 0)},
203c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+01:02:15", ZoneOffset.ofHoursMinutesSeconds(1, 2, 15)},
204c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "-01:00", ZoneOffset.ofHoursMinutesSeconds(-1, 0, 0)},
205c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "-02:00", ZoneOffset.ofHoursMinutesSeconds(-2, 0, 0)},
206c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "-18:00", ZoneOffset.ofHoursMinutesSeconds(-18, 0, 0)},
207c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
208c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+00:00:00", ZoneOffset.UTC},
209c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "-00:00:00", ZoneOffset.UTC},
210c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+01:00:00", ZoneOffset.ofHoursMinutesSeconds(1, 0, 0)},
211c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+01:02:03", ZoneOffset.ofHoursMinutesSeconds(1, 2, 3)},
212c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+01:59:59", ZoneOffset.ofHoursMinutesSeconds(1, 59, 59)},
213c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+02:00:00", ZoneOffset.ofHoursMinutesSeconds(2, 0, 0)},
214c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+18:00:00", ZoneOffset.ofHoursMinutesSeconds(18, 0, 0)},
215c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "-01:00:00", ZoneOffset.ofHoursMinutesSeconds(-1, 0, 0)},
216c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "-02:00:00", ZoneOffset.ofHoursMinutesSeconds(-2, 0, 0)},
217c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "-18:00:00", ZoneOffset.ofHoursMinutesSeconds(-18, 0, 0)},
218c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
219c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "+000000", ZoneOffset.UTC},
220c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "-000000", ZoneOffset.UTC},
221c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "+010203", ZoneOffset.ofHoursMinutesSeconds(1, 2, 3)},
222c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "-010203", ZoneOffset.ofHoursMinutesSeconds(-1, -2, -3)},
223c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
224c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+00:00:00", ZoneOffset.UTC},
225c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "-00:00:00", ZoneOffset.UTC},
226c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+01:02:03", ZoneOffset.ofHoursMinutesSeconds(1, 2, 3)},
227c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "-01:02:03", ZoneOffset.ofHoursMinutesSeconds(-1, -2, -3)},
228c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        };
229c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
230c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
231c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="offsets")
232c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_exactMatch(String pattern, String parse, ZoneOffset expected) throws Exception {
233c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
234c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(pattern, "Z").parseUnresolved(parse, pos);
235c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), parse.length());
236c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, expected);
237c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
238c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
239c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="offsets")
240c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_startStringMatch(String pattern, String parse, ZoneOffset expected) throws Exception {
241c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
242c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(pattern, "Z").parseUnresolved(parse + ":OTHER", pos);
243c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), parse.length());
244c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, expected);
245c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
246c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
247c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="offsets")
248c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_midStringMatch(String pattern, String parse, ZoneOffset expected) throws Exception {
249c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(5);
250c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(pattern, "Z").parseUnresolved("OTHER" + parse + ":OTHER", pos);
251c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), parse.length() + 5);
252c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, expected);
253c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
254c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
255c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="offsets")
256c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_endStringMatch(String pattern, String parse, ZoneOffset expected) throws Exception {
257c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(5);
258c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(pattern, "Z").parseUnresolved("OTHER" + parse, pos);
259c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), parse.length() + 5);
260c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, expected);
261c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
262c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
263c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="offsets")
264c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_exactMatch_EmptyUTC(String pattern, String parse, ZoneOffset expected) throws Exception {
265c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
266c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(pattern, "").parseUnresolved(parse, pos);
267c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), parse.length());
268c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, expected);
269c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
270c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
271c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="offsets")
272c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_startStringMatch_EmptyUTC(String pattern, String parse, ZoneOffset expected) throws Exception {
273c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
274c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(pattern, "").parseUnresolved(parse + ":OTHER", pos);
275c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), parse.length());
276c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, expected);
277c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
278c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
279c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="offsets")
280c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_midStringMatch_EmptyUTC(String pattern, String parse, ZoneOffset expected) throws Exception {
281c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(5);
282c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(pattern, "").parseUnresolved("OTHER" + parse + ":OTHER", pos);
283c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), parse.length() + 5);
284c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, expected);
285c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
286c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
287c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="offsets")
288c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_endStringMatch_EmptyUTC(String pattern, String parse, ZoneOffset expected) throws Exception {
289c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(5);
290c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(pattern, "").parseUnresolved("OTHER" + parse, pos);
291c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), parse.length() + 5);
292c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, expected);
293c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
294c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
295c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
296c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @DataProvider(name="bigOffsets")
297c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    Object[][] provider_bigOffsets() {
298c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new Object[][] {
299c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "+59", 59 * 3600},
300c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "-19", -(19 * 3600)},
301c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
302c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "+1801", 18 * 3600 + 1 * 60},
303c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "-1801", -(18 * 3600 + 1 * 60)},
304c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
305c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+18:01", 18 * 3600 + 1 * 60},
306c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "-18:01", -(18 * 3600 + 1 * 60)},
307c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
308c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+180103", 18 * 3600 + 1 * 60 + 3},
309c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "-180103", -(18 * 3600 + 1 * 60 + 3)},
310c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
311c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+18:01:03", 18 * 3600 + 1 * 60 + 3},
312c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "-18:01:03", -(18 * 3600 + 1 * 60 + 3)},
313c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
314c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "+180103", 18 * 3600 + 1 * 60 + 3},
315c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "-180103", -(18 * 3600 + 1 * 60 + 3)},
316c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
317c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+18:01:03", 18 * 3600 + 1 * 60 + 3},
318c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "-18:01:03", -(18 * 3600 + 1 * 60 + 3)},
319c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        };
320c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
321c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
322c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="bigOffsets")
323c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_bigOffsets(String pattern, String parse, long offsetSecs) throws Exception {
324c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
325c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(pattern, "").parseUnresolved(parse, pos);
326c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), parse.length());
327c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(parsed.getLong(OFFSET_SECONDS), offsetSecs);
328c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
329c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
330c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
331c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @DataProvider(name="badOffsets")
332c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    Object[][] provider_badOffsets() {
333c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new Object[][] {
334c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "+1", 0},
335c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "-1", 0},
336c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "01", 0},
337c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "01", 0},
338c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH", "+AA", 0},
339c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
340c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "+1", 0},
341c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "+01", 0},
342c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "+001", 0},
343c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "0102", 0},
344c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "+01:02", 0},
345c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMM", "+AAAA", 0},
346c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
347c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+1", 0},
348c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+01", 0},
349c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+0:01", 0},
350c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+00:1", 0},
351c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+0:1", 0},
352c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+:", 0},
353c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "01:02", 0},
354c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+0102", 0},
355c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM", "+AA:AA", 0},
356c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
357c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+1", 0},
358c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+01", 0},
359c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+001", 0},
360c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "0102", 0},
361c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+01:02", 0},
362c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMss", "+AAAA", 0},
363c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
364c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+1", 0},
365c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+01", 0},
366c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+0:01", 0},
367c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+00:1", 0},
368c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+0:1", 0},
369c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+:", 0},
370c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "01:02", 0},
371c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+0102", 0},
372c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:ss", "+AA:AA", 0},
373c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
374c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "+1", 0},
375c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "+01", 0},
376c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "+001", 0},
377c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "0102", 0},
378c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "+01:02", 0},
379c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HHMMSS", "+AAAA", 0},
380c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
381c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+1", 0},
382c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+01", 0},
383c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+0:01", 0},
384c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+00:1", 0},
385c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+0:1", 0},
386c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+:", 0},
387c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "01:02", 0},
388c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+0102", 0},
389c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {"+HH:MM:SS", "+AA:AA", 0},
390c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        };
391c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
392c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
393c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="badOffsets")
394c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_invalid(String pattern, String parse, int expectedPosition) throws Exception {
395c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
396c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(pattern, "Z").parseUnresolved(parse, pos);
397c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getErrorIndex(), expectedPosition);
398c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(parsed, null);
399c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
400c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
401c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
402c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
403c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
404c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_caseSensitiveUTC_matchedCase() throws Exception {
405c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        setCaseSensitive(true);
406c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
407c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "Z").parseUnresolved("Z", pos);
408c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 1);
409c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
410c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
411c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
412c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_caseSensitiveUTC_unmatchedCase() throws Exception {
413c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        setCaseSensitive(true);
414c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
415c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "Z").parseUnresolved("z", pos);
416c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getErrorIndex(), 0);
417c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(parsed, null);
418c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
419c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
420c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_caseInsensitiveUTC_matchedCase() throws Exception {
421c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        setCaseSensitive(false);
422c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
423c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "Z").parseUnresolved("Z", pos);
424c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 1);
425c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
426c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
427c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
428c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_caseInsensitiveUTC_unmatchedCase() throws Exception {
429c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        setCaseSensitive(false);
430c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
431c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter("+HH:MM:ss", "Z").parseUnresolved("z", pos);
432c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), 1);
433c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, ZoneOffset.UTC);
434c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
435c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
436c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private void assertParsed(TemporalAccessor parsed, ZoneOffset expectedOffset) {
437c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (expectedOffset == null) {
438c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            assertEquals(parsed, null);
439c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        } else {
440c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            assertEquals(parsed.isSupported(OFFSET_SECONDS), true);
441c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            assertEquals(parsed.getLong(OFFSET_SECONDS), (long) expectedOffset.getTotalSeconds());
442c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
443c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
444c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
445c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer}
446