// Copyright © 2015 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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class AverageOfPreviousWeeksPredictorTest extends AbstractPredictorTest {
public AverageOfPreviousWeeksPredictorTest() {
super(new AverageOfPreviousWeeksPredictor());
}
@Before
public void defineCurrentTime() {
// the predictor is independent of system time, so the latest utilization defines "now"
insertUtilization(now, 0);
}
@After
public void checkUpdatesLatestUtilization() {
assertThat(predictorState.latestUtilization).isEqualTo(now);
}
@Test
public void when_less_than_6_days_of_history_then_no_predictions() {
insertUtilization(now.minusDays(6).plusSeconds(1), 666);
List<Prediction> predictions = predict();
assertThat(predictions).isEmpty();
}
@Test
public void when_1_week_of_history_then_predicts_same_as_one_week_ago() {
insertUtilization(now.minusDays(7), 10);
insertUtilization(now.minusDays(6), 20);
List<Prediction> predictions = predict();
assertThat(predictions).containsSubsequence(
new Prediction(now, 10),
new Prediction(now.plusDays(1), 20));
}
@Test
public void when_3_weeks_of_history_then_predicts_the_mean_of_all_the_weeks() {
insertUtilization(now.minusWeeks(3).plusDays(0), 10);
insertUtilization(now.minusWeeks(3).plusDays(1), 20);
insertUtilization(now.minusWeeks(2).plusDays(0), 17);
insertUtilization(now.minusWeeks(2).plusDays(1), 27);
insertUtilization(now.minusWeeks(1).plusDays(0), 18);
insertUtilization(now.minusWeeks(1).plusDays(1), 28);
List<Prediction> predictions = predict();
assertThat(predictions).containsSubsequence(
new Prediction(now, 15),
new Prediction(now.plusDays(1), 25));
}
@Test
public void when_more_than_3_weeks_of_history_then_uses_only_the_last_3_weeks() {
insertUtilization(now.minusWeeks(4).plusDays(0), 666);
insertUtilization(now.minusWeeks(3).plusDays(0), 10);
insertUtilization(now.minusWeeks(3).plusDays(1), 20);
insertUtilization(now.minusWeeks(2).plusDays(0), 10);
insertUtilization(now.minusWeeks(2).plusDays(1), 20);
insertUtilization(now.minusWeeks(1).plusDays(0), 10);
insertUtilization(now.minusWeeks(1).plusDays(1), 20);
List<Prediction> predictions = predict();
assertThat(predictions).containsSubsequence(
new Prediction(now, 10),
new Prediction(now.plusDays(1), 20));
}
// TODO: shift prediction up/down to start from current utilization baseline
// TODO: 5 weeks of history, discard 2 outliers, average
// TODO: more than 5 weeks of history, use only the last 5 weeks
}