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)) } }