DemoTest.kt
| 1 | package de.upapp |
| 2 | |
| 3 | import android.content.SharedPreferences |
| 4 | import org.junit.Assert.assertEquals |
| 5 | import org.junit.Assert.assertThrows |
| 6 | import org.junit.Test |
| 7 | import java.lang.reflect.Proxy |
| 8 | import java.util.concurrent.CountDownLatch |
| 9 | import java.util.concurrent.TimeUnit |
| 10 | import kotlin.concurrent.thread |
| 11 | |
| 12 | /** Preferences that return [credentials] for every VIN. */ |
| 13 | fun storedCredentials(credentials: String) = |
| 14 | Proxy.newProxyInstance(SharedPreferences::class.java.classLoader, arrayOf(SharedPreferences::class.java)) { _, m, _ -> |
| 15 | if (m.name == "getString") credentials else null |
| 16 | } as SharedPreferences |
| 17 | |
| 18 | class DemoTest { |
| 19 | private val car = Car(DemoCar().tunnel, storedCredentials(DEMO_CREDENTIALS)).apply { connect {} } |
| 20 | |
| 21 | @Test |
| 22 | fun readsAllData() { |
| 23 | assertEquals(DEMO_VIN, car.vin) |
| 24 | assertEquals(64.0, car.battery().soc!!, 1.0) |
| 25 | assertEquals(Status("running", "plugged", "idle", 12.5, "celsius"), car.status().copy(charge = "running")) |
| 26 | val cm = car.chargingManager() |
| 27 | assertEquals(listOf("Zuhause", "Arbeit"), cm.profiles.map { it.name }) |
| 28 | assertEquals(3, cm.timers.size) |
| 29 | assertEquals(2, cm.providers.size) |
| 30 | } |
| 31 | |
| 32 | @Test |
| 33 | fun createsAndDeletesLocations() { |
| 34 | car.create(newProfile(car.vin).copy(name = "Oma")) |
| 35 | val added = car.chargingManager().profiles.single { it.name == "Oma" } |
| 36 | assertEquals(3, car.chargingManager().providers.size) |
| 37 | car.delete(added) |
| 38 | assertEquals(listOf("Zuhause", "Arbeit"), car.chargingManager().profiles.map { it.name }) |
| 39 | assertEquals(2, car.chargingManager().providers.size) |
| 40 | val used = car.chargingManager().profiles.first() |
| 41 | assertThrows(IllegalArgumentException::class.java) { car.delete(used) } |
| 42 | } |
| 43 | |
| 44 | @Test |
| 45 | fun writesTimerAndPushesEvent() { |
| 46 | val changed = CountDownLatch(1) |
| 47 | thread(isDaemon = true) { runCatching { car.listen(listOf("/chargingmanager/timers/")) { _, _ -> changed.countDown() } } } |
| 48 | val cm = car.chargingManager() |
| 49 | val timer = cm.timers.first() |
| 50 | val work = cm.profiles.last() |
| 51 | var on = timer.active |
| 52 | // Writes until the event connection is up and reports a change. |
| 53 | repeat(25) { |
| 54 | on = !on |
| 55 | car.write(timer.copy(state = if (on) TIMER_ON else TIMER_OFF, profileId = work.id)) |
| 56 | if (changed.await(200, TimeUnit.MILLISECONDS)) return@repeat |
| 57 | } |
| 58 | assertEquals(0, changed.count) |
| 59 | val stored = car.chargingManager().timers.first() |
| 60 | assertEquals(work.id, stored.profileId) |
| 61 | assertEquals(on, stored.active) |
| 62 | } |
| 63 | } |
| 64 |