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