package com.mindmachine.mvp import com.mindmachine.mvp.session.FlashColor import com.mindmachine.mvp.session.computeSplitFlashFrame import org.junit.Assert.assertEquals import org.junit.Test class VisualSignalTest { @Test fun splitFlashPattern_cycles_redGreen_black_greenRed_black() { val intervalMs = 100 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) assertEquals(FlashColor.RED, phase0.left) assertEquals(FlashColor.GREEN, phase0.right) 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 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 tooSlow = computeSplitFlashFrame(frameTimeNanos = 2_100_000_000L, flashIntervalMs = 5000) val validAt2000ms = computeSplitFlashFrame(frameTimeNanos = 2_100_000_000L, flashIntervalMs = 2000) assertEquals(validAt2000ms, tooSlow) } }