Update mode toggle, split flash visuals, and interval-ms controls

This commit is contained in:
Tretzi
2026-03-10 23:24:49 -05:00
parent fdf3bf01d3
commit bb5d77fea3
9 changed files with 137 additions and 125 deletions

View File

@@ -1,67 +1,42 @@
package com.mindmachine.mvp
import com.mindmachine.mvp.domain.VisualPattern
import com.mindmachine.mvp.session.computeVisualAlpha
import com.mindmachine.mvp.session.FlashColor
import com.mindmachine.mvp.session.computeSplitFlashFrame
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
class VisualSignalTest {
@Test
fun flashPatternAlternatesBetweenIntensityAndOff() {
val intensity = 70
val hz = 10f
fun splitFlashPattern_cycles_redGreen_black_greenRed_black() {
val intervalMs = 100
val on = computeVisualAlpha(
visualPattern = VisualPattern.FLASH,
frameTimeNanos = 0L,
blinkFrequencyHz = hz,
intensityPercent = intensity
)
val phase0 = computeSplitFlashFrame(frameTimeNanos = 0L, flashIntervalMs = intervalMs)
val phase1 = computeSplitFlashFrame(frameTimeNanos = 100_000_000L, flashIntervalMs = intervalMs)
val phase2 = computeSplitFlashFrame(frameTimeNanos = 200_000_000L, flashIntervalMs = intervalMs)
val phase3 = computeSplitFlashFrame(frameTimeNanos = 300_000_000L, flashIntervalMs = intervalMs)
val off = computeVisualAlpha(
visualPattern = VisualPattern.FLASH,
frameTimeNanos = 75_000_000L,
blinkFrequencyHz = hz,
intensityPercent = intensity
)
assertEquals(FlashColor.RED, phase0.left)
assertEquals(FlashColor.GREEN, phase0.right)
assertEquals(0.7f, on, 0.0001f)
assertEquals(0f, off, 0.0001f)
assertEquals(FlashColor.BLACK, phase1.left)
assertEquals(FlashColor.BLACK, phase1.right)
assertEquals(FlashColor.GREEN, phase2.left)
assertEquals(FlashColor.RED, phase2.right)
assertEquals(FlashColor.BLACK, phase3.left)
assertEquals(FlashColor.BLACK, phase3.right)
}
@Test
fun pulsePatternStaysWithinZeroAndIntensity() {
val intensity = 60
fun interval_is_clamped_to_valid_range() {
val tooFast = computeSplitFlashFrame(frameTimeNanos = 49_000_000L, flashIntervalMs = 1)
val validAt50ms = computeSplitFlashFrame(frameTimeNanos = 49_000_000L, flashIntervalMs = 50)
assertEquals(validAt50ms, tooFast)
val atStart = computeVisualAlpha(
visualPattern = VisualPattern.PULSE,
frameTimeNanos = 0L,
blinkFrequencyHz = 3f,
intensityPercent = intensity
)
val quarterCycle = computeVisualAlpha(
visualPattern = VisualPattern.PULSE,
frameTimeNanos = 83_333_333L,
blinkFrequencyHz = 3f,
intensityPercent = intensity
)
assertTrue(atStart in 0f..0.6f)
assertTrue(quarterCycle in 0f..0.6f)
assertTrue(quarterCycle > atStart)
}
@Test
fun intensityZeroAlwaysReturnsZero() {
val alpha = computeVisualAlpha(
visualPattern = VisualPattern.FLASH,
frameTimeNanos = 123_000_000L,
blinkFrequencyHz = 8f,
intensityPercent = 0
)
assertEquals(0f, alpha, 0f)
val tooSlow = computeSplitFlashFrame(frameTimeNanos = 2_100_000_000L, flashIntervalMs = 5000)
val validAt2000ms = computeSplitFlashFrame(frameTimeNanos = 2_100_000_000L, flashIntervalMs = 2000)
assertEquals(validAt2000ms, tooSlow)
}
}