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.NANO_OF_SECOND;
63c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.temporal.ChronoField.SECOND_OF_MINUTE;
64c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static org.testng.Assert.assertEquals;
65c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static org.testng.Assert.fail;
66c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
67c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.text.ParsePosition;
68c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.DateTimeException;
69c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.LocalTime;
70c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.format.DateTimeFormatter;
71c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalAccessor;
72c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalField;
73c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
74c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport org.testng.annotations.DataProvider;
75c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport org.testng.annotations.Test;
76c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport test.java.time.temporal.MockFieldValue;
77c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
78c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer/**
79c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Test FractionPrinterParser.
80c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */
81c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer@Test
82c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerpublic class TestFractionPrinterParser extends AbstractTestPrinterParser {
83c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
84c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private DateTimeFormatter getFormatter(TemporalField field, int minWidth, int maxWidth, boolean decimalPoint) {
85c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return builder.appendFraction(field, minWidth, maxWidth, decimalPoint).toFormatter(locale).withDecimalStyle(decimalStyle);
86c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
87c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
88c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
89c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    // print
90c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
91c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(expectedExceptions=DateTimeException.class)
92c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_print_emptyCalendrical() throws Exception {
93c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        getFormatter(NANO_OF_SECOND, 0, 9, true).formatTo(EMPTY_DTA, buf);
94c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
95c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
96c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_print_append() throws Exception {
97c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        buf.append("EXISTING");
98c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        getFormatter(NANO_OF_SECOND, 0, 9, true).formatTo(LocalTime.of(12, 30, 40, 3), buf);
99c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(buf.toString(), "EXISTING.000000003");
100c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
101c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
102c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
103c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @DataProvider(name="Nanos")
104c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    Object[][] provider_nanos() {
105c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new Object[][] {
106c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 0,           ""},
107c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 2,           ".000000002"},
108c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 20,          ".00000002"},
109c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 200,         ".0000002"},
110c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 2000,        ".000002"},
111c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 20000,       ".00002"},
112c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 200000,      ".0002"},
113c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 2000000,     ".002"},
114c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 20000000,    ".02"},
115c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 200000000,   ".2"},
116c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 1,           ".000000001"},
117c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 12,          ".000000012"},
118c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 123,         ".000000123"},
119c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 1234,        ".000001234"},
120c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 12345,       ".000012345"},
121c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 123456,      ".000123456"},
122c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 1234567,     ".001234567"},
123c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 12345678,    ".012345678"},
124c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 123456789,   ".123456789"},
125c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
126c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {1, 9, 0,           ".0"},
127c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {1, 9, 2,           ".000000002"},
128c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {1, 9, 20,          ".00000002"},
129c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {1, 9, 200,         ".0000002"},
130c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {1, 9, 2000,        ".000002"},
131c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {1, 9, 20000,       ".00002"},
132c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {1, 9, 200000,      ".0002"},
133c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {1, 9, 2000000,     ".002"},
134c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {1, 9, 20000000,    ".02"},
135c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {1, 9, 200000000,   ".2"},
136c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
137c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 0,           ".00"},
138c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 2,           ".000"},
139c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 20,          ".000"},
140c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 200,         ".000"},
141c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 2000,        ".000"},
142c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 20000,       ".000"},
143c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 200000,      ".000"},
144c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 2000000,     ".002"},
145c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 20000000,    ".02"},
146c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 200000000,   ".20"},
147c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 1,           ".000"},
148c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 12,          ".000"},
149c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 123,         ".000"},
150c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 1234,        ".000"},
151c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 12345,       ".000"},
152c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 123456,      ".000"},
153c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 1234567,     ".001"},
154c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 12345678,    ".012"},
155c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 3, 123456789,   ".123"},
156c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
157c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 0,           ".000000"},
158c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 2,           ".000000"},
159c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 20,          ".000000"},
160c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 200,         ".000000"},
161c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 2000,        ".000002"},
162c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 20000,       ".000020"},
163c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 200000,      ".000200"},
164c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 2000000,     ".002000"},
165c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 20000000,    ".020000"},
166c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 200000000,   ".200000"},
167c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 1,           ".000000"},
168c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 12,          ".000000"},
169c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 123,         ".000000"},
170c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 1234,        ".000001"},
171c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 12345,       ".000012"},
172c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 123456,      ".000123"},
173c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 1234567,     ".001234"},
174c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 12345678,    ".012345"},
175c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {6, 6, 123456789,   ".123456"},
176c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer       };
177c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
178c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
179c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="Nanos")
180c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_print_nanos(int minWidth, int maxWidth, int value, String result) throws Exception {
181c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        getFormatter(NANO_OF_SECOND,  minWidth, maxWidth, true).formatTo(new MockFieldValue(NANO_OF_SECOND, value), buf);
182c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (result == null) {
183c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            fail("Expected exception");
184c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
185c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(buf.toString(), result);
186c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
187c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
188c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="Nanos")
189c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_print_nanos_noDecimalPoint(int minWidth, int maxWidth, int value, String result) throws Exception {
190c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        getFormatter(NANO_OF_SECOND,  minWidth, maxWidth, false).formatTo(new MockFieldValue(NANO_OF_SECOND, value), buf);
191c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (result == null) {
192c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            fail("Expected exception");
193c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
194c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(buf.toString(), (result.startsWith(".") ? result.substring(1) : result));
195c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
196c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
197c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
198c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @DataProvider(name="Seconds")
199c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    Object[][] provider_seconds() {
200c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new Object[][] {
201c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 0,  ""},
202c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 3,  ".05"},
203c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 6,  ".1"},
204c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 9,  ".15"},
205c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 12, ".2"},
206c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 15, ".25"},
207c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 30, ".5"},
208c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {0, 9, 45, ".75"},
209c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
210c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 2, 0,  ".00"},
211c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 2, 3,  ".05"},
212c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 2, 6,  ".10"},
213c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 2, 9,  ".15"},
214c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 2, 12, ".20"},
215c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 2, 15, ".25"},
216c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 2, 30, ".50"},
217c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {2, 2, 45, ".75"},
218c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        };
219c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
220c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
221c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="Seconds")
222c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_print_seconds(int minWidth, int maxWidth, int value, String result) throws Exception {
223c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        getFormatter(SECOND_OF_MINUTE, minWidth, maxWidth, true).formatTo(new MockFieldValue(SECOND_OF_MINUTE, value), buf);
224c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (result == null) {
225c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            fail("Expected exception");
226c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
227c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(buf.toString(), result);
228c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
229c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
230c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="Seconds")
231c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_print_seconds_noDecimalPoint(int minWidth, int maxWidth, int value, String result) throws Exception {
232c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        getFormatter(SECOND_OF_MINUTE, minWidth, maxWidth, false).formatTo(new MockFieldValue(SECOND_OF_MINUTE, value), buf);
233c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (result == null) {
234c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            fail("Expected exception");
235c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
236c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(buf.toString(), (result.startsWith(".") ? result.substring(1) : result));
237c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
238c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
239c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
240c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    // parse
241c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
242c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="Nanos")
243c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_reverseParse(int minWidth, int maxWidth, int value, String result) throws Exception {
244c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
245c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        int expectedValue = fixParsedValue(maxWidth, value);
246c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(NANO_OF_SECOND, minWidth, maxWidth, true).parseUnresolved(result, pos);
247c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), result.length());
248c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, NANO_OF_SECOND, value == 0 && minWidth == 0 ? null : (long) expectedValue);
249c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
250c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
251c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="Nanos")
252c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_reverseParse_noDecimalPoint(int minWidth, int maxWidth, int value, String result) throws Exception {
253c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition((result.startsWith(".") ? 1 : 0));
254c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(NANO_OF_SECOND, minWidth, maxWidth, false).parseUnresolved(result, pos);
255c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), result.length());
256c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        int expectedValue = fixParsedValue(maxWidth, value);
257c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, NANO_OF_SECOND, value == 0 && minWidth == 0 ? null : (long) expectedValue);
258c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
259c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
260c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="Nanos")
261c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_reverseParse_followedByNonDigit(int minWidth, int maxWidth, int value, String result) throws Exception {
262c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
263c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        int expectedValue = fixParsedValue(maxWidth, value);
264c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(NANO_OF_SECOND, minWidth, maxWidth, true).parseUnresolved(result + " ", pos);
265c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), result.length());
266c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, NANO_OF_SECOND, value == 0 && minWidth == 0 ? null : (long) expectedValue);
267c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
268c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
269c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer//    @Test(dataProvider="Nanos")
270c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer//    public void test_reverseParse_followedByNonDigit_noDecimalPoint(int minWidth, int maxWidth, int value, String result) throws Exception {
271c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer//        FractionPrinterParser pp = new FractionPrinterParser(NANO_OF_SECOND, minWidth, maxWidth, false);
272c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer//        int newPos = pp.parse(parseContext, result + " ", (result.startsWith(".") ? 1 : 0));
273c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer//        assertEquals(newPos, result.length());
274c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer//        int expectedValue = fixParsedValue(maxWidth, value);
275c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer//        assertParsed(parseContext, NANO_OF_SECOND, value == 0 && minWidth == 0 ? null : (long) expectedValue);
276c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer//    }
277c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
278c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="Nanos")
279c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_reverseParse_preceededByNonDigit(int minWidth, int maxWidth, int value, String result) throws Exception {
280c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(1);
281c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        int expectedValue = fixParsedValue(maxWidth, value);
282c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(NANO_OF_SECOND, minWidth, maxWidth, true).parseUnresolved(" " + result, pos);
283c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), result.length() + 1);
284c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, NANO_OF_SECOND, value == 0 && minWidth == 0 ? null : (long) expectedValue);
285c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
286c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
287c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private int fixParsedValue(int maxWidth, int value) {
288c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (maxWidth < 9) {
289c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            int power = (int) Math.pow(10, (9 - maxWidth));
290c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            value = (value / power) * power;
291c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
292c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return value;
293c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
294c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
295c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider="Seconds")
296c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_reverseParse_seconds(int minWidth, int maxWidth, int value, String result) throws Exception {
297c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition pos = new ParsePosition(0);
298c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(SECOND_OF_MINUTE, minWidth, maxWidth, true).parseUnresolved(result, pos);
299c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(pos.getIndex(), result.length());
300c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertParsed(parsed, SECOND_OF_MINUTE, value == 0 && minWidth == 0 ? null : (long) value);
301c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
302c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
303c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    private void assertParsed(TemporalAccessor parsed, TemporalField field, Long value) {
304c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        if (value == null) {
305c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            assertEquals(parsed.isSupported(field), false);
306c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        } else {
307c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            assertEquals(parsed.isSupported(field), true);
308c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            assertEquals(parsed.getLong(field), (long) value);
309c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        }
310c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
311c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
312c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
313c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @DataProvider(name="ParseNothing")
314c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    Object[][] provider_parseNothing() {
315c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        return new Object[][] {
316c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {NANO_OF_SECOND, 3, 6, true, "", 0, 0},
317c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {NANO_OF_SECOND, 3, 6, true, "A", 0, 0},
318c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {NANO_OF_SECOND, 3, 6, true, ".", 0, 1},
319c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {NANO_OF_SECOND, 3, 6, true, ".5", 0, 1},
320c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {NANO_OF_SECOND, 3, 6, true, ".51", 0, 1},
321c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {NANO_OF_SECOND, 3, 6, true, ".A23456", 0, 1},
322c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer            {NANO_OF_SECOND, 3, 6, true, ".1A3456", 0, 1},
323c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        };
324c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
325c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
326c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    @Test(dataProvider = "ParseNothing")
327c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_parse_nothing(TemporalField field, int min, int max, boolean decimalPoint, String text, int pos, int expected) {
328c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        ParsePosition ppos = new ParsePosition(pos);
329c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        TemporalAccessor parsed = getFormatter(field, min, max, decimalPoint).parseUnresolved(text, ppos);
330c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(ppos.getErrorIndex(), expected);
331c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(parsed, null);
332c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
333c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
334c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    //-----------------------------------------------------------------------
335c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_toString() throws Exception {
336c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(getFormatter(NANO_OF_SECOND, 3, 6, true).toString(), "Fraction(NanoOfSecond,3,6,DecimalPoint)");
337c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
338c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
339c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    public void test_toString_noDecimalPoint() throws Exception {
340c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer        assertEquals(getFormatter(NANO_OF_SECOND, 3, 6, false).toString(), "Fraction(NanoOfSecond,3,6)");
341c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer    }
342c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer
343c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer}
344