DemoTest.kt
⎇
Raw
1package de.upapp
2
3import android.content.SharedPreferences
4import org.junit.Assert.assertEquals
5import org.junit.Assert.assertThrows
6import org.junit.Test
7import java.lang.reflect.Proxy
8import java.util.concurrent.CountDownLatch
9import java.util.concurrent.TimeUnit
10import kotlin.concurrent.thread
11
12/** Preferences that return [credentials] for every VIN. */
13fun 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
18class 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