118 lines
3.8 KiB
Kotlin
118 lines
3.8 KiB
Kotlin
package pw.binom.viewmate.glasses
|
||
|
||
import kotlin.test.Test
|
||
import kotlin.test.assertEquals
|
||
import pw.binom.viewmate.glasses.ui.Side
|
||
import pw.binom.viewmate.glasses.ui.scaleOffsetX
|
||
import pw.binom.viewmate.glasses.ui.verticalOffsetY
|
||
import pw.binom.viewmate.glasses.ui.videoOffsetY
|
||
import pw.binom.viewmate.glasses.ui.panelOffsetX
|
||
|
||
/**
|
||
* scaleOffsetX — смещение контейнера глаза к центру (к носу):
|
||
* левый прижат правым краем к центру, правый — offset 0 (левый край уже у центра).
|
||
* Чистая функция — тестируется без Android.
|
||
*/
|
||
class ScaleOffsetTest {
|
||
|
||
@Test
|
||
fun leftFullScreenNoOffset() {
|
||
assertEquals(0, scaleOffsetX(Side.LEFT, 640, 1f))
|
||
}
|
||
|
||
@Test
|
||
fun leftScale07Offset() {
|
||
assertEquals(192, scaleOffsetX(Side.LEFT, 640, 0.7f))
|
||
}
|
||
|
||
@Test
|
||
fun leftScale05Offset() {
|
||
assertEquals(320, scaleOffsetX(Side.LEFT, 640, 0.5f))
|
||
}
|
||
|
||
@Test
|
||
fun rightNeverOffset() {
|
||
assertEquals(0, scaleOffsetX(Side.RIGHT, 640, 1f))
|
||
assertEquals(0, scaleOffsetX(Side.RIGHT, 640, 0.7f))
|
||
assertEquals(0, scaleOffsetX(Side.RIGHT, 640, 0.5f))
|
||
assertEquals(0, scaleOffsetX(Side.RIGHT, 480, 0.5f))
|
||
}
|
||
|
||
/*
|
||
* verticalOffsetY — вертикальное положение контейнера с учётом масштаба:
|
||
* 1.0 — у верха (offset 0), 0.0 — нижняя кромка у низа ((1 - scale) высоты).
|
||
*/
|
||
|
||
@Test
|
||
fun verticalTop_isZero() {
|
||
assertEquals(0, verticalOffsetY(480, 1f, 1f))
|
||
assertEquals(0, verticalOffsetY(480, 0.7f, 1f))
|
||
assertEquals(0, verticalOffsetY(480, 0.5f, 1f))
|
||
}
|
||
|
||
@Test
|
||
fun verticalBottom_pushesToBottomEdge() {
|
||
// 0.7 scale: свободный ход = 480 * 0.3 = 144
|
||
assertEquals(144, verticalOffsetY(480, 0.7f, 0f))
|
||
// 1.0 scale: хода нет — экран и так на весь дисплей
|
||
assertEquals(0, verticalOffsetY(480, 1f, 0f))
|
||
}
|
||
|
||
@Test
|
||
fun verticalMiddle_halfOfFreeRun() {
|
||
// 0.7 scale, vertical 0.5: (1-0.5)*480*0.3 = 72
|
||
assertEquals(72, verticalOffsetY(480, 0.7f, 0.5f))
|
||
assertEquals(0, verticalOffsetY(480, 1f, 0.5f))
|
||
}
|
||
|
||
/*
|
||
* videoOffsetY — видео внутри контейнера: верх при vertical=1, низ при 0.
|
||
*/
|
||
|
||
@Test
|
||
fun videoTop_zero() {
|
||
assertEquals(0, videoOffsetY(432, 268, 1f))
|
||
}
|
||
|
||
@Test
|
||
fun videoBottom_pushedToContainerBottom() {
|
||
// 432 контейнер, 268 видео: ход = 164
|
||
assertEquals(164, videoOffsetY(432, 268, 0f))
|
||
}
|
||
|
||
@Test
|
||
fun videoMiddle_halfOfRun() {
|
||
assertEquals(82, videoOffsetY(432, 268, 0.5f))
|
||
}
|
||
|
||
@Test
|
||
fun videoLargerThanContainer_noNegativeOffset() {
|
||
assertEquals(0, videoOffsetY(200, 268, 0f), "видео выше контейнера — хода нет")
|
||
}
|
||
|
||
/*
|
||
* panelOffsetX — панель статуса сдвигается к носу, как контейнер:
|
||
* LEFT — вправо, RIGHT — влево, на (1 - scale) * W / 2.
|
||
*/
|
||
|
||
@Test
|
||
fun panelFullScale_noOffset() {
|
||
assertEquals(0, panelOffsetX(Side.LEFT, 640, 1f))
|
||
assertEquals(0, panelOffsetX(Side.RIGHT, 640, 1f))
|
||
}
|
||
|
||
@Test
|
||
fun panelHalfScale_movesTowardNose() {
|
||
// 640 * 0.5 / 2 = 160: LEFT вправо, RIGHT влево
|
||
assertEquals(160, panelOffsetX(Side.LEFT, 640, 0.5f))
|
||
assertEquals(-160, panelOffsetX(Side.RIGHT, 640, 0.5f))
|
||
}
|
||
|
||
@Test
|
||
fun panelScale07_offset() {
|
||
// 640 * 0.3 / 2 = 96
|
||
assertEquals(96, panelOffsetX(Side.LEFT, 640, 0.7f))
|
||
assertEquals(-96, panelOffsetX(Side.RIGHT, 640, 0.7f))
|
||
}
|
||
}
|