import javax.measure.quantity.Power;
import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openhab.binding.solarforecast.internal.SolarForecastBindingConstants;
import org.openhab.binding.solarforecast.internal.SolarForecastException;
public static final String NO_GORECAST_INDICATOR = "No forecast data";
public static final String DAY_MISSING_INDICATOR = "not available in forecast";
+ @BeforeAll
+ static void setFixedTime() {
+ // Instant matching the date of test resources
+ String fixedInstant = "2022-07-17T15:00:00Z";
+ Clock fixedClock = Clock.fixed(Instant.parse(fixedInstant), TEST_ZONE);
+ Utils.setClock(fixedClock);
+ }
+
@Test
void testForecastObject() {
String content = FileReader.readFileInString("src/test/resources/forecastsolar/result.json");
ForecastSolarObject fo = new ForecastSolarObject("fs-test", content, queryDateTime.toInstant());
TimeSeries powerSeries = fo.getPowerTimeSeries(QueryMode.Average);
- assertEquals(36, powerSeries.size()); // 18 values each day for 2 days
+ Instant now = Instant.now(Utils.getClock());
+ assertEquals(24, powerSeries.size());
powerSeries.getStates().forEachOrdered(entry -> {
+ assertTrue(Utils.isAfterOrEqual(entry.timestamp(), now));
State s = entry.state();
assertTrue(s instanceof QuantityType<?>);
assertEquals("kW", ((QuantityType<?>) s).getUnit().toString());
});
TimeSeries energySeries = fo.getEnergyTimeSeries(QueryMode.Average);
- assertEquals(36, energySeries.size());
+ assertEquals(24, energySeries.size());
energySeries.getStates().forEachOrdered(entry -> {
+ assertTrue(Utils.isAfterOrEqual(entry.timestamp(), now));
State s = entry.state();
assertTrue(s instanceof QuantityType<?>);
assertEquals("kWh", ((QuantityType<?>) s).getUnit().toString());
@Test
void testPowerTimeSeries() {
- // Instant matching the date of test resources
- String fixedInstant = "2022-07-17T15:00:00Z";
- Clock fixedClock = Clock.fixed(Instant.parse(fixedInstant), TEST_ZONE);
- Utils.setClock(fixedClock);
ForecastSolarBridgeHandler fsbh = new ForecastSolarBridgeHandler(
new BridgeImpl(SolarForecastBindingConstants.FORECAST_SOLAR_SITE, "bridge"),
Optional.of(PointType.valueOf("1,2")));
@Test
void testCommonForecastStartEnd() {
- // Instant matching the date of test resources
- String fixedInstant = "2022-07-17T15:00:00Z";
- Clock fixedClock = Clock.fixed(Instant.parse(fixedInstant), TEST_ZONE);
- Utils.setClock(fixedClock);
ForecastSolarBridgeHandler fsbh = new ForecastSolarBridgeHandler(
new BridgeImpl(SolarForecastBindingConstants.FORECAST_SOLAR_SITE, "bridge"),
Optional.of(PointType.valueOf("1,2")));
@Test
void testActions() {
- // Instant matching the date of test resources
- String fixedInstant = "2022-07-17T15:00:00Z";
- Clock fixedClock = Clock.fixed(Instant.parse(fixedInstant), TEST_ZONE);
- Utils.setClock(fixedClock);
ForecastSolarBridgeHandler fsbh = new ForecastSolarBridgeHandler(
new BridgeImpl(SolarForecastBindingConstants.FORECAST_SOLAR_SITE, "bridge"),
Optional.of(PointType.valueOf("1,2")));
@Test
void testEnergyTimeSeries() {
- // Instant matching the date of test resources
- String fixedInstant = "2022-07-17T15:00:00Z";
- Clock fixedClock = Clock.fixed(Instant.parse(fixedInstant), TEST_ZONE);
- Utils.setClock(fixedClock);
ForecastSolarBridgeHandler fsbh = new ForecastSolarBridgeHandler(
new BridgeImpl(SolarForecastBindingConstants.FORECAST_SOLAR_SITE, "bridge"),
Optional.of(PointType.valueOf("1,2")));
@Test
void testCalmDown() {
- // Instant matching the date of test resources
- String fixedInstant = "2022-07-17T15:00:00Z";
- Clock fixedClock = Clock.fixed(Instant.parse(fixedInstant), TEST_ZONE);
- Utils.setClock(fixedClock);
ForecastSolarBridgeHandler fsbh = new ForecastSolarBridgeHandler(
new BridgeImpl(SolarForecastBindingConstants.FORECAST_SOLAR_SITE, "bridge"),
Optional.of(PointType.valueOf("1,2")));
assertEquals(ThingStatusDetail.COMMUNICATION_ERROR, cm.getStatus().getStatusDetail(), "Offline");
// forward Clock to get ONLINE again
- fixedInstant = "2022-07-17T16:15:00Z";
- fixedClock = Clock.fixed(Instant.parse(fixedInstant), ZoneId.of("UTC"));
+ String fixedInstant = "2022-07-17T16:15:00Z";
+ Clock fixedClock = Clock.fixed(Instant.parse(fixedInstant), ZoneId.of("UTC"));
Utils.setClock(fixedClock);
fsbh.handleCommand(
new ChannelUID("solarforecast:fs-site:bridge:" + SolarForecastBindingConstants.CHANNEL_ENERGY_ACTUAL),
import static org.junit.jupiter.api.Assertions.*;
+import java.time.Clock;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.json.JSONObject;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openhab.binding.solarforecast.internal.SolarForecastBindingConstants;
import org.openhab.binding.solarforecast.internal.SolarForecastException;
import org.openhab.binding.solarforecast.internal.solcast.handler.SolcastBridgeHandler;
import org.openhab.binding.solarforecast.internal.solcast.handler.SolcastPlaneHandler;
import org.openhab.binding.solarforecast.internal.solcast.handler.SolcastPlaneMock;
+import org.openhab.binding.solarforecast.internal.utils.Utils;
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.library.unit.Units;
import org.openhab.core.thing.internal.BridgeImpl;
public static final String TOO_LATE_INDICATOR = "too late";
public static final String DAY_MISSING_INDICATOR = "not available in forecast";
+ @BeforeAll
+ static void setFixedTimeJul17() {
+ // Instant matching the date of test resources
+ Instant fixedInstant = Instant.parse("2022-07-17T21:00:00Z");
+ Clock fixedClock = Clock.fixed(fixedInstant, TEST_ZONE);
+ Utils.setClock(fixedClock);
+ }
+
+ static void setFixedTimeJul18() {
+ // Instant matching the date of test resources
+ Instant fixedInstant = Instant.parse("2022-07-18T14:23:00Z");
+ Clock fixedClock = Clock.fixed(fixedInstant, TEST_ZONE);
+ Utils.setClock(fixedClock);
+ }
+
/**
* "2022-07-18T00:00+02:00[Europe/Berlin]": 0,
* "2022-07-18T00:30+02:00[Europe/Berlin]": 0,
@Test
void testPowerTimeSeries() {
+ setFixedTimeJul18();
+ Instant now = Instant.now(Utils.getClock());
String content = FileReader.readFileInString("src/test/resources/solcast/estimated-actuals.json");
- ZonedDateTime now = LocalDateTime.of(2022, 7, 18, 16, 23).atZone(TEST_ZONE);
- SolcastObject sco = new SolcastObject("sc-test", content, now.toInstant(), TIMEZONEPROVIDER);
+ SolcastObject sco = new SolcastObject("sc-test", content, now, TIMEZONEPROVIDER);
content = FileReader.readFileInString("src/test/resources/solcast/forecasts.json");
sco.join(content);
TimeSeries powerSeries = sco.getPowerTimeSeries(QueryMode.Average);
List<QuantityType<?>> estimateL = new ArrayList<>();
- assertEquals(672, powerSeries.size());
+ assertEquals(302, powerSeries.size());
powerSeries.getStates().forEachOrdered(entry -> {
+ assertTrue(entry.timestamp().isAfter(Instant.now(Utils.getClock())));
State s = entry.state();
assertTrue(s instanceof QuantityType<?>);
assertEquals("kW", ((QuantityType<?>) s).getUnit().toString());
TimeSeries powerSeries10 = sco.getPowerTimeSeries(QueryMode.Pessimistic);
List<QuantityType<?>> estimate10 = new ArrayList<>();
- assertEquals(672, powerSeries10.size());
+ assertEquals(302, powerSeries10.size());
powerSeries10.getStates().forEachOrdered(entry -> {
+ assertTrue(entry.timestamp().isAfter(Instant.now(Utils.getClock())));
State s = entry.state();
assertTrue(s instanceof QuantityType<?>);
assertEquals("kW", ((QuantityType<?>) s).getUnit().toString());
TimeSeries powerSeries90 = sco.getPowerTimeSeries(QueryMode.Optimistic);
List<QuantityType<?>> estimate90 = new ArrayList<>();
- assertEquals(672, powerSeries90.size());
+ assertEquals(302, powerSeries90.size());
powerSeries90.getStates().forEachOrdered(entry -> {
+ assertTrue(entry.timestamp().isAfter(Instant.now(Utils.getClock())));
State s = entry.state();
assertTrue(s instanceof QuantityType<?>);
assertEquals("kW", ((QuantityType<?>) s).getUnit().toString());
@Test
void testEnergyTimeSeries() {
+ setFixedTimeJul18();
+ Instant now = Instant.now(Utils.getClock());
String content = FileReader.readFileInString("src/test/resources/solcast/estimated-actuals.json");
- ZonedDateTime now = LocalDateTime.of(2022, 7, 18, 16, 23).atZone(TEST_ZONE);
- SolcastObject sco = new SolcastObject("sc-test", content, now.toInstant(), TIMEZONEPROVIDER);
+ SolcastObject sco = new SolcastObject("sc-test", content, now, TIMEZONEPROVIDER);
content = FileReader.readFileInString("src/test/resources/solcast/forecasts.json");
sco.join(content);
TimeSeries energySeries = sco.getEnergyTimeSeries(QueryMode.Average);
List<QuantityType<?>> estimateL = new ArrayList<>();
- assertEquals(672, energySeries.size()); // 18 values each day for 2 days
+ assertEquals(302, energySeries.size()); // 48 values each day for next 7 days
energySeries.getStates().forEachOrdered(entry -> {
+ assertTrue(Utils.isAfterOrEqual(entry.timestamp(), now));
State s = entry.state();
assertTrue(s instanceof QuantityType<?>);
assertEquals("kWh", ((QuantityType<?>) s).getUnit().toString());
TimeSeries energySeries10 = sco.getEnergyTimeSeries(QueryMode.Pessimistic);
List<QuantityType<?>> estimate10 = new ArrayList<>();
- assertEquals(672, energySeries10.size()); // 18 values each day for 2 days
+ assertEquals(302, energySeries10.size()); // 48 values each day for next 7 days
energySeries10.getStates().forEachOrdered(entry -> {
+ assertTrue(Utils.isAfterOrEqual(entry.timestamp(), now));
State s = entry.state();
assertTrue(s instanceof QuantityType<?>);
assertEquals("kWh", ((QuantityType<?>) s).getUnit().toString());
TimeSeries energySeries90 = sco.getEnergyTimeSeries(QueryMode.Optimistic);
List<QuantityType<?>> estimate90 = new ArrayList<>();
- assertEquals(672, energySeries90.size()); // 18 values each day for 2 days
+ assertEquals(302, energySeries90.size()); // 48 values each day for next 7 days
energySeries90.getStates().forEachOrdered(entry -> {
+ assertTrue(Utils.isAfterOrEqual(entry.timestamp(), now));
State s = entry.state();
assertTrue(s instanceof QuantityType<?>);
assertEquals("kWh", ((QuantityType<?>) s).getUnit().toString());
@Test
void testCombinedPowerTimeSeries() {
+ setFixedTimeJul18();
BridgeImpl bi = new BridgeImpl(SolarForecastBindingConstants.SOLCAST_SITE, "bridge");
SolcastBridgeHandler scbh = new SolcastBridgeHandler(bi, new TimeZP());
bi.setHandler(scbh);
TimeSeries ts1 = cm.getTimeSeries("solarforecast:sc-site:bridge:average#power-estimate");
TimeSeries ts2 = cm2.getTimeSeries("solarforecast:sc-plane:thing:average#power-estimate");
- assertEquals(336, ts1.size(), "TimeSeries size");
- assertEquals(336, ts2.size(), "TimeSeries size");
+ assertEquals(302, ts1.size(), "TimeSeries size");
+ assertEquals(302, ts2.size(), "TimeSeries size");
Iterator<TimeSeries.Entry> iter1 = ts1.getStates().iterator();
Iterator<TimeSeries.Entry> iter2 = ts2.getStates().iterator();
while (iter1.hasNext()) {
@Test
void testCombinedEnergyTimeSeries() {
+ setFixedTimeJul18();
BridgeImpl bi = new BridgeImpl(SolarForecastBindingConstants.SOLCAST_SITE, "bridge");
SolcastBridgeHandler scbh = new SolcastBridgeHandler(bi, new TimeZP());
bi.setHandler(scbh);
TimeSeries ts1 = cm.getTimeSeries("solarforecast:sc-site:bridge:average#energy-estimate");
TimeSeries ts2 = cm2.getTimeSeries("solarforecast:sc-plane:thing:average#energy-estimate");
- assertEquals(336, ts1.size(), "TimeSeries size");
- assertEquals(336, ts2.size(), "TimeSeries size");
+ assertEquals(302, ts1.size(), "TimeSeries size");
+ assertEquals(302, ts2.size(), "TimeSeries size");
Iterator<TimeSeries.Entry> iter1 = ts1.getStates().iterator();
Iterator<TimeSeries.Entry> iter2 = ts2.getStates().iterator();
@Test
void testSingleEnergyTimeSeries() {
+ setFixedTimeJul18();
BridgeImpl bi = new BridgeImpl(SolarForecastBindingConstants.SOLCAST_SITE, "bridge");
SolcastBridgeHandler scbh = new SolcastBridgeHandler(bi, new TimeZP());
bi.setHandler(scbh);
scbh.getData();
TimeSeries ts1 = cm.getTimeSeries("solarforecast:sc-site:bridge:average#energy-estimate");
- assertEquals(336, ts1.size(), "TimeSeries size");
+ assertEquals(302, ts1.size(), "TimeSeries size");
Iterator<TimeSeries.Entry> iter1 = ts1.getStates().iterator();
while (iter1.hasNext()) {
TimeSeries.Entry e1 = iter1.next();