Coverage Summary for Class: TrainingStateValidator (com.vsevolodganin.clicktrack.training)

Class Method, % Branch, % Line, % Instruction, %
TrainingStateValidator 0% (0/2) 0% (0/10) 0% (0/27) 3.5% (4/115)
TrainingStateValidator$ValidationResult 0% (0/1) 0% (0/3) 0% (0/12)
TrainingStateValidator$WhenMappings
Total 0% (0/3) 0% (0/10) 0% (0/30) 3.1% (4/127)


 package com.vsevolodganin.clicktrack.training
 
 import com.vsevolodganin.clicktrack.common.BpmValidator
 import me.tatarka.inject.annotations.Inject
 
 @Inject
 class TrainingStateValidator(
     private val bpmValidator: BpmValidator,
 ) {
     class ValidationResult(
         val persistableState: TrainingValidState?,
         val errors: Set<TrainingEditState.Error>,
     )
 
     fun validate(state: TrainingEditState): ValidationResult {
         val startingTempoValidationResult = bpmValidator.validate(state.startingTempo)
         val tempoChangeValidationResult = bpmValidator.validate(state.tempoChange)
         val endingByTempoValidationResult = bpmValidator.validate(state.endingByTempo.endingTempo)
 
         val errors = buildSet {
             if (startingTempoValidationResult.hasError) {
                 this += TrainingEditState.Error.STARTING_TEMPO
             }
 
             if (tempoChangeValidationResult.hasError) {
                 this += TrainingEditState.Error.TEMPO_CHANGE
             }
 
             if (endingByTempoValidationResult.hasError && state.activeEndingKind == TrainingEndingKind.BY_TEMPO) {
                 this += TrainingEditState.Error.ENDING_TEMPO
             }
         }
 
         return if (errors.isNotEmpty()) {
             ValidationResult(
                 persistableState = null,
                 errors = errors,
             )
         } else {
             ValidationResult(
                 persistableState = TrainingValidState(
                     startingTempo = startingTempoValidationResult.coercedBpm,
                     mode = state.mode,
                     segmentLength = state.segmentLength,
                     tempoChange = tempoChangeValidationResult.coercedBpm,
                     ending = when (state.activeEndingKind) {
                         TrainingEndingKind.BY_TEMPO -> TrainingValidState.Ending.ByTempo(endingByTempoValidationResult.coercedBpm)
                         TrainingEndingKind.BY_TIME -> TrainingValidState.Ending.ByTime(state.endingByTime.duration)
                     },
                 ),
                 errors = errors,
             )
         }
     }
 }