1/*
2 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * This file is available under and governed by the GNU General Public
26 * License version 2 only, as published by the Free Software Foundation.
27 * However, the following notice accompanied the original version of this
28 * file:
29 *
30 * Copyright (c) 2012, Stephen Colebourne & Michael Nascimento Santos
31 *
32 * All rights reserved.
33 *
34 * Redistribution and use in source and binary forms, with or without
35 * modification, are permitted provided that the following conditions are met:
36 *
37 *  * Redistributions of source code must retain the above copyright notice,
38 *    this list of conditions and the following disclaimer.
39 *
40 *  * Redistributions in binary form must reproduce the above copyright notice,
41 *    this list of conditions and the following disclaimer in the documentation
42 *    and/or other materials provided with the distribution.
43 *
44 *  * Neither the name of JSR-310 nor the names of its contributors
45 *    may be used to endorse or promote products derived from this software
46 *    without specific prior written permission.
47 *
48 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
51 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
52 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
53 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
54 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
55 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
56 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
57 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
58 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59 */
60package test.java.time;
61
62import static java.time.temporal.ChronoUnit.DAYS;
63import static java.time.temporal.ChronoUnit.FOREVER;
64import static java.time.temporal.ChronoUnit.SECONDS;
65
66import java.time.DateTimeException;
67import java.time.temporal.Temporal;
68import java.time.temporal.TemporalAmount;
69import java.time.temporal.TemporalUnit;
70import java.util.List;
71import java.util.Objects;
72
73/**
74 * Mock period of time measured using a single unit, such as {@code 3 Days}.
75 */
76public final class MockSimplePeriod
77        implements TemporalAmount, Comparable<MockSimplePeriod> {
78
79    /**
80     * A constant for a period of zero, measured in days.
81     */
82    public static final MockSimplePeriod ZERO_DAYS = new MockSimplePeriod(0, DAYS);
83    /**
84     * A constant for a period of zero, measured in seconds.
85     */
86    public static final MockSimplePeriod ZERO_SECONDS = new MockSimplePeriod(0, SECONDS);
87
88    /**
89     * The amount of the period.
90     */
91    private final long amount;
92    /**
93     * The unit the period is measured in.
94     */
95    private final TemporalUnit unit;
96
97    /**
98     * Obtains a {@code MockSimplePeriod} from an amount and unit.
99     * <p>
100     * The parameters represent the two parts of a phrase like '6 Days'.
101     *
102     * @param amount  the amount of the period, measured in terms of the unit, positive or negative
103     * @param unit  the unit that the period is measured in, must not be the 'Forever' unit, not null
104     * @return the {@code MockSimplePeriod} instance, not null
105     * @throws DateTimeException if the period unit is {@link java.time.temporal.ChronoUnit#FOREVER}.
106     */
107    public static MockSimplePeriod of(long amount, TemporalUnit unit) {
108        return new MockSimplePeriod(amount, unit);
109    }
110
111    private MockSimplePeriod(long amount, TemporalUnit unit) {
112        Objects.requireNonNull(unit, "unit");
113        if (unit == FOREVER) {
114            throw new DateTimeException("Cannot create a period of the Forever unit");
115        }
116        this.amount = amount;
117        this.unit = unit;
118    }
119
120    @Override
121    public long get(TemporalUnit unit) {
122        throw new UnsupportedOperationException("Not supported yet.");
123    }
124
125    @Override
126    public List<TemporalUnit> getUnits() {
127        throw new UnsupportedOperationException("Not supported yet.");
128    }
129
130    //-----------------------------------------------------------------------
131    public long getAmount() {
132        return amount;
133    }
134
135    public TemporalUnit getUnit() {
136        return unit;
137    }
138
139    //-------------------------------------------------------------------------
140    @Override
141    public Temporal addTo(Temporal temporal) {
142        return temporal.plus(amount, unit);
143    }
144
145    @Override
146    public Temporal subtractFrom(Temporal temporal) {
147        return temporal.minus(amount, unit);
148    }
149
150    //-----------------------------------------------------------------------
151    @Override
152    public int compareTo(MockSimplePeriod otherPeriod) {
153        if (unit.equals(otherPeriod.getUnit()) == false) {
154            throw new IllegalArgumentException("Units cannot be compared: " + unit + " and " + otherPeriod.getUnit());
155        }
156        return Long.compare(amount, otherPeriod.amount);
157    }
158
159    @Override
160    public boolean equals(Object obj) {
161        if (this == obj) {
162           return true;
163        }
164        if (obj instanceof MockSimplePeriod) {
165            MockSimplePeriod other = (MockSimplePeriod) obj;
166            return this.amount == other.amount &&
167                    this.unit.equals(other.unit);
168        }
169        return false;
170    }
171
172    @Override
173    public int hashCode() {
174        return unit.hashCode() ^ (int) (amount ^ (amount >>> 32));
175    }
176
177    @Override
178    public String toString() {
179        return amount + " " + unit;
180    }
181
182}
183