// Copyright © 2016 HSL <https://www.hsl.fi> // This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses. package fi.hsl.parkandride.core.domain.prediction; import fi.hsl.parkandride.back.AbstractDaoTest; import fi.hsl.parkandride.back.Dummies; import fi.hsl.parkandride.core.back.FacilityRepository; import fi.hsl.parkandride.core.back.UtilizationRepository; import fi.hsl.parkandride.core.domain.*; import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; import org.springframework.transaction.annotation.Transactional; import javax.inject.Inject; import java.util.Collections; import java.util.List; import java.util.Optional; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; @Transactional public abstract class AbstractPredictorTest extends AbstractDaoTest { @Inject private Dummies dummies; @Inject private UtilizationRepository utilizationRepository; @Inject private FacilityRepository facilityRepository; private final Predictor predictor; protected UtilizationKey utilizationKey; protected UtilizationHistory utilizationHistory; protected PredictorState predictorState; protected final DateTime now = new DateTime(); protected Optional<Utilization> latestInsertedUtilization; protected int availableMaxCapacity; protected AbstractPredictorTest(Predictor predictor) { this.predictor = predictor; } @Before public void init() { long facilityId = dummies.createFacility(); utilizationKey = new UtilizationKey(facilityId, CapacityType.CAR, Usage.PARK_AND_RIDE); Facility facility = facilityRepository.getFacilityForUpdate(facilityId); facility.pricingMethod = PricingMethod.PARK_AND_RIDE_247_FREE; facilityRepository.updateFacility(facilityId, facility); utilizationHistory = new UtilizationHistoryImpl(utilizationRepository, utilizationKey); predictorState = new PredictorState(1L, predictor.getType(), utilizationKey); latestInsertedUtilization = Optional.empty(); availableMaxCapacity = 5000; } public void insertUtilization(DateTime timestamp, int spacesAvailable) { Utilization u = new Utilization(); u.facilityId = utilizationKey.facilityId; u.capacityType = utilizationKey.capacityType; u.usage = utilizationKey.usage; u.timestamp = timestamp; u.spacesAvailable = spacesAvailable; u.capacity = 1000; utilizationRepository.insertUtilizations(Collections.singletonList(u)); if (!latestInsertedUtilization.isPresent() || latestInsertedUtilization.get().timestamp.isBefore(timestamp)) { latestInsertedUtilization = Optional.of(u); } } public List<Prediction> predict() { return predictor.predict(predictorState, utilizationHistory, availableMaxCapacity); } @Test public void when_no_history_then_no_predictions() { assertThat(predict(), is(empty())); } }