package com.mindmachine.mvp import com.mindmachine.mvp.domain.SessionConfig import com.mindmachine.mvp.domain.SessionMode import com.mindmachine.mvp.domain.VisualPattern import com.mindmachine.mvp.session.SessionValidator import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Test class SessionValidatorTest { private val valid = SessionConfig( presetId = "relax", durationSec = 600, mode = SessionMode.AUDIO_VISUAL, visualPatternType = VisualPattern.PULSE, flashIntervalMs = 167, intensityPercent = 50, carrierFrequencyHz = 200f, binauralDifferenceHz = 6f, ) @Test fun valid_with_headset_passes() { assertNull(SessionValidator.validate(valid, headsetAvailable = true)) } @Test fun audio_without_headset_is_blocked() { val error = SessionValidator.validate(valid, headsetAvailable = false) assertEquals("Stereo headphones are required for binaural audio. Connect headphones or switch to Visual-only.", error) } @Test fun visual_only_without_headset_passes() { assertNull(SessionValidator.validate(valid.copy(mode = SessionMode.VISUAL_ONLY), headsetAvailable = false)) } @Test fun out_of_range_values_are_blocked() { assertEquals("Duration must be 1 minute to 8 hours.", SessionValidator.validate(valid.copy(durationSec = 59), true)) assertEquals("Flash interval must be 0.05 to 2.00 seconds.", SessionValidator.validate(valid.copy(flashIntervalMs = 49), true)) assertEquals("Carrier frequency must be between 80 and 400.", SessionValidator.validate(valid.copy(carrierFrequencyHz = 79f), true)) assertEquals("Binaural difference must be between 0.5 and 20.", SessionValidator.validate(valid.copy(binauralDifferenceHz = 0.1f), true)) } }