package de.upapp import android.content.SharedPreferences import org.junit.Assert.assertEquals import org.junit.Assert.assertThrows import org.junit.Test import java.lang.reflect.Proxy import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit import kotlin.concurrent.thread /** Preferences that return [credentials] for every VIN. */ fun storedCredentials(credentials: String) = Proxy.newProxyInstance(SharedPreferences::class.java.classLoader, arrayOf(SharedPreferences::class.java)) { _, m, _ -> if (m.name == "getString") credentials else null } as SharedPreferences class DemoTest { private val car = Car(DemoCar().tunnel, storedCredentials(DEMO_CREDENTIALS)).apply { connect {} } @Test fun readsAllData() { assertEquals(DEMO_VIN, car.vin) assertEquals(64.0, car.battery().soc!!, 1.0) assertEquals(Status("running", "plugged", "idle", 12.5, "celsius"), car.status().copy(charge = "running")) val cm = car.chargingManager() assertEquals(listOf("Zuhause", "Arbeit"), cm.profiles.map { it.name }) assertEquals(3, cm.timers.size) assertEquals(2, cm.providers.size) } @Test fun createsAndDeletesLocations() { car.create(newProfile(car.vin).copy(name = "Oma")) val added = car.chargingManager().profiles.single { it.name == "Oma" } assertEquals(3, car.chargingManager().providers.size) car.delete(added) assertEquals(listOf("Zuhause", "Arbeit"), car.chargingManager().profiles.map { it.name }) assertEquals(2, car.chargingManager().providers.size) val used = car.chargingManager().profiles.first() assertThrows(IllegalArgumentException::class.java) { car.delete(used) } } @Test fun writesTimerAndPushesEvent() { val changed = CountDownLatch(1) thread(isDaemon = true) { runCatching { car.listen(listOf("/chargingmanager/timers/")) { _, _ -> changed.countDown() } } } val cm = car.chargingManager() val timer = cm.timers.first() val work = cm.profiles.last() var on = timer.active // Writes until the event connection is up and reports a change. repeat(25) { on = !on car.write(timer.copy(state = if (on) TIMER_ON else TIMER_OFF, profileId = work.id)) if (changed.await(200, TimeUnit.MILLISECONDS)) return@repeat } assertEquals(0, changed.count) val stored = car.chargingManager().timers.first() assertEquals(work.id, stored.profileId) assertEquals(on, stored.active) } }