package bad.robot.temperature.server

import bad.robot.temperature.rrd.{Host, Seconds}
import bad.robot.temperature.{Measurement, SensorReading, Temperature}
import org.specs2.mutable.Specification

class AllTemperaturesTest extends Specification {

  "drain's partially based on time (the most recent 5 seconds are retained)" >> {
    val temperatures = AllTemperatures()
    temperatures.put(measurement("A", 0, 20.0, 20.1))
    temperatures.put(measurement("B", 1, 21.0, 21.1))
    temperatures.put(measurement("C", 2, 22.0, 22.1))
    temperatures.put(measurement("D", 3, 23.2, 23.3))
    temperatures.put(measurement("E", 4, 24.0, 24.1))
    temperatures.put(measurement("F", 5, 25.0, 25.1))
    temperatures.put(measurement("G", 6, 26.0, 26.1))
    temperatures.put(measurement("H", 7, 27.0, 27.1))
    temperatures.put(measurement("I", 8, 28.0, 28.1))
    temperatures.put(measurement("J", 9, 29.0, 29.1))


    temperatures.drainPartially(Seconds(10)) must containTheSameElementsAs(List(
      measurement("A", 0, 20.0, 20.1),
      measurement("B", 1, 21.0, 21.1),
      measurement("C", 2, 22.0, 22.1),
      measurement("D", 3, 23.2, 23.3),
      measurement("E", 4, 24.0, 24.1)
    ))

    temperatures.drainPartially(Seconds(20)) must containTheSameElementsAs(List(
      measurement("F", 5, 25.0, 25.1),
      measurement("G", 6, 26.0, 26.1),
      measurement("H", 7, 27.0, 27.1),
      measurement("I", 8, 28.0, 28.1),
      measurement("J", 9, 29.0, 29.1)
    ))

    temperatures.drainPartially(Seconds(30)) must_== List()
  }

  private def measurement(host: String, time: Long, temperatures: Double*) = {
    Measurement(Host(host), Seconds(time), temperatures.zipWithIndex.map { case (temperature, index) =>
      SensorReading(s"sensor-$index", Temperature(temperature))
    }.toList)
  }
}