/**
* Copyright 2015 Dhatim
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.dhatim.businesshours;
import java.time.DateTimeException;
import java.time.LocalTime;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.IsoFields;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalQueries;
import java.time.temporal.UnsupportedTemporalTypeException;
import java.time.temporal.WeekFields;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class BusinessTemporalTest {
@Test(expected = DateTimeException.class)
public void fromNonContiguousFields() {
BusinessTemporal.of(new HashMap<ChronoField, Integer>() {
{
put(ChronoField.MILLI_OF_SECOND, 0);
put(ChronoField.MINUTE_OF_HOUR, 0);
}
});
}
@Test(expected = DateTimeException.class)
public void fromVariableLengthFields() {
BusinessTemporal.of(Collections.singletonMap(ChronoField.DAY_OF_MONTH, 1));
}
@Test
public void temporalQueries() {
assertEquals(
BusinessTemporal.of(toMap(ChronoField.HOUR_OF_DAY, 0, ChronoField.MINUTE_OF_HOUR, 0))
.query(TemporalQueries.precision()),
ChronoUnit.MINUTES);
assertEquals(
BusinessTemporal.of(toMap(ChronoField.HOUR_OF_DAY, 0, ChronoField.MINUTE_OF_HOUR, 0, ChronoField.SECOND_OF_MINUTE, 0))
.query(TemporalQueries.precision()),
ChronoUnit.SECONDS);
assertNull(
BusinessTemporal.of(Collections.singletonMap(ChronoField.HOUR_OF_DAY, 0))
.query(TemporalQueries.zoneId()));
}
@Test
public void supportedFields() {
BusinessTemporal bt = BusinessTemporal.of(Collections.singletonMap(ChronoField.DAY_OF_WEEK, 1));
assertEquals(bt.isSupported(ChronoField.DAY_OF_WEEK), true);
assertEquals(bt.isSupported(ChronoField.HOUR_OF_DAY), false);
assertEquals(bt.isSupported(WeekFields.SUNDAY_START.dayOfWeek()), true);
assertEquals(bt.isSupported(IsoFields.QUARTER_OF_YEAR), false);
}
@Test
public void getSupportedField() {
BusinessTemporal bt = BusinessTemporal.of(Collections.singletonMap(ChronoField.DAY_OF_WEEK, 1));
assertEquals(bt.getLong(ChronoField.DAY_OF_WEEK), 1);
assertEquals(bt.getLong(WeekFields.SUNDAY_START.dayOfWeek()), 2);
}
@Test(expected = UnsupportedTemporalTypeException.class)
public void getUnsupportedChronoField() {
BusinessTemporal.of(Collections.singletonMap(ChronoField.DAY_OF_WEEK, 1)).getLong(ChronoField.HOUR_OF_DAY);
}
@Test(expected = UnsupportedTemporalTypeException.class)
public void getUnsupportedField() {
BusinessTemporal.of(Collections.singletonMap(ChronoField.DAY_OF_WEEK, 1)).getLong(IsoFields.QUARTER_OF_YEAR);
}
@Test
public void withSupportedField() {
BusinessTemporal bt = BusinessTemporal.of(toMap(ChronoField.DAY_OF_WEEK, 1, ChronoField.HOUR_OF_DAY, 0));
Temporal temporal = bt.with(ChronoField.DAY_OF_WEEK, 2);
assertEquals(temporal.getLong(ChronoField.DAY_OF_WEEK), 2);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 0);
temporal = bt.with(WeekFields.SUNDAY_START.dayOfWeek(), 4);
assertEquals(temporal.getLong(ChronoField.DAY_OF_WEEK), 3);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 0);
}
@Test(expected = DateTimeException.class)
public void withInvalidFieldValue() {
BusinessTemporal.of(Collections.singletonMap(ChronoField.SECOND_OF_MINUTE, 0)).with(ChronoField.SECOND_OF_MINUTE, 61);
}
@Test(expected = UnsupportedTemporalTypeException.class)
public void withUnsupportedChronoField() {
BusinessTemporal.of(Collections.singletonMap(ChronoField.DAY_OF_WEEK, 1)).with(ChronoField.HOUR_OF_DAY, 0);
}
@Test(expected = UnsupportedTemporalTypeException.class)
public void withUnsupportedField() {
BusinessTemporal.of(Collections.singletonMap(ChronoField.DAY_OF_WEEK, 1)).with(IsoFields.QUARTER_OF_YEAR, 0);
}
@Test
public void supportedUnits() {
BusinessTemporal bt = BusinessTemporal.of(Collections.singletonMap(ChronoField.DAY_OF_WEEK, 1));
assertEquals(bt.isSupported(ChronoUnit.DAYS), true);
assertEquals(bt.isSupported(ChronoUnit.WEEKS), false);
assertEquals(bt.isSupported(IsoFields.QUARTER_YEARS), false);
}
@Test
public void plusSupportedUnit() {
BusinessTemporal bt = BusinessTemporal.of(toMap(ChronoField.HOUR_OF_DAY, 0, ChronoField.MINUTE_OF_HOUR, 0));
Temporal temporal = bt.plus(1, ChronoUnit.MINUTES);
assertEquals(temporal.getLong(ChronoField.MINUTE_OF_HOUR), 1);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 0);
temporal = bt.plus(60, ChronoUnit.MINUTES);
assertEquals(temporal.getLong(ChronoField.MINUTE_OF_HOUR), 0);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 1);
temporal = bt.plus(1440, ChronoUnit.MINUTES);
assertEquals(temporal.getLong(ChronoField.MINUTE_OF_HOUR), 0);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 0);
temporal = bt.plus(1, ChronoUnit.HOURS);
assertEquals(temporal.getLong(ChronoField.MINUTE_OF_HOUR), 0);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 1);
temporal = bt.plus(24, ChronoUnit.HOURS);
assertEquals(temporal.getLong(ChronoField.MINUTE_OF_HOUR), 0);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 0);
temporal = bt.minus(1, ChronoUnit.MINUTES);
assertEquals(temporal.getLong(ChronoField.MINUTE_OF_HOUR), 59);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 23);
temporal = bt.minus(60, ChronoUnit.MINUTES);
assertEquals(temporal.getLong(ChronoField.MINUTE_OF_HOUR), 0);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 23);
temporal = bt.minus(1440, ChronoUnit.MINUTES);
assertEquals(temporal.getLong(ChronoField.MINUTE_OF_HOUR), 0);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 0);
temporal = bt.minus(1, ChronoUnit.HOURS);
assertEquals(temporal.getLong(ChronoField.MINUTE_OF_HOUR), 0);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 23);
temporal = bt.minus(24, ChronoUnit.HOURS);
assertEquals(temporal.getLong(ChronoField.MINUTE_OF_HOUR), 0);
assertEquals(temporal.getLong(ChronoField.HOUR_OF_DAY), 0);
}
@Test(expected = UnsupportedTemporalTypeException.class)
public void plusUnsupportedChronoUnit() {
BusinessTemporal.of(Collections.singletonMap(ChronoField.MINUTE_OF_HOUR, 0)).plus(1, ChronoUnit.HOURS);
}
@Test(expected = UnsupportedTemporalTypeException.class)
public void plusUnsupportedUnit() {
BusinessTemporal.of(Collections.singletonMap(ChronoField.MINUTE_OF_HOUR, 0)).plus(1, IsoFields.QUARTER_YEARS);
}
@Test
public void increment() {
BusinessTemporal bt = BusinessTemporal.of(toMap(ChronoField.HOUR_OF_DAY, 0, ChronoField.MINUTE_OF_HOUR, 0)).increment();
assertEquals(bt.getLong(ChronoField.MINUTE_OF_HOUR), 1);
assertEquals(bt.getLong(ChronoField.HOUR_OF_DAY), 0);
bt = BusinessTemporal.of(toMap(ChronoField.HOUR_OF_DAY, 0, ChronoField.MINUTE_OF_HOUR, 59)).increment();
assertEquals(bt.getLong(ChronoField.MINUTE_OF_HOUR), 0);
assertEquals(bt.getLong(ChronoField.HOUR_OF_DAY), 1);
}
@Test
public void untilChronoUnit() {
BusinessTemporal bt = BusinessTemporal.of(toMap(ChronoField.HOUR_OF_DAY, 11, ChronoField.MINUTE_OF_HOUR, 30));
assertEquals(bt.until(LocalTime.of(13, 29), ChronoUnit.MINUTES), 119);
assertEquals(bt.until(LocalTime.of(13, 29), ChronoUnit.HOURS), 1);
assertEquals(bt.until(LocalTime.of(13, 29), ChronoUnit.DAYS), 0);
assertEquals(bt.until(LocalTime.of(13, 29), IsoFields.QUARTER_YEARS), 0);
}
@Test(expected = UnsupportedTemporalTypeException.class)
public void sinceInvalidTemporal() {
BusinessTemporal.of(Collections.singletonMap(ChronoField.DAY_OF_WEEK, 1)).until(LocalTime.of(0, 0), ChronoUnit.DAYS);
}
@Test
public void since() {
assertEquals(BusinessTemporal
.of(toMap(ChronoField.HOUR_OF_DAY, 13, ChronoField.MINUTE_OF_HOUR, 29))
.since(LocalTime.of(11, 30, 1), ChronoUnit.HOURS), 1);
assertEquals(BusinessTemporal
.of(toMap(ChronoField.HOUR_OF_DAY, 13, ChronoField.MINUTE_OF_HOUR, 29))
.since(LocalTime.of(11, 30, 1), ChronoUnit.MINUTES), 118);
assertEquals(BusinessTemporal
.of(toMap(ChronoField.HOUR_OF_DAY, 13, ChronoField.MINUTE_OF_HOUR, 29))
.since(LocalTime.of(11, 30, 1), ChronoUnit.SECONDS), 7139);
assertEquals(BusinessTemporal
.of(toMap(ChronoField.HOUR_OF_DAY, 13, ChronoField.MINUTE_OF_HOUR, 29))
.since(LocalTime.of(11, 30, 1), ChronoUnit.MILLIS), 7139000);
assertEquals(BusinessTemporal
.of(toMap(ChronoField.HOUR_OF_DAY, 11, ChronoField.MINUTE_OF_HOUR, 30))
.since(LocalTime.of(13, 29, 1), ChronoUnit.MILLIS), 79259000);
}
@Test
public void compare() {
assertEquals(BusinessTemporal.of(Collections.singletonMap(ChronoField.HOUR_OF_DAY, 1)).compareTo(LocalTime.of(1, 0)), 0);
assertTrue(BusinessTemporal.of(Collections.singletonMap(ChronoField.HOUR_OF_DAY, 2)).compareTo(LocalTime.of(1, 0)) > 0);
assertTrue(BusinessTemporal.of(Collections.singletonMap(ChronoField.HOUR_OF_DAY, 0)).compareTo(LocalTime.of(1, 0)) < 0);
}
private static Map<ChronoField, Integer> toMap(
ChronoField field1, Integer value1,
ChronoField field2, Integer value2) {
return new HashMap<ChronoField, Integer>() {
{
put(field1, value1);
put(field2, value2);
}
};
}
private static Map<ChronoField, Integer> toMap(
ChronoField field1, Integer value1,
ChronoField field2, Integer value2,
ChronoField field3, Integer value3) {
return new HashMap<ChronoField, Integer>() {
{
put(field1, value1);
put(field2, value2);
put(field3, value3);
}
};
}
}